OSDN Git Service

* config/i386/i386.c (ix86_code_end): Call build_function_type_list
[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         free (option_strings[i]);
4787     }
4788
4789   return t;
4790 }
4791
4792 /* Hook to validate attribute((target("string"))).  */
4793
4794 static bool
4795 ix86_valid_target_attribute_p (tree fndecl,
4796                                tree ARG_UNUSED (name),
4797                                tree args,
4798                                int ARG_UNUSED (flags))
4799 {
4800   struct cl_target_option cur_target;
4801   bool ret = true;
4802   tree old_optimize = build_optimization_node ();
4803   tree new_target, new_optimize;
4804   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
4805
4806   /* If the function changed the optimization levels as well as setting target
4807      options, start with the optimizations specified.  */
4808   if (func_optimize && func_optimize != old_optimize)
4809     cl_optimization_restore (&global_options,
4810                              TREE_OPTIMIZATION (func_optimize));
4811
4812   /* The target attributes may also change some optimization flags, so update
4813      the optimization options if necessary.  */
4814   cl_target_option_save (&cur_target, &global_options);
4815   new_target = ix86_valid_target_attribute_tree (args);
4816   new_optimize = build_optimization_node ();
4817
4818   if (!new_target)
4819     ret = false;
4820
4821   else if (fndecl)
4822     {
4823       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
4824
4825       if (old_optimize != new_optimize)
4826         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
4827     }
4828
4829   cl_target_option_restore (&global_options, &cur_target);
4830
4831   if (old_optimize != new_optimize)
4832     cl_optimization_restore (&global_options,
4833                              TREE_OPTIMIZATION (old_optimize));
4834
4835   return ret;
4836 }
4837
4838 \f
4839 /* Hook to determine if one function can safely inline another.  */
4840
4841 static bool
4842 ix86_can_inline_p (tree caller, tree callee)
4843 {
4844   bool ret = false;
4845   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
4846   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
4847
4848   /* If callee has no option attributes, then it is ok to inline.  */
4849   if (!callee_tree)
4850     ret = true;
4851
4852   /* If caller has no option attributes, but callee does then it is not ok to
4853      inline.  */
4854   else if (!caller_tree)
4855     ret = false;
4856
4857   else
4858     {
4859       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
4860       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
4861
4862       /* Callee's isa options should a subset of the caller's, i.e. a SSE4 function
4863          can inline a SSE2 function but a SSE2 function can't inline a SSE4
4864          function.  */
4865       if ((caller_opts->x_ix86_isa_flags & callee_opts->x_ix86_isa_flags)
4866           != callee_opts->x_ix86_isa_flags)
4867         ret = false;
4868
4869       /* See if we have the same non-isa options.  */
4870       else if (caller_opts->x_target_flags != callee_opts->x_target_flags)
4871         ret = false;
4872
4873       /* See if arch, tune, etc. are the same.  */
4874       else if (caller_opts->arch != callee_opts->arch)
4875         ret = false;
4876
4877       else if (caller_opts->tune != callee_opts->tune)
4878         ret = false;
4879
4880       else if (caller_opts->fpmath != callee_opts->fpmath)
4881         ret = false;
4882
4883       else if (caller_opts->branch_cost != callee_opts->branch_cost)
4884         ret = false;
4885
4886       else
4887         ret = true;
4888     }
4889
4890   return ret;
4891 }
4892
4893 \f
4894 /* Remember the last target of ix86_set_current_function.  */
4895 static GTY(()) tree ix86_previous_fndecl;
4896
4897 /* Establish appropriate back-end context for processing the function
4898    FNDECL.  The argument might be NULL to indicate processing at top
4899    level, outside of any function scope.  */
4900 static void
4901 ix86_set_current_function (tree fndecl)
4902 {
4903   /* Only change the context if the function changes.  This hook is called
4904      several times in the course of compiling a function, and we don't want to
4905      slow things down too much or call target_reinit when it isn't safe.  */
4906   if (fndecl && fndecl != ix86_previous_fndecl)
4907     {
4908       tree old_tree = (ix86_previous_fndecl
4909                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
4910                        : NULL_TREE);
4911
4912       tree new_tree = (fndecl
4913                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
4914                        : NULL_TREE);
4915
4916       ix86_previous_fndecl = fndecl;
4917       if (old_tree == new_tree)
4918         ;
4919
4920       else if (new_tree)
4921         {
4922           cl_target_option_restore (&global_options,
4923                                     TREE_TARGET_OPTION (new_tree));
4924           target_reinit ();
4925         }
4926
4927       else if (old_tree)
4928         {
4929           struct cl_target_option *def
4930             = TREE_TARGET_OPTION (target_option_current_node);
4931
4932           cl_target_option_restore (&global_options, def);
4933           target_reinit ();
4934         }
4935     }
4936 }
4937
4938 \f
4939 /* Return true if this goes in large data/bss.  */
4940
4941 static bool
4942 ix86_in_large_data_p (tree exp)
4943 {
4944   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
4945     return false;
4946
4947   /* Functions are never large data.  */
4948   if (TREE_CODE (exp) == FUNCTION_DECL)
4949     return false;
4950
4951   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
4952     {
4953       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
4954       if (strcmp (section, ".ldata") == 0
4955           || strcmp (section, ".lbss") == 0)
4956         return true;
4957       return false;
4958     }
4959   else
4960     {
4961       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
4962
4963       /* If this is an incomplete type with size 0, then we can't put it
4964          in data because it might be too big when completed.  */
4965       if (!size || size > ix86_section_threshold)
4966         return true;
4967     }
4968
4969   return false;
4970 }
4971
4972 /* Switch to the appropriate section for output of DECL.
4973    DECL is either a `VAR_DECL' node or a constant of some sort.
4974    RELOC indicates whether forming the initial value of DECL requires
4975    link-time relocations.  */
4976
4977 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
4978         ATTRIBUTE_UNUSED;
4979
4980 static section *
4981 x86_64_elf_select_section (tree decl, int reloc,
4982                            unsigned HOST_WIDE_INT align)
4983 {
4984   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4985       && ix86_in_large_data_p (decl))
4986     {
4987       const char *sname = NULL;
4988       unsigned int flags = SECTION_WRITE;
4989       switch (categorize_decl_for_section (decl, reloc))
4990         {
4991         case SECCAT_DATA:
4992           sname = ".ldata";
4993           break;
4994         case SECCAT_DATA_REL:
4995           sname = ".ldata.rel";
4996           break;
4997         case SECCAT_DATA_REL_LOCAL:
4998           sname = ".ldata.rel.local";
4999           break;
5000         case SECCAT_DATA_REL_RO:
5001           sname = ".ldata.rel.ro";
5002           break;
5003         case SECCAT_DATA_REL_RO_LOCAL:
5004           sname = ".ldata.rel.ro.local";
5005           break;
5006         case SECCAT_BSS:
5007           sname = ".lbss";
5008           flags |= SECTION_BSS;
5009           break;
5010         case SECCAT_RODATA:
5011         case SECCAT_RODATA_MERGE_STR:
5012         case SECCAT_RODATA_MERGE_STR_INIT:
5013         case SECCAT_RODATA_MERGE_CONST:
5014           sname = ".lrodata";
5015           flags = 0;
5016           break;
5017         case SECCAT_SRODATA:
5018         case SECCAT_SDATA:
5019         case SECCAT_SBSS:
5020           gcc_unreachable ();
5021         case SECCAT_TEXT:
5022         case SECCAT_TDATA:
5023         case SECCAT_TBSS:
5024           /* We don't split these for medium model.  Place them into
5025              default sections and hope for best.  */
5026           break;
5027         }
5028       if (sname)
5029         {
5030           /* We might get called with string constants, but get_named_section
5031              doesn't like them as they are not DECLs.  Also, we need to set
5032              flags in that case.  */
5033           if (!DECL_P (decl))
5034             return get_section (sname, flags, NULL);
5035           return get_named_section (decl, sname, reloc);
5036         }
5037     }
5038   return default_elf_select_section (decl, reloc, align);
5039 }
5040
5041 /* Build up a unique section name, expressed as a
5042    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
5043    RELOC indicates whether the initial value of EXP requires
5044    link-time relocations.  */
5045
5046 static void ATTRIBUTE_UNUSED
5047 x86_64_elf_unique_section (tree decl, int reloc)
5048 {
5049   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5050       && ix86_in_large_data_p (decl))
5051     {
5052       const char *prefix = NULL;
5053       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
5054       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
5055
5056       switch (categorize_decl_for_section (decl, reloc))
5057         {
5058         case SECCAT_DATA:
5059         case SECCAT_DATA_REL:
5060         case SECCAT_DATA_REL_LOCAL:
5061         case SECCAT_DATA_REL_RO:
5062         case SECCAT_DATA_REL_RO_LOCAL:
5063           prefix = one_only ? ".ld" : ".ldata";
5064           break;
5065         case SECCAT_BSS:
5066           prefix = one_only ? ".lb" : ".lbss";
5067           break;
5068         case SECCAT_RODATA:
5069         case SECCAT_RODATA_MERGE_STR:
5070         case SECCAT_RODATA_MERGE_STR_INIT:
5071         case SECCAT_RODATA_MERGE_CONST:
5072           prefix = one_only ? ".lr" : ".lrodata";
5073           break;
5074         case SECCAT_SRODATA:
5075         case SECCAT_SDATA:
5076         case SECCAT_SBSS:
5077           gcc_unreachable ();
5078         case SECCAT_TEXT:
5079         case SECCAT_TDATA:
5080         case SECCAT_TBSS:
5081           /* We don't split these for medium model.  Place them into
5082              default sections and hope for best.  */
5083           break;
5084         }
5085       if (prefix)
5086         {
5087           const char *name, *linkonce;
5088           char *string;
5089
5090           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5091           name = targetm.strip_name_encoding (name);
5092
5093           /* If we're using one_only, then there needs to be a .gnu.linkonce
5094              prefix to the section name.  */
5095           linkonce = one_only ? ".gnu.linkonce" : "";
5096
5097           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
5098
5099           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
5100           return;
5101         }
5102     }
5103   default_unique_section (decl, reloc);
5104 }
5105
5106 #ifdef COMMON_ASM_OP
5107 /* This says how to output assembler code to declare an
5108    uninitialized external linkage data object.
5109
5110    For medium model x86-64 we need to use .largecomm opcode for
5111    large objects.  */
5112 void
5113 x86_elf_aligned_common (FILE *file,
5114                         const char *name, unsigned HOST_WIDE_INT size,
5115                         int align)
5116 {
5117   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5118       && size > (unsigned int)ix86_section_threshold)
5119     fputs (".largecomm\t", file);
5120   else
5121     fputs (COMMON_ASM_OP, file);
5122   assemble_name (file, name);
5123   fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
5124            size, align / BITS_PER_UNIT);
5125 }
5126 #endif
5127
5128 /* Utility function for targets to use in implementing
5129    ASM_OUTPUT_ALIGNED_BSS.  */
5130
5131 void
5132 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
5133                         const char *name, unsigned HOST_WIDE_INT size,
5134                         int align)
5135 {
5136   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
5137       && size > (unsigned int)ix86_section_threshold)
5138     switch_to_section (get_named_section (decl, ".lbss", 0));
5139   else
5140     switch_to_section (bss_section);
5141   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
5142 #ifdef ASM_DECLARE_OBJECT_NAME
5143   last_assemble_variable_decl = decl;
5144   ASM_DECLARE_OBJECT_NAME (file, name, decl);
5145 #else
5146   /* Standard thing is just output label for the object.  */
5147   ASM_OUTPUT_LABEL (file, name);
5148 #endif /* ASM_DECLARE_OBJECT_NAME */
5149   ASM_OUTPUT_SKIP (file, size ? size : 1);
5150 }
5151 \f
5152 static const struct default_options ix86_option_optimization_table[] =
5153   {
5154     /* Turn off -fschedule-insns by default.  It tends to make the
5155        problem with not enough registers even worse.  */
5156 #ifdef INSN_SCHEDULING
5157     { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
5158 #endif
5159
5160 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
5161     SUBTARGET_OPTIMIZATION_OPTIONS,
5162 #endif
5163     { OPT_LEVELS_NONE, 0, NULL, 0 }
5164   };
5165
5166 /* Implement TARGET_OPTION_INIT_STRUCT.  */
5167
5168 static void
5169 ix86_option_init_struct (struct gcc_options *opts)
5170 {
5171   if (TARGET_MACHO)
5172     /* The Darwin libraries never set errno, so we might as well
5173        avoid calling them when that's the only reason we would.  */
5174     opts->x_flag_errno_math = 0;
5175
5176   opts->x_flag_pcc_struct_return = 2;
5177   opts->x_flag_asynchronous_unwind_tables = 2;
5178   opts->x_flag_vect_cost_model = 1;
5179 }
5180
5181 /* Decide whether we must probe the stack before any space allocation
5182    on this target.  It's essentially TARGET_STACK_PROBE except when
5183    -fstack-check causes the stack to be already probed differently.  */
5184
5185 bool
5186 ix86_target_stack_probe (void)
5187 {
5188   /* Do not probe the stack twice if static stack checking is enabled.  */
5189   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5190     return false;
5191
5192   return TARGET_STACK_PROBE;
5193 }
5194 \f
5195 /* Decide whether we can make a sibling call to a function.  DECL is the
5196    declaration of the function being targeted by the call and EXP is the
5197    CALL_EXPR representing the call.  */
5198
5199 static bool
5200 ix86_function_ok_for_sibcall (tree decl, tree exp)
5201 {
5202   tree type, decl_or_type;
5203   rtx a, b;
5204
5205   /* If we are generating position-independent code, we cannot sibcall
5206      optimize any indirect call, or a direct call to a global function,
5207      as the PLT requires %ebx be live. (Darwin does not have a PLT.)  */
5208   if (!TARGET_MACHO
5209       && !TARGET_64BIT 
5210       && flag_pic 
5211       && (!decl || !targetm.binds_local_p (decl)))
5212     return false;
5213
5214   /* If we need to align the outgoing stack, then sibcalling would
5215      unalign the stack, which may break the called function.  */
5216   if (ix86_minimum_incoming_stack_boundary (true)
5217       < PREFERRED_STACK_BOUNDARY)
5218     return false;
5219
5220   if (decl)
5221     {
5222       decl_or_type = decl;
5223       type = TREE_TYPE (decl);
5224     }
5225   else
5226     {
5227       /* We're looking at the CALL_EXPR, we need the type of the function.  */
5228       type = CALL_EXPR_FN (exp);                /* pointer expression */
5229       type = TREE_TYPE (type);                  /* pointer type */
5230       type = TREE_TYPE (type);                  /* function type */
5231       decl_or_type = type;
5232     }
5233
5234   /* Check that the return value locations are the same.  Like
5235      if we are returning floats on the 80387 register stack, we cannot
5236      make a sibcall from a function that doesn't return a float to a
5237      function that does or, conversely, from a function that does return
5238      a float to a function that doesn't; the necessary stack adjustment
5239      would not be executed.  This is also the place we notice
5240      differences in the return value ABI.  Note that it is ok for one
5241      of the functions to have void return type as long as the return
5242      value of the other is passed in a register.  */
5243   a = ix86_function_value (TREE_TYPE (exp), decl_or_type, false);
5244   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
5245                            cfun->decl, false);
5246   if (STACK_REG_P (a) || STACK_REG_P (b))
5247     {
5248       if (!rtx_equal_p (a, b))
5249         return false;
5250     }
5251   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
5252     {
5253       /* Disable sibcall if we need to generate vzeroupper after
5254          callee returns.  */
5255       if (TARGET_VZEROUPPER
5256           && cfun->machine->callee_return_avx256_p
5257           && !cfun->machine->caller_return_avx256_p)
5258         return false;
5259     }
5260   else if (!rtx_equal_p (a, b))
5261     return false;
5262
5263   if (TARGET_64BIT)
5264     {
5265       /* The SYSV ABI has more call-clobbered registers;
5266          disallow sibcalls from MS to SYSV.  */
5267       if (cfun->machine->call_abi == MS_ABI
5268           && ix86_function_type_abi (type) == SYSV_ABI)
5269         return false;
5270     }
5271   else
5272     {
5273       /* If this call is indirect, we'll need to be able to use a
5274          call-clobbered register for the address of the target function.
5275          Make sure that all such registers are not used for passing
5276          parameters.  Note that DLLIMPORT functions are indirect.  */
5277       if (!decl
5278           || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
5279         {
5280           if (ix86_function_regparm (type, NULL) >= 3)
5281             {
5282               /* ??? Need to count the actual number of registers to be used,
5283                  not the possible number of registers.  Fix later.  */
5284               return false;
5285             }
5286         }
5287     }
5288
5289   /* Otherwise okay.  That also includes certain types of indirect calls.  */
5290   return true;
5291 }
5292
5293 /* Handle "cdecl", "stdcall", "fastcall", "regparm", "thiscall",
5294    and "sseregparm" calling convention attributes;
5295    arguments as in struct attribute_spec.handler.  */
5296
5297 static tree
5298 ix86_handle_cconv_attribute (tree *node, tree name,
5299                                    tree args,
5300                                    int flags ATTRIBUTE_UNUSED,
5301                                    bool *no_add_attrs)
5302 {
5303   if (TREE_CODE (*node) != FUNCTION_TYPE
5304       && TREE_CODE (*node) != METHOD_TYPE
5305       && TREE_CODE (*node) != FIELD_DECL
5306       && TREE_CODE (*node) != TYPE_DECL)
5307     {
5308       warning (OPT_Wattributes, "%qE attribute only applies to functions",
5309                name);
5310       *no_add_attrs = true;
5311       return NULL_TREE;
5312     }
5313
5314   /* Can combine regparm with all attributes but fastcall, and thiscall.  */
5315   if (is_attribute_p ("regparm", name))
5316     {
5317       tree cst;
5318
5319       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5320         {
5321           error ("fastcall and regparm attributes are not compatible");
5322         }
5323
5324       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5325         {
5326           error ("regparam and thiscall attributes are not compatible");
5327         }
5328
5329       cst = TREE_VALUE (args);
5330       if (TREE_CODE (cst) != INTEGER_CST)
5331         {
5332           warning (OPT_Wattributes,
5333                    "%qE attribute requires an integer constant argument",
5334                    name);
5335           *no_add_attrs = true;
5336         }
5337       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
5338         {
5339           warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
5340                    name, REGPARM_MAX);
5341           *no_add_attrs = true;
5342         }
5343
5344       return NULL_TREE;
5345     }
5346
5347   if (TARGET_64BIT)
5348     {
5349       /* Do not warn when emulating the MS ABI.  */
5350       if ((TREE_CODE (*node) != FUNCTION_TYPE
5351            && TREE_CODE (*node) != METHOD_TYPE)
5352           || ix86_function_type_abi (*node) != MS_ABI)
5353         warning (OPT_Wattributes, "%qE attribute ignored",
5354                  name);
5355       *no_add_attrs = true;
5356       return NULL_TREE;
5357     }
5358
5359   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
5360   if (is_attribute_p ("fastcall", name))
5361     {
5362       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5363         {
5364           error ("fastcall and cdecl attributes are not compatible");
5365         }
5366       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5367         {
5368           error ("fastcall and stdcall attributes are not compatible");
5369         }
5370       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
5371         {
5372           error ("fastcall and regparm attributes are not compatible");
5373         }
5374       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5375         {
5376           error ("fastcall and thiscall attributes are not compatible");
5377         }
5378     }
5379
5380   /* Can combine stdcall with fastcall (redundant), regparm and
5381      sseregparm.  */
5382   else if (is_attribute_p ("stdcall", name))
5383     {
5384       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5385         {
5386           error ("stdcall and cdecl attributes are not compatible");
5387         }
5388       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5389         {
5390           error ("stdcall and fastcall attributes are not compatible");
5391         }
5392       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5393         {
5394           error ("stdcall and thiscall attributes are not compatible");
5395         }
5396     }
5397
5398   /* Can combine cdecl with regparm and sseregparm.  */
5399   else if (is_attribute_p ("cdecl", name))
5400     {
5401       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5402         {
5403           error ("stdcall and cdecl attributes are not compatible");
5404         }
5405       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5406         {
5407           error ("fastcall and cdecl attributes are not compatible");
5408         }
5409       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
5410         {
5411           error ("cdecl and thiscall attributes are not compatible");
5412         }
5413     }
5414   else if (is_attribute_p ("thiscall", name))
5415     {
5416       if (TREE_CODE (*node) != METHOD_TYPE && pedantic)
5417         warning (OPT_Wattributes, "%qE attribute is used for none class-method",
5418                  name);
5419       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
5420         {
5421           error ("stdcall and thiscall attributes are not compatible");
5422         }
5423       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
5424         {
5425           error ("fastcall and thiscall attributes are not compatible");
5426         }
5427       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
5428         {
5429           error ("cdecl and thiscall attributes are not compatible");
5430         }
5431     }
5432
5433   /* Can combine sseregparm with all attributes.  */
5434
5435   return NULL_TREE;
5436 }
5437
5438 /* This function determines from TYPE the calling-convention.  */
5439
5440 unsigned int
5441 ix86_get_callcvt (const_tree type)
5442 {
5443   unsigned int ret = 0;
5444   bool is_stdarg;
5445   tree attrs;
5446
5447   if (TARGET_64BIT)
5448     return IX86_CALLCVT_CDECL;
5449
5450   attrs = TYPE_ATTRIBUTES (type);
5451   if (attrs != NULL_TREE)
5452     {
5453       if (lookup_attribute ("cdecl", attrs))
5454         ret |= IX86_CALLCVT_CDECL;
5455       else if (lookup_attribute ("stdcall", attrs))
5456         ret |= IX86_CALLCVT_STDCALL;
5457       else if (lookup_attribute ("fastcall", attrs))
5458         ret |= IX86_CALLCVT_FASTCALL;
5459       else if (lookup_attribute ("thiscall", attrs))
5460         ret |= IX86_CALLCVT_THISCALL;
5461
5462       /* Regparam isn't allowed for thiscall and fastcall.  */
5463       if ((ret & (IX86_CALLCVT_THISCALL | IX86_CALLCVT_FASTCALL)) == 0)
5464         {
5465           if (lookup_attribute ("regparm", attrs))
5466             ret |= IX86_CALLCVT_REGPARM;
5467           if (lookup_attribute ("sseregparm", attrs))
5468             ret |= IX86_CALLCVT_SSEREGPARM;
5469         }
5470
5471       if (IX86_BASE_CALLCVT(ret) != 0)
5472         return ret;
5473     }
5474
5475   is_stdarg = stdarg_p (type);
5476   if (TARGET_RTD && !is_stdarg)
5477     return IX86_CALLCVT_STDCALL | ret;
5478
5479   if (ret != 0
5480       || is_stdarg
5481       || TREE_CODE (type) != METHOD_TYPE
5482       || ix86_function_type_abi (type) != MS_ABI)
5483     return IX86_CALLCVT_CDECL | ret;
5484
5485   return IX86_CALLCVT_THISCALL;
5486 }
5487
5488 /* Return 0 if the attributes for two types are incompatible, 1 if they
5489    are compatible, and 2 if they are nearly compatible (which causes a
5490    warning to be generated).  */
5491
5492 static int
5493 ix86_comp_type_attributes (const_tree type1, const_tree type2)
5494 {
5495   unsigned int ccvt1, ccvt2;
5496
5497   if (TREE_CODE (type1) != FUNCTION_TYPE
5498       && TREE_CODE (type1) != METHOD_TYPE)
5499     return 1;
5500
5501   ccvt1 = ix86_get_callcvt (type1);
5502   ccvt2 = ix86_get_callcvt (type2);
5503   if (ccvt1 != ccvt2)
5504     return 0;
5505   if (ix86_function_regparm (type1, NULL)
5506       != ix86_function_regparm (type2, NULL))
5507     return 0;
5508
5509   return 1;
5510 }
5511 \f
5512 /* Return the regparm value for a function with the indicated TYPE and DECL.
5513    DECL may be NULL when calling function indirectly
5514    or considering a libcall.  */
5515
5516 static int
5517 ix86_function_regparm (const_tree type, const_tree decl)
5518 {
5519   tree attr;
5520   int regparm;
5521   unsigned int ccvt;
5522
5523   if (TARGET_64BIT)
5524     return (ix86_function_type_abi (type) == SYSV_ABI
5525             ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
5526   ccvt = ix86_get_callcvt (type);
5527   regparm = ix86_regparm;
5528
5529   if ((ccvt & IX86_CALLCVT_REGPARM) != 0)
5530     {
5531       attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
5532       if (attr)
5533         {
5534           regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
5535           return regparm;
5536         }
5537     }
5538   else if ((ccvt & IX86_CALLCVT_FASTCALL) != 0)
5539     return 2;
5540   else if ((ccvt & IX86_CALLCVT_THISCALL) != 0)
5541     return 1;
5542
5543   /* Use register calling convention for local functions when possible.  */
5544   if (decl
5545       && TREE_CODE (decl) == FUNCTION_DECL
5546       && optimize
5547       && !(profile_flag && !flag_fentry))
5548     {
5549       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
5550       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE (decl));
5551       if (i && i->local && i->can_change_signature)
5552         {
5553           int local_regparm, globals = 0, regno;
5554
5555           /* Make sure no regparm register is taken by a
5556              fixed register variable.  */
5557           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
5558             if (fixed_regs[local_regparm])
5559               break;
5560
5561           /* We don't want to use regparm(3) for nested functions as
5562              these use a static chain pointer in the third argument.  */
5563           if (local_regparm == 3 && DECL_STATIC_CHAIN (decl))
5564             local_regparm = 2;
5565
5566           /* In 32-bit mode save a register for the split stack.  */
5567           if (!TARGET_64BIT && local_regparm == 3 && flag_split_stack)
5568             local_regparm = 2;
5569
5570           /* Each fixed register usage increases register pressure,
5571              so less registers should be used for argument passing.
5572              This functionality can be overriden by an explicit
5573              regparm value.  */
5574           for (regno = 0; regno <= DI_REG; regno++)
5575             if (fixed_regs[regno])
5576               globals++;
5577
5578           local_regparm
5579             = globals < local_regparm ? local_regparm - globals : 0;
5580
5581           if (local_regparm > regparm)
5582             regparm = local_regparm;
5583         }
5584     }
5585
5586   return regparm;
5587 }
5588
5589 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
5590    DFmode (2) arguments in SSE registers for a function with the
5591    indicated TYPE and DECL.  DECL may be NULL when calling function
5592    indirectly or considering a libcall.  Otherwise return 0.  */
5593
5594 static int
5595 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
5596 {
5597   gcc_assert (!TARGET_64BIT);
5598
5599   /* Use SSE registers to pass SFmode and DFmode arguments if requested
5600      by the sseregparm attribute.  */
5601   if (TARGET_SSEREGPARM
5602       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
5603     {
5604       if (!TARGET_SSE)
5605         {
5606           if (warn)
5607             {
5608               if (decl)
5609                 error ("calling %qD with attribute sseregparm without "
5610                        "SSE/SSE2 enabled", decl);
5611               else
5612                 error ("calling %qT with attribute sseregparm without "
5613                        "SSE/SSE2 enabled", type);
5614             }
5615           return 0;
5616         }
5617
5618       return 2;
5619     }
5620
5621   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
5622      (and DFmode for SSE2) arguments in SSE registers.  */
5623   if (decl && TARGET_SSE_MATH && optimize
5624       && !(profile_flag && !flag_fentry))
5625     {
5626       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
5627       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
5628       if (i && i->local && i->can_change_signature)
5629         return TARGET_SSE2 ? 2 : 1;
5630     }
5631
5632   return 0;
5633 }
5634
5635 /* Return true if EAX is live at the start of the function.  Used by
5636    ix86_expand_prologue to determine if we need special help before
5637    calling allocate_stack_worker.  */
5638
5639 static bool
5640 ix86_eax_live_at_start_p (void)
5641 {
5642   /* Cheat.  Don't bother working forward from ix86_function_regparm
5643      to the function type to whether an actual argument is located in
5644      eax.  Instead just look at cfg info, which is still close enough
5645      to correct at this point.  This gives false positives for broken
5646      functions that might use uninitialized data that happens to be
5647      allocated in eax, but who cares?  */
5648   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
5649 }
5650
5651 static bool
5652 ix86_keep_aggregate_return_pointer (tree fntype)
5653 {
5654   tree attr;
5655
5656   if (!TARGET_64BIT)
5657     {
5658       attr = lookup_attribute ("callee_pop_aggregate_return",
5659                                TYPE_ATTRIBUTES (fntype));
5660       if (attr)
5661         return (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))) == 0);
5662
5663       /* For 32-bit MS-ABI the default is to keep aggregate
5664          return pointer.  */
5665       if (ix86_function_type_abi (fntype) == MS_ABI)
5666         return true;
5667     }
5668   return KEEP_AGGREGATE_RETURN_POINTER != 0;
5669 }
5670
5671 /* Value is the number of bytes of arguments automatically
5672    popped when returning from a subroutine call.
5673    FUNDECL is the declaration node of the function (as a tree),
5674    FUNTYPE is the data type of the function (as a tree),
5675    or for a library call it is an identifier node for the subroutine name.
5676    SIZE is the number of bytes of arguments passed on the stack.
5677
5678    On the 80386, the RTD insn may be used to pop them if the number
5679      of args is fixed, but if the number is variable then the caller
5680      must pop them all.  RTD can't be used for library calls now
5681      because the library is compiled with the Unix compiler.
5682    Use of RTD is a selectable option, since it is incompatible with
5683    standard Unix calling sequences.  If the option is not selected,
5684    the caller must always pop the args.
5685
5686    The attribute stdcall is equivalent to RTD on a per module basis.  */
5687
5688 static int
5689 ix86_return_pops_args (tree fundecl, tree funtype, int size)
5690 {
5691   unsigned int ccvt;
5692
5693   /* None of the 64-bit ABIs pop arguments.  */
5694   if (TARGET_64BIT)
5695     return 0;
5696
5697   ccvt = ix86_get_callcvt (funtype);
5698
5699   if ((ccvt & (IX86_CALLCVT_STDCALL | IX86_CALLCVT_FASTCALL
5700                | IX86_CALLCVT_THISCALL)) != 0
5701       && ! stdarg_p (funtype))
5702     return size;
5703
5704   /* Lose any fake structure return argument if it is passed on the stack.  */
5705   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
5706       && !ix86_keep_aggregate_return_pointer (funtype))
5707     {
5708       int nregs = ix86_function_regparm (funtype, fundecl);
5709       if (nregs == 0)
5710         return GET_MODE_SIZE (Pmode);
5711     }
5712
5713   return 0;
5714 }
5715 \f
5716 /* Argument support functions.  */
5717
5718 /* Return true when register may be used to pass function parameters.  */
5719 bool
5720 ix86_function_arg_regno_p (int regno)
5721 {
5722   int i;
5723   const int *parm_regs;
5724
5725   if (!TARGET_64BIT)
5726     {
5727       if (TARGET_MACHO)
5728         return (regno < REGPARM_MAX
5729                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
5730       else
5731         return (regno < REGPARM_MAX
5732                 || (TARGET_MMX && MMX_REGNO_P (regno)
5733                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
5734                 || (TARGET_SSE && SSE_REGNO_P (regno)
5735                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
5736     }
5737
5738   if (TARGET_MACHO)
5739     {
5740       if (SSE_REGNO_P (regno) && TARGET_SSE)
5741         return true;
5742     }
5743   else
5744     {
5745       if (TARGET_SSE && SSE_REGNO_P (regno)
5746           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
5747         return true;
5748     }
5749
5750   /* TODO: The function should depend on current function ABI but
5751      builtins.c would need updating then. Therefore we use the
5752      default ABI.  */
5753
5754   /* RAX is used as hidden argument to va_arg functions.  */
5755   if (ix86_abi == SYSV_ABI && regno == AX_REG)
5756     return true;
5757
5758   if (ix86_abi == MS_ABI)
5759     parm_regs = x86_64_ms_abi_int_parameter_registers;
5760   else
5761     parm_regs = x86_64_int_parameter_registers;
5762   for (i = 0; i < (ix86_abi == MS_ABI
5763                    ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++)
5764     if (regno == parm_regs[i])
5765       return true;
5766   return false;
5767 }
5768
5769 /* Return if we do not know how to pass TYPE solely in registers.  */
5770
5771 static bool
5772 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
5773 {
5774   if (must_pass_in_stack_var_size_or_pad (mode, type))
5775     return true;
5776
5777   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
5778      The layout_type routine is crafty and tries to trick us into passing
5779      currently unsupported vector types on the stack by using TImode.  */
5780   return (!TARGET_64BIT && mode == TImode
5781           && type && TREE_CODE (type) != VECTOR_TYPE);
5782 }
5783
5784 /* It returns the size, in bytes, of the area reserved for arguments passed
5785    in registers for the function represented by fndecl dependent to the used
5786    abi format.  */
5787 int
5788 ix86_reg_parm_stack_space (const_tree fndecl)
5789 {
5790   enum calling_abi call_abi = SYSV_ABI;
5791   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
5792     call_abi = ix86_function_abi (fndecl);
5793   else
5794     call_abi = ix86_function_type_abi (fndecl);
5795   if (TARGET_64BIT && call_abi == MS_ABI)
5796     return 32;
5797   return 0;
5798 }
5799
5800 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
5801    call abi used.  */
5802 enum calling_abi
5803 ix86_function_type_abi (const_tree fntype)
5804 {
5805   if (fntype != NULL_TREE && TYPE_ATTRIBUTES (fntype) != NULL_TREE)
5806     {
5807       enum calling_abi abi = ix86_abi;
5808       if (abi == SYSV_ABI)
5809         {
5810           if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
5811             abi = MS_ABI;
5812         }
5813       else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
5814         abi = SYSV_ABI;
5815       return abi;
5816     }
5817   return ix86_abi;
5818 }
5819
5820 static bool
5821 ix86_function_ms_hook_prologue (const_tree fn)
5822 {
5823   if (fn && lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fn)))
5824     {
5825       if (decl_function_context (fn) != NULL_TREE)
5826         error_at (DECL_SOURCE_LOCATION (fn),
5827                   "ms_hook_prologue is not compatible with nested function");
5828       else
5829         return true;
5830     }
5831   return false;
5832 }
5833
5834 static enum calling_abi
5835 ix86_function_abi (const_tree fndecl)
5836 {
5837   if (! fndecl)
5838     return ix86_abi;
5839   return ix86_function_type_abi (TREE_TYPE (fndecl));
5840 }
5841
5842 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
5843    call abi used.  */
5844 enum calling_abi
5845 ix86_cfun_abi (void)
5846 {
5847   if (! cfun)
5848     return ix86_abi;
5849   return cfun->machine->call_abi;
5850 }
5851
5852 /* Write the extra assembler code needed to declare a function properly.  */
5853
5854 void
5855 ix86_asm_output_function_label (FILE *asm_out_file, const char *fname,
5856                                 tree decl)
5857 {
5858   bool is_ms_hook = ix86_function_ms_hook_prologue (decl);
5859
5860   if (is_ms_hook)
5861     {
5862       int i, filler_count = (TARGET_64BIT ? 32 : 16);
5863       unsigned int filler_cc = 0xcccccccc;
5864
5865       for (i = 0; i < filler_count; i += 4)
5866         fprintf (asm_out_file, ASM_LONG " %#x\n", filler_cc);
5867     }
5868
5869 #ifdef SUBTARGET_ASM_UNWIND_INIT
5870   SUBTARGET_ASM_UNWIND_INIT (asm_out_file);
5871 #endif
5872
5873   ASM_OUTPUT_LABEL (asm_out_file, fname);
5874
5875   /* Output magic byte marker, if hot-patch attribute is set.  */
5876   if (is_ms_hook)
5877     {
5878       if (TARGET_64BIT)
5879         {
5880           /* leaq [%rsp + 0], %rsp  */
5881           asm_fprintf (asm_out_file, ASM_BYTE
5882                        "0x48, 0x8d, 0xa4, 0x24, 0x00, 0x00, 0x00, 0x00\n");
5883         }
5884       else
5885         {
5886           /* movl.s %edi, %edi
5887              push   %ebp
5888              movl.s %esp, %ebp */
5889           asm_fprintf (asm_out_file, ASM_BYTE
5890                        "0x8b, 0xff, 0x55, 0x8b, 0xec\n");
5891         }
5892     }
5893 }
5894
5895 /* regclass.c  */
5896 extern void init_regs (void);
5897
5898 /* Implementation of call abi switching target hook. Specific to FNDECL
5899    the specific call register sets are set.  See also
5900    ix86_conditional_register_usage for more details.  */
5901 void
5902 ix86_call_abi_override (const_tree fndecl)
5903 {
5904   if (fndecl == NULL_TREE)
5905     cfun->machine->call_abi = ix86_abi;
5906   else
5907     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
5908 }
5909
5910 /* 64-bit MS and SYSV ABI have different set of call used registers.  Avoid
5911    expensive re-initialization of init_regs each time we switch function context
5912    since this is needed only during RTL expansion.  */
5913 static void
5914 ix86_maybe_switch_abi (void)
5915 {
5916   if (TARGET_64BIT &&
5917       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
5918     reinit_regs ();
5919 }
5920
5921 /* Initialize a variable CUM of type CUMULATIVE_ARGS
5922    for a call to a function whose data type is FNTYPE.
5923    For a library call, FNTYPE is 0.  */
5924
5925 void
5926 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
5927                       tree fntype,      /* tree ptr for function decl */
5928                       rtx libname,      /* SYMBOL_REF of library name or 0 */
5929                       tree fndecl,
5930                       int caller)
5931 {
5932   struct cgraph_local_info *i;
5933   tree fnret_type;
5934
5935   memset (cum, 0, sizeof (*cum));
5936
5937   /* Initialize for the current callee.  */
5938   if (caller)
5939     {
5940       cfun->machine->callee_pass_avx256_p = false;
5941       cfun->machine->callee_return_avx256_p = false;
5942     }
5943
5944   if (fndecl)
5945     {
5946       i = cgraph_local_info (fndecl);
5947       cum->call_abi = ix86_function_abi (fndecl);
5948       fnret_type = TREE_TYPE (TREE_TYPE (fndecl));
5949     }
5950   else
5951     {
5952       i = NULL;
5953       cum->call_abi = ix86_function_type_abi (fntype);
5954       if (fntype)
5955         fnret_type = TREE_TYPE (fntype);
5956       else
5957         fnret_type = NULL;
5958     }
5959
5960   if (TARGET_VZEROUPPER && fnret_type)
5961     {
5962       rtx fnret_value = ix86_function_value (fnret_type, fntype,
5963                                              false);
5964       if (function_pass_avx256_p (fnret_value))
5965         {
5966           /* The return value of this function uses 256bit AVX modes.  */
5967           if (caller)
5968             cfun->machine->callee_return_avx256_p = true;
5969           else
5970             cfun->machine->caller_return_avx256_p = true;
5971         }
5972     }
5973
5974   cum->caller = caller;
5975
5976   /* Set up the number of registers to use for passing arguments.  */
5977
5978   if (TARGET_64BIT && cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
5979     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
5980            "or subtarget optimization implying it");
5981   cum->nregs = ix86_regparm;
5982   if (TARGET_64BIT)
5983     {
5984       cum->nregs = (cum->call_abi == SYSV_ABI
5985                    ? X86_64_REGPARM_MAX
5986                    : X86_64_MS_REGPARM_MAX);
5987     }
5988   if (TARGET_SSE)
5989     {
5990       cum->sse_nregs = SSE_REGPARM_MAX;
5991       if (TARGET_64BIT)
5992         {
5993           cum->sse_nregs = (cum->call_abi == SYSV_ABI
5994                            ? X86_64_SSE_REGPARM_MAX
5995                            : X86_64_MS_SSE_REGPARM_MAX);
5996         }
5997     }
5998   if (TARGET_MMX)
5999     cum->mmx_nregs = MMX_REGPARM_MAX;
6000   cum->warn_avx = true;
6001   cum->warn_sse = true;
6002   cum->warn_mmx = true;
6003
6004   /* Because type might mismatch in between caller and callee, we need to
6005      use actual type of function for local calls.
6006      FIXME: cgraph_analyze can be told to actually record if function uses
6007      va_start so for local functions maybe_vaarg can be made aggressive
6008      helping K&R code.
6009      FIXME: once typesytem is fixed, we won't need this code anymore.  */
6010   if (i && i->local && i->can_change_signature)
6011     fntype = TREE_TYPE (fndecl);
6012   cum->maybe_vaarg = (fntype
6013                       ? (!prototype_p (fntype) || stdarg_p (fntype))
6014                       : !libname);
6015
6016   if (!TARGET_64BIT)
6017     {
6018       /* If there are variable arguments, then we won't pass anything
6019          in registers in 32-bit mode. */
6020       if (stdarg_p (fntype))
6021         {
6022           cum->nregs = 0;
6023           cum->sse_nregs = 0;
6024           cum->mmx_nregs = 0;
6025           cum->warn_avx = 0;
6026           cum->warn_sse = 0;
6027           cum->warn_mmx = 0;
6028           return;
6029         }
6030
6031       /* Use ecx and edx registers if function has fastcall attribute,
6032          else look for regparm information.  */
6033       if (fntype)
6034         {
6035           unsigned int ccvt = ix86_get_callcvt (fntype);
6036           if ((ccvt & IX86_CALLCVT_THISCALL) != 0)
6037             {
6038               cum->nregs = 1;
6039               cum->fastcall = 1; /* Same first register as in fastcall.  */
6040             }
6041           else if ((ccvt & IX86_CALLCVT_FASTCALL) != 0)
6042             {
6043               cum->nregs = 2;
6044               cum->fastcall = 1;
6045             }
6046           else
6047             cum->nregs = ix86_function_regparm (fntype, fndecl);
6048         }
6049
6050       /* Set up the number of SSE registers used for passing SFmode
6051          and DFmode arguments.  Warn for mismatching ABI.  */
6052       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
6053     }
6054 }
6055
6056 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
6057    But in the case of vector types, it is some vector mode.
6058
6059    When we have only some of our vector isa extensions enabled, then there
6060    are some modes for which vector_mode_supported_p is false.  For these
6061    modes, the generic vector support in gcc will choose some non-vector mode
6062    in order to implement the type.  By computing the natural mode, we'll
6063    select the proper ABI location for the operand and not depend on whatever
6064    the middle-end decides to do with these vector types.
6065
6066    The midde-end can't deal with the vector types > 16 bytes.  In this
6067    case, we return the original mode and warn ABI change if CUM isn't
6068    NULL.  */
6069
6070 static enum machine_mode
6071 type_natural_mode (const_tree type, const CUMULATIVE_ARGS *cum)
6072 {
6073   enum machine_mode mode = TYPE_MODE (type);
6074
6075   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
6076     {
6077       HOST_WIDE_INT size = int_size_in_bytes (type);
6078       if ((size == 8 || size == 16 || size == 32)
6079           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
6080           && TYPE_VECTOR_SUBPARTS (type) > 1)
6081         {
6082           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
6083
6084           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6085             mode = MIN_MODE_VECTOR_FLOAT;
6086           else
6087             mode = MIN_MODE_VECTOR_INT;
6088
6089           /* Get the mode which has this inner mode and number of units.  */
6090           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
6091             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
6092                 && GET_MODE_INNER (mode) == innermode)
6093               {
6094                 if (size == 32 && !TARGET_AVX)
6095                   {
6096                     static bool warnedavx;
6097
6098                     if (cum
6099                         && !warnedavx
6100                         && cum->warn_avx)
6101                       {
6102                         warnedavx = true;
6103                         warning (0, "AVX vector argument without AVX "
6104                                  "enabled changes the ABI");
6105                       }
6106                     return TYPE_MODE (type);
6107                   }
6108                 else
6109                   return mode;
6110               }
6111
6112           gcc_unreachable ();
6113         }
6114     }
6115
6116   return mode;
6117 }
6118
6119 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
6120    this may not agree with the mode that the type system has chosen for the
6121    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
6122    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
6123
6124 static rtx
6125 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
6126                      unsigned int regno)
6127 {
6128   rtx tmp;
6129
6130   if (orig_mode != BLKmode)
6131     tmp = gen_rtx_REG (orig_mode, regno);
6132   else
6133     {
6134       tmp = gen_rtx_REG (mode, regno);
6135       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
6136       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
6137     }
6138
6139   return tmp;
6140 }
6141
6142 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
6143    of this code is to classify each 8bytes of incoming argument by the register
6144    class and assign registers accordingly.  */
6145
6146 /* Return the union class of CLASS1 and CLASS2.
6147    See the x86-64 PS ABI for details.  */
6148
6149 static enum x86_64_reg_class
6150 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
6151 {
6152   /* Rule #1: If both classes are equal, this is the resulting class.  */
6153   if (class1 == class2)
6154     return class1;
6155
6156   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
6157      the other class.  */
6158   if (class1 == X86_64_NO_CLASS)
6159     return class2;
6160   if (class2 == X86_64_NO_CLASS)
6161     return class1;
6162
6163   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
6164   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
6165     return X86_64_MEMORY_CLASS;
6166
6167   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
6168   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
6169       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
6170     return X86_64_INTEGERSI_CLASS;
6171   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
6172       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
6173     return X86_64_INTEGER_CLASS;
6174
6175   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
6176      MEMORY is used.  */
6177   if (class1 == X86_64_X87_CLASS
6178       || class1 == X86_64_X87UP_CLASS
6179       || class1 == X86_64_COMPLEX_X87_CLASS
6180       || class2 == X86_64_X87_CLASS
6181       || class2 == X86_64_X87UP_CLASS
6182       || class2 == X86_64_COMPLEX_X87_CLASS)
6183     return X86_64_MEMORY_CLASS;
6184
6185   /* Rule #6: Otherwise class SSE is used.  */
6186   return X86_64_SSE_CLASS;
6187 }
6188
6189 /* Classify the argument of type TYPE and mode MODE.
6190    CLASSES will be filled by the register class used to pass each word
6191    of the operand.  The number of words is returned.  In case the parameter
6192    should be passed in memory, 0 is returned. As a special case for zero
6193    sized containers, classes[0] will be NO_CLASS and 1 is returned.
6194
6195    BIT_OFFSET is used internally for handling records and specifies offset
6196    of the offset in bits modulo 256 to avoid overflow cases.
6197
6198    See the x86-64 PS ABI for details.
6199 */
6200
6201 static int
6202 classify_argument (enum machine_mode mode, const_tree type,
6203                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
6204 {
6205   HOST_WIDE_INT bytes =
6206     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
6207   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6208
6209   /* Variable sized entities are always passed/returned in memory.  */
6210   if (bytes < 0)
6211     return 0;
6212
6213   if (mode != VOIDmode
6214       && targetm.calls.must_pass_in_stack (mode, type))
6215     return 0;
6216
6217   if (type && AGGREGATE_TYPE_P (type))
6218     {
6219       int i;
6220       tree field;
6221       enum x86_64_reg_class subclasses[MAX_CLASSES];
6222
6223       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
6224       if (bytes > 32)
6225         return 0;
6226
6227       for (i = 0; i < words; i++)
6228         classes[i] = X86_64_NO_CLASS;
6229
6230       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
6231          signalize memory class, so handle it as special case.  */
6232       if (!words)
6233         {
6234           classes[0] = X86_64_NO_CLASS;
6235           return 1;
6236         }
6237
6238       /* Classify each field of record and merge classes.  */
6239       switch (TREE_CODE (type))
6240         {
6241         case RECORD_TYPE:
6242           /* And now merge the fields of structure.  */
6243           for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6244             {
6245               if (TREE_CODE (field) == FIELD_DECL)
6246                 {
6247                   int num;
6248
6249                   if (TREE_TYPE (field) == error_mark_node)
6250                     continue;
6251
6252                   /* Bitfields are always classified as integer.  Handle them
6253                      early, since later code would consider them to be
6254                      misaligned integers.  */
6255                   if (DECL_BIT_FIELD (field))
6256                     {
6257                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
6258                            i < ((int_bit_position (field) + (bit_offset % 64))
6259                                 + tree_low_cst (DECL_SIZE (field), 0)
6260                                 + 63) / 8 / 8; i++)
6261                         classes[i] =
6262                           merge_classes (X86_64_INTEGER_CLASS,
6263                                          classes[i]);
6264                     }
6265                   else
6266                     {
6267                       int pos;
6268
6269                       type = TREE_TYPE (field);
6270
6271                       /* Flexible array member is ignored.  */
6272                       if (TYPE_MODE (type) == BLKmode
6273                           && TREE_CODE (type) == ARRAY_TYPE
6274                           && TYPE_SIZE (type) == NULL_TREE
6275                           && TYPE_DOMAIN (type) != NULL_TREE
6276                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
6277                               == NULL_TREE))
6278                         {
6279                           static bool warned;
6280
6281                           if (!warned && warn_psabi)
6282                             {
6283                               warned = true;
6284                               inform (input_location,
6285                                       "the ABI of passing struct with"
6286                                       " a flexible array member has"
6287                                       " changed in GCC 4.4");
6288                             }
6289                           continue;
6290                         }
6291                       num = classify_argument (TYPE_MODE (type), type,
6292                                                subclasses,
6293                                                (int_bit_position (field)
6294                                                 + bit_offset) % 256);
6295                       if (!num)
6296                         return 0;
6297                       pos = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
6298                       for (i = 0; i < num && (i + pos) < words; i++)
6299                         classes[i + pos] =
6300                           merge_classes (subclasses[i], classes[i + pos]);
6301                     }
6302                 }
6303             }
6304           break;
6305
6306         case ARRAY_TYPE:
6307           /* Arrays are handled as small records.  */
6308           {
6309             int num;
6310             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
6311                                      TREE_TYPE (type), subclasses, bit_offset);
6312             if (!num)
6313               return 0;
6314
6315             /* The partial classes are now full classes.  */
6316             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
6317               subclasses[0] = X86_64_SSE_CLASS;
6318             if (subclasses[0] == X86_64_INTEGERSI_CLASS
6319                 && !((bit_offset % 64) == 0 && bytes == 4))
6320               subclasses[0] = X86_64_INTEGER_CLASS;
6321
6322             for (i = 0; i < words; i++)
6323               classes[i] = subclasses[i % num];
6324
6325             break;
6326           }
6327         case UNION_TYPE:
6328         case QUAL_UNION_TYPE:
6329           /* Unions are similar to RECORD_TYPE but offset is always 0.
6330              */
6331           for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6332             {
6333               if (TREE_CODE (field) == FIELD_DECL)
6334                 {
6335                   int num;
6336
6337                   if (TREE_TYPE (field) == error_mark_node)
6338                     continue;
6339
6340                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
6341                                            TREE_TYPE (field), subclasses,
6342                                            bit_offset);
6343                   if (!num)
6344                     return 0;
6345                   for (i = 0; i < num; i++)
6346                     classes[i] = merge_classes (subclasses[i], classes[i]);
6347                 }
6348             }
6349           break;
6350
6351         default:
6352           gcc_unreachable ();
6353         }
6354
6355       if (words > 2)
6356         {
6357           /* When size > 16 bytes, if the first one isn't
6358              X86_64_SSE_CLASS or any other ones aren't
6359              X86_64_SSEUP_CLASS, everything should be passed in
6360              memory.  */
6361           if (classes[0] != X86_64_SSE_CLASS)
6362               return 0;
6363
6364           for (i = 1; i < words; i++)
6365             if (classes[i] != X86_64_SSEUP_CLASS)
6366               return 0;
6367         }
6368
6369       /* Final merger cleanup.  */
6370       for (i = 0; i < words; i++)
6371         {
6372           /* If one class is MEMORY, everything should be passed in
6373              memory.  */
6374           if (classes[i] == X86_64_MEMORY_CLASS)
6375             return 0;
6376
6377           /* The X86_64_SSEUP_CLASS should be always preceded by
6378              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
6379           if (classes[i] == X86_64_SSEUP_CLASS
6380               && classes[i - 1] != X86_64_SSE_CLASS
6381               && classes[i - 1] != X86_64_SSEUP_CLASS)
6382             {
6383               /* The first one should never be X86_64_SSEUP_CLASS.  */
6384               gcc_assert (i != 0);
6385               classes[i] = X86_64_SSE_CLASS;
6386             }
6387
6388           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
6389                everything should be passed in memory.  */
6390           if (classes[i] == X86_64_X87UP_CLASS
6391               && (classes[i - 1] != X86_64_X87_CLASS))
6392             {
6393               static bool warned;
6394
6395               /* The first one should never be X86_64_X87UP_CLASS.  */
6396               gcc_assert (i != 0);
6397               if (!warned && warn_psabi)
6398                 {
6399                   warned = true;
6400                   inform (input_location,
6401                           "the ABI of passing union with long double"
6402                           " has changed in GCC 4.4");
6403                 }
6404               return 0;
6405             }
6406         }
6407       return words;
6408     }
6409
6410   /* Compute alignment needed.  We align all types to natural boundaries with
6411      exception of XFmode that is aligned to 64bits.  */
6412   if (mode != VOIDmode && mode != BLKmode)
6413     {
6414       int mode_alignment = GET_MODE_BITSIZE (mode);
6415
6416       if (mode == XFmode)
6417         mode_alignment = 128;
6418       else if (mode == XCmode)
6419         mode_alignment = 256;
6420       if (COMPLEX_MODE_P (mode))
6421         mode_alignment /= 2;
6422       /* Misaligned fields are always returned in memory.  */
6423       if (bit_offset % mode_alignment)
6424         return 0;
6425     }
6426
6427   /* for V1xx modes, just use the base mode */
6428   if (VECTOR_MODE_P (mode) && mode != V1DImode && mode != V1TImode
6429       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
6430     mode = GET_MODE_INNER (mode);
6431
6432   /* Classification of atomic types.  */
6433   switch (mode)
6434     {
6435     case SDmode:
6436     case DDmode:
6437       classes[0] = X86_64_SSE_CLASS;
6438       return 1;
6439     case TDmode:
6440       classes[0] = X86_64_SSE_CLASS;
6441       classes[1] = X86_64_SSEUP_CLASS;
6442       return 2;
6443     case DImode:
6444     case SImode:
6445     case HImode:
6446     case QImode:
6447     case CSImode:
6448     case CHImode:
6449     case CQImode:
6450       {
6451         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
6452
6453         if (size <= 32)
6454           {
6455             classes[0] = X86_64_INTEGERSI_CLASS;
6456             return 1;
6457           }
6458         else if (size <= 64)
6459           {
6460             classes[0] = X86_64_INTEGER_CLASS;
6461             return 1;
6462           }
6463         else if (size <= 64+32)
6464           {
6465             classes[0] = X86_64_INTEGER_CLASS;
6466             classes[1] = X86_64_INTEGERSI_CLASS;
6467             return 2;
6468           }
6469         else if (size <= 64+64)
6470           {
6471             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
6472             return 2;
6473           }
6474         else
6475           gcc_unreachable ();
6476       }
6477     case CDImode:
6478     case TImode:
6479       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
6480       return 2;
6481     case COImode:
6482     case OImode:
6483       /* OImode shouldn't be used directly.  */
6484       gcc_unreachable ();
6485     case CTImode:
6486       return 0;
6487     case SFmode:
6488       if (!(bit_offset % 64))
6489         classes[0] = X86_64_SSESF_CLASS;
6490       else
6491         classes[0] = X86_64_SSE_CLASS;
6492       return 1;
6493     case DFmode:
6494       classes[0] = X86_64_SSEDF_CLASS;
6495       return 1;
6496     case XFmode:
6497       classes[0] = X86_64_X87_CLASS;
6498       classes[1] = X86_64_X87UP_CLASS;
6499       return 2;
6500     case TFmode:
6501       classes[0] = X86_64_SSE_CLASS;
6502       classes[1] = X86_64_SSEUP_CLASS;
6503       return 2;
6504     case SCmode:
6505       classes[0] = X86_64_SSE_CLASS;
6506       if (!(bit_offset % 64))
6507         return 1;
6508       else
6509         {
6510           static bool warned;
6511
6512           if (!warned && warn_psabi)
6513             {
6514               warned = true;
6515               inform (input_location,
6516                       "the ABI of passing structure with complex float"
6517                       " member has changed in GCC 4.4");
6518             }
6519           classes[1] = X86_64_SSESF_CLASS;
6520           return 2;
6521         }
6522     case DCmode:
6523       classes[0] = X86_64_SSEDF_CLASS;
6524       classes[1] = X86_64_SSEDF_CLASS;
6525       return 2;
6526     case XCmode:
6527       classes[0] = X86_64_COMPLEX_X87_CLASS;
6528       return 1;
6529     case TCmode:
6530       /* This modes is larger than 16 bytes.  */
6531       return 0;
6532     case V8SFmode:
6533     case V8SImode:
6534     case V32QImode:
6535     case V16HImode:
6536     case V4DFmode:
6537     case V4DImode:
6538       classes[0] = X86_64_SSE_CLASS;
6539       classes[1] = X86_64_SSEUP_CLASS;
6540       classes[2] = X86_64_SSEUP_CLASS;
6541       classes[3] = X86_64_SSEUP_CLASS;
6542       return 4;
6543     case V4SFmode:
6544     case V4SImode:
6545     case V16QImode:
6546     case V8HImode:
6547     case V2DFmode:
6548     case V2DImode:
6549       classes[0] = X86_64_SSE_CLASS;
6550       classes[1] = X86_64_SSEUP_CLASS;
6551       return 2;
6552     case V1TImode:
6553     case V1DImode:
6554     case V2SFmode:
6555     case V2SImode:
6556     case V4HImode:
6557     case V8QImode:
6558       classes[0] = X86_64_SSE_CLASS;
6559       return 1;
6560     case BLKmode:
6561     case VOIDmode:
6562       return 0;
6563     default:
6564       gcc_assert (VECTOR_MODE_P (mode));
6565
6566       if (bytes > 16)
6567         return 0;
6568
6569       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
6570
6571       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
6572         classes[0] = X86_64_INTEGERSI_CLASS;
6573       else
6574         classes[0] = X86_64_INTEGER_CLASS;
6575       classes[1] = X86_64_INTEGER_CLASS;
6576       return 1 + (bytes > 8);
6577     }
6578 }
6579
6580 /* Examine the argument and return set number of register required in each
6581    class.  Return 0 iff parameter should be passed in memory.  */
6582 static int
6583 examine_argument (enum machine_mode mode, const_tree type, int in_return,
6584                   int *int_nregs, int *sse_nregs)
6585 {
6586   enum x86_64_reg_class regclass[MAX_CLASSES];
6587   int n = classify_argument (mode, type, regclass, 0);
6588
6589   *int_nregs = 0;
6590   *sse_nregs = 0;
6591   if (!n)
6592     return 0;
6593   for (n--; n >= 0; n--)
6594     switch (regclass[n])
6595       {
6596       case X86_64_INTEGER_CLASS:
6597       case X86_64_INTEGERSI_CLASS:
6598         (*int_nregs)++;
6599         break;
6600       case X86_64_SSE_CLASS:
6601       case X86_64_SSESF_CLASS:
6602       case X86_64_SSEDF_CLASS:
6603         (*sse_nregs)++;
6604         break;
6605       case X86_64_NO_CLASS:
6606       case X86_64_SSEUP_CLASS:
6607         break;
6608       case X86_64_X87_CLASS:
6609       case X86_64_X87UP_CLASS:
6610         if (!in_return)
6611           return 0;
6612         break;
6613       case X86_64_COMPLEX_X87_CLASS:
6614         return in_return ? 2 : 0;
6615       case X86_64_MEMORY_CLASS:
6616         gcc_unreachable ();
6617       }
6618   return 1;
6619 }
6620
6621 /* Construct container for the argument used by GCC interface.  See
6622    FUNCTION_ARG for the detailed description.  */
6623
6624 static rtx
6625 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
6626                      const_tree type, int in_return, int nintregs, int nsseregs,
6627                      const int *intreg, int sse_regno)
6628 {
6629   /* The following variables hold the static issued_error state.  */
6630   static bool issued_sse_arg_error;
6631   static bool issued_sse_ret_error;
6632   static bool issued_x87_ret_error;
6633
6634   enum machine_mode tmpmode;
6635   int bytes =
6636     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
6637   enum x86_64_reg_class regclass[MAX_CLASSES];
6638   int n;
6639   int i;
6640   int nexps = 0;
6641   int needed_sseregs, needed_intregs;
6642   rtx exp[MAX_CLASSES];
6643   rtx ret;
6644
6645   n = classify_argument (mode, type, regclass, 0);
6646   if (!n)
6647     return NULL;
6648   if (!examine_argument (mode, type, in_return, &needed_intregs,
6649                          &needed_sseregs))
6650     return NULL;
6651   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
6652     return NULL;
6653
6654   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
6655      some less clueful developer tries to use floating-point anyway.  */
6656   if (needed_sseregs && !TARGET_SSE)
6657     {
6658       if (in_return)
6659         {
6660           if (!issued_sse_ret_error)
6661             {
6662               error ("SSE register return with SSE disabled");
6663               issued_sse_ret_error = true;
6664             }
6665         }
6666       else if (!issued_sse_arg_error)
6667         {
6668           error ("SSE register argument with SSE disabled");
6669           issued_sse_arg_error = true;
6670         }
6671       return NULL;
6672     }
6673
6674   /* Likewise, error if the ABI requires us to return values in the
6675      x87 registers and the user specified -mno-80387.  */
6676   if (!TARGET_80387 && in_return)
6677     for (i = 0; i < n; i++)
6678       if (regclass[i] == X86_64_X87_CLASS
6679           || regclass[i] == X86_64_X87UP_CLASS
6680           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
6681         {
6682           if (!issued_x87_ret_error)
6683             {
6684               error ("x87 register return with x87 disabled");
6685               issued_x87_ret_error = true;
6686             }
6687           return NULL;
6688         }
6689
6690   /* First construct simple cases.  Avoid SCmode, since we want to use
6691      single register to pass this type.  */
6692   if (n == 1 && mode != SCmode)
6693     switch (regclass[0])
6694       {
6695       case X86_64_INTEGER_CLASS:
6696       case X86_64_INTEGERSI_CLASS:
6697         return gen_rtx_REG (mode, intreg[0]);
6698       case X86_64_SSE_CLASS:
6699       case X86_64_SSESF_CLASS:
6700       case X86_64_SSEDF_CLASS:
6701         if (mode != BLKmode)
6702           return gen_reg_or_parallel (mode, orig_mode,
6703                                       SSE_REGNO (sse_regno));
6704         break;
6705       case X86_64_X87_CLASS:
6706       case X86_64_COMPLEX_X87_CLASS:
6707         return gen_rtx_REG (mode, FIRST_STACK_REG);
6708       case X86_64_NO_CLASS:
6709         /* Zero sized array, struct or class.  */
6710         return NULL;
6711       default:
6712         gcc_unreachable ();
6713       }
6714   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
6715       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
6716     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
6717   if (n == 4
6718       && regclass[0] == X86_64_SSE_CLASS
6719       && regclass[1] == X86_64_SSEUP_CLASS
6720       && regclass[2] == X86_64_SSEUP_CLASS
6721       && regclass[3] == X86_64_SSEUP_CLASS
6722       && mode != BLKmode)
6723     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
6724
6725   if (n == 2
6726       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
6727     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
6728   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
6729       && regclass[1] == X86_64_INTEGER_CLASS
6730       && (mode == CDImode || mode == TImode || mode == TFmode)
6731       && intreg[0] + 1 == intreg[1])
6732     return gen_rtx_REG (mode, intreg[0]);
6733
6734   /* Otherwise figure out the entries of the PARALLEL.  */
6735   for (i = 0; i < n; i++)
6736     {
6737       int pos;
6738
6739       switch (regclass[i])
6740         {
6741           case X86_64_NO_CLASS:
6742             break;
6743           case X86_64_INTEGER_CLASS:
6744           case X86_64_INTEGERSI_CLASS:
6745             /* Merge TImodes on aligned occasions here too.  */
6746             if (i * 8 + 8 > bytes)
6747               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
6748             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
6749               tmpmode = SImode;
6750             else
6751               tmpmode = DImode;
6752             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
6753             if (tmpmode == BLKmode)
6754               tmpmode = DImode;
6755             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6756                                                gen_rtx_REG (tmpmode, *intreg),
6757                                                GEN_INT (i*8));
6758             intreg++;
6759             break;
6760           case X86_64_SSESF_CLASS:
6761             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6762                                                gen_rtx_REG (SFmode,
6763                                                             SSE_REGNO (sse_regno)),
6764                                                GEN_INT (i*8));
6765             sse_regno++;
6766             break;
6767           case X86_64_SSEDF_CLASS:
6768             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6769                                                gen_rtx_REG (DFmode,
6770                                                             SSE_REGNO (sse_regno)),
6771                                                GEN_INT (i*8));
6772             sse_regno++;
6773             break;
6774           case X86_64_SSE_CLASS:
6775             pos = i;
6776             switch (n)
6777               {
6778               case 1:
6779                 tmpmode = DImode;
6780                 break;
6781               case 2:
6782                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
6783                   {
6784                     tmpmode = TImode;
6785                     i++;
6786                   }
6787                 else
6788                   tmpmode = DImode;
6789                 break;
6790               case 4:
6791                 gcc_assert (i == 0
6792                             && regclass[1] == X86_64_SSEUP_CLASS
6793                             && regclass[2] == X86_64_SSEUP_CLASS
6794                             && regclass[3] == X86_64_SSEUP_CLASS);
6795                 tmpmode = OImode;
6796                 i += 3;
6797                 break;
6798               default:
6799                 gcc_unreachable ();
6800               }
6801             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
6802                                                gen_rtx_REG (tmpmode,
6803                                                             SSE_REGNO (sse_regno)),
6804                                                GEN_INT (pos*8));
6805             sse_regno++;
6806             break;
6807           default:
6808             gcc_unreachable ();
6809         }
6810     }
6811
6812   /* Empty aligned struct, union or class.  */
6813   if (nexps == 0)
6814     return NULL;
6815
6816   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
6817   for (i = 0; i < nexps; i++)
6818     XVECEXP (ret, 0, i) = exp [i];
6819   return ret;
6820 }
6821
6822 /* Update the data in CUM to advance over an argument of mode MODE
6823    and data type TYPE.  (TYPE is null for libcalls where that information
6824    may not be available.)  */
6825
6826 static void
6827 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6828                          const_tree type, HOST_WIDE_INT bytes,
6829                          HOST_WIDE_INT words)
6830 {
6831   switch (mode)
6832     {
6833     default:
6834       break;
6835
6836     case BLKmode:
6837       if (bytes < 0)
6838         break;
6839       /* FALLTHRU */
6840
6841     case DImode:
6842     case SImode:
6843     case HImode:
6844     case QImode:
6845       cum->words += words;
6846       cum->nregs -= words;
6847       cum->regno += words;
6848
6849       if (cum->nregs <= 0)
6850         {
6851           cum->nregs = 0;
6852           cum->regno = 0;
6853         }
6854       break;
6855
6856     case OImode:
6857       /* OImode shouldn't be used directly.  */
6858       gcc_unreachable ();
6859
6860     case DFmode:
6861       if (cum->float_in_sse < 2)
6862         break;
6863     case SFmode:
6864       if (cum->float_in_sse < 1)
6865         break;
6866       /* FALLTHRU */
6867
6868     case V8SFmode:
6869     case V8SImode:
6870     case V32QImode:
6871     case V16HImode:
6872     case V4DFmode:
6873     case V4DImode:
6874     case TImode:
6875     case V16QImode:
6876     case V8HImode:
6877     case V4SImode:
6878     case V2DImode:
6879     case V4SFmode:
6880     case V2DFmode:
6881       if (!type || !AGGREGATE_TYPE_P (type))
6882         {
6883           cum->sse_words += words;
6884           cum->sse_nregs -= 1;
6885           cum->sse_regno += 1;
6886           if (cum->sse_nregs <= 0)
6887             {
6888               cum->sse_nregs = 0;
6889               cum->sse_regno = 0;
6890             }
6891         }
6892       break;
6893
6894     case V8QImode:
6895     case V4HImode:
6896     case V2SImode:
6897     case V2SFmode:
6898     case V1TImode:
6899     case V1DImode:
6900       if (!type || !AGGREGATE_TYPE_P (type))
6901         {
6902           cum->mmx_words += words;
6903           cum->mmx_nregs -= 1;
6904           cum->mmx_regno += 1;
6905           if (cum->mmx_nregs <= 0)
6906             {
6907               cum->mmx_nregs = 0;
6908               cum->mmx_regno = 0;
6909             }
6910         }
6911       break;
6912     }
6913 }
6914
6915 static void
6916 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6917                          const_tree type, HOST_WIDE_INT words, bool named)
6918 {
6919   int int_nregs, sse_nregs;
6920
6921   /* Unnamed 256bit vector mode parameters are passed on stack.  */
6922   if (!named && VALID_AVX256_REG_MODE (mode))
6923     return;
6924
6925   if (examine_argument (mode, type, 0, &int_nregs, &sse_nregs)
6926       && sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
6927     {
6928       cum->nregs -= int_nregs;
6929       cum->sse_nregs -= sse_nregs;
6930       cum->regno += int_nregs;
6931       cum->sse_regno += sse_nregs;
6932     }
6933   else
6934     {
6935       int align = ix86_function_arg_boundary (mode, type) / BITS_PER_WORD;
6936       cum->words = (cum->words + align - 1) & ~(align - 1);
6937       cum->words += words;
6938     }
6939 }
6940
6941 static void
6942 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
6943                             HOST_WIDE_INT words)
6944 {
6945   /* Otherwise, this should be passed indirect.  */
6946   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
6947
6948   cum->words += words;
6949   if (cum->nregs > 0)
6950     {
6951       cum->nregs -= 1;
6952       cum->regno += 1;
6953     }
6954 }
6955
6956 /* Update the data in CUM to advance over an argument of mode MODE and
6957    data type TYPE.  (TYPE is null for libcalls where that information
6958    may not be available.)  */
6959
6960 static void
6961 ix86_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6962                            const_tree type, bool named)
6963 {
6964   HOST_WIDE_INT bytes, words;
6965
6966   if (mode == BLKmode)
6967     bytes = int_size_in_bytes (type);
6968   else
6969     bytes = GET_MODE_SIZE (mode);
6970   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6971
6972   if (type)
6973     mode = type_natural_mode (type, NULL);
6974
6975   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6976     function_arg_advance_ms_64 (cum, bytes, words);
6977   else if (TARGET_64BIT)
6978     function_arg_advance_64 (cum, mode, type, words, named);
6979   else
6980     function_arg_advance_32 (cum, mode, type, bytes, words);
6981 }
6982
6983 /* Define where to put the arguments to a function.
6984    Value is zero to push the argument on the stack,
6985    or a hard register in which to store the argument.
6986
6987    MODE is the argument's machine mode.
6988    TYPE is the data type of the argument (as a tree).
6989     This is null for libcalls where that information may
6990     not be available.
6991    CUM is a variable of type CUMULATIVE_ARGS which gives info about
6992     the preceding args and about the function being called.
6993    NAMED is nonzero if this argument is a named parameter
6994     (otherwise it is an extra parameter matching an ellipsis).  */
6995
6996 static rtx
6997 function_arg_32 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
6998                  enum machine_mode orig_mode, const_tree type,
6999                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
7000 {
7001   static bool warnedsse, warnedmmx;
7002
7003   /* Avoid the AL settings for the Unix64 ABI.  */
7004   if (mode == VOIDmode)
7005     return constm1_rtx;
7006
7007   switch (mode)
7008     {
7009     default:
7010       break;
7011
7012     case BLKmode:
7013       if (bytes < 0)
7014         break;
7015       /* FALLTHRU */
7016     case DImode:
7017     case SImode:
7018     case HImode:
7019     case QImode:
7020       if (words <= cum->nregs)
7021         {
7022           int regno = cum->regno;
7023
7024           /* Fastcall allocates the first two DWORD (SImode) or
7025             smaller arguments to ECX and EDX if it isn't an
7026             aggregate type .  */
7027           if (cum->fastcall)
7028             {
7029               if (mode == BLKmode
7030                   || mode == DImode
7031                   || (type && AGGREGATE_TYPE_P (type)))
7032                 break;
7033
7034               /* ECX not EAX is the first allocated register.  */
7035               if (regno == AX_REG)
7036                 regno = CX_REG;
7037             }
7038           return gen_rtx_REG (mode, regno);
7039         }
7040       break;
7041
7042     case DFmode:
7043       if (cum->float_in_sse < 2)
7044         break;
7045     case SFmode:
7046       if (cum->float_in_sse < 1)
7047         break;
7048       /* FALLTHRU */
7049     case TImode:
7050       /* In 32bit, we pass TImode in xmm registers.  */
7051     case V16QImode:
7052     case V8HImode:
7053     case V4SImode:
7054     case V2DImode:
7055     case V4SFmode:
7056     case V2DFmode:
7057       if (!type || !AGGREGATE_TYPE_P (type))
7058         {
7059           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
7060             {
7061               warnedsse = true;
7062               warning (0, "SSE vector argument without SSE enabled "
7063                        "changes the ABI");
7064             }
7065           if (cum->sse_nregs)
7066             return gen_reg_or_parallel (mode, orig_mode,
7067                                         cum->sse_regno + FIRST_SSE_REG);
7068         }
7069       break;
7070
7071     case OImode:
7072       /* OImode shouldn't be used directly.  */
7073       gcc_unreachable ();
7074
7075     case V8SFmode:
7076     case V8SImode:
7077     case V32QImode:
7078     case V16HImode:
7079     case V4DFmode:
7080     case V4DImode:
7081       if (!type || !AGGREGATE_TYPE_P (type))
7082         {
7083           if (cum->sse_nregs)
7084             return gen_reg_or_parallel (mode, orig_mode,
7085                                         cum->sse_regno + FIRST_SSE_REG);
7086         }
7087       break;
7088
7089     case V8QImode:
7090     case V4HImode:
7091     case V2SImode:
7092     case V2SFmode:
7093     case V1TImode:
7094     case V1DImode:
7095       if (!type || !AGGREGATE_TYPE_P (type))
7096         {
7097           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
7098             {
7099               warnedmmx = true;
7100               warning (0, "MMX vector argument without MMX enabled "
7101                        "changes the ABI");
7102             }
7103           if (cum->mmx_nregs)
7104             return gen_reg_or_parallel (mode, orig_mode,
7105                                         cum->mmx_regno + FIRST_MMX_REG);
7106         }
7107       break;
7108     }
7109
7110   return NULL_RTX;
7111 }
7112
7113 static rtx
7114 function_arg_64 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7115                  enum machine_mode orig_mode, const_tree type, bool named)
7116 {
7117   /* Handle a hidden AL argument containing number of registers
7118      for varargs x86-64 functions.  */
7119   if (mode == VOIDmode)
7120     return GEN_INT (cum->maybe_vaarg
7121                     ? (cum->sse_nregs < 0
7122                        ? X86_64_SSE_REGPARM_MAX
7123                        : cum->sse_regno)
7124                     : -1);
7125
7126   switch (mode)
7127     {
7128     default:
7129       break;
7130
7131     case V8SFmode:
7132     case V8SImode:
7133     case V32QImode:
7134     case V16HImode:
7135     case V4DFmode:
7136     case V4DImode:
7137       /* Unnamed 256bit vector mode parameters are passed on stack.  */
7138       if (!named)
7139         return NULL;
7140       break;
7141     }
7142
7143   return construct_container (mode, orig_mode, type, 0, cum->nregs,
7144                               cum->sse_nregs,
7145                               &x86_64_int_parameter_registers [cum->regno],
7146                               cum->sse_regno);
7147 }
7148
7149 static rtx
7150 function_arg_ms_64 (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
7151                     enum machine_mode orig_mode, bool named,
7152                     HOST_WIDE_INT bytes)
7153 {
7154   unsigned int regno;
7155
7156   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
7157      We use value of -2 to specify that current function call is MSABI.  */
7158   if (mode == VOIDmode)
7159     return GEN_INT (-2);
7160
7161   /* If we've run out of registers, it goes on the stack.  */
7162   if (cum->nregs == 0)
7163     return NULL_RTX;
7164
7165   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
7166
7167   /* Only floating point modes are passed in anything but integer regs.  */
7168   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
7169     {
7170       if (named)
7171         regno = cum->regno + FIRST_SSE_REG;
7172       else
7173         {
7174           rtx t1, t2;
7175
7176           /* Unnamed floating parameters are passed in both the
7177              SSE and integer registers.  */
7178           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
7179           t2 = gen_rtx_REG (mode, regno);
7180           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
7181           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
7182           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
7183         }
7184     }
7185   /* Handle aggregated types passed in register.  */
7186   if (orig_mode == BLKmode)
7187     {
7188       if (bytes > 0 && bytes <= 8)
7189         mode = (bytes > 4 ? DImode : SImode);
7190       if (mode == BLKmode)
7191         mode = DImode;
7192     }
7193
7194   return gen_reg_or_parallel (mode, orig_mode, regno);
7195 }
7196
7197 /* Return where to put the arguments to a function.
7198    Return zero to push the argument on the stack, or a hard register in which to store the argument.
7199
7200    MODE is the argument's machine mode.  TYPE is the data type of the
7201    argument.  It is null for libcalls where that information may not be
7202    available.  CUM gives information about the preceding args and about
7203    the function being called.  NAMED is nonzero if this argument is a
7204    named parameter (otherwise it is an extra parameter matching an
7205    ellipsis).  */
7206
7207 static rtx
7208 ix86_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
7209                    const_tree type, bool named)
7210 {
7211   enum machine_mode mode = omode;
7212   HOST_WIDE_INT bytes, words;
7213   rtx arg;
7214
7215   if (mode == BLKmode)
7216     bytes = int_size_in_bytes (type);
7217   else
7218     bytes = GET_MODE_SIZE (mode);
7219   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7220
7221   /* To simplify the code below, represent vector types with a vector mode
7222      even if MMX/SSE are not active.  */
7223   if (type && TREE_CODE (type) == VECTOR_TYPE)
7224     mode = type_natural_mode (type, cum);
7225
7226   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
7227     arg = function_arg_ms_64 (cum, mode, omode, named, bytes);
7228   else if (TARGET_64BIT)
7229     arg = function_arg_64 (cum, mode, omode, type, named);
7230   else
7231     arg = function_arg_32 (cum, mode, omode, type, bytes, words);
7232
7233   if (TARGET_VZEROUPPER && function_pass_avx256_p (arg))
7234     {
7235       /* This argument uses 256bit AVX modes.  */
7236       if (cum->caller)
7237         cfun->machine->callee_pass_avx256_p = true;
7238       else
7239         cfun->machine->caller_pass_avx256_p = true;
7240     }
7241
7242   return arg;
7243 }
7244
7245 /* A C expression that indicates when an argument must be passed by
7246    reference.  If nonzero for an argument, a copy of that argument is
7247    made in memory and a pointer to the argument is passed instead of
7248    the argument itself.  The pointer is passed in whatever way is
7249    appropriate for passing a pointer to that type.  */
7250
7251 static bool
7252 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
7253                         enum machine_mode mode ATTRIBUTE_UNUSED,
7254                         const_tree type, bool named ATTRIBUTE_UNUSED)
7255 {
7256   /* See Windows x64 Software Convention.  */
7257   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
7258     {
7259       int msize = (int) GET_MODE_SIZE (mode);
7260       if (type)
7261         {
7262           /* Arrays are passed by reference.  */
7263           if (TREE_CODE (type) == ARRAY_TYPE)
7264             return true;
7265
7266           if (AGGREGATE_TYPE_P (type))
7267             {
7268               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
7269                  are passed by reference.  */
7270               msize = int_size_in_bytes (type);
7271             }
7272         }
7273
7274       /* __m128 is passed by reference.  */
7275       switch (msize) {
7276       case 1: case 2: case 4: case 8:
7277         break;
7278       default:
7279         return true;
7280       }
7281     }
7282   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
7283     return 1;
7284
7285   return 0;
7286 }
7287
7288 /* Return true when TYPE should be 128bit aligned for 32bit argument
7289    passing ABI.  XXX: This function is obsolete and is only used for
7290    checking psABI compatibility with previous versions of GCC.  */
7291
7292 static bool
7293 ix86_compat_aligned_value_p (const_tree type)
7294 {
7295   enum machine_mode mode = TYPE_MODE (type);
7296   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
7297        || mode == TDmode
7298        || mode == TFmode
7299        || mode == TCmode)
7300       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
7301     return true;
7302   if (TYPE_ALIGN (type) < 128)
7303     return false;
7304
7305   if (AGGREGATE_TYPE_P (type))
7306     {
7307       /* Walk the aggregates recursively.  */
7308       switch (TREE_CODE (type))
7309         {
7310         case RECORD_TYPE:
7311         case UNION_TYPE:
7312         case QUAL_UNION_TYPE:
7313           {
7314             tree field;
7315
7316             /* Walk all the structure fields.  */
7317             for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
7318               {
7319                 if (TREE_CODE (field) == FIELD_DECL
7320                     && ix86_compat_aligned_value_p (TREE_TYPE (field)))
7321                   return true;
7322               }
7323             break;
7324           }
7325
7326         case ARRAY_TYPE:
7327           /* Just for use if some languages passes arrays by value.  */
7328           if (ix86_compat_aligned_value_p (TREE_TYPE (type)))
7329             return true;
7330           break;
7331
7332         default:
7333           gcc_unreachable ();
7334         }
7335     }
7336   return false;
7337 }
7338
7339 /* Return the alignment boundary for MODE and TYPE with alignment ALIGN.
7340    XXX: This function is obsolete and is only used for checking psABI
7341    compatibility with previous versions of GCC.  */
7342
7343 static unsigned int
7344 ix86_compat_function_arg_boundary (enum machine_mode mode,
7345                                    const_tree type, unsigned int align)
7346 {
7347   /* In 32bit, only _Decimal128 and __float128 are aligned to their
7348      natural boundaries.  */
7349   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
7350     {
7351       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
7352          make an exception for SSE modes since these require 128bit
7353          alignment.
7354
7355          The handling here differs from field_alignment.  ICC aligns MMX
7356          arguments to 4 byte boundaries, while structure fields are aligned
7357          to 8 byte boundaries.  */
7358       if (!type)
7359         {
7360           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
7361             align = PARM_BOUNDARY;
7362         }
7363       else
7364         {
7365           if (!ix86_compat_aligned_value_p (type))
7366             align = PARM_BOUNDARY;
7367         }
7368     }
7369   if (align > BIGGEST_ALIGNMENT)
7370     align = BIGGEST_ALIGNMENT;
7371   return align;
7372 }
7373
7374 /* Return true when TYPE should be 128bit aligned for 32bit argument
7375    passing ABI.  */
7376
7377 static bool
7378 ix86_contains_aligned_value_p (const_tree type)
7379 {
7380   enum machine_mode mode = TYPE_MODE (type);
7381
7382   if (mode == XFmode || mode == XCmode)
7383     return false;
7384
7385   if (TYPE_ALIGN (type) < 128)
7386     return false;
7387
7388   if (AGGREGATE_TYPE_P (type))
7389     {
7390       /* Walk the aggregates recursively.  */
7391       switch (TREE_CODE (type))
7392         {
7393         case RECORD_TYPE:
7394         case UNION_TYPE:
7395         case QUAL_UNION_TYPE:
7396           {
7397             tree field;
7398
7399             /* Walk all the structure fields.  */
7400             for (field = TYPE_FIELDS (type);
7401                  field;
7402                  field = DECL_CHAIN (field))
7403               {
7404                 if (TREE_CODE (field) == FIELD_DECL
7405                     && ix86_contains_aligned_value_p (TREE_TYPE (field)))
7406                   return true;
7407               }
7408             break;
7409           }
7410
7411         case ARRAY_TYPE:
7412           /* Just for use if some languages passes arrays by value.  */
7413           if (ix86_contains_aligned_value_p (TREE_TYPE (type)))
7414             return true;
7415           break;
7416
7417         default:
7418           gcc_unreachable ();
7419         }
7420     }
7421   else
7422     return TYPE_ALIGN (type) >= 128;
7423
7424   return false;
7425 }
7426
7427 /* Gives the alignment boundary, in bits, of an argument with the
7428    specified mode and type.  */
7429
7430 static unsigned int
7431 ix86_function_arg_boundary (enum machine_mode mode, const_tree type)
7432 {
7433   unsigned int align;
7434   if (type)
7435     {
7436       /* Since the main variant type is used for call, we convert it to
7437          the main variant type.  */
7438       type = TYPE_MAIN_VARIANT (type);
7439       align = TYPE_ALIGN (type);
7440     }
7441   else
7442     align = GET_MODE_ALIGNMENT (mode);
7443   if (align < PARM_BOUNDARY)
7444     align = PARM_BOUNDARY;
7445   else
7446     {
7447       static bool warned;
7448       unsigned int saved_align = align;
7449
7450       if (!TARGET_64BIT)
7451         {
7452           /* i386 ABI defines XFmode arguments to be 4 byte aligned.  */
7453           if (!type)
7454             {
7455               if (mode == XFmode || mode == XCmode)
7456                 align = PARM_BOUNDARY;
7457             }
7458           else if (!ix86_contains_aligned_value_p (type))
7459             align = PARM_BOUNDARY;
7460
7461           if (align < 128)
7462             align = PARM_BOUNDARY;
7463         }
7464
7465       if (warn_psabi
7466           && !warned
7467           && align != ix86_compat_function_arg_boundary (mode, type,
7468                                                          saved_align))
7469         {
7470           warned = true;
7471           inform (input_location,
7472                   "The ABI for passing parameters with %d-byte"
7473                   " alignment has changed in GCC 4.6",
7474                   align / BITS_PER_UNIT);
7475         }
7476     }
7477
7478   return align;
7479 }
7480
7481 /* Return true if N is a possible register number of function value.  */
7482
7483 static bool
7484 ix86_function_value_regno_p (const unsigned int regno)
7485 {
7486   switch (regno)
7487     {
7488     case 0:
7489       return true;
7490
7491     case FIRST_FLOAT_REG:
7492       /* TODO: The function should depend on current function ABI but
7493        builtins.c would need updating then. Therefore we use the
7494        default ABI.  */
7495       if (TARGET_64BIT && ix86_abi == MS_ABI)
7496         return false;
7497       return TARGET_FLOAT_RETURNS_IN_80387;
7498
7499     case FIRST_SSE_REG:
7500       return TARGET_SSE;
7501
7502     case FIRST_MMX_REG:
7503       if (TARGET_MACHO || TARGET_64BIT)
7504         return false;
7505       return TARGET_MMX;
7506     }
7507
7508   return false;
7509 }
7510
7511 /* Define how to find the value returned by a function.
7512    VALTYPE is the data type of the value (as a tree).
7513    If the precise function being called is known, FUNC is its FUNCTION_DECL;
7514    otherwise, FUNC is 0.  */
7515
7516 static rtx
7517 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
7518                    const_tree fntype, const_tree fn)
7519 {
7520   unsigned int regno;
7521
7522   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
7523      we normally prevent this case when mmx is not available.  However
7524      some ABIs may require the result to be returned like DImode.  */
7525   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
7526     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
7527
7528   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
7529      we prevent this case when sse is not available.  However some ABIs
7530      may require the result to be returned like integer TImode.  */
7531   else if (mode == TImode
7532            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
7533     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
7534
7535   /* 32-byte vector modes in %ymm0.   */
7536   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
7537     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
7538
7539   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
7540   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
7541     regno = FIRST_FLOAT_REG;
7542   else
7543     /* Most things go in %eax.  */
7544     regno = AX_REG;
7545
7546   /* Override FP return register with %xmm0 for local functions when
7547      SSE math is enabled or for functions with sseregparm attribute.  */
7548   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
7549     {
7550       int sse_level = ix86_function_sseregparm (fntype, fn, false);
7551       if ((sse_level >= 1 && mode == SFmode)
7552           || (sse_level == 2 && mode == DFmode))
7553         regno = FIRST_SSE_REG;
7554     }
7555
7556   /* OImode shouldn't be used directly.  */
7557   gcc_assert (mode != OImode);
7558
7559   return gen_rtx_REG (orig_mode, regno);
7560 }
7561
7562 static rtx
7563 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
7564                    const_tree valtype)
7565 {
7566   rtx ret;
7567
7568   /* Handle libcalls, which don't provide a type node.  */
7569   if (valtype == NULL)
7570     {
7571       switch (mode)
7572         {
7573         case SFmode:
7574         case SCmode:
7575         case DFmode:
7576         case DCmode:
7577         case TFmode:
7578         case SDmode:
7579         case DDmode:
7580         case TDmode:
7581           return gen_rtx_REG (mode, FIRST_SSE_REG);
7582         case XFmode:
7583         case XCmode:
7584           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
7585         case TCmode:
7586           return NULL;
7587         default:
7588           return gen_rtx_REG (mode, AX_REG);
7589         }
7590     }
7591
7592   ret = construct_container (mode, orig_mode, valtype, 1,
7593                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
7594                              x86_64_int_return_registers, 0);
7595
7596   /* For zero sized structures, construct_container returns NULL, but we
7597      need to keep rest of compiler happy by returning meaningful value.  */
7598   if (!ret)
7599     ret = gen_rtx_REG (orig_mode, AX_REG);
7600
7601   return ret;
7602 }
7603
7604 static rtx
7605 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
7606 {
7607   unsigned int regno = AX_REG;
7608
7609   if (TARGET_SSE)
7610     {
7611       switch (GET_MODE_SIZE (mode))
7612         {
7613         case 16:
7614           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
7615              && !COMPLEX_MODE_P (mode))
7616             regno = FIRST_SSE_REG;
7617           break;
7618         case 8:
7619         case 4:
7620           if (mode == SFmode || mode == DFmode)
7621             regno = FIRST_SSE_REG;
7622           break;
7623         default:
7624           break;
7625         }
7626     }
7627   return gen_rtx_REG (orig_mode, regno);
7628 }
7629
7630 static rtx
7631 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
7632                        enum machine_mode orig_mode, enum machine_mode mode)
7633 {
7634   const_tree fn, fntype;
7635
7636   fn = NULL_TREE;
7637   if (fntype_or_decl && DECL_P (fntype_or_decl))
7638     fn = fntype_or_decl;
7639   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
7640
7641   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
7642     return function_value_ms_64 (orig_mode, mode);
7643   else if (TARGET_64BIT)
7644     return function_value_64 (orig_mode, mode, valtype);
7645   else
7646     return function_value_32 (orig_mode, mode, fntype, fn);
7647 }
7648
7649 static rtx
7650 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
7651                      bool outgoing ATTRIBUTE_UNUSED)
7652 {
7653   enum machine_mode mode, orig_mode;
7654
7655   orig_mode = TYPE_MODE (valtype);
7656   mode = type_natural_mode (valtype, NULL);
7657   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
7658 }
7659
7660 rtx
7661 ix86_libcall_value (enum machine_mode mode)
7662 {
7663   return ix86_function_value_1 (NULL, NULL, mode, mode);
7664 }
7665
7666 /* Return true iff type is returned in memory.  */
7667
7668 static bool ATTRIBUTE_UNUSED
7669 return_in_memory_32 (const_tree type, enum machine_mode mode)
7670 {
7671   HOST_WIDE_INT size;
7672
7673   if (mode == BLKmode)
7674     return true;
7675
7676   size = int_size_in_bytes (type);
7677
7678   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
7679     return false;
7680
7681   if (VECTOR_MODE_P (mode) || mode == TImode)
7682     {
7683       /* User-created vectors small enough to fit in EAX.  */
7684       if (size < 8)
7685         return false;
7686
7687       /* MMX/3dNow values are returned in MM0,
7688          except when it doesn't exits or the ABI prescribes otherwise.  */
7689       if (size == 8)
7690         return !TARGET_MMX || TARGET_VECT8_RETURNS;
7691
7692       /* SSE values are returned in XMM0, except when it doesn't exist.  */
7693       if (size == 16)
7694         return !TARGET_SSE;
7695
7696       /* AVX values are returned in YMM0, except when it doesn't exist.  */
7697       if (size == 32)
7698         return !TARGET_AVX;
7699     }
7700
7701   if (mode == XFmode)
7702     return false;
7703
7704   if (size > 12)
7705     return true;
7706
7707   /* OImode shouldn't be used directly.  */
7708   gcc_assert (mode != OImode);
7709
7710   return false;
7711 }
7712
7713 static bool ATTRIBUTE_UNUSED
7714 return_in_memory_64 (const_tree type, enum machine_mode mode)
7715 {
7716   int needed_intregs, needed_sseregs;
7717   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
7718 }
7719
7720 static bool ATTRIBUTE_UNUSED
7721 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
7722 {
7723   HOST_WIDE_INT size = int_size_in_bytes (type);
7724
7725   /* __m128 is returned in xmm0.  */
7726   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
7727       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
7728     return false;
7729
7730   /* Otherwise, the size must be exactly in [1248]. */
7731   return size != 1 && size != 2 && size != 4 && size != 8;
7732 }
7733
7734 static bool
7735 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7736 {
7737 #ifdef SUBTARGET_RETURN_IN_MEMORY
7738   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
7739 #else
7740   const enum machine_mode mode = type_natural_mode (type, NULL);
7741
7742   if (TARGET_64BIT)
7743     {
7744       if (ix86_function_type_abi (fntype) == MS_ABI)
7745         return return_in_memory_ms_64 (type, mode);
7746       else
7747         return return_in_memory_64 (type, mode);
7748     }
7749   else
7750     return return_in_memory_32 (type, mode);
7751 #endif
7752 }
7753
7754 /* When returning SSE vector types, we have a choice of either
7755      (1) being abi incompatible with a -march switch, or
7756      (2) generating an error.
7757    Given no good solution, I think the safest thing is one warning.
7758    The user won't be able to use -Werror, but....
7759
7760    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
7761    called in response to actually generating a caller or callee that
7762    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
7763    via aggregate_value_p for general type probing from tree-ssa.  */
7764
7765 static rtx
7766 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
7767 {
7768   static bool warnedsse, warnedmmx;
7769
7770   if (!TARGET_64BIT && type)
7771     {
7772       /* Look at the return type of the function, not the function type.  */
7773       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
7774
7775       if (!TARGET_SSE && !warnedsse)
7776         {
7777           if (mode == TImode
7778               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
7779             {
7780               warnedsse = true;
7781               warning (0, "SSE vector return without SSE enabled "
7782                        "changes the ABI");
7783             }
7784         }
7785
7786       if (!TARGET_MMX && !warnedmmx)
7787         {
7788           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
7789             {
7790               warnedmmx = true;
7791               warning (0, "MMX vector return without MMX enabled "
7792                        "changes the ABI");
7793             }
7794         }
7795     }
7796
7797   return NULL;
7798 }
7799
7800 \f
7801 /* Create the va_list data type.  */
7802
7803 /* Returns the calling convention specific va_list date type.
7804    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
7805
7806 static tree
7807 ix86_build_builtin_va_list_abi (enum calling_abi abi)
7808 {
7809   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
7810
7811   /* For i386 we use plain pointer to argument area.  */
7812   if (!TARGET_64BIT || abi == MS_ABI)
7813     return build_pointer_type (char_type_node);
7814
7815   record = lang_hooks.types.make_type (RECORD_TYPE);
7816   type_decl = build_decl (BUILTINS_LOCATION,
7817                           TYPE_DECL, get_identifier ("__va_list_tag"), record);
7818
7819   f_gpr = build_decl (BUILTINS_LOCATION,
7820                       FIELD_DECL, get_identifier ("gp_offset"),
7821                       unsigned_type_node);
7822   f_fpr = build_decl (BUILTINS_LOCATION,
7823                       FIELD_DECL, get_identifier ("fp_offset"),
7824                       unsigned_type_node);
7825   f_ovf = build_decl (BUILTINS_LOCATION,
7826                       FIELD_DECL, get_identifier ("overflow_arg_area"),
7827                       ptr_type_node);
7828   f_sav = build_decl (BUILTINS_LOCATION,
7829                       FIELD_DECL, get_identifier ("reg_save_area"),
7830                       ptr_type_node);
7831
7832   va_list_gpr_counter_field = f_gpr;
7833   va_list_fpr_counter_field = f_fpr;
7834
7835   DECL_FIELD_CONTEXT (f_gpr) = record;
7836   DECL_FIELD_CONTEXT (f_fpr) = record;
7837   DECL_FIELD_CONTEXT (f_ovf) = record;
7838   DECL_FIELD_CONTEXT (f_sav) = record;
7839
7840   TYPE_STUB_DECL (record) = type_decl;
7841   TYPE_NAME (record) = type_decl;
7842   TYPE_FIELDS (record) = f_gpr;
7843   DECL_CHAIN (f_gpr) = f_fpr;
7844   DECL_CHAIN (f_fpr) = f_ovf;
7845   DECL_CHAIN (f_ovf) = f_sav;
7846
7847   layout_type (record);
7848
7849   /* The correct type is an array type of one element.  */
7850   return build_array_type (record, build_index_type (size_zero_node));
7851 }
7852
7853 /* Setup the builtin va_list data type and for 64-bit the additional
7854    calling convention specific va_list data types.  */
7855
7856 static tree
7857 ix86_build_builtin_va_list (void)
7858 {
7859   tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
7860
7861   /* Initialize abi specific va_list builtin types.  */
7862   if (TARGET_64BIT)
7863     {
7864       tree t;
7865       if (ix86_abi == MS_ABI)
7866         {
7867           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
7868           if (TREE_CODE (t) != RECORD_TYPE)
7869             t = build_variant_type_copy (t);
7870           sysv_va_list_type_node = t;
7871         }
7872       else
7873         {
7874           t = ret;
7875           if (TREE_CODE (t) != RECORD_TYPE)
7876             t = build_variant_type_copy (t);
7877           sysv_va_list_type_node = t;
7878         }
7879       if (ix86_abi != MS_ABI)
7880         {
7881           t = ix86_build_builtin_va_list_abi (MS_ABI);
7882           if (TREE_CODE (t) != RECORD_TYPE)
7883             t = build_variant_type_copy (t);
7884           ms_va_list_type_node = t;
7885         }
7886       else
7887         {
7888           t = ret;
7889           if (TREE_CODE (t) != RECORD_TYPE)
7890             t = build_variant_type_copy (t);
7891           ms_va_list_type_node = t;
7892         }
7893     }
7894
7895   return ret;
7896 }
7897
7898 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
7899
7900 static void
7901 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
7902 {
7903   rtx save_area, mem;
7904   alias_set_type set;
7905   int i, max;
7906
7907   /* GPR size of varargs save area.  */
7908   if (cfun->va_list_gpr_size)
7909     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
7910   else
7911     ix86_varargs_gpr_size = 0;
7912
7913   /* FPR size of varargs save area.  We don't need it if we don't pass
7914      anything in SSE registers.  */
7915   if (TARGET_SSE && cfun->va_list_fpr_size)
7916     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
7917   else
7918     ix86_varargs_fpr_size = 0;
7919
7920   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
7921     return;
7922
7923   save_area = frame_pointer_rtx;
7924   set = get_varargs_alias_set ();
7925
7926   max = cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
7927   if (max > X86_64_REGPARM_MAX)
7928     max = X86_64_REGPARM_MAX;
7929
7930   for (i = cum->regno; i < max; i++)
7931     {
7932       mem = gen_rtx_MEM (Pmode,
7933                          plus_constant (save_area, i * UNITS_PER_WORD));
7934       MEM_NOTRAP_P (mem) = 1;
7935       set_mem_alias_set (mem, set);
7936       emit_move_insn (mem, gen_rtx_REG (Pmode,
7937                                         x86_64_int_parameter_registers[i]));
7938     }
7939
7940   if (ix86_varargs_fpr_size)
7941     {
7942       enum machine_mode smode;
7943       rtx label, test;
7944
7945       /* Now emit code to save SSE registers.  The AX parameter contains number
7946          of SSE parameter registers used to call this function, though all we
7947          actually check here is the zero/non-zero status.  */
7948
7949       label = gen_label_rtx ();
7950       test = gen_rtx_EQ (VOIDmode, gen_rtx_REG (QImode, AX_REG), const0_rtx);
7951       emit_jump_insn (gen_cbranchqi4 (test, XEXP (test, 0), XEXP (test, 1),
7952                                       label));
7953
7954       /* ??? If !TARGET_SSE_TYPELESS_STORES, would we perform better if
7955          we used movdqa (i.e. TImode) instead?  Perhaps even better would
7956          be if we could determine the real mode of the data, via a hook
7957          into pass_stdarg.  Ignore all that for now.  */
7958       smode = V4SFmode;
7959       if (crtl->stack_alignment_needed < GET_MODE_ALIGNMENT (smode))
7960         crtl->stack_alignment_needed = GET_MODE_ALIGNMENT (smode);
7961
7962       max = cum->sse_regno + cfun->va_list_fpr_size / 16;
7963       if (max > X86_64_SSE_REGPARM_MAX)
7964         max = X86_64_SSE_REGPARM_MAX;
7965
7966       for (i = cum->sse_regno; i < max; ++i)
7967         {
7968           mem = plus_constant (save_area, i * 16 + ix86_varargs_gpr_size);
7969           mem = gen_rtx_MEM (smode, mem);
7970           MEM_NOTRAP_P (mem) = 1;
7971           set_mem_alias_set (mem, set);
7972           set_mem_align (mem, GET_MODE_ALIGNMENT (smode));
7973
7974           emit_move_insn (mem, gen_rtx_REG (smode, SSE_REGNO (i)));
7975         }
7976
7977       emit_label (label);
7978     }
7979 }
7980
7981 static void
7982 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
7983 {
7984   alias_set_type set = get_varargs_alias_set ();
7985   int i;
7986
7987   for (i = cum->regno; i < X86_64_MS_REGPARM_MAX; i++)
7988     {
7989       rtx reg, mem;
7990
7991       mem = gen_rtx_MEM (Pmode,
7992                          plus_constant (virtual_incoming_args_rtx,
7993                                         i * UNITS_PER_WORD));
7994       MEM_NOTRAP_P (mem) = 1;
7995       set_mem_alias_set (mem, set);
7996
7997       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
7998       emit_move_insn (mem, reg);
7999     }
8000 }
8001
8002 static void
8003 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8004                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
8005                              int no_rtl)
8006 {
8007   CUMULATIVE_ARGS next_cum;
8008   tree fntype;
8009
8010   /* This argument doesn't appear to be used anymore.  Which is good,
8011      because the old code here didn't suppress rtl generation.  */
8012   gcc_assert (!no_rtl);
8013
8014   if (!TARGET_64BIT)
8015     return;
8016
8017   fntype = TREE_TYPE (current_function_decl);
8018
8019   /* For varargs, we do not want to skip the dummy va_dcl argument.
8020      For stdargs, we do want to skip the last named argument.  */
8021   next_cum = *cum;
8022   if (stdarg_p (fntype))
8023     ix86_function_arg_advance (&next_cum, mode, type, true);
8024
8025   if (cum->call_abi == MS_ABI)
8026     setup_incoming_varargs_ms_64 (&next_cum);
8027   else
8028     setup_incoming_varargs_64 (&next_cum);
8029 }
8030
8031 /* Checks if TYPE is of kind va_list char *.  */
8032
8033 static bool
8034 is_va_list_char_pointer (tree type)
8035 {
8036   tree canonic;
8037
8038   /* For 32-bit it is always true.  */
8039   if (!TARGET_64BIT)
8040     return true;
8041   canonic = ix86_canonical_va_list_type (type);
8042   return (canonic == ms_va_list_type_node
8043           || (ix86_abi == MS_ABI && canonic == va_list_type_node));
8044 }
8045
8046 /* Implement va_start.  */
8047
8048 static void
8049 ix86_va_start (tree valist, rtx nextarg)
8050 {
8051   HOST_WIDE_INT words, n_gpr, n_fpr;
8052   tree f_gpr, f_fpr, f_ovf, f_sav;
8053   tree gpr, fpr, ovf, sav, t;
8054   tree type;
8055   rtx ovf_rtx;
8056
8057   if (flag_split_stack
8058       && cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8059     {
8060       unsigned int scratch_regno;
8061
8062       /* When we are splitting the stack, we can't refer to the stack
8063          arguments using internal_arg_pointer, because they may be on
8064          the old stack.  The split stack prologue will arrange to
8065          leave a pointer to the old stack arguments in a scratch
8066          register, which we here copy to a pseudo-register.  The split
8067          stack prologue can't set the pseudo-register directly because
8068          it (the prologue) runs before any registers have been saved.  */
8069
8070       scratch_regno = split_stack_prologue_scratch_regno ();
8071       if (scratch_regno != INVALID_REGNUM)
8072         {
8073           rtx reg, seq;
8074
8075           reg = gen_reg_rtx (Pmode);
8076           cfun->machine->split_stack_varargs_pointer = reg;
8077
8078           start_sequence ();
8079           emit_move_insn (reg, gen_rtx_REG (Pmode, scratch_regno));
8080           seq = get_insns ();
8081           end_sequence ();
8082
8083           push_topmost_sequence ();
8084           emit_insn_after (seq, entry_of_function ());
8085           pop_topmost_sequence ();
8086         }
8087     }
8088
8089   /* Only 64bit target needs something special.  */
8090   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
8091     {
8092       if (cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8093         std_expand_builtin_va_start (valist, nextarg);
8094       else
8095         {
8096           rtx va_r, next;
8097
8098           va_r = expand_expr (valist, NULL_RTX, VOIDmode, EXPAND_WRITE);
8099           next = expand_binop (ptr_mode, add_optab,
8100                                cfun->machine->split_stack_varargs_pointer,
8101                                crtl->args.arg_offset_rtx,
8102                                NULL_RTX, 0, OPTAB_LIB_WIDEN);
8103           convert_move (va_r, next, 0);
8104         }
8105       return;
8106     }
8107
8108   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
8109   f_fpr = DECL_CHAIN (f_gpr);
8110   f_ovf = DECL_CHAIN (f_fpr);
8111   f_sav = DECL_CHAIN (f_ovf);
8112
8113   valist = build_simple_mem_ref (valist);
8114   TREE_TYPE (valist) = TREE_TYPE (sysv_va_list_type_node);
8115   /* The following should be folded into the MEM_REF offset.  */
8116   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), unshare_expr (valist),
8117                 f_gpr, NULL_TREE);
8118   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
8119                 f_fpr, NULL_TREE);
8120   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
8121                 f_ovf, NULL_TREE);
8122   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
8123                 f_sav, NULL_TREE);
8124
8125   /* Count number of gp and fp argument registers used.  */
8126   words = crtl->args.info.words;
8127   n_gpr = crtl->args.info.regno;
8128   n_fpr = crtl->args.info.sse_regno;
8129
8130   if (cfun->va_list_gpr_size)
8131     {
8132       type = TREE_TYPE (gpr);
8133       t = build2 (MODIFY_EXPR, type,
8134                   gpr, build_int_cst (type, n_gpr * 8));
8135       TREE_SIDE_EFFECTS (t) = 1;
8136       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8137     }
8138
8139   if (TARGET_SSE && cfun->va_list_fpr_size)
8140     {
8141       type = TREE_TYPE (fpr);
8142       t = build2 (MODIFY_EXPR, type, fpr,
8143                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
8144       TREE_SIDE_EFFECTS (t) = 1;
8145       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8146     }
8147
8148   /* Find the overflow area.  */
8149   type = TREE_TYPE (ovf);
8150   if (cfun->machine->split_stack_varargs_pointer == NULL_RTX)
8151     ovf_rtx = crtl->args.internal_arg_pointer;
8152   else
8153     ovf_rtx = cfun->machine->split_stack_varargs_pointer;
8154   t = make_tree (type, ovf_rtx);
8155   if (words != 0)
8156     t = build2 (POINTER_PLUS_EXPR, type, t,
8157                 size_int (words * UNITS_PER_WORD));
8158   t = build2 (MODIFY_EXPR, type, ovf, t);
8159   TREE_SIDE_EFFECTS (t) = 1;
8160   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8161
8162   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
8163     {
8164       /* Find the register save area.
8165          Prologue of the function save it right above stack frame.  */
8166       type = TREE_TYPE (sav);
8167       t = make_tree (type, frame_pointer_rtx);
8168       if (!ix86_varargs_gpr_size)
8169         t = build2 (POINTER_PLUS_EXPR, type, t,
8170                     size_int (-8 * X86_64_REGPARM_MAX));
8171       t = build2 (MODIFY_EXPR, type, sav, t);
8172       TREE_SIDE_EFFECTS (t) = 1;
8173       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8174     }
8175 }
8176
8177 /* Implement va_arg.  */
8178
8179 static tree
8180 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
8181                       gimple_seq *post_p)
8182 {
8183   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
8184   tree f_gpr, f_fpr, f_ovf, f_sav;
8185   tree gpr, fpr, ovf, sav, t;
8186   int size, rsize;
8187   tree lab_false, lab_over = NULL_TREE;
8188   tree addr, t2;
8189   rtx container;
8190   int indirect_p = 0;
8191   tree ptrtype;
8192   enum machine_mode nat_mode;
8193   unsigned int arg_boundary;
8194
8195   /* Only 64bit target needs something special.  */
8196   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
8197     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
8198
8199   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
8200   f_fpr = DECL_CHAIN (f_gpr);
8201   f_ovf = DECL_CHAIN (f_fpr);
8202   f_sav = DECL_CHAIN (f_ovf);
8203
8204   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
8205                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
8206   valist = build_va_arg_indirect_ref (valist);
8207   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
8208   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
8209   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
8210
8211   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
8212   if (indirect_p)
8213     type = build_pointer_type (type);
8214   size = int_size_in_bytes (type);
8215   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8216
8217   nat_mode = type_natural_mode (type, NULL);
8218   switch (nat_mode)
8219     {
8220     case V8SFmode:
8221     case V8SImode:
8222     case V32QImode:
8223     case V16HImode:
8224     case V4DFmode:
8225     case V4DImode:
8226       /* Unnamed 256bit vector mode parameters are passed on stack.  */
8227       if (!TARGET_64BIT_MS_ABI)
8228         {
8229           container = NULL;
8230           break;
8231         }
8232
8233     default:
8234       container = construct_container (nat_mode, TYPE_MODE (type),
8235                                        type, 0, X86_64_REGPARM_MAX,
8236                                        X86_64_SSE_REGPARM_MAX, intreg,
8237                                        0);
8238       break;
8239     }
8240
8241   /* Pull the value out of the saved registers.  */
8242
8243   addr = create_tmp_var (ptr_type_node, "addr");
8244
8245   if (container)
8246     {
8247       int needed_intregs, needed_sseregs;
8248       bool need_temp;
8249       tree int_addr, sse_addr;
8250
8251       lab_false = create_artificial_label (UNKNOWN_LOCATION);
8252       lab_over = create_artificial_label (UNKNOWN_LOCATION);
8253
8254       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
8255
8256       need_temp = (!REG_P (container)
8257                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
8258                        || TYPE_ALIGN (type) > 128));
8259
8260       /* In case we are passing structure, verify that it is consecutive block
8261          on the register save area.  If not we need to do moves.  */
8262       if (!need_temp && !REG_P (container))
8263         {
8264           /* Verify that all registers are strictly consecutive  */
8265           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
8266             {
8267               int i;
8268
8269               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
8270                 {
8271                   rtx slot = XVECEXP (container, 0, i);
8272                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
8273                       || INTVAL (XEXP (slot, 1)) != i * 16)
8274                     need_temp = 1;
8275                 }
8276             }
8277           else
8278             {
8279               int i;
8280
8281               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
8282                 {
8283                   rtx slot = XVECEXP (container, 0, i);
8284                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
8285                       || INTVAL (XEXP (slot, 1)) != i * 8)
8286                     need_temp = 1;
8287                 }
8288             }
8289         }
8290       if (!need_temp)
8291         {
8292           int_addr = addr;
8293           sse_addr = addr;
8294         }
8295       else
8296         {
8297           int_addr = create_tmp_var (ptr_type_node, "int_addr");
8298           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
8299         }
8300
8301       /* First ensure that we fit completely in registers.  */
8302       if (needed_intregs)
8303         {
8304           t = build_int_cst (TREE_TYPE (gpr),
8305                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
8306           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
8307           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
8308           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
8309           gimplify_and_add (t, pre_p);
8310         }
8311       if (needed_sseregs)
8312         {
8313           t = build_int_cst (TREE_TYPE (fpr),
8314                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
8315                              + X86_64_REGPARM_MAX * 8);
8316           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
8317           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
8318           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
8319           gimplify_and_add (t, pre_p);
8320         }
8321
8322       /* Compute index to start of area used for integer regs.  */
8323       if (needed_intregs)
8324         {
8325           /* int_addr = gpr + sav; */
8326           t = fold_convert (sizetype, gpr);
8327           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
8328           gimplify_assign (int_addr, t, pre_p);
8329         }
8330       if (needed_sseregs)
8331         {
8332           /* sse_addr = fpr + sav; */
8333           t = fold_convert (sizetype, fpr);
8334           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
8335           gimplify_assign (sse_addr, t, pre_p);
8336         }
8337       if (need_temp)
8338         {
8339           int i, prev_size = 0;
8340           tree temp = create_tmp_var (type, "va_arg_tmp");
8341
8342           /* addr = &temp; */
8343           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
8344           gimplify_assign (addr, t, pre_p);
8345
8346           for (i = 0; i < XVECLEN (container, 0); i++)
8347             {
8348               rtx slot = XVECEXP (container, 0, i);
8349               rtx reg = XEXP (slot, 0);
8350               enum machine_mode mode = GET_MODE (reg);
8351               tree piece_type;
8352               tree addr_type;
8353               tree daddr_type;
8354               tree src_addr, src;
8355               int src_offset;
8356               tree dest_addr, dest;
8357               int cur_size = GET_MODE_SIZE (mode);
8358
8359               gcc_assert (prev_size <= INTVAL (XEXP (slot, 1)));
8360               prev_size = INTVAL (XEXP (slot, 1));
8361               if (prev_size + cur_size > size)
8362                 {
8363                   cur_size = size - prev_size;
8364                   mode = mode_for_size (cur_size * BITS_PER_UNIT, MODE_INT, 1);
8365                   if (mode == BLKmode)
8366                     mode = QImode;
8367                 }
8368               piece_type = lang_hooks.types.type_for_mode (mode, 1);
8369               if (mode == GET_MODE (reg))
8370                 addr_type = build_pointer_type (piece_type);
8371               else
8372                 addr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
8373                                                          true);
8374               daddr_type = build_pointer_type_for_mode (piece_type, ptr_mode,
8375                                                         true);
8376
8377               if (SSE_REGNO_P (REGNO (reg)))
8378                 {
8379                   src_addr = sse_addr;
8380                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
8381                 }
8382               else
8383                 {
8384                   src_addr = int_addr;
8385                   src_offset = REGNO (reg) * 8;
8386                 }
8387               src_addr = fold_convert (addr_type, src_addr);
8388               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
8389                                       size_int (src_offset));
8390
8391               dest_addr = fold_convert (daddr_type, addr);
8392               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
8393                                        size_int (prev_size));
8394               if (cur_size == GET_MODE_SIZE (mode))
8395                 {
8396                   src = build_va_arg_indirect_ref (src_addr);
8397                   dest = build_va_arg_indirect_ref (dest_addr);
8398
8399                   gimplify_assign (dest, src, pre_p);
8400                 }
8401               else
8402                 {
8403                   tree copy
8404                     = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
8405                                        3, dest_addr, src_addr,
8406                                        size_int (cur_size));
8407                   gimplify_and_add (copy, pre_p);
8408                 }
8409               prev_size += cur_size;
8410             }
8411         }
8412
8413       if (needed_intregs)
8414         {
8415           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
8416                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
8417           gimplify_assign (gpr, t, pre_p);
8418         }
8419
8420       if (needed_sseregs)
8421         {
8422           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
8423                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
8424           gimplify_assign (fpr, t, pre_p);
8425         }
8426
8427       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
8428
8429       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
8430     }
8431
8432   /* ... otherwise out of the overflow area.  */
8433
8434   /* When we align parameter on stack for caller, if the parameter
8435      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
8436      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
8437      here with caller.  */
8438   arg_boundary = ix86_function_arg_boundary (VOIDmode, type);
8439   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
8440     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
8441
8442   /* Care for on-stack alignment if needed.  */
8443   if (arg_boundary <= 64 || size == 0)
8444     t = ovf;
8445  else
8446     {
8447       HOST_WIDE_INT align = arg_boundary / 8;
8448       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
8449                   size_int (align - 1));
8450       t = fold_convert (sizetype, t);
8451       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
8452                   size_int (-align));
8453       t = fold_convert (TREE_TYPE (ovf), t);
8454     }
8455
8456   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
8457   gimplify_assign (addr, t, pre_p);
8458
8459   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
8460               size_int (rsize * UNITS_PER_WORD));
8461   gimplify_assign (unshare_expr (ovf), t, pre_p);
8462
8463   if (container)
8464     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
8465
8466   ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
8467   addr = fold_convert (ptrtype, addr);
8468
8469   if (indirect_p)
8470     addr = build_va_arg_indirect_ref (addr);
8471   return build_va_arg_indirect_ref (addr);
8472 }
8473 \f
8474 /* Return true if OPNUM's MEM should be matched
8475    in movabs* patterns.  */
8476
8477 bool
8478 ix86_check_movabs (rtx insn, int opnum)
8479 {
8480   rtx set, mem;
8481
8482   set = PATTERN (insn);
8483   if (GET_CODE (set) == PARALLEL)
8484     set = XVECEXP (set, 0, 0);
8485   gcc_assert (GET_CODE (set) == SET);
8486   mem = XEXP (set, opnum);
8487   while (GET_CODE (mem) == SUBREG)
8488     mem = SUBREG_REG (mem);
8489   gcc_assert (MEM_P (mem));
8490   return volatile_ok || !MEM_VOLATILE_P (mem);
8491 }
8492 \f
8493 /* Initialize the table of extra 80387 mathematical constants.  */
8494
8495 static void
8496 init_ext_80387_constants (void)
8497 {
8498   static const char * cst[5] =
8499   {
8500     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
8501     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
8502     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
8503     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
8504     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
8505   };
8506   int i;
8507
8508   for (i = 0; i < 5; i++)
8509     {
8510       real_from_string (&ext_80387_constants_table[i], cst[i]);
8511       /* Ensure each constant is rounded to XFmode precision.  */
8512       real_convert (&ext_80387_constants_table[i],
8513                     XFmode, &ext_80387_constants_table[i]);
8514     }
8515
8516   ext_80387_constants_init = 1;
8517 }
8518
8519 /* Return non-zero if the constant is something that
8520    can be loaded with a special instruction.  */
8521
8522 int
8523 standard_80387_constant_p (rtx x)
8524 {
8525   enum machine_mode mode = GET_MODE (x);
8526
8527   REAL_VALUE_TYPE r;
8528
8529   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
8530     return -1;
8531
8532   if (x == CONST0_RTX (mode))
8533     return 1;
8534   if (x == CONST1_RTX (mode))
8535     return 2;
8536
8537   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
8538
8539   /* For XFmode constants, try to find a special 80387 instruction when
8540      optimizing for size or on those CPUs that benefit from them.  */
8541   if (mode == XFmode
8542       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
8543     {
8544       int i;
8545
8546       if (! ext_80387_constants_init)
8547         init_ext_80387_constants ();
8548
8549       for (i = 0; i < 5; i++)
8550         if (real_identical (&r, &ext_80387_constants_table[i]))
8551           return i + 3;
8552     }
8553
8554   /* Load of the constant -0.0 or -1.0 will be split as
8555      fldz;fchs or fld1;fchs sequence.  */
8556   if (real_isnegzero (&r))
8557     return 8;
8558   if (real_identical (&r, &dconstm1))
8559     return 9;
8560
8561   return 0;
8562 }
8563
8564 /* Return the opcode of the special instruction to be used to load
8565    the constant X.  */
8566
8567 const char *
8568 standard_80387_constant_opcode (rtx x)
8569 {
8570   switch (standard_80387_constant_p (x))
8571     {
8572     case 1:
8573       return "fldz";
8574     case 2:
8575       return "fld1";
8576     case 3:
8577       return "fldlg2";
8578     case 4:
8579       return "fldln2";
8580     case 5:
8581       return "fldl2e";
8582     case 6:
8583       return "fldl2t";
8584     case 7:
8585       return "fldpi";
8586     case 8:
8587     case 9:
8588       return "#";
8589     default:
8590       gcc_unreachable ();
8591     }
8592 }
8593
8594 /* Return the CONST_DOUBLE representing the 80387 constant that is
8595    loaded by the specified special instruction.  The argument IDX
8596    matches the return value from standard_80387_constant_p.  */
8597
8598 rtx
8599 standard_80387_constant_rtx (int idx)
8600 {
8601   int i;
8602
8603   if (! ext_80387_constants_init)
8604     init_ext_80387_constants ();
8605
8606   switch (idx)
8607     {
8608     case 3:
8609     case 4:
8610     case 5:
8611     case 6:
8612     case 7:
8613       i = idx - 3;
8614       break;
8615
8616     default:
8617       gcc_unreachable ();
8618     }
8619
8620   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
8621                                        XFmode);
8622 }
8623
8624 /* Return 1 if X is all 0s and 2 if x is all 1s
8625    in supported SSE vector mode.  */
8626
8627 int
8628 standard_sse_constant_p (rtx x)
8629 {
8630   enum machine_mode mode = GET_MODE (x);
8631
8632   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
8633     return 1;
8634   if (vector_all_ones_operand (x, mode))
8635     switch (mode)
8636       {
8637       case V16QImode:
8638       case V8HImode:
8639       case V4SImode:
8640       case V2DImode:
8641         if (TARGET_SSE2)
8642           return 2;
8643       default:
8644         break;
8645       }
8646
8647   return 0;
8648 }
8649
8650 /* Return the opcode of the special instruction to be used to load
8651    the constant X.  */
8652
8653 const char *
8654 standard_sse_constant_opcode (rtx insn, rtx x)
8655 {
8656   switch (standard_sse_constant_p (x))
8657     {
8658     case 1:
8659       switch (get_attr_mode (insn))
8660         {
8661         case MODE_V4SF:
8662           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8663         case MODE_V2DF:
8664           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8665             return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8666           else
8667             return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
8668         case MODE_TI:
8669           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8670             return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
8671           else
8672             return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
8673         case MODE_V8SF:
8674           return "vxorps\t%x0, %x0, %x0";
8675         case MODE_V4DF:
8676           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8677             return "vxorps\t%x0, %x0, %x0";
8678           else
8679             return "vxorpd\t%x0, %x0, %x0";
8680         case MODE_OI:
8681           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
8682             return "vxorps\t%x0, %x0, %x0";
8683           else
8684             return "vpxor\t%x0, %x0, %x0";
8685         default:
8686           break;
8687         }
8688     case 2:
8689       return TARGET_AVX ? "vpcmpeqd\t%0, %0, %0" : "pcmpeqd\t%0, %0";
8690     default:
8691       break;
8692     }
8693   gcc_unreachable ();
8694 }
8695
8696 /* Returns true if OP contains a symbol reference */
8697
8698 bool
8699 symbolic_reference_mentioned_p (rtx op)
8700 {
8701   const char *fmt;
8702   int i;
8703
8704   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
8705     return true;
8706
8707   fmt = GET_RTX_FORMAT (GET_CODE (op));
8708   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
8709     {
8710       if (fmt[i] == 'E')
8711         {
8712           int j;
8713
8714           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
8715             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
8716               return true;
8717         }
8718
8719       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
8720         return true;
8721     }
8722
8723   return false;
8724 }
8725
8726 /* Return true if it is appropriate to emit `ret' instructions in the
8727    body of a function.  Do this only if the epilogue is simple, needing a
8728    couple of insns.  Prior to reloading, we can't tell how many registers
8729    must be saved, so return false then.  Return false if there is no frame
8730    marker to de-allocate.  */
8731
8732 bool
8733 ix86_can_use_return_insn_p (void)
8734 {
8735   struct ix86_frame frame;
8736
8737   if (! reload_completed || frame_pointer_needed)
8738     return 0;
8739
8740   /* Don't allow more than 32k pop, since that's all we can do
8741      with one instruction.  */
8742   if (crtl->args.pops_args && crtl->args.size >= 32768)
8743     return 0;
8744
8745   ix86_compute_frame_layout (&frame);
8746   return (frame.stack_pointer_offset == UNITS_PER_WORD
8747           && (frame.nregs + frame.nsseregs) == 0);
8748 }
8749 \f
8750 /* Value should be nonzero if functions must have frame pointers.
8751    Zero means the frame pointer need not be set up (and parms may
8752    be accessed via the stack pointer) in functions that seem suitable.  */
8753
8754 static bool
8755 ix86_frame_pointer_required (void)
8756 {
8757   /* If we accessed previous frames, then the generated code expects
8758      to be able to access the saved ebp value in our frame.  */
8759   if (cfun->machine->accesses_prev_frame)
8760     return true;
8761
8762   /* Several x86 os'es need a frame pointer for other reasons,
8763      usually pertaining to setjmp.  */
8764   if (SUBTARGET_FRAME_POINTER_REQUIRED)
8765     return true;
8766
8767   /* In ix86_option_override_internal, TARGET_OMIT_LEAF_FRAME_POINTER
8768      turns off the frame pointer by default.  Turn it back on now if
8769      we've not got a leaf function.  */
8770   if (TARGET_OMIT_LEAF_FRAME_POINTER
8771       && (!current_function_is_leaf
8772           || ix86_current_function_calls_tls_descriptor))
8773     return true;
8774
8775   if (crtl->profile && !flag_fentry)
8776     return true;
8777
8778   return false;
8779 }
8780
8781 /* Record that the current function accesses previous call frames.  */
8782
8783 void
8784 ix86_setup_frame_addresses (void)
8785 {
8786   cfun->machine->accesses_prev_frame = 1;
8787 }
8788 \f
8789 #ifndef USE_HIDDEN_LINKONCE
8790 # if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
8791 #  define USE_HIDDEN_LINKONCE 1
8792 # else
8793 #  define USE_HIDDEN_LINKONCE 0
8794 # endif
8795 #endif
8796
8797 static int pic_labels_used;
8798
8799 /* Fills in the label name that should be used for a pc thunk for
8800    the given register.  */
8801
8802 static void
8803 get_pc_thunk_name (char name[32], unsigned int regno)
8804 {
8805   gcc_assert (!TARGET_64BIT);
8806
8807   if (USE_HIDDEN_LINKONCE)
8808     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
8809   else
8810     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
8811 }
8812
8813
8814 /* This function generates code for -fpic that loads %ebx with
8815    the return address of the caller and then returns.  */
8816
8817 static void
8818 ix86_code_end (void)
8819 {
8820   rtx xops[2];
8821   int regno;
8822
8823   for (regno = AX_REG; regno <= SP_REG; regno++)
8824     {
8825       char name[32];
8826       tree decl;
8827
8828       if (!(pic_labels_used & (1 << regno)))
8829         continue;
8830
8831       get_pc_thunk_name (name, regno);
8832
8833       decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
8834                          get_identifier (name),
8835                          build_function_type_list (void_type_node, NULL_TREE));
8836       DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
8837                                        NULL_TREE, void_type_node);
8838       TREE_PUBLIC (decl) = 1;
8839       TREE_STATIC (decl) = 1;
8840
8841 #if TARGET_MACHO
8842       if (TARGET_MACHO)
8843         {
8844           switch_to_section (darwin_sections[text_coal_section]);
8845           fputs ("\t.weak_definition\t", asm_out_file);
8846           assemble_name (asm_out_file, name);
8847           fputs ("\n\t.private_extern\t", asm_out_file);
8848           assemble_name (asm_out_file, name);
8849           putc ('\n', asm_out_file);
8850           ASM_OUTPUT_LABEL (asm_out_file, name);
8851           DECL_WEAK (decl) = 1;
8852         }
8853       else
8854 #endif
8855       if (USE_HIDDEN_LINKONCE)
8856         {
8857           DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
8858
8859           targetm.asm_out.unique_section (decl, 0);
8860           switch_to_section (get_named_section (decl, NULL, 0));
8861
8862           targetm.asm_out.globalize_label (asm_out_file, name);
8863           fputs ("\t.hidden\t", asm_out_file);
8864           assemble_name (asm_out_file, name);
8865           putc ('\n', asm_out_file);
8866           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
8867         }
8868       else
8869         {
8870           switch_to_section (text_section);
8871           ASM_OUTPUT_LABEL (asm_out_file, name);
8872         }
8873
8874       DECL_INITIAL (decl) = make_node (BLOCK);
8875       current_function_decl = decl;
8876       init_function_start (decl);
8877       first_function_block_is_cold = false;
8878       /* Make sure unwind info is emitted for the thunk if needed.  */
8879       final_start_function (emit_barrier (), asm_out_file, 1);
8880
8881       /* Pad stack IP move with 4 instructions (two NOPs count
8882          as one instruction).  */
8883       if (TARGET_PAD_SHORT_FUNCTION)
8884         {
8885           int i = 8;
8886
8887           while (i--)
8888             fputs ("\tnop\n", asm_out_file);
8889         }
8890
8891       xops[0] = gen_rtx_REG (Pmode, regno);
8892       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
8893       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
8894       fputs ("\tret\n", asm_out_file);
8895       final_end_function ();
8896       init_insn_lengths ();
8897       free_after_compilation (cfun);
8898       set_cfun (NULL);
8899       current_function_decl = NULL;
8900     }
8901
8902   if (flag_split_stack)
8903     file_end_indicate_split_stack ();
8904 }
8905
8906 /* Emit code for the SET_GOT patterns.  */
8907
8908 const char *
8909 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
8910 {
8911   rtx xops[3];
8912
8913   xops[0] = dest;
8914
8915   if (TARGET_VXWORKS_RTP && flag_pic)
8916     {
8917       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
8918       xops[2] = gen_rtx_MEM (Pmode,
8919                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
8920       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
8921
8922       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
8923          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
8924          an unadorned address.  */
8925       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
8926       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
8927       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
8928       return "";
8929     }
8930
8931   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
8932
8933   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
8934     {
8935       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
8936
8937       if (!flag_pic)
8938         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
8939       else
8940         {
8941           output_asm_insn ("call\t%a2", xops);
8942 #ifdef DWARF2_UNWIND_INFO
8943           /* The call to next label acts as a push.  */
8944           if (dwarf2out_do_frame ())
8945             {
8946               rtx insn;
8947               start_sequence ();
8948               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8949                                              gen_rtx_PLUS (Pmode,
8950                                                            stack_pointer_rtx,
8951                                                            GEN_INT (-4))));
8952               RTX_FRAME_RELATED_P (insn) = 1;
8953               dwarf2out_frame_debug (insn, true);
8954               end_sequence ();
8955             }
8956 #endif
8957         }
8958
8959 #if TARGET_MACHO
8960       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
8961          is what will be referenced by the Mach-O PIC subsystem.  */
8962       if (!label)
8963         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
8964 #endif
8965
8966       targetm.asm_out.internal_label (asm_out_file, "L",
8967                                       CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
8968
8969       if (flag_pic)
8970         {
8971           output_asm_insn ("pop%z0\t%0", xops);
8972 #ifdef DWARF2_UNWIND_INFO
8973           /* The pop is a pop and clobbers dest, but doesn't restore it
8974              for unwind info purposes.  */
8975           if (dwarf2out_do_frame ())
8976             {
8977               rtx insn;
8978               start_sequence ();
8979               insn = emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
8980               dwarf2out_frame_debug (insn, true);
8981               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8982                                              gen_rtx_PLUS (Pmode,
8983                                                            stack_pointer_rtx,
8984                                                            GEN_INT (4))));
8985               RTX_FRAME_RELATED_P (insn) = 1;
8986               dwarf2out_frame_debug (insn, true);
8987               end_sequence ();
8988             }
8989 #endif
8990         }
8991     }
8992   else
8993     {
8994       char name[32];
8995       get_pc_thunk_name (name, REGNO (dest));
8996       pic_labels_used |= 1 << REGNO (dest);
8997
8998 #ifdef DWARF2_UNWIND_INFO
8999       /* Ensure all queued register saves are flushed before the
9000          call.  */
9001       if (dwarf2out_do_frame ())
9002         dwarf2out_flush_queued_reg_saves ();
9003 #endif
9004       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
9005       xops[2] = gen_rtx_MEM (QImode, xops[2]);
9006       output_asm_insn ("call\t%X2", xops);
9007       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
9008          is what will be referenced by the Mach-O PIC subsystem.  */
9009 #if TARGET_MACHO
9010       if (!label)
9011         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
9012       else
9013         targetm.asm_out.internal_label (asm_out_file, "L",
9014                                            CODE_LABEL_NUMBER (label));
9015 #endif
9016     }
9017
9018   if (TARGET_MACHO)
9019     return "";
9020
9021   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
9022     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
9023   else
9024     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
9025
9026   return "";
9027 }
9028
9029 /* Generate an "push" pattern for input ARG.  */
9030
9031 static rtx
9032 gen_push (rtx arg)
9033 {
9034   struct machine_function *m = cfun->machine;
9035
9036   if (m->fs.cfa_reg == stack_pointer_rtx)
9037     m->fs.cfa_offset += UNITS_PER_WORD;
9038   m->fs.sp_offset += UNITS_PER_WORD;
9039
9040   return gen_rtx_SET (VOIDmode,
9041                       gen_rtx_MEM (Pmode,
9042                                    gen_rtx_PRE_DEC (Pmode,
9043                                                     stack_pointer_rtx)),
9044                       arg);
9045 }
9046
9047 /* Generate an "pop" pattern for input ARG.  */
9048
9049 static rtx
9050 gen_pop (rtx arg)
9051 {
9052   return gen_rtx_SET (VOIDmode,
9053                       arg,
9054                       gen_rtx_MEM (Pmode,
9055                                    gen_rtx_POST_INC (Pmode,
9056                                                      stack_pointer_rtx)));
9057 }
9058
9059 /* Return >= 0 if there is an unused call-clobbered register available
9060    for the entire function.  */
9061
9062 static unsigned int
9063 ix86_select_alt_pic_regnum (void)
9064 {
9065   if (current_function_is_leaf
9066       && !crtl->profile
9067       && !ix86_current_function_calls_tls_descriptor)
9068     {
9069       int i, drap;
9070       /* Can't use the same register for both PIC and DRAP.  */
9071       if (crtl->drap_reg)
9072         drap = REGNO (crtl->drap_reg);
9073       else
9074         drap = -1;
9075       for (i = 2; i >= 0; --i)
9076         if (i != drap && !df_regs_ever_live_p (i))
9077           return i;
9078     }
9079
9080   return INVALID_REGNUM;
9081 }
9082
9083 /* Return 1 if we need to save REGNO.  */
9084 static int
9085 ix86_save_reg (unsigned int regno, int maybe_eh_return)
9086 {
9087   if (pic_offset_table_rtx
9088       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
9089       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
9090           || crtl->profile
9091           || crtl->calls_eh_return
9092           || crtl->uses_const_pool))
9093     {
9094       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
9095         return 0;
9096       return 1;
9097     }
9098
9099   if (crtl->calls_eh_return && maybe_eh_return)
9100     {
9101       unsigned i;
9102       for (i = 0; ; i++)
9103         {
9104           unsigned test = EH_RETURN_DATA_REGNO (i);
9105           if (test == INVALID_REGNUM)
9106             break;
9107           if (test == regno)
9108             return 1;
9109         }
9110     }
9111
9112   if (crtl->drap_reg && regno == REGNO (crtl->drap_reg))
9113     return 1;
9114
9115   return (df_regs_ever_live_p (regno)
9116           && !call_used_regs[regno]
9117           && !fixed_regs[regno]
9118           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
9119 }
9120
9121 /* Return number of saved general prupose registers.  */
9122
9123 static int
9124 ix86_nsaved_regs (void)
9125 {
9126   int nregs = 0;
9127   int regno;
9128
9129   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9130     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9131       nregs ++;
9132   return nregs;
9133 }
9134
9135 /* Return number of saved SSE registrers.  */
9136
9137 static int
9138 ix86_nsaved_sseregs (void)
9139 {
9140   int nregs = 0;
9141   int regno;
9142
9143   if (!TARGET_64BIT_MS_ABI)
9144     return 0;
9145   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9146     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9147       nregs ++;
9148   return nregs;
9149 }
9150
9151 /* Given FROM and TO register numbers, say whether this elimination is
9152    allowed.  If stack alignment is needed, we can only replace argument
9153    pointer with hard frame pointer, or replace frame pointer with stack
9154    pointer.  Otherwise, frame pointer elimination is automatically
9155    handled and all other eliminations are valid.  */
9156
9157 static bool
9158 ix86_can_eliminate (const int from, const int to)
9159 {
9160   if (stack_realign_fp)
9161     return ((from == ARG_POINTER_REGNUM
9162              && to == HARD_FRAME_POINTER_REGNUM)
9163             || (from == FRAME_POINTER_REGNUM
9164                 && to == STACK_POINTER_REGNUM));
9165   else
9166     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : true;
9167 }
9168
9169 /* Return the offset between two registers, one to be eliminated, and the other
9170    its replacement, at the start of a routine.  */
9171
9172 HOST_WIDE_INT
9173 ix86_initial_elimination_offset (int from, int to)
9174 {
9175   struct ix86_frame frame;
9176   ix86_compute_frame_layout (&frame);
9177
9178   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
9179     return frame.hard_frame_pointer_offset;
9180   else if (from == FRAME_POINTER_REGNUM
9181            && to == HARD_FRAME_POINTER_REGNUM)
9182     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
9183   else
9184     {
9185       gcc_assert (to == STACK_POINTER_REGNUM);
9186
9187       if (from == ARG_POINTER_REGNUM)
9188         return frame.stack_pointer_offset;
9189
9190       gcc_assert (from == FRAME_POINTER_REGNUM);
9191       return frame.stack_pointer_offset - frame.frame_pointer_offset;
9192     }
9193 }
9194
9195 /* In a dynamically-aligned function, we can't know the offset from
9196    stack pointer to frame pointer, so we must ensure that setjmp
9197    eliminates fp against the hard fp (%ebp) rather than trying to
9198    index from %esp up to the top of the frame across a gap that is
9199    of unknown (at compile-time) size.  */
9200 static rtx
9201 ix86_builtin_setjmp_frame_value (void)
9202 {
9203   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
9204 }
9205
9206 /* On the x86 -fsplit-stack and -fstack-protector both use the same
9207    field in the TCB, so they can not be used together.  */
9208
9209 static bool
9210 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
9211                            struct gcc_options *opts ATTRIBUTE_UNUSED)
9212 {
9213   bool ret = true;
9214
9215 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
9216   if (report)
9217     error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
9218   ret = false;
9219 #else
9220   if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
9221     {
9222       if (report)
9223         error ("%<-fsplit-stack%> requires "
9224                "assembler support for CFI directives");
9225       ret = false;
9226     }
9227 #endif
9228
9229   return ret;
9230 }
9231
9232 /* When using -fsplit-stack, the allocation routines set a field in
9233    the TCB to the bottom of the stack plus this much space, measured
9234    in bytes.  */
9235
9236 #define SPLIT_STACK_AVAILABLE 256
9237
9238 /* Fill structure ix86_frame about frame of currently computed function.  */
9239
9240 static void
9241 ix86_compute_frame_layout (struct ix86_frame *frame)
9242 {
9243   unsigned int stack_alignment_needed;
9244   HOST_WIDE_INT offset;
9245   unsigned int preferred_alignment;
9246   HOST_WIDE_INT size = get_frame_size ();
9247   HOST_WIDE_INT to_allocate;
9248
9249   frame->nregs = ix86_nsaved_regs ();
9250   frame->nsseregs = ix86_nsaved_sseregs ();
9251
9252   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
9253   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
9254
9255   /* 64-bit MS ABI seem to require stack alignment to be always 16 except for
9256      function prologues and leaf.  */
9257   if ((TARGET_64BIT_MS_ABI && preferred_alignment < 16)
9258       && (!current_function_is_leaf || cfun->calls_alloca != 0
9259           || ix86_current_function_calls_tls_descriptor))
9260     {
9261       preferred_alignment = 16;
9262       stack_alignment_needed = 16;
9263       crtl->preferred_stack_boundary = 128;
9264       crtl->stack_alignment_needed = 128;
9265     }
9266
9267   gcc_assert (!size || stack_alignment_needed);
9268   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
9269   gcc_assert (preferred_alignment <= stack_alignment_needed);
9270
9271   /* For SEH we have to limit the amount of code movement into the prologue.
9272      At present we do this via a BLOCKAGE, at which point there's very little
9273      scheduling that can be done, which means that there's very little point
9274      in doing anything except PUSHs.  */
9275   if (TARGET_SEH)
9276     cfun->machine->use_fast_prologue_epilogue = false;
9277
9278   /* During reload iteration the amount of registers saved can change.
9279      Recompute the value as needed.  Do not recompute when amount of registers
9280      didn't change as reload does multiple calls to the function and does not
9281      expect the decision to change within single iteration.  */
9282   else if (!optimize_function_for_size_p (cfun)
9283            && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
9284     {
9285       int count = frame->nregs;
9286       struct cgraph_node *node = cgraph_get_node (current_function_decl);
9287
9288       cfun->machine->use_fast_prologue_epilogue_nregs = count;
9289
9290       /* The fast prologue uses move instead of push to save registers.  This
9291          is significantly longer, but also executes faster as modern hardware
9292          can execute the moves in parallel, but can't do that for push/pop.
9293
9294          Be careful about choosing what prologue to emit:  When function takes
9295          many instructions to execute we may use slow version as well as in
9296          case function is known to be outside hot spot (this is known with
9297          feedback only).  Weight the size of function by number of registers
9298          to save as it is cheap to use one or two push instructions but very
9299          slow to use many of them.  */
9300       if (count)
9301         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
9302       if (node->frequency < NODE_FREQUENCY_NORMAL
9303           || (flag_branch_probabilities
9304               && node->frequency < NODE_FREQUENCY_HOT))
9305         cfun->machine->use_fast_prologue_epilogue = false;
9306       else
9307         cfun->machine->use_fast_prologue_epilogue
9308            = !expensive_function_p (count);
9309     }
9310   if (TARGET_PROLOGUE_USING_MOVE
9311       && cfun->machine->use_fast_prologue_epilogue)
9312     frame->save_regs_using_mov = true;
9313   else
9314     frame->save_regs_using_mov = false;
9315
9316   /* If static stack checking is enabled and done with probes, the registers
9317      need to be saved before allocating the frame.  */
9318   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
9319     frame->save_regs_using_mov = false;
9320
9321   /* Skip return address.  */
9322   offset = UNITS_PER_WORD;
9323
9324   /* Skip pushed static chain.  */
9325   if (ix86_static_chain_on_stack)
9326     offset += UNITS_PER_WORD;
9327
9328   /* Skip saved base pointer.  */
9329   if (frame_pointer_needed)
9330     offset += UNITS_PER_WORD;
9331   frame->hfp_save_offset = offset;
9332
9333   /* The traditional frame pointer location is at the top of the frame.  */
9334   frame->hard_frame_pointer_offset = offset;
9335
9336   /* Register save area */
9337   offset += frame->nregs * UNITS_PER_WORD;
9338   frame->reg_save_offset = offset;
9339
9340   /* Align and set SSE register save area.  */
9341   if (frame->nsseregs)
9342     {
9343       /* The only ABI that has saved SSE registers (Win64) also has a
9344          16-byte aligned default stack, and thus we don't need to be
9345          within the re-aligned local stack frame to save them.  */
9346       gcc_assert (INCOMING_STACK_BOUNDARY >= 128);
9347       offset = (offset + 16 - 1) & -16;
9348       offset += frame->nsseregs * 16;
9349     }
9350   frame->sse_reg_save_offset = offset;
9351
9352   /* The re-aligned stack starts here.  Values before this point are not
9353      directly comparable with values below this point.  In order to make
9354      sure that no value happens to be the same before and after, force
9355      the alignment computation below to add a non-zero value.  */
9356   if (stack_realign_fp)
9357     offset = (offset + stack_alignment_needed) & -stack_alignment_needed;
9358
9359   /* Va-arg area */
9360   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
9361   offset += frame->va_arg_size;
9362
9363   /* Align start of frame for local function.  */
9364   if (stack_realign_fp
9365       || offset != frame->sse_reg_save_offset
9366       || size != 0
9367       || !current_function_is_leaf
9368       || cfun->calls_alloca
9369       || ix86_current_function_calls_tls_descriptor)
9370     offset = (offset + stack_alignment_needed - 1) & -stack_alignment_needed;
9371
9372   /* Frame pointer points here.  */
9373   frame->frame_pointer_offset = offset;
9374
9375   offset += size;
9376
9377   /* Add outgoing arguments area.  Can be skipped if we eliminated
9378      all the function calls as dead code.
9379      Skipping is however impossible when function calls alloca.  Alloca
9380      expander assumes that last crtl->outgoing_args_size
9381      of stack frame are unused.  */
9382   if (ACCUMULATE_OUTGOING_ARGS
9383       && (!current_function_is_leaf || cfun->calls_alloca
9384           || ix86_current_function_calls_tls_descriptor))
9385     {
9386       offset += crtl->outgoing_args_size;
9387       frame->outgoing_arguments_size = crtl->outgoing_args_size;
9388     }
9389   else
9390     frame->outgoing_arguments_size = 0;
9391
9392   /* Align stack boundary.  Only needed if we're calling another function
9393      or using alloca.  */
9394   if (!current_function_is_leaf || cfun->calls_alloca
9395       || ix86_current_function_calls_tls_descriptor)
9396     offset = (offset + preferred_alignment - 1) & -preferred_alignment;
9397
9398   /* We've reached end of stack frame.  */
9399   frame->stack_pointer_offset = offset;
9400
9401   /* Size prologue needs to allocate.  */
9402   to_allocate = offset - frame->sse_reg_save_offset;
9403
9404   if ((!to_allocate && frame->nregs <= 1)
9405       || (TARGET_64BIT && to_allocate >= (HOST_WIDE_INT) 0x80000000))
9406     frame->save_regs_using_mov = false;
9407
9408   if (ix86_using_red_zone ()
9409       && current_function_sp_is_unchanging
9410       && current_function_is_leaf
9411       && !ix86_current_function_calls_tls_descriptor)
9412     {
9413       frame->red_zone_size = to_allocate;
9414       if (frame->save_regs_using_mov)
9415         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
9416       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
9417         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
9418     }
9419   else
9420     frame->red_zone_size = 0;
9421   frame->stack_pointer_offset -= frame->red_zone_size;
9422
9423   /* The SEH frame pointer location is near the bottom of the frame.
9424      This is enforced by the fact that the difference between the
9425      stack pointer and the frame pointer is limited to 240 bytes in
9426      the unwind data structure.  */
9427   if (TARGET_SEH)
9428     {
9429       HOST_WIDE_INT diff;
9430
9431       /* If we can leave the frame pointer where it is, do so.  */
9432       diff = frame->stack_pointer_offset - frame->hard_frame_pointer_offset;
9433       if (diff > 240 || (diff & 15) != 0)
9434         {
9435           /* Ideally we'd determine what portion of the local stack frame
9436              (within the constraint of the lowest 240) is most heavily used.
9437              But without that complication, simply bias the frame pointer
9438              by 128 bytes so as to maximize the amount of the local stack
9439              frame that is addressable with 8-bit offsets.  */
9440           frame->hard_frame_pointer_offset = frame->stack_pointer_offset - 128;
9441         }
9442     }
9443 }
9444
9445 /* This is semi-inlined memory_address_length, but simplified
9446    since we know that we're always dealing with reg+offset, and
9447    to avoid having to create and discard all that rtl.  */
9448
9449 static inline int
9450 choose_baseaddr_len (unsigned int regno, HOST_WIDE_INT offset)
9451 {
9452   int len = 4;
9453
9454   if (offset == 0)
9455     {
9456       /* EBP and R13 cannot be encoded without an offset.  */
9457       len = (regno == BP_REG || regno == R13_REG);
9458     }
9459   else if (IN_RANGE (offset, -128, 127))
9460     len = 1;
9461
9462   /* ESP and R12 must be encoded with a SIB byte.  */
9463   if (regno == SP_REG || regno == R12_REG)
9464     len++;
9465
9466   return len;
9467 }
9468   
9469 /* Return an RTX that points to CFA_OFFSET within the stack frame.
9470    The valid base registers are taken from CFUN->MACHINE->FS.  */
9471
9472 static rtx
9473 choose_baseaddr (HOST_WIDE_INT cfa_offset)
9474 {
9475   const struct machine_function *m = cfun->machine;
9476   rtx base_reg = NULL;
9477   HOST_WIDE_INT base_offset = 0;
9478
9479   if (m->use_fast_prologue_epilogue)
9480     {
9481       /* Choose the base register most likely to allow the most scheduling
9482          opportunities.  Generally FP is valid througout the function,
9483          while DRAP must be reloaded within the epilogue.  But choose either
9484          over the SP due to increased encoding size.  */
9485
9486       if (m->fs.fp_valid)
9487         {
9488           base_reg = hard_frame_pointer_rtx;
9489           base_offset = m->fs.fp_offset - cfa_offset;
9490         }
9491       else if (m->fs.drap_valid)
9492         {
9493           base_reg = crtl->drap_reg;
9494           base_offset = 0 - cfa_offset;
9495         }
9496       else if (m->fs.sp_valid)
9497         {
9498           base_reg = stack_pointer_rtx;
9499           base_offset = m->fs.sp_offset - cfa_offset;
9500         }
9501     }
9502   else
9503     {
9504       HOST_WIDE_INT toffset;
9505       int len = 16, tlen;
9506
9507       /* Choose the base register with the smallest address encoding.
9508          With a tie, choose FP > DRAP > SP.  */
9509       if (m->fs.sp_valid)
9510         {
9511           base_reg = stack_pointer_rtx;
9512           base_offset = m->fs.sp_offset - cfa_offset;
9513           len = choose_baseaddr_len (STACK_POINTER_REGNUM, base_offset);
9514         }
9515       if (m->fs.drap_valid)
9516         {
9517           toffset = 0 - cfa_offset;
9518           tlen = choose_baseaddr_len (REGNO (crtl->drap_reg), toffset);
9519           if (tlen <= len)
9520             {
9521               base_reg = crtl->drap_reg;
9522               base_offset = toffset;
9523               len = tlen;
9524             }
9525         }
9526       if (m->fs.fp_valid)
9527         {
9528           toffset = m->fs.fp_offset - cfa_offset;
9529           tlen = choose_baseaddr_len (HARD_FRAME_POINTER_REGNUM, toffset);
9530           if (tlen <= len)
9531             {
9532               base_reg = hard_frame_pointer_rtx;
9533               base_offset = toffset;
9534               len = tlen;
9535             }
9536         }
9537     }
9538   gcc_assert (base_reg != NULL);
9539
9540   return plus_constant (base_reg, base_offset);
9541 }
9542
9543 /* Emit code to save registers in the prologue.  */
9544
9545 static void
9546 ix86_emit_save_regs (void)
9547 {
9548   unsigned int regno;
9549   rtx insn;
9550
9551   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
9552     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9553       {
9554         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
9555         RTX_FRAME_RELATED_P (insn) = 1;
9556       }
9557 }
9558
9559 /* Emit a single register save at CFA - CFA_OFFSET.  */
9560
9561 static void
9562 ix86_emit_save_reg_using_mov (enum machine_mode mode, unsigned int regno,
9563                               HOST_WIDE_INT cfa_offset)
9564 {
9565   struct machine_function *m = cfun->machine;
9566   rtx reg = gen_rtx_REG (mode, regno);
9567   rtx mem, addr, base, insn;
9568
9569   addr = choose_baseaddr (cfa_offset);
9570   mem = gen_frame_mem (mode, addr);
9571
9572   /* For SSE saves, we need to indicate the 128-bit alignment.  */
9573   set_mem_align (mem, GET_MODE_ALIGNMENT (mode));
9574
9575   insn = emit_move_insn (mem, reg);
9576   RTX_FRAME_RELATED_P (insn) = 1;
9577
9578   base = addr;
9579   if (GET_CODE (base) == PLUS)
9580     base = XEXP (base, 0);
9581   gcc_checking_assert (REG_P (base));
9582
9583   /* When saving registers into a re-aligned local stack frame, avoid
9584      any tricky guessing by dwarf2out.  */
9585   if (m->fs.realigned)
9586     {
9587       gcc_checking_assert (stack_realign_drap);
9588
9589       if (regno == REGNO (crtl->drap_reg))
9590         {
9591           /* A bit of a hack.  We force the DRAP register to be saved in
9592              the re-aligned stack frame, which provides us with a copy
9593              of the CFA that will last past the prologue.  Install it.  */
9594           gcc_checking_assert (cfun->machine->fs.fp_valid);
9595           addr = plus_constant (hard_frame_pointer_rtx,
9596                                 cfun->machine->fs.fp_offset - cfa_offset);
9597           mem = gen_rtx_MEM (mode, addr);
9598           add_reg_note (insn, REG_CFA_DEF_CFA, mem);
9599         }
9600       else
9601         {
9602           /* The frame pointer is a stable reference within the
9603              aligned frame.  Use it.  */
9604           gcc_checking_assert (cfun->machine->fs.fp_valid);
9605           addr = plus_constant (hard_frame_pointer_rtx,
9606                                 cfun->machine->fs.fp_offset - cfa_offset);
9607           mem = gen_rtx_MEM (mode, addr);
9608           add_reg_note (insn, REG_CFA_EXPRESSION,
9609                         gen_rtx_SET (VOIDmode, mem, reg));
9610         }
9611     }
9612
9613   /* The memory may not be relative to the current CFA register,
9614      which means that we may need to generate a new pattern for
9615      use by the unwind info.  */
9616   else if (base != m->fs.cfa_reg)
9617     {
9618       addr = plus_constant (m->fs.cfa_reg, m->fs.cfa_offset - cfa_offset);
9619       mem = gen_rtx_MEM (mode, addr);
9620       add_reg_note (insn, REG_CFA_OFFSET, gen_rtx_SET (VOIDmode, mem, reg));
9621     }
9622 }
9623
9624 /* Emit code to save registers using MOV insns.
9625    First register is stored at CFA - CFA_OFFSET.  */
9626 static void
9627 ix86_emit_save_regs_using_mov (HOST_WIDE_INT cfa_offset)
9628 {
9629   unsigned int regno;
9630
9631   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
9632     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
9633       {
9634         ix86_emit_save_reg_using_mov (Pmode, regno, cfa_offset);
9635         cfa_offset -= UNITS_PER_WORD;
9636       }
9637 }
9638
9639 /* Emit code to save SSE registers using MOV insns.
9640    First register is stored at CFA - CFA_OFFSET.  */
9641 static void
9642 ix86_emit_save_sse_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 (V4SFmode, regno, cfa_offset);
9650         cfa_offset -= 16;
9651       }
9652 }
9653
9654 static GTY(()) rtx queued_cfa_restores;
9655
9656 /* Add a REG_CFA_RESTORE REG note to INSN or queue them until next stack
9657    manipulation insn.  The value is on the stack at CFA - CFA_OFFSET.
9658    Don't add the note if the previously saved value will be left untouched
9659    within stack red-zone till return, as unwinders can find the same value
9660    in the register and on the stack.  */
9661
9662 static void
9663 ix86_add_cfa_restore_note (rtx insn, rtx reg, HOST_WIDE_INT cfa_offset)
9664 {
9665   if (cfa_offset <= cfun->machine->fs.red_zone_offset)
9666     return;
9667
9668   if (insn)
9669     {
9670       add_reg_note (insn, REG_CFA_RESTORE, reg);
9671       RTX_FRAME_RELATED_P (insn) = 1;
9672     }
9673   else
9674     queued_cfa_restores
9675       = alloc_reg_note (REG_CFA_RESTORE, reg, queued_cfa_restores);
9676 }
9677
9678 /* Add queued REG_CFA_RESTORE notes if any to INSN.  */
9679
9680 static void
9681 ix86_add_queued_cfa_restore_notes (rtx insn)
9682 {
9683   rtx last;
9684   if (!queued_cfa_restores)
9685     return;
9686   for (last = queued_cfa_restores; XEXP (last, 1); last = XEXP (last, 1))
9687     ;
9688   XEXP (last, 1) = REG_NOTES (insn);
9689   REG_NOTES (insn) = queued_cfa_restores;
9690   queued_cfa_restores = NULL_RTX;
9691   RTX_FRAME_RELATED_P (insn) = 1;
9692 }
9693
9694 /* Expand prologue or epilogue stack adjustment.
9695    The pattern exist to put a dependency on all ebp-based memory accesses.
9696    STYLE should be negative if instructions should be marked as frame related,
9697    zero if %r11 register is live and cannot be freely used and positive
9698    otherwise.  */
9699
9700 static void
9701 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
9702                            int style, bool set_cfa)
9703 {
9704   struct machine_function *m = cfun->machine;
9705   rtx insn;
9706   bool add_frame_related_expr = false;
9707
9708   if (! TARGET_64BIT)
9709     insn = gen_pro_epilogue_adjust_stack_si_add (dest, src, offset);
9710   else if (x86_64_immediate_operand (offset, DImode))
9711     insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, offset);
9712   else
9713     {
9714       rtx tmp;
9715       /* r11 is used by indirect sibcall return as well, set before the
9716          epilogue and used after the epilogue.  */
9717       if (style)
9718         tmp = gen_rtx_REG (DImode, R11_REG);
9719       else
9720         {
9721           gcc_assert (src != hard_frame_pointer_rtx
9722                       && dest != hard_frame_pointer_rtx);
9723           tmp = hard_frame_pointer_rtx;
9724         }
9725       insn = emit_insn (gen_rtx_SET (DImode, tmp, offset));
9726       if (style < 0)
9727         add_frame_related_expr = true;
9728
9729       insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, tmp);
9730     }
9731
9732   insn = emit_insn (insn);
9733   if (style >= 0)
9734     ix86_add_queued_cfa_restore_notes (insn);
9735
9736   if (set_cfa)
9737     {
9738       rtx r;
9739
9740       gcc_assert (m->fs.cfa_reg == src);
9741       m->fs.cfa_offset += INTVAL (offset);
9742       m->fs.cfa_reg = dest;
9743
9744       r = gen_rtx_PLUS (Pmode, src, offset);
9745       r = gen_rtx_SET (VOIDmode, dest, r);
9746       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
9747       RTX_FRAME_RELATED_P (insn) = 1;
9748     }
9749   else if (style < 0)
9750     {
9751       RTX_FRAME_RELATED_P (insn) = 1;
9752       if (add_frame_related_expr)
9753         {
9754           rtx r = gen_rtx_PLUS (Pmode, src, offset);
9755           r = gen_rtx_SET (VOIDmode, dest, r);
9756           add_reg_note (insn, REG_FRAME_RELATED_EXPR, r);
9757         }
9758     }
9759
9760   if (dest == stack_pointer_rtx)
9761     {
9762       HOST_WIDE_INT ooffset = m->fs.sp_offset;
9763       bool valid = m->fs.sp_valid;
9764
9765       if (src == hard_frame_pointer_rtx)
9766         {
9767           valid = m->fs.fp_valid;
9768           ooffset = m->fs.fp_offset;
9769         }
9770       else if (src == crtl->drap_reg)
9771         {
9772           valid = m->fs.drap_valid;
9773           ooffset = 0;
9774         }
9775       else
9776         {
9777           /* Else there are two possibilities: SP itself, which we set
9778              up as the default above.  Or EH_RETURN_STACKADJ_RTX, which is
9779              taken care of this by hand along the eh_return path.  */
9780           gcc_checking_assert (src == stack_pointer_rtx
9781                                || offset == const0_rtx);
9782         }
9783
9784       m->fs.sp_offset = ooffset - INTVAL (offset);
9785       m->fs.sp_valid = valid;
9786     }
9787 }
9788
9789 /* Find an available register to be used as dynamic realign argument
9790    pointer regsiter.  Such a register will be written in prologue and
9791    used in begin of body, so it must not be
9792         1. parameter passing register.
9793         2. GOT pointer.
9794    We reuse static-chain register if it is available.  Otherwise, we
9795    use DI for i386 and R13 for x86-64.  We chose R13 since it has
9796    shorter encoding.
9797
9798    Return: the regno of chosen register.  */
9799
9800 static unsigned int
9801 find_drap_reg (void)
9802 {
9803   tree decl = cfun->decl;
9804
9805   if (TARGET_64BIT)
9806     {
9807       /* Use R13 for nested function or function need static chain.
9808          Since function with tail call may use any caller-saved
9809          registers in epilogue, DRAP must not use caller-saved
9810          register in such case.  */
9811       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
9812         return R13_REG;
9813
9814       return R10_REG;
9815     }
9816   else
9817     {
9818       /* Use DI for nested function or function need static chain.
9819          Since function with tail call may use any caller-saved
9820          registers in epilogue, DRAP must not use caller-saved
9821          register in such case.  */
9822       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
9823         return DI_REG;
9824
9825       /* Reuse static chain register if it isn't used for parameter
9826          passing.  */
9827       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2)
9828         {
9829           unsigned int ccvt = ix86_get_callcvt (TREE_TYPE (decl));
9830           if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) == 0)
9831             return CX_REG;
9832         }
9833       return DI_REG;
9834     }
9835 }
9836
9837 /* Return minimum incoming stack alignment.  */
9838
9839 static unsigned int
9840 ix86_minimum_incoming_stack_boundary (bool sibcall)
9841 {
9842   unsigned int incoming_stack_boundary;
9843
9844   /* Prefer the one specified at command line. */
9845   if (ix86_user_incoming_stack_boundary)
9846     incoming_stack_boundary = ix86_user_incoming_stack_boundary;
9847   /* In 32bit, use MIN_STACK_BOUNDARY for incoming stack boundary
9848      if -mstackrealign is used, it isn't used for sibcall check and
9849      estimated stack alignment is 128bit.  */
9850   else if (!sibcall
9851            && !TARGET_64BIT
9852            && ix86_force_align_arg_pointer
9853            && crtl->stack_alignment_estimated == 128)
9854     incoming_stack_boundary = MIN_STACK_BOUNDARY;
9855   else
9856     incoming_stack_boundary = ix86_default_incoming_stack_boundary;
9857
9858   /* Incoming stack alignment can be changed on individual functions
9859      via force_align_arg_pointer attribute.  We use the smallest
9860      incoming stack boundary.  */
9861   if (incoming_stack_boundary > MIN_STACK_BOUNDARY
9862       && lookup_attribute (ix86_force_align_arg_pointer_string,
9863                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
9864     incoming_stack_boundary = MIN_STACK_BOUNDARY;
9865
9866   /* The incoming stack frame has to be aligned at least at
9867      parm_stack_boundary.  */
9868   if (incoming_stack_boundary < crtl->parm_stack_boundary)
9869     incoming_stack_boundary = crtl->parm_stack_boundary;
9870
9871   /* Stack at entrance of main is aligned by runtime.  We use the
9872      smallest incoming stack boundary. */
9873   if (incoming_stack_boundary > MAIN_STACK_BOUNDARY
9874       && DECL_NAME (current_function_decl)
9875       && MAIN_NAME_P (DECL_NAME (current_function_decl))
9876       && DECL_FILE_SCOPE_P (current_function_decl))
9877     incoming_stack_boundary = MAIN_STACK_BOUNDARY;
9878
9879   return incoming_stack_boundary;
9880 }
9881
9882 /* Update incoming stack boundary and estimated stack alignment.  */
9883
9884 static void
9885 ix86_update_stack_boundary (void)
9886 {
9887   ix86_incoming_stack_boundary
9888     = ix86_minimum_incoming_stack_boundary (false);
9889
9890   /* x86_64 vararg needs 16byte stack alignment for register save
9891      area.  */
9892   if (TARGET_64BIT
9893       && cfun->stdarg
9894       && crtl->stack_alignment_estimated < 128)
9895     crtl->stack_alignment_estimated = 128;
9896 }
9897
9898 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
9899    needed or an rtx for DRAP otherwise.  */
9900
9901 static rtx
9902 ix86_get_drap_rtx (void)
9903 {
9904   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
9905     crtl->need_drap = true;
9906
9907   if (stack_realign_drap)
9908     {
9909       /* Assign DRAP to vDRAP and returns vDRAP */
9910       unsigned int regno = find_drap_reg ();
9911       rtx drap_vreg;
9912       rtx arg_ptr;
9913       rtx seq, insn;
9914
9915       arg_ptr = gen_rtx_REG (Pmode, regno);
9916       crtl->drap_reg = arg_ptr;
9917
9918       start_sequence ();
9919       drap_vreg = copy_to_reg (arg_ptr);
9920       seq = get_insns ();
9921       end_sequence ();
9922
9923       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
9924       if (!optimize)
9925         {
9926           add_reg_note (insn, REG_CFA_SET_VDRAP, drap_vreg);
9927           RTX_FRAME_RELATED_P (insn) = 1;
9928         }
9929       return drap_vreg;
9930     }
9931   else
9932     return NULL;
9933 }
9934
9935 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
9936
9937 static rtx
9938 ix86_internal_arg_pointer (void)
9939 {
9940   return virtual_incoming_args_rtx;
9941 }
9942
9943 struct scratch_reg {
9944   rtx reg;
9945   bool saved;
9946 };
9947
9948 /* Return a short-lived scratch register for use on function entry.
9949    In 32-bit mode, it is valid only after the registers are saved
9950    in the prologue.  This register must be released by means of
9951    release_scratch_register_on_entry once it is dead.  */
9952
9953 static void
9954 get_scratch_register_on_entry (struct scratch_reg *sr)
9955 {
9956   int regno;
9957
9958   sr->saved = false;
9959
9960   if (TARGET_64BIT)
9961     {
9962       /* We always use R11 in 64-bit mode.  */
9963       regno = R11_REG;
9964     }
9965   else
9966     {
9967       tree decl = current_function_decl, fntype = TREE_TYPE (decl);
9968       bool fastcall_p
9969         = lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)) != NULL_TREE;
9970       bool static_chain_p = DECL_STATIC_CHAIN (decl);
9971       int regparm = ix86_function_regparm (fntype, decl);
9972       int drap_regno
9973         = crtl->drap_reg ? REGNO (crtl->drap_reg) : INVALID_REGNUM;
9974
9975       /* 'fastcall' sets regparm to 2, uses ecx/edx for arguments and eax
9976           for the static chain register.  */
9977       if ((regparm < 1 || (fastcall_p && !static_chain_p))
9978           && drap_regno != AX_REG)
9979         regno = AX_REG;
9980       else if (regparm < 2 && drap_regno != DX_REG)
9981         regno = DX_REG;
9982       /* ecx is the static chain register.  */
9983       else if (regparm < 3 && !fastcall_p && !static_chain_p
9984                && drap_regno != CX_REG)
9985         regno = CX_REG;
9986       else if (ix86_save_reg (BX_REG, true))
9987         regno = BX_REG;
9988       /* esi is the static chain register.  */
9989       else if (!(regparm == 3 && static_chain_p)
9990                && ix86_save_reg (SI_REG, true))
9991         regno = SI_REG;
9992       else if (ix86_save_reg (DI_REG, true))
9993         regno = DI_REG;
9994       else
9995         {
9996           regno = (drap_regno == AX_REG ? DX_REG : AX_REG);
9997           sr->saved = true;
9998         }
9999     }
10000
10001   sr->reg = gen_rtx_REG (Pmode, regno);
10002   if (sr->saved)
10003     {
10004       rtx insn = emit_insn (gen_push (sr->reg));
10005       RTX_FRAME_RELATED_P (insn) = 1;
10006     }
10007 }
10008
10009 /* Release a scratch register obtained from the preceding function.  */
10010
10011 static void
10012 release_scratch_register_on_entry (struct scratch_reg *sr)
10013 {
10014   if (sr->saved)
10015     {
10016       rtx x, insn = emit_insn (gen_pop (sr->reg));
10017
10018       /* The RTX_FRAME_RELATED_P mechanism doesn't know about pop.  */
10019       RTX_FRAME_RELATED_P (insn) = 1;
10020       x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD));
10021       x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x);
10022       add_reg_note (insn, REG_FRAME_RELATED_EXPR, x);
10023     }
10024 }
10025
10026 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
10027
10028 /* Emit code to adjust the stack pointer by SIZE bytes while probing it.  */
10029
10030 static void
10031 ix86_adjust_stack_and_probe (const HOST_WIDE_INT size)
10032 {
10033   /* We skip the probe for the first interval + a small dope of 4 words and
10034      probe that many bytes past the specified size to maintain a protection
10035      area at the botton of the stack.  */
10036   const int dope = 4 * UNITS_PER_WORD;
10037   rtx size_rtx = GEN_INT (size), last;
10038
10039   /* See if we have a constant small number of probes to generate.  If so,
10040      that's the easy case.  The run-time loop is made up of 11 insns in the
10041      generic case while the compile-time loop is made up of 3+2*(n-1) insns
10042      for n # of intervals.  */
10043   if (size <= 5 * PROBE_INTERVAL)
10044     {
10045       HOST_WIDE_INT i, adjust;
10046       bool first_probe = true;
10047
10048       /* Adjust SP and probe at PROBE_INTERVAL + N * PROBE_INTERVAL for
10049          values of N from 1 until it exceeds SIZE.  If only one probe is
10050          needed, this will not generate any code.  Then adjust and probe
10051          to PROBE_INTERVAL + SIZE.  */
10052       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10053         {
10054           if (first_probe)
10055             {
10056               adjust = 2 * PROBE_INTERVAL + dope;
10057               first_probe = false;
10058             }
10059           else
10060             adjust = PROBE_INTERVAL;
10061
10062           emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10063                                   plus_constant (stack_pointer_rtx, -adjust)));
10064           emit_stack_probe (stack_pointer_rtx);
10065         }
10066
10067       if (first_probe)
10068         adjust = size + PROBE_INTERVAL + dope;
10069       else
10070         adjust = size + PROBE_INTERVAL - i;
10071
10072       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10073                               plus_constant (stack_pointer_rtx, -adjust)));
10074       emit_stack_probe (stack_pointer_rtx);
10075
10076       /* Adjust back to account for the additional first interval.  */
10077       last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10078                                      plus_constant (stack_pointer_rtx,
10079                                                     PROBE_INTERVAL + dope)));
10080     }
10081
10082   /* Otherwise, do the same as above, but in a loop.  Note that we must be
10083      extra careful with variables wrapping around because we might be at
10084      the very top (or the very bottom) of the address space and we have
10085      to be able to handle this case properly; in particular, we use an
10086      equality test for the loop condition.  */
10087   else
10088     {
10089       HOST_WIDE_INT rounded_size;
10090       struct scratch_reg sr;
10091
10092       get_scratch_register_on_entry (&sr);
10093
10094
10095       /* Step 1: round SIZE to the previous multiple of the interval.  */
10096
10097       rounded_size = size & -PROBE_INTERVAL;
10098
10099
10100       /* Step 2: compute initial and final value of the loop counter.  */
10101
10102       /* SP = SP_0 + PROBE_INTERVAL.  */
10103       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10104                               plus_constant (stack_pointer_rtx,
10105                                              - (PROBE_INTERVAL + dope))));
10106
10107       /* LAST_ADDR = SP_0 + PROBE_INTERVAL + ROUNDED_SIZE.  */
10108       emit_move_insn (sr.reg, GEN_INT (-rounded_size));
10109       emit_insn (gen_rtx_SET (VOIDmode, sr.reg,
10110                               gen_rtx_PLUS (Pmode, sr.reg,
10111                                             stack_pointer_rtx)));
10112
10113
10114       /* Step 3: the loop
10115
10116          while (SP != LAST_ADDR)
10117            {
10118              SP = SP + PROBE_INTERVAL
10119              probe at SP
10120            }
10121
10122          adjusts SP and probes to PROBE_INTERVAL + N * PROBE_INTERVAL for
10123          values of N from 1 until it is equal to ROUNDED_SIZE.  */
10124
10125       emit_insn (ix86_gen_adjust_stack_and_probe (sr.reg, sr.reg, size_rtx));
10126
10127
10128       /* Step 4: adjust SP and probe at PROBE_INTERVAL + SIZE if we cannot
10129          assert at compile-time that SIZE is equal to ROUNDED_SIZE.  */
10130
10131       if (size != rounded_size)
10132         {
10133           emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10134                                   plus_constant (stack_pointer_rtx,
10135                                                  rounded_size - size)));
10136           emit_stack_probe (stack_pointer_rtx);
10137         }
10138
10139       /* Adjust back to account for the additional first interval.  */
10140       last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10141                                      plus_constant (stack_pointer_rtx,
10142                                                     PROBE_INTERVAL + dope)));
10143
10144       release_scratch_register_on_entry (&sr);
10145     }
10146
10147   gcc_assert (cfun->machine->fs.cfa_reg != stack_pointer_rtx);
10148
10149   /* Even if the stack pointer isn't the CFA register, we need to correctly
10150      describe the adjustments made to it, in particular differentiate the
10151      frame-related ones from the frame-unrelated ones.  */
10152   if (size > 0)
10153     {
10154       rtx expr = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2));
10155       XVECEXP (expr, 0, 0)
10156         = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10157                        plus_constant (stack_pointer_rtx, -size));
10158       XVECEXP (expr, 0, 1)
10159         = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10160                        plus_constant (stack_pointer_rtx,
10161                                       PROBE_INTERVAL + dope + size));
10162       add_reg_note (last, REG_FRAME_RELATED_EXPR, expr);
10163       RTX_FRAME_RELATED_P (last) = 1;
10164
10165       cfun->machine->fs.sp_offset += size;
10166     }
10167
10168   /* Make sure nothing is scheduled before we are done.  */
10169   emit_insn (gen_blockage ());
10170 }
10171
10172 /* Adjust the stack pointer up to REG while probing it.  */
10173
10174 const char *
10175 output_adjust_stack_and_probe (rtx reg)
10176 {
10177   static int labelno = 0;
10178   char loop_lab[32], end_lab[32];
10179   rtx xops[2];
10180
10181   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10182   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10183
10184   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10185
10186   /* Jump to END_LAB if SP == LAST_ADDR.  */
10187   xops[0] = stack_pointer_rtx;
10188   xops[1] = reg;
10189   output_asm_insn ("cmp%z0\t{%1, %0|%0, %1}", xops);
10190   fputs ("\tje\t", asm_out_file);
10191   assemble_name_raw (asm_out_file, end_lab);
10192   fputc ('\n', asm_out_file);
10193
10194   /* SP = SP + PROBE_INTERVAL.  */
10195   xops[1] = GEN_INT (PROBE_INTERVAL);
10196   output_asm_insn ("sub%z0\t{%1, %0|%0, %1}", xops);
10197
10198   /* Probe at SP.  */
10199   xops[1] = const0_rtx;
10200   output_asm_insn ("or%z0\t{%1, (%0)|DWORD PTR [%0], %1}", xops);
10201
10202   fprintf (asm_out_file, "\tjmp\t");
10203   assemble_name_raw (asm_out_file, loop_lab);
10204   fputc ('\n', asm_out_file);
10205
10206   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10207
10208   return "";
10209 }
10210
10211 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
10212    inclusive.  These are offsets from the current stack pointer.  */
10213
10214 static void
10215 ix86_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
10216 {
10217   /* See if we have a constant small number of probes to generate.  If so,
10218      that's the easy case.  The run-time loop is made up of 7 insns in the
10219      generic case while the compile-time loop is made up of n insns for n #
10220      of intervals.  */
10221   if (size <= 7 * PROBE_INTERVAL)
10222     {
10223       HOST_WIDE_INT i;
10224
10225       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
10226          it exceeds SIZE.  If only one probe is needed, this will not
10227          generate any code.  Then probe at FIRST + SIZE.  */
10228       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10229         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
10230
10231       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
10232     }
10233
10234   /* Otherwise, do the same as above, but in a loop.  Note that we must be
10235      extra careful with variables wrapping around because we might be at
10236      the very top (or the very bottom) of the address space and we have
10237      to be able to handle this case properly; in particular, we use an
10238      equality test for the loop condition.  */
10239   else
10240     {
10241       HOST_WIDE_INT rounded_size, last;
10242       struct scratch_reg sr;
10243
10244       get_scratch_register_on_entry (&sr);
10245
10246
10247       /* Step 1: round SIZE to the previous multiple of the interval.  */
10248
10249       rounded_size = size & -PROBE_INTERVAL;
10250
10251
10252       /* Step 2: compute initial and final value of the loop counter.  */
10253
10254       /* TEST_OFFSET = FIRST.  */
10255       emit_move_insn (sr.reg, GEN_INT (-first));
10256
10257       /* LAST_OFFSET = FIRST + ROUNDED_SIZE.  */
10258       last = first + rounded_size;
10259
10260
10261       /* Step 3: the loop
10262
10263          while (TEST_ADDR != LAST_ADDR)
10264            {
10265              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
10266              probe at TEST_ADDR
10267            }
10268
10269          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
10270          until it is equal to ROUNDED_SIZE.  */
10271
10272       emit_insn (ix86_gen_probe_stack_range (sr.reg, sr.reg, GEN_INT (-last)));
10273
10274
10275       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
10276          that SIZE is equal to ROUNDED_SIZE.  */
10277
10278       if (size != rounded_size)
10279         emit_stack_probe (plus_constant (gen_rtx_PLUS (Pmode,
10280                                                        stack_pointer_rtx,
10281                                                        sr.reg),
10282                                          rounded_size - size));
10283
10284       release_scratch_register_on_entry (&sr);
10285     }
10286
10287   /* Make sure nothing is scheduled before we are done.  */
10288   emit_insn (gen_blockage ());
10289 }
10290
10291 /* Probe a range of stack addresses from REG to END, inclusive.  These are
10292    offsets from the current stack pointer.  */
10293
10294 const char *
10295 output_probe_stack_range (rtx reg, rtx end)
10296 {
10297   static int labelno = 0;
10298   char loop_lab[32], end_lab[32];
10299   rtx xops[3];
10300
10301   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10302   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10303
10304   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10305
10306   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
10307   xops[0] = reg;
10308   xops[1] = end;
10309   output_asm_insn ("cmp%z0\t{%1, %0|%0, %1}", xops);
10310   fputs ("\tje\t", asm_out_file);
10311   assemble_name_raw (asm_out_file, end_lab);
10312   fputc ('\n', asm_out_file);
10313
10314   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
10315   xops[1] = GEN_INT (PROBE_INTERVAL);
10316   output_asm_insn ("sub%z0\t{%1, %0|%0, %1}", xops);
10317
10318   /* Probe at TEST_ADDR.  */
10319   xops[0] = stack_pointer_rtx;
10320   xops[1] = reg;
10321   xops[2] = const0_rtx;
10322   output_asm_insn ("or%z0\t{%2, (%0,%1)|DWORD PTR [%0+%1], %2}", xops);
10323
10324   fprintf (asm_out_file, "\tjmp\t");
10325   assemble_name_raw (asm_out_file, loop_lab);
10326   fputc ('\n', asm_out_file);
10327
10328   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10329
10330   return "";
10331 }
10332
10333 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
10334    to be generated in correct form.  */
10335 static void
10336 ix86_finalize_stack_realign_flags (void)
10337 {
10338   /* Check if stack realign is really needed after reload, and
10339      stores result in cfun */
10340   unsigned int incoming_stack_boundary
10341     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
10342        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
10343   unsigned int stack_realign = (incoming_stack_boundary
10344                                 < (current_function_is_leaf
10345                                    ? crtl->max_used_stack_slot_alignment
10346                                    : crtl->stack_alignment_needed));
10347
10348   if (crtl->stack_realign_finalized)
10349     {
10350       /* After stack_realign_needed is finalized, we can't no longer
10351          change it.  */
10352       gcc_assert (crtl->stack_realign_needed == stack_realign);
10353     }
10354   else
10355     {
10356       crtl->stack_realign_needed = stack_realign;
10357       crtl->stack_realign_finalized = true;
10358     }
10359 }
10360
10361 /* Expand the prologue into a bunch of separate insns.  */
10362
10363 void
10364 ix86_expand_prologue (void)
10365 {
10366   struct machine_function *m = cfun->machine;
10367   rtx insn, t;
10368   bool pic_reg_used;
10369   struct ix86_frame frame;
10370   HOST_WIDE_INT allocate;
10371   bool int_registers_saved;
10372
10373   ix86_finalize_stack_realign_flags ();
10374
10375   /* DRAP should not coexist with stack_realign_fp */
10376   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
10377
10378   memset (&m->fs, 0, sizeof (m->fs));
10379
10380   /* Initialize CFA state for before the prologue.  */
10381   m->fs.cfa_reg = stack_pointer_rtx;
10382   m->fs.cfa_offset = INCOMING_FRAME_SP_OFFSET;
10383
10384   /* Track SP offset to the CFA.  We continue tracking this after we've
10385      swapped the CFA register away from SP.  In the case of re-alignment
10386      this is fudged; we're interested to offsets within the local frame.  */
10387   m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
10388   m->fs.sp_valid = true;
10389
10390   ix86_compute_frame_layout (&frame);
10391
10392   if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
10393     {
10394       /* We should have already generated an error for any use of
10395          ms_hook on a nested function.  */
10396       gcc_checking_assert (!ix86_static_chain_on_stack);
10397
10398       /* Check if profiling is active and we shall use profiling before
10399          prologue variant. If so sorry.  */
10400       if (crtl->profile && flag_fentry != 0)
10401         sorry ("ms_hook_prologue attribute isn%'t compatible "
10402                "with -mfentry for 32-bit");
10403
10404       /* In ix86_asm_output_function_label we emitted:
10405          8b ff     movl.s %edi,%edi
10406          55        push   %ebp
10407          8b ec     movl.s %esp,%ebp
10408
10409          This matches the hookable function prologue in Win32 API
10410          functions in Microsoft Windows XP Service Pack 2 and newer.
10411          Wine uses this to enable Windows apps to hook the Win32 API
10412          functions provided by Wine.
10413
10414          What that means is that we've already set up the frame pointer.  */
10415
10416       if (frame_pointer_needed
10417           && !(crtl->drap_reg && crtl->stack_realign_needed))
10418         {
10419           rtx push, mov;
10420
10421           /* We've decided to use the frame pointer already set up.
10422              Describe this to the unwinder by pretending that both
10423              push and mov insns happen right here.
10424
10425              Putting the unwind info here at the end of the ms_hook
10426              is done so that we can make absolutely certain we get
10427              the required byte sequence at the start of the function,
10428              rather than relying on an assembler that can produce
10429              the exact encoding required.
10430
10431              However it does mean (in the unpatched case) that we have
10432              a 1 insn window where the asynchronous unwind info is
10433              incorrect.  However, if we placed the unwind info at
10434              its correct location we would have incorrect unwind info
10435              in the patched case.  Which is probably all moot since
10436              I don't expect Wine generates dwarf2 unwind info for the
10437              system libraries that use this feature.  */
10438
10439           insn = emit_insn (gen_blockage ());
10440
10441           push = gen_push (hard_frame_pointer_rtx);
10442           mov = gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10443                              stack_pointer_rtx);
10444           RTX_FRAME_RELATED_P (push) = 1;
10445           RTX_FRAME_RELATED_P (mov) = 1;
10446
10447           RTX_FRAME_RELATED_P (insn) = 1;
10448           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
10449                         gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, push, mov)));
10450
10451           /* Note that gen_push incremented m->fs.cfa_offset, even
10452              though we didn't emit the push insn here.  */
10453           m->fs.cfa_reg = hard_frame_pointer_rtx;
10454           m->fs.fp_offset = m->fs.cfa_offset;
10455           m->fs.fp_valid = true;
10456         }
10457       else
10458         {
10459           /* The frame pointer is not needed so pop %ebp again.
10460              This leaves us with a pristine state.  */
10461           emit_insn (gen_pop (hard_frame_pointer_rtx));
10462         }
10463     }
10464
10465   /* The first insn of a function that accepts its static chain on the
10466      stack is to push the register that would be filled in by a direct
10467      call.  This insn will be skipped by the trampoline.  */
10468   else if (ix86_static_chain_on_stack)
10469     {
10470       insn = emit_insn (gen_push (ix86_static_chain (cfun->decl, false)));
10471       emit_insn (gen_blockage ());
10472
10473       /* We don't want to interpret this push insn as a register save,
10474          only as a stack adjustment.  The real copy of the register as
10475          a save will be done later, if needed.  */
10476       t = plus_constant (stack_pointer_rtx, -UNITS_PER_WORD);
10477       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
10478       add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
10479       RTX_FRAME_RELATED_P (insn) = 1;
10480     }
10481
10482   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
10483      of DRAP is needed and stack realignment is really needed after reload */
10484   if (stack_realign_drap)
10485     {
10486       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
10487
10488       /* Only need to push parameter pointer reg if it is caller saved.  */
10489       if (!call_used_regs[REGNO (crtl->drap_reg)])
10490         {
10491           /* Push arg pointer reg */
10492           insn = emit_insn (gen_push (crtl->drap_reg));
10493           RTX_FRAME_RELATED_P (insn) = 1;
10494         }
10495
10496       /* Grab the argument pointer.  */
10497       t = plus_constant (stack_pointer_rtx, m->fs.sp_offset);
10498       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, t));
10499       RTX_FRAME_RELATED_P (insn) = 1;
10500       m->fs.cfa_reg = crtl->drap_reg;
10501       m->fs.cfa_offset = 0;
10502
10503       /* Align the stack.  */
10504       insn = emit_insn (ix86_gen_andsp (stack_pointer_rtx,
10505                                         stack_pointer_rtx,
10506                                         GEN_INT (-align_bytes)));
10507       RTX_FRAME_RELATED_P (insn) = 1;
10508
10509       /* Replicate the return address on the stack so that return
10510          address can be reached via (argp - 1) slot.  This is needed
10511          to implement macro RETURN_ADDR_RTX and intrinsic function
10512          expand_builtin_return_addr etc.  */
10513       t = plus_constant (crtl->drap_reg, -UNITS_PER_WORD);
10514       t = gen_frame_mem (Pmode, t);
10515       insn = emit_insn (gen_push (t));
10516       RTX_FRAME_RELATED_P (insn) = 1;
10517
10518       /* For the purposes of frame and register save area addressing,
10519          we've started over with a new frame.  */
10520       m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
10521       m->fs.realigned = true;
10522     }
10523
10524   if (frame_pointer_needed && !m->fs.fp_valid)
10525     {
10526       /* Note: AT&T enter does NOT have reversed args.  Enter is probably
10527          slower on all targets.  Also sdb doesn't like it.  */
10528       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
10529       RTX_FRAME_RELATED_P (insn) = 1;
10530
10531       if (m->fs.sp_offset == frame.hard_frame_pointer_offset)
10532         {
10533           insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
10534           RTX_FRAME_RELATED_P (insn) = 1;
10535
10536           if (m->fs.cfa_reg == stack_pointer_rtx)
10537             m->fs.cfa_reg = hard_frame_pointer_rtx;
10538           m->fs.fp_offset = m->fs.sp_offset;
10539           m->fs.fp_valid = true;
10540         }
10541     }
10542
10543   int_registers_saved = (frame.nregs == 0);
10544
10545   if (!int_registers_saved)
10546     {
10547       /* If saving registers via PUSH, do so now.  */
10548       if (!frame.save_regs_using_mov)
10549         {
10550           ix86_emit_save_regs ();
10551           int_registers_saved = true;
10552           gcc_assert (m->fs.sp_offset == frame.reg_save_offset);
10553         }
10554
10555       /* When using red zone we may start register saving before allocating
10556          the stack frame saving one cycle of the prologue.  However, avoid
10557          doing this if we have to probe the stack; at least on x86_64 the
10558          stack probe can turn into a call that clobbers a red zone location. */
10559       else if (ix86_using_red_zone ()
10560                && (! TARGET_STACK_PROBE
10561                    || frame.stack_pointer_offset < CHECK_STACK_LIMIT))
10562         {
10563           ix86_emit_save_regs_using_mov (frame.reg_save_offset);
10564           int_registers_saved = true;
10565         }
10566     }
10567
10568   if (stack_realign_fp)
10569     {
10570       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
10571       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
10572
10573       /* The computation of the size of the re-aligned stack frame means
10574          that we must allocate the size of the register save area before
10575          performing the actual alignment.  Otherwise we cannot guarantee
10576          that there's enough storage above the realignment point.  */
10577       if (m->fs.sp_offset != frame.sse_reg_save_offset)
10578         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10579                                    GEN_INT (m->fs.sp_offset
10580                                             - frame.sse_reg_save_offset),
10581                                    -1, false);
10582
10583       /* Align the stack.  */
10584       insn = emit_insn (ix86_gen_andsp (stack_pointer_rtx,
10585                                         stack_pointer_rtx,
10586                                         GEN_INT (-align_bytes)));
10587
10588       /* For the purposes of register save area addressing, the stack
10589          pointer is no longer valid.  As for the value of sp_offset,
10590          see ix86_compute_frame_layout, which we need to match in order
10591          to pass verification of stack_pointer_offset at the end.  */
10592       m->fs.sp_offset = (m->fs.sp_offset + align_bytes) & -align_bytes;
10593       m->fs.sp_valid = false;
10594     }
10595
10596   allocate = frame.stack_pointer_offset - m->fs.sp_offset;
10597
10598   if (flag_stack_usage)
10599     {
10600       /* We start to count from ARG_POINTER.  */
10601       HOST_WIDE_INT stack_size = frame.stack_pointer_offset;
10602
10603       /* If it was realigned, take into account the fake frame.  */
10604       if (stack_realign_drap)
10605         {
10606           if (ix86_static_chain_on_stack)
10607             stack_size += UNITS_PER_WORD;
10608
10609           if (!call_used_regs[REGNO (crtl->drap_reg)])
10610             stack_size += UNITS_PER_WORD;
10611
10612           /* This over-estimates by 1 minimal-stack-alignment-unit but
10613              mitigates that by counting in the new return address slot.  */
10614           current_function_dynamic_stack_size
10615             += crtl->stack_alignment_needed / BITS_PER_UNIT;
10616         }
10617
10618       current_function_static_stack_size = stack_size;
10619     }
10620
10621   /* The stack has already been decremented by the instruction calling us
10622      so probe if the size is non-negative to preserve the protection area.  */
10623   if (allocate >= 0 && flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
10624     {
10625       /* We expect the registers to be saved when probes are used.  */
10626       gcc_assert (int_registers_saved);
10627
10628       if (STACK_CHECK_MOVING_SP)
10629         {
10630           ix86_adjust_stack_and_probe (allocate);
10631           allocate = 0;
10632         }
10633       else
10634         {
10635           HOST_WIDE_INT size = allocate;
10636
10637           if (TARGET_64BIT && size >= (HOST_WIDE_INT) 0x80000000)
10638             size = 0x80000000 - STACK_CHECK_PROTECT - 1;
10639
10640           if (TARGET_STACK_PROBE)
10641             ix86_emit_probe_stack_range (0, size + STACK_CHECK_PROTECT);
10642           else
10643             ix86_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
10644         }
10645     }
10646
10647   if (allocate == 0)
10648     ;
10649   else if (!ix86_target_stack_probe ()
10650            || frame.stack_pointer_offset < CHECK_STACK_LIMIT)
10651     {
10652       pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
10653                                  GEN_INT (-allocate), -1,
10654                                  m->fs.cfa_reg == stack_pointer_rtx);
10655     }
10656   else
10657     {
10658       rtx eax = gen_rtx_REG (Pmode, AX_REG);
10659       rtx r10 = NULL;
10660       rtx (*adjust_stack_insn)(rtx, rtx, rtx);
10661
10662       bool eax_live = false;
10663       bool r10_live = false;
10664
10665       if (TARGET_64BIT)
10666         r10_live = (DECL_STATIC_CHAIN (current_function_decl) != 0);
10667       if (!TARGET_64BIT_MS_ABI)
10668         eax_live = ix86_eax_live_at_start_p ();
10669
10670       if (eax_live)
10671         {
10672           emit_insn (gen_push (eax));
10673           allocate -= UNITS_PER_WORD;
10674         }
10675       if (r10_live)
10676         {
10677           r10 = gen_rtx_REG (Pmode, R10_REG);
10678           emit_insn (gen_push (r10));
10679           allocate -= UNITS_PER_WORD;
10680         }
10681
10682       emit_move_insn (eax, GEN_INT (allocate));
10683       emit_insn (ix86_gen_allocate_stack_worker (eax, eax));
10684
10685       /* Use the fact that AX still contains ALLOCATE.  */
10686       adjust_stack_insn = (TARGET_64BIT
10687                            ? gen_pro_epilogue_adjust_stack_di_sub
10688                            : gen_pro_epilogue_adjust_stack_si_sub);
10689
10690       insn = emit_insn (adjust_stack_insn (stack_pointer_rtx,
10691                                            stack_pointer_rtx, eax));
10692
10693       /* Note that SEH directives need to continue tracking the stack
10694          pointer even after the frame pointer has been set up.  */
10695       if (m->fs.cfa_reg == stack_pointer_rtx || TARGET_SEH)
10696         {
10697           if (m->fs.cfa_reg == stack_pointer_rtx)
10698             m->fs.cfa_offset += allocate;
10699
10700           RTX_FRAME_RELATED_P (insn) = 1;
10701           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
10702                         gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10703                                      plus_constant (stack_pointer_rtx,
10704                                                     -allocate)));
10705         }
10706       m->fs.sp_offset += allocate;
10707
10708       if (r10_live && eax_live)
10709         {
10710           t = choose_baseaddr (m->fs.sp_offset - allocate);
10711           emit_move_insn (r10, gen_frame_mem (Pmode, t));
10712           t = choose_baseaddr (m->fs.sp_offset - allocate - UNITS_PER_WORD);
10713           emit_move_insn (eax, gen_frame_mem (Pmode, t));
10714         }
10715       else if (eax_live || r10_live)
10716         {
10717           t = choose_baseaddr (m->fs.sp_offset - allocate);
10718           emit_move_insn ((eax_live ? eax : r10), gen_frame_mem (Pmode, t));
10719         }
10720     }
10721   gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset);
10722
10723   /* If we havn't already set up the frame pointer, do so now.  */
10724   if (frame_pointer_needed && !m->fs.fp_valid)
10725     {
10726       insn = ix86_gen_add3 (hard_frame_pointer_rtx, stack_pointer_rtx,
10727                             GEN_INT (frame.stack_pointer_offset
10728                                      - frame.hard_frame_pointer_offset));
10729       insn = emit_insn (insn);
10730       RTX_FRAME_RELATED_P (insn) = 1;
10731       add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL);
10732
10733       if (m->fs.cfa_reg == stack_pointer_rtx)
10734         m->fs.cfa_reg = hard_frame_pointer_rtx;
10735       m->fs.fp_offset = frame.hard_frame_pointer_offset;
10736       m->fs.fp_valid = true;
10737     }
10738
10739   if (!int_registers_saved)
10740     ix86_emit_save_regs_using_mov (frame.reg_save_offset);
10741   if (frame.nsseregs)
10742     ix86_emit_save_sse_regs_using_mov (frame.sse_reg_save_offset);
10743
10744   pic_reg_used = false;
10745   if (pic_offset_table_rtx
10746       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
10747           || crtl->profile))
10748     {
10749       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
10750
10751       if (alt_pic_reg_used != INVALID_REGNUM)
10752         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
10753
10754       pic_reg_used = true;
10755     }
10756
10757   if (pic_reg_used)
10758     {
10759       if (TARGET_64BIT)
10760         {
10761           if (ix86_cmodel == CM_LARGE_PIC)
10762             {
10763               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
10764               rtx label = gen_label_rtx ();
10765               emit_label (label);
10766               LABEL_PRESERVE_P (label) = 1;
10767               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
10768               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
10769               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
10770               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
10771                                             pic_offset_table_rtx, tmp_reg));
10772             }
10773           else
10774             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
10775         }
10776       else
10777         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
10778     }
10779
10780   /* In the pic_reg_used case, make sure that the got load isn't deleted
10781      when mcount needs it.  Blockage to avoid call movement across mcount
10782      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
10783      note.  */
10784   if (crtl->profile && !flag_fentry && pic_reg_used)
10785     emit_insn (gen_prologue_use (pic_offset_table_rtx));
10786
10787   if (crtl->drap_reg && !crtl->stack_realign_needed)
10788     {
10789       /* vDRAP is setup but after reload it turns out stack realign
10790          isn't necessary, here we will emit prologue to setup DRAP
10791          without stack realign adjustment */
10792       t = choose_baseaddr (0);
10793       emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, t));
10794     }
10795
10796   /* Prevent instructions from being scheduled into register save push
10797      sequence when access to the redzone area is done through frame pointer.
10798      The offset between the frame pointer and the stack pointer is calculated
10799      relative to the value of the stack pointer at the end of the function
10800      prologue, and moving instructions that access redzone area via frame
10801      pointer inside push sequence violates this assumption.  */
10802   if (frame_pointer_needed && frame.red_zone_size)
10803     emit_insn (gen_memory_blockage ());
10804
10805   /* Emit cld instruction if stringops are used in the function.  */
10806   if (TARGET_CLD && ix86_current_function_needs_cld)
10807     emit_insn (gen_cld ());
10808
10809   /* SEH requires that the prologue end within 256 bytes of the start of
10810      the function.  Prevent instruction schedules that would extend that.  */
10811   if (TARGET_SEH)
10812     emit_insn (gen_blockage ());
10813 }
10814
10815 /* Emit code to restore REG using a POP insn.  */
10816
10817 static void
10818 ix86_emit_restore_reg_using_pop (rtx reg)
10819 {
10820   struct machine_function *m = cfun->machine;
10821   rtx insn = emit_insn (gen_pop (reg));
10822
10823   ix86_add_cfa_restore_note (insn, reg, m->fs.sp_offset);
10824   m->fs.sp_offset -= UNITS_PER_WORD;
10825
10826   if (m->fs.cfa_reg == crtl->drap_reg
10827       && REGNO (reg) == REGNO (crtl->drap_reg))
10828     {
10829       /* Previously we'd represented the CFA as an expression
10830          like *(%ebp - 8).  We've just popped that value from
10831          the stack, which means we need to reset the CFA to
10832          the drap register.  This will remain until we restore
10833          the stack pointer.  */
10834       add_reg_note (insn, REG_CFA_DEF_CFA, reg);
10835       RTX_FRAME_RELATED_P (insn) = 1;
10836
10837       /* This means that the DRAP register is valid for addressing too.  */
10838       m->fs.drap_valid = true;
10839       return;
10840     }
10841
10842   if (m->fs.cfa_reg == stack_pointer_rtx)
10843     {
10844       rtx x = plus_constant (stack_pointer_rtx, UNITS_PER_WORD);
10845       x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x);
10846       add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
10847       RTX_FRAME_RELATED_P (insn) = 1;
10848
10849       m->fs.cfa_offset -= UNITS_PER_WORD;
10850     }
10851
10852   /* When the frame pointer is the CFA, and we pop it, we are
10853      swapping back to the stack pointer as the CFA.  This happens
10854      for stack frames that don't allocate other data, so we assume
10855      the stack pointer is now pointing at the return address, i.e.
10856      the function entry state, which makes the offset be 1 word.  */
10857   if (reg == hard_frame_pointer_rtx)
10858     {
10859       m->fs.fp_valid = false;
10860       if (m->fs.cfa_reg == hard_frame_pointer_rtx)
10861         {
10862           m->fs.cfa_reg = stack_pointer_rtx;
10863           m->fs.cfa_offset -= UNITS_PER_WORD;
10864
10865           add_reg_note (insn, REG_CFA_DEF_CFA,
10866                         gen_rtx_PLUS (Pmode, stack_pointer_rtx,
10867                                       GEN_INT (m->fs.cfa_offset)));
10868           RTX_FRAME_RELATED_P (insn) = 1;
10869         }
10870     }
10871 }
10872
10873 /* Emit code to restore saved registers using POP insns.  */
10874
10875 static void
10876 ix86_emit_restore_regs_using_pop (void)
10877 {
10878   unsigned int regno;
10879
10880   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10881     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
10882       ix86_emit_restore_reg_using_pop (gen_rtx_REG (Pmode, regno));
10883 }
10884
10885 /* Emit code and notes for the LEAVE instruction.  */
10886
10887 static void
10888 ix86_emit_leave (void)
10889 {
10890   struct machine_function *m = cfun->machine;
10891   rtx insn = emit_insn (ix86_gen_leave ());
10892
10893   ix86_add_queued_cfa_restore_notes (insn);
10894
10895   gcc_assert (m->fs.fp_valid);
10896   m->fs.sp_valid = true;
10897   m->fs.sp_offset = m->fs.fp_offset - UNITS_PER_WORD;
10898   m->fs.fp_valid = false;
10899
10900   if (m->fs.cfa_reg == hard_frame_pointer_rtx)
10901     {
10902       m->fs.cfa_reg = stack_pointer_rtx;
10903       m->fs.cfa_offset = m->fs.sp_offset;
10904
10905       add_reg_note (insn, REG_CFA_DEF_CFA,
10906                     plus_constant (stack_pointer_rtx, m->fs.sp_offset));
10907       RTX_FRAME_RELATED_P (insn) = 1;
10908       ix86_add_cfa_restore_note (insn, hard_frame_pointer_rtx,
10909                                  m->fs.fp_offset);
10910     }
10911 }
10912
10913 /* Emit code to restore saved registers using MOV insns.
10914    First register is restored from CFA - CFA_OFFSET.  */
10915 static void
10916 ix86_emit_restore_regs_using_mov (HOST_WIDE_INT cfa_offset,
10917                                   int maybe_eh_return)
10918 {
10919   struct machine_function *m = cfun->machine;
10920   unsigned int regno;
10921
10922   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10923     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
10924       {
10925         rtx reg = gen_rtx_REG (Pmode, regno);
10926         rtx insn, mem;
10927         
10928         mem = choose_baseaddr (cfa_offset);
10929         mem = gen_frame_mem (Pmode, mem);
10930         insn = emit_move_insn (reg, mem);
10931
10932         if (m->fs.cfa_reg == crtl->drap_reg && regno == REGNO (crtl->drap_reg))
10933           {
10934             /* Previously we'd represented the CFA as an expression
10935                like *(%ebp - 8).  We've just popped that value from
10936                the stack, which means we need to reset the CFA to
10937                the drap register.  This will remain until we restore
10938                the stack pointer.  */
10939             add_reg_note (insn, REG_CFA_DEF_CFA, reg);
10940             RTX_FRAME_RELATED_P (insn) = 1;
10941
10942             /* This means that the DRAP register is valid for addressing.  */
10943             m->fs.drap_valid = true;
10944           }
10945         else
10946           ix86_add_cfa_restore_note (NULL_RTX, reg, cfa_offset);
10947
10948         cfa_offset -= UNITS_PER_WORD;
10949       }
10950 }
10951
10952 /* Emit code to restore saved registers using MOV insns.
10953    First register is restored from CFA - CFA_OFFSET.  */
10954 static void
10955 ix86_emit_restore_sse_regs_using_mov (HOST_WIDE_INT cfa_offset,
10956                                       int maybe_eh_return)
10957 {
10958   unsigned int regno;
10959
10960   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
10961     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
10962       {
10963         rtx reg = gen_rtx_REG (V4SFmode, regno);
10964         rtx mem;
10965
10966         mem = choose_baseaddr (cfa_offset);
10967         mem = gen_rtx_MEM (V4SFmode, mem);
10968         set_mem_align (mem, 128);
10969         emit_move_insn (reg, mem);
10970
10971         ix86_add_cfa_restore_note (NULL_RTX, reg, cfa_offset);
10972
10973         cfa_offset -= 16;
10974       }
10975 }
10976
10977 /* Restore function stack, frame, and registers.  */
10978
10979 void
10980 ix86_expand_epilogue (int style)
10981 {
10982   struct machine_function *m = cfun->machine;
10983   struct machine_frame_state frame_state_save = m->fs;
10984   struct ix86_frame frame;
10985   bool restore_regs_via_mov;
10986   bool using_drap;
10987
10988   ix86_finalize_stack_realign_flags ();
10989   ix86_compute_frame_layout (&frame);
10990
10991   m->fs.sp_valid = (!frame_pointer_needed
10992                     || (current_function_sp_is_unchanging
10993                         && !stack_realign_fp));
10994   gcc_assert (!m->fs.sp_valid
10995               || m->fs.sp_offset == frame.stack_pointer_offset);
10996
10997   /* The FP must be valid if the frame pointer is present.  */
10998   gcc_assert (frame_pointer_needed == m->fs.fp_valid);
10999   gcc_assert (!m->fs.fp_valid
11000               || m->fs.fp_offset == frame.hard_frame_pointer_offset);
11001
11002   /* We must have *some* valid pointer to the stack frame.  */
11003   gcc_assert (m->fs.sp_valid || m->fs.fp_valid);
11004
11005   /* The DRAP is never valid at this point.  */
11006   gcc_assert (!m->fs.drap_valid);
11007
11008   /* See the comment about red zone and frame
11009      pointer usage in ix86_expand_prologue.  */
11010   if (frame_pointer_needed && frame.red_zone_size)
11011     emit_insn (gen_memory_blockage ());
11012
11013   using_drap = crtl->drap_reg && crtl->stack_realign_needed;
11014   gcc_assert (!using_drap || m->fs.cfa_reg == crtl->drap_reg);
11015
11016   /* Determine the CFA offset of the end of the red-zone.  */
11017   m->fs.red_zone_offset = 0;
11018   if (ix86_using_red_zone () && crtl->args.pops_args < 65536)
11019     {
11020       /* The red-zone begins below the return address.  */
11021       m->fs.red_zone_offset = RED_ZONE_SIZE + UNITS_PER_WORD;
11022
11023       /* When the register save area is in the aligned portion of
11024          the stack, determine the maximum runtime displacement that
11025          matches up with the aligned frame.  */
11026       if (stack_realign_drap)
11027         m->fs.red_zone_offset -= (crtl->stack_alignment_needed / BITS_PER_UNIT
11028                                   + UNITS_PER_WORD);
11029     }
11030
11031   /* Special care must be taken for the normal return case of a function
11032      using eh_return: the eax and edx registers are marked as saved, but
11033      not restored along this path.  Adjust the save location to match.  */
11034   if (crtl->calls_eh_return && style != 2)
11035     frame.reg_save_offset -= 2 * UNITS_PER_WORD;
11036
11037   /* EH_RETURN requires the use of moves to function properly.  */
11038   if (crtl->calls_eh_return)
11039     restore_regs_via_mov = true;
11040   /* SEH requires the use of pops to identify the epilogue.  */
11041   else if (TARGET_SEH)
11042     restore_regs_via_mov = false;
11043   /* If we're only restoring one register and sp is not valid then
11044      using a move instruction to restore the register since it's
11045      less work than reloading sp and popping the register.  */
11046   else if (!m->fs.sp_valid && frame.nregs <= 1)
11047     restore_regs_via_mov = true;
11048   else if (TARGET_EPILOGUE_USING_MOVE
11049            && cfun->machine->use_fast_prologue_epilogue
11050            && (frame.nregs > 1
11051                || m->fs.sp_offset != frame.reg_save_offset))
11052     restore_regs_via_mov = true;
11053   else if (frame_pointer_needed
11054            && !frame.nregs
11055            && m->fs.sp_offset != frame.reg_save_offset)
11056     restore_regs_via_mov = true;
11057   else if (frame_pointer_needed
11058            && TARGET_USE_LEAVE
11059            && cfun->machine->use_fast_prologue_epilogue
11060            && frame.nregs == 1)
11061     restore_regs_via_mov = true;
11062   else
11063     restore_regs_via_mov = false;
11064
11065   if (restore_regs_via_mov || frame.nsseregs)
11066     {
11067       /* Ensure that the entire register save area is addressable via
11068          the stack pointer, if we will restore via sp.  */
11069       if (TARGET_64BIT
11070           && m->fs.sp_offset > 0x7fffffff
11071           && !(m->fs.fp_valid || m->fs.drap_valid)
11072           && (frame.nsseregs + frame.nregs) != 0)
11073         {
11074           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11075                                      GEN_INT (m->fs.sp_offset
11076                                               - frame.sse_reg_save_offset),
11077                                      style,
11078                                      m->fs.cfa_reg == stack_pointer_rtx);
11079         }
11080     }
11081
11082   /* If there are any SSE registers to restore, then we have to do it
11083      via moves, since there's obviously no pop for SSE regs.  */
11084   if (frame.nsseregs)
11085     ix86_emit_restore_sse_regs_using_mov (frame.sse_reg_save_offset,
11086                                           style == 2);
11087
11088   if (restore_regs_via_mov)
11089     {
11090       rtx t;
11091
11092       if (frame.nregs)
11093         ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
11094
11095       /* eh_return epilogues need %ecx added to the stack pointer.  */
11096       if (style == 2)
11097         {
11098           rtx insn, sa = EH_RETURN_STACKADJ_RTX;
11099
11100           /* Stack align doesn't work with eh_return.  */
11101           gcc_assert (!stack_realign_drap);
11102           /* Neither does regparm nested functions.  */
11103           gcc_assert (!ix86_static_chain_on_stack);
11104
11105           if (frame_pointer_needed)
11106             {
11107               t = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
11108               t = plus_constant (t, m->fs.fp_offset - UNITS_PER_WORD);
11109               emit_insn (gen_rtx_SET (VOIDmode, sa, t));
11110
11111               t = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
11112               insn = emit_move_insn (hard_frame_pointer_rtx, t);
11113
11114               /* Note that we use SA as a temporary CFA, as the return
11115                  address is at the proper place relative to it.  We
11116                  pretend this happens at the FP restore insn because
11117                  prior to this insn the FP would be stored at the wrong
11118                  offset relative to SA, and after this insn we have no
11119                  other reasonable register to use for the CFA.  We don't
11120                  bother resetting the CFA to the SP for the duration of
11121                  the return insn.  */
11122               add_reg_note (insn, REG_CFA_DEF_CFA,
11123                             plus_constant (sa, UNITS_PER_WORD));
11124               ix86_add_queued_cfa_restore_notes (insn);
11125               add_reg_note (insn, REG_CFA_RESTORE, hard_frame_pointer_rtx);
11126               RTX_FRAME_RELATED_P (insn) = 1;
11127
11128               m->fs.cfa_reg = sa;
11129               m->fs.cfa_offset = UNITS_PER_WORD;
11130               m->fs.fp_valid = false;
11131
11132               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
11133                                          const0_rtx, style, false);
11134             }
11135           else
11136             {
11137               t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
11138               t = plus_constant (t, m->fs.sp_offset - UNITS_PER_WORD);
11139               insn = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, t));
11140               ix86_add_queued_cfa_restore_notes (insn);
11141
11142               gcc_assert (m->fs.cfa_reg == stack_pointer_rtx);
11143               if (m->fs.cfa_offset != UNITS_PER_WORD)
11144                 {
11145                   m->fs.cfa_offset = UNITS_PER_WORD;
11146                   add_reg_note (insn, REG_CFA_DEF_CFA,
11147                                 plus_constant (stack_pointer_rtx,
11148                                                UNITS_PER_WORD));
11149                   RTX_FRAME_RELATED_P (insn) = 1;
11150                 }
11151             }
11152           m->fs.sp_offset = UNITS_PER_WORD;
11153           m->fs.sp_valid = true;
11154         }
11155     }
11156   else
11157     {
11158       /* SEH requires that the function end with (1) a stack adjustment
11159          if necessary, (2) a sequence of pops, and (3) a return or
11160          jump instruction.  Prevent insns from the function body from
11161          being scheduled into this sequence.  */
11162       if (TARGET_SEH)
11163         {
11164           /* Prevent a catch region from being adjacent to the standard
11165              epilogue sequence.  Unfortuantely crtl->uses_eh_lsda nor
11166              several other flags that would be interesting to test are
11167              not yet set up.  */
11168           if (flag_non_call_exceptions)
11169             emit_insn (gen_nops (const1_rtx));
11170           else
11171             emit_insn (gen_blockage ());
11172         }
11173
11174       /* First step is to deallocate the stack frame so that we can
11175          pop the registers.  */
11176       if (!m->fs.sp_valid)
11177         {
11178           pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
11179                                      GEN_INT (m->fs.fp_offset
11180                                               - frame.reg_save_offset),
11181                                      style, false);
11182         }
11183       else if (m->fs.sp_offset != frame.reg_save_offset)
11184         {
11185           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11186                                      GEN_INT (m->fs.sp_offset
11187                                               - frame.reg_save_offset),
11188                                      style,
11189                                      m->fs.cfa_reg == stack_pointer_rtx);
11190         }
11191
11192       ix86_emit_restore_regs_using_pop ();
11193     }
11194
11195   /* If we used a stack pointer and haven't already got rid of it,
11196      then do so now.  */
11197   if (m->fs.fp_valid)
11198     {
11199       /* If the stack pointer is valid and pointing at the frame
11200          pointer store address, then we only need a pop.  */
11201       if (m->fs.sp_valid && m->fs.sp_offset == frame.hfp_save_offset)
11202         ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx);
11203       /* Leave results in shorter dependency chains on CPUs that are
11204          able to grok it fast.  */
11205       else if (TARGET_USE_LEAVE
11206                || optimize_function_for_size_p (cfun)
11207                || !cfun->machine->use_fast_prologue_epilogue)
11208         ix86_emit_leave ();
11209       else
11210         {
11211           pro_epilogue_adjust_stack (stack_pointer_rtx,
11212                                      hard_frame_pointer_rtx,
11213                                      const0_rtx, style, !using_drap);
11214           ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx);
11215         }
11216     }
11217
11218   if (using_drap)
11219     {
11220       int param_ptr_offset = UNITS_PER_WORD;
11221       rtx insn;
11222
11223       gcc_assert (stack_realign_drap);
11224
11225       if (ix86_static_chain_on_stack)
11226         param_ptr_offset += UNITS_PER_WORD;
11227       if (!call_used_regs[REGNO (crtl->drap_reg)])
11228         param_ptr_offset += UNITS_PER_WORD;
11229
11230       insn = emit_insn (gen_rtx_SET
11231                         (VOIDmode, stack_pointer_rtx,
11232                          gen_rtx_PLUS (Pmode,
11233                                        crtl->drap_reg,
11234                                        GEN_INT (-param_ptr_offset))));
11235       m->fs.cfa_reg = stack_pointer_rtx;
11236       m->fs.cfa_offset = param_ptr_offset;
11237       m->fs.sp_offset = param_ptr_offset;
11238       m->fs.realigned = false;
11239
11240       add_reg_note (insn, REG_CFA_DEF_CFA,
11241                     gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11242                                   GEN_INT (param_ptr_offset)));
11243       RTX_FRAME_RELATED_P (insn) = 1;
11244
11245       if (!call_used_regs[REGNO (crtl->drap_reg)])
11246         ix86_emit_restore_reg_using_pop (crtl->drap_reg);
11247     }
11248
11249   /* At this point the stack pointer must be valid, and we must have
11250      restored all of the registers.  We may not have deallocated the
11251      entire stack frame.  We've delayed this until now because it may
11252      be possible to merge the local stack deallocation with the
11253      deallocation forced by ix86_static_chain_on_stack.   */
11254   gcc_assert (m->fs.sp_valid);
11255   gcc_assert (!m->fs.fp_valid);
11256   gcc_assert (!m->fs.realigned);
11257   if (m->fs.sp_offset != UNITS_PER_WORD)
11258     {
11259       pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11260                                  GEN_INT (m->fs.sp_offset - UNITS_PER_WORD),
11261                                  style, true);
11262     }
11263
11264   /* Sibcall epilogues don't want a return instruction.  */
11265   if (style == 0)
11266     {
11267       m->fs = frame_state_save;
11268       return;
11269     }
11270
11271   /* Emit vzeroupper if needed.  */
11272   if (TARGET_VZEROUPPER
11273       && !TREE_THIS_VOLATILE (cfun->decl)
11274       && !cfun->machine->caller_return_avx256_p)
11275     emit_insn (gen_avx_vzeroupper (GEN_INT (call_no_avx256))); 
11276
11277   if (crtl->args.pops_args && crtl->args.size)
11278     {
11279       rtx popc = GEN_INT (crtl->args.pops_args);
11280
11281       /* i386 can only pop 64K bytes.  If asked to pop more, pop return
11282          address, do explicit add, and jump indirectly to the caller.  */
11283
11284       if (crtl->args.pops_args >= 65536)
11285         {
11286           rtx ecx = gen_rtx_REG (SImode, CX_REG);
11287           rtx insn;
11288
11289           /* There is no "pascal" calling convention in any 64bit ABI.  */
11290           gcc_assert (!TARGET_64BIT);
11291
11292           insn = emit_insn (gen_pop (ecx));
11293           m->fs.cfa_offset -= UNITS_PER_WORD;
11294           m->fs.sp_offset -= UNITS_PER_WORD;
11295
11296           add_reg_note (insn, REG_CFA_ADJUST_CFA,
11297                         copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
11298           add_reg_note (insn, REG_CFA_REGISTER,
11299                         gen_rtx_SET (VOIDmode, ecx, pc_rtx));
11300           RTX_FRAME_RELATED_P (insn) = 1;
11301
11302           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
11303                                      popc, -1, true);
11304           emit_jump_insn (gen_return_indirect_internal (ecx));
11305         }
11306       else
11307         emit_jump_insn (gen_return_pop_internal (popc));
11308     }
11309   else
11310     emit_jump_insn (gen_return_internal ());
11311
11312   /* Restore the state back to the state from the prologue,
11313      so that it's correct for the next epilogue.  */
11314   m->fs = frame_state_save;
11315 }
11316
11317 /* Reset from the function's potential modifications.  */
11318
11319 static void
11320 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
11321                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
11322 {
11323   if (pic_offset_table_rtx)
11324     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
11325 #if TARGET_MACHO
11326   /* Mach-O doesn't support labels at the end of objects, so if
11327      it looks like we might want one, insert a NOP.  */
11328   {
11329     rtx insn = get_last_insn ();
11330     while (insn
11331            && NOTE_P (insn)
11332            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
11333       insn = PREV_INSN (insn);
11334     if (insn
11335         && (LABEL_P (insn)
11336             || (NOTE_P (insn)
11337                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
11338       fputs ("\tnop\n", file);
11339   }
11340 #endif
11341
11342 }
11343
11344 /* Return a scratch register to use in the split stack prologue.  The
11345    split stack prologue is used for -fsplit-stack.  It is the first
11346    instructions in the function, even before the regular prologue.
11347    The scratch register can be any caller-saved register which is not
11348    used for parameters or for the static chain.  */
11349
11350 static unsigned int
11351 split_stack_prologue_scratch_regno (void)
11352 {
11353   if (TARGET_64BIT)
11354     return R11_REG;
11355   else
11356     {
11357       bool is_fastcall;
11358       int regparm;
11359
11360       is_fastcall = (lookup_attribute ("fastcall",
11361                                        TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl)))
11362                      != NULL);
11363       regparm = ix86_function_regparm (TREE_TYPE (cfun->decl), cfun->decl);
11364
11365       if (is_fastcall)
11366         {
11367           if (DECL_STATIC_CHAIN (cfun->decl))
11368             {
11369               sorry ("-fsplit-stack does not support fastcall with "
11370                      "nested function");
11371               return INVALID_REGNUM;
11372             }
11373           return AX_REG;
11374         }
11375       else if (regparm < 3)
11376         {
11377           if (!DECL_STATIC_CHAIN (cfun->decl))
11378             return CX_REG;
11379           else
11380             {
11381               if (regparm >= 2)
11382                 {
11383                   sorry ("-fsplit-stack does not support 2 register "
11384                          " parameters for a nested function");
11385                   return INVALID_REGNUM;
11386                 }
11387               return DX_REG;
11388             }
11389         }
11390       else
11391         {
11392           /* FIXME: We could make this work by pushing a register
11393              around the addition and comparison.  */
11394           sorry ("-fsplit-stack does not support 3 register parameters");
11395           return INVALID_REGNUM;
11396         }
11397     }
11398 }
11399
11400 /* A SYMBOL_REF for the function which allocates new stackspace for
11401    -fsplit-stack.  */
11402
11403 static GTY(()) rtx split_stack_fn;
11404
11405 /* A SYMBOL_REF for the more stack function when using the large
11406    model.  */
11407
11408 static GTY(()) rtx split_stack_fn_large;
11409
11410 /* Handle -fsplit-stack.  These are the first instructions in the
11411    function, even before the regular prologue.  */
11412
11413 void
11414 ix86_expand_split_stack_prologue (void)
11415 {
11416   struct ix86_frame frame;
11417   HOST_WIDE_INT allocate;
11418   unsigned HOST_WIDE_INT args_size;
11419   rtx label, limit, current, jump_insn, allocate_rtx, call_insn, call_fusage;
11420   rtx scratch_reg = NULL_RTX;
11421   rtx varargs_label = NULL_RTX;
11422   rtx fn;
11423
11424   gcc_assert (flag_split_stack && reload_completed);
11425
11426   ix86_finalize_stack_realign_flags ();
11427   ix86_compute_frame_layout (&frame);
11428   allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
11429
11430   /* This is the label we will branch to if we have enough stack
11431      space.  We expect the basic block reordering pass to reverse this
11432      branch if optimizing, so that we branch in the unlikely case.  */
11433   label = gen_label_rtx ();
11434
11435   /* We need to compare the stack pointer minus the frame size with
11436      the stack boundary in the TCB.  The stack boundary always gives
11437      us SPLIT_STACK_AVAILABLE bytes, so if we need less than that we
11438      can compare directly.  Otherwise we need to do an addition.  */
11439
11440   limit = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
11441                           UNSPEC_STACK_CHECK);
11442   limit = gen_rtx_CONST (Pmode, limit);
11443   limit = gen_rtx_MEM (Pmode, limit);
11444   if (allocate < SPLIT_STACK_AVAILABLE)
11445     current = stack_pointer_rtx;
11446   else
11447     {
11448       unsigned int scratch_regno;
11449       rtx offset;
11450
11451       /* We need a scratch register to hold the stack pointer minus
11452          the required frame size.  Since this is the very start of the
11453          function, the scratch register can be any caller-saved
11454          register which is not used for parameters.  */
11455       offset = GEN_INT (- allocate);
11456       scratch_regno = split_stack_prologue_scratch_regno ();
11457       if (scratch_regno == INVALID_REGNUM)
11458         return;
11459       scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
11460       if (!TARGET_64BIT || x86_64_immediate_operand (offset, Pmode))
11461         {
11462           /* We don't use ix86_gen_add3 in this case because it will
11463              want to split to lea, but when not optimizing the insn
11464              will not be split after this point.  */
11465           emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11466                                   gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11467                                                 offset)));
11468         }
11469       else
11470         {
11471           emit_move_insn (scratch_reg, offset);
11472           emit_insn (gen_adddi3 (scratch_reg, scratch_reg,
11473                                  stack_pointer_rtx));
11474         }
11475       current = scratch_reg;
11476     }
11477
11478   ix86_expand_branch (GEU, current, limit, label);
11479   jump_insn = get_last_insn ();
11480   JUMP_LABEL (jump_insn) = label;
11481
11482   /* Mark the jump as very likely to be taken.  */
11483   add_reg_note (jump_insn, REG_BR_PROB,
11484                 GEN_INT (REG_BR_PROB_BASE - REG_BR_PROB_BASE / 100));
11485
11486   if (split_stack_fn == NULL_RTX)
11487     split_stack_fn = gen_rtx_SYMBOL_REF (Pmode, "__morestack");
11488   fn = split_stack_fn;
11489
11490   /* Get more stack space.  We pass in the desired stack space and the
11491      size of the arguments to copy to the new stack.  In 32-bit mode
11492      we push the parameters; __morestack will return on a new stack
11493      anyhow.  In 64-bit mode we pass the parameters in r10 and
11494      r11.  */
11495   allocate_rtx = GEN_INT (allocate);
11496   args_size = crtl->args.size >= 0 ? crtl->args.size : 0;
11497   call_fusage = NULL_RTX;
11498   if (TARGET_64BIT)
11499     {
11500       rtx reg10, reg11;
11501
11502       reg10 = gen_rtx_REG (Pmode, R10_REG);
11503       reg11 = gen_rtx_REG (Pmode, R11_REG);
11504
11505       /* If this function uses a static chain, it will be in %r10.
11506          Preserve it across the call to __morestack.  */
11507       if (DECL_STATIC_CHAIN (cfun->decl))
11508         {
11509           rtx rax;
11510
11511           rax = gen_rtx_REG (Pmode, AX_REG);
11512           emit_move_insn (rax, reg10);
11513           use_reg (&call_fusage, rax);
11514         }
11515
11516       if (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
11517         {
11518           HOST_WIDE_INT argval;
11519
11520           /* When using the large model we need to load the address
11521              into a register, and we've run out of registers.  So we
11522              switch to a different calling convention, and we call a
11523              different function: __morestack_large.  We pass the
11524              argument size in the upper 32 bits of r10 and pass the
11525              frame size in the lower 32 bits.  */
11526           gcc_assert ((allocate & (HOST_WIDE_INT) 0xffffffff) == allocate);
11527           gcc_assert ((args_size & 0xffffffff) == args_size);
11528
11529           if (split_stack_fn_large == NULL_RTX)
11530             split_stack_fn_large =
11531               gen_rtx_SYMBOL_REF (Pmode, "__morestack_large_model");
11532
11533           if (ix86_cmodel == CM_LARGE_PIC)
11534             {
11535               rtx label, x;
11536
11537               label = gen_label_rtx ();
11538               emit_label (label);
11539               LABEL_PRESERVE_P (label) = 1;
11540               emit_insn (gen_set_rip_rex64 (reg10, label));
11541               emit_insn (gen_set_got_offset_rex64 (reg11, label));
11542               emit_insn (gen_adddi3 (reg10, reg10, reg11));
11543               x = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, split_stack_fn_large),
11544                                   UNSPEC_GOT);
11545               x = gen_rtx_CONST (Pmode, x);
11546               emit_move_insn (reg11, x);
11547               x = gen_rtx_PLUS (Pmode, reg10, reg11);
11548               x = gen_const_mem (Pmode, x);
11549               emit_move_insn (reg11, x);
11550             }
11551           else
11552             emit_move_insn (reg11, split_stack_fn_large);
11553
11554           fn = reg11;
11555
11556           argval = ((args_size << 16) << 16) + allocate;
11557           emit_move_insn (reg10, GEN_INT (argval));
11558         }
11559       else
11560         {
11561           emit_move_insn (reg10, allocate_rtx);
11562           emit_move_insn (reg11, GEN_INT (args_size));
11563           use_reg (&call_fusage, reg11);
11564         }
11565
11566       use_reg (&call_fusage, reg10);
11567     }
11568   else
11569     {
11570       emit_insn (gen_push (GEN_INT (args_size)));
11571       emit_insn (gen_push (allocate_rtx));
11572     }
11573   call_insn = ix86_expand_call (NULL_RTX, gen_rtx_MEM (QImode, fn),
11574                                 GEN_INT (UNITS_PER_WORD), constm1_rtx,
11575                                 NULL_RTX, 0);
11576   add_function_usage_to (call_insn, call_fusage);
11577
11578   /* In order to make call/return prediction work right, we now need
11579      to execute a return instruction.  See
11580      libgcc/config/i386/morestack.S for the details on how this works.
11581
11582      For flow purposes gcc must not see this as a return
11583      instruction--we need control flow to continue at the subsequent
11584      label.  Therefore, we use an unspec.  */
11585   gcc_assert (crtl->args.pops_args < 65536);
11586   emit_insn (gen_split_stack_return (GEN_INT (crtl->args.pops_args)));
11587
11588   /* If we are in 64-bit mode and this function uses a static chain,
11589      we saved %r10 in %rax before calling _morestack.  */
11590   if (TARGET_64BIT && DECL_STATIC_CHAIN (cfun->decl))
11591     emit_move_insn (gen_rtx_REG (Pmode, R10_REG),
11592                     gen_rtx_REG (Pmode, AX_REG));
11593
11594   /* If this function calls va_start, we need to store a pointer to
11595      the arguments on the old stack, because they may not have been
11596      all copied to the new stack.  At this point the old stack can be
11597      found at the frame pointer value used by __morestack, because
11598      __morestack has set that up before calling back to us.  Here we
11599      store that pointer in a scratch register, and in
11600      ix86_expand_prologue we store the scratch register in a stack
11601      slot.  */
11602   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11603     {
11604       unsigned int scratch_regno;
11605       rtx frame_reg;
11606       int words;
11607
11608       scratch_regno = split_stack_prologue_scratch_regno ();
11609       scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
11610       frame_reg = gen_rtx_REG (Pmode, BP_REG);
11611
11612       /* 64-bit:
11613          fp -> old fp value
11614                return address within this function
11615                return address of caller of this function
11616                stack arguments
11617          So we add three words to get to the stack arguments.
11618
11619          32-bit:
11620          fp -> old fp value
11621                return address within this function
11622                first argument to __morestack
11623                second argument to __morestack
11624                return address of caller of this function
11625                stack arguments
11626          So we add five words to get to the stack arguments.
11627       */
11628       words = TARGET_64BIT ? 3 : 5;
11629       emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11630                               gen_rtx_PLUS (Pmode, frame_reg,
11631                                             GEN_INT (words * UNITS_PER_WORD))));
11632
11633       varargs_label = gen_label_rtx ();
11634       emit_jump_insn (gen_jump (varargs_label));
11635       JUMP_LABEL (get_last_insn ()) = varargs_label;
11636
11637       emit_barrier ();
11638     }
11639
11640   emit_label (label);
11641   LABEL_NUSES (label) = 1;
11642
11643   /* If this function calls va_start, we now have to set the scratch
11644      register for the case where we do not call __morestack.  In this
11645      case we need to set it based on the stack pointer.  */
11646   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11647     {
11648       emit_insn (gen_rtx_SET (VOIDmode, scratch_reg,
11649                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
11650                                             GEN_INT (UNITS_PER_WORD))));
11651
11652       emit_label (varargs_label);
11653       LABEL_NUSES (varargs_label) = 1;
11654     }
11655 }
11656
11657 /* We may have to tell the dataflow pass that the split stack prologue
11658    is initializing a scratch register.  */
11659
11660 static void
11661 ix86_live_on_entry (bitmap regs)
11662 {
11663   if (cfun->machine->split_stack_varargs_pointer != NULL_RTX)
11664     {
11665       gcc_assert (flag_split_stack);
11666       bitmap_set_bit (regs, split_stack_prologue_scratch_regno ());
11667     }
11668 }
11669 \f
11670 /* Extract the parts of an RTL expression that is a valid memory address
11671    for an instruction.  Return 0 if the structure of the address is
11672    grossly off.  Return -1 if the address contains ASHIFT, so it is not
11673    strictly valid, but still used for computing length of lea instruction.  */
11674
11675 int
11676 ix86_decompose_address (rtx addr, struct ix86_address *out)
11677 {
11678   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
11679   rtx base_reg, index_reg;
11680   HOST_WIDE_INT scale = 1;
11681   rtx scale_rtx = NULL_RTX;
11682   rtx tmp;
11683   int retval = 1;
11684   enum ix86_address_seg seg = SEG_DEFAULT;
11685
11686   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
11687     base = addr;
11688   else if (GET_CODE (addr) == PLUS)
11689     {
11690       rtx addends[4], op;
11691       int n = 0, i;
11692
11693       op = addr;
11694       do
11695         {
11696           if (n >= 4)
11697             return 0;
11698           addends[n++] = XEXP (op, 1);
11699           op = XEXP (op, 0);
11700         }
11701       while (GET_CODE (op) == PLUS);
11702       if (n >= 4)
11703         return 0;
11704       addends[n] = op;
11705
11706       for (i = n; i >= 0; --i)
11707         {
11708           op = addends[i];
11709           switch (GET_CODE (op))
11710             {
11711             case MULT:
11712               if (index)
11713                 return 0;
11714               index = XEXP (op, 0);
11715               scale_rtx = XEXP (op, 1);
11716               break;
11717
11718             case ASHIFT:
11719               if (index)
11720                 return 0;
11721               index = XEXP (op, 0);
11722               tmp = XEXP (op, 1);
11723               if (!CONST_INT_P (tmp))
11724                 return 0;
11725               scale = INTVAL (tmp);
11726               if ((unsigned HOST_WIDE_INT) scale > 3)
11727                 return 0;
11728               scale = 1 << scale;
11729               break;
11730
11731             case UNSPEC:
11732               if (XINT (op, 1) == UNSPEC_TP
11733                   && TARGET_TLS_DIRECT_SEG_REFS
11734                   && seg == SEG_DEFAULT)
11735                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
11736               else
11737                 return 0;
11738               break;
11739
11740             case REG:
11741             case SUBREG:
11742               if (!base)
11743                 base = op;
11744               else if (!index)
11745                 index = op;
11746               else
11747                 return 0;
11748               break;
11749
11750             case CONST:
11751             case CONST_INT:
11752             case SYMBOL_REF:
11753             case LABEL_REF:
11754               if (disp)
11755                 return 0;
11756               disp = op;
11757               break;
11758
11759             default:
11760               return 0;
11761             }
11762         }
11763     }
11764   else if (GET_CODE (addr) == MULT)
11765     {
11766       index = XEXP (addr, 0);           /* index*scale */
11767       scale_rtx = XEXP (addr, 1);
11768     }
11769   else if (GET_CODE (addr) == ASHIFT)
11770     {
11771       /* We're called for lea too, which implements ashift on occasion.  */
11772       index = XEXP (addr, 0);
11773       tmp = XEXP (addr, 1);
11774       if (!CONST_INT_P (tmp))
11775         return 0;
11776       scale = INTVAL (tmp);
11777       if ((unsigned HOST_WIDE_INT) scale > 3)
11778         return 0;
11779       scale = 1 << scale;
11780       retval = -1;
11781     }
11782   else
11783     disp = addr;                        /* displacement */
11784
11785   /* Extract the integral value of scale.  */
11786   if (scale_rtx)
11787     {
11788       if (!CONST_INT_P (scale_rtx))
11789         return 0;
11790       scale = INTVAL (scale_rtx);
11791     }
11792
11793   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
11794   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
11795
11796   /* Avoid useless 0 displacement.  */
11797   if (disp == const0_rtx && (base || index))
11798     disp = NULL_RTX;
11799
11800   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
11801   if (base_reg && index_reg && scale == 1
11802       && (index_reg == arg_pointer_rtx
11803           || index_reg == frame_pointer_rtx
11804           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
11805     {
11806       rtx tmp;
11807       tmp = base, base = index, index = tmp;
11808       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
11809     }
11810
11811   /* Special case: %ebp cannot be encoded as a base without a displacement.
11812      Similarly %r13.  */
11813   if (!disp
11814       && base_reg
11815       && (base_reg == hard_frame_pointer_rtx
11816           || base_reg == frame_pointer_rtx
11817           || base_reg == arg_pointer_rtx
11818           || (REG_P (base_reg)
11819               && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM
11820                   || REGNO (base_reg) == R13_REG))))
11821     disp = const0_rtx;
11822
11823   /* Special case: on K6, [%esi] makes the instruction vector decoded.
11824      Avoid this by transforming to [%esi+0].
11825      Reload calls address legitimization without cfun defined, so we need
11826      to test cfun for being non-NULL. */
11827   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
11828       && base_reg && !index_reg && !disp
11829       && REG_P (base_reg) && REGNO (base_reg) == SI_REG)
11830     disp = const0_rtx;
11831
11832   /* Special case: encode reg+reg instead of reg*2.  */
11833   if (!base && index && scale == 2)
11834     base = index, base_reg = index_reg, scale = 1;
11835
11836   /* Special case: scaling cannot be encoded without base or displacement.  */
11837   if (!base && !disp && index && scale != 1)
11838     disp = const0_rtx;
11839
11840   out->base = base;
11841   out->index = index;
11842   out->disp = disp;
11843   out->scale = scale;
11844   out->seg = seg;
11845
11846   return retval;
11847 }
11848 \f
11849 /* Return cost of the memory address x.
11850    For i386, it is better to use a complex address than let gcc copy
11851    the address into a reg and make a new pseudo.  But not if the address
11852    requires to two regs - that would mean more pseudos with longer
11853    lifetimes.  */
11854 static int
11855 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
11856 {
11857   struct ix86_address parts;
11858   int cost = 1;
11859   int ok = ix86_decompose_address (x, &parts);
11860
11861   gcc_assert (ok);
11862
11863   if (parts.base && GET_CODE (parts.base) == SUBREG)
11864     parts.base = SUBREG_REG (parts.base);
11865   if (parts.index && GET_CODE (parts.index) == SUBREG)
11866     parts.index = SUBREG_REG (parts.index);
11867
11868   /* Attempt to minimize number of registers in the address.  */
11869   if ((parts.base
11870        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
11871       || (parts.index
11872           && (!REG_P (parts.index)
11873               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
11874     cost++;
11875
11876   if (parts.base
11877       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
11878       && parts.index
11879       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
11880       && parts.base != parts.index)
11881     cost++;
11882
11883   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
11884      since it's predecode logic can't detect the length of instructions
11885      and it degenerates to vector decoded.  Increase cost of such
11886      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
11887      to split such addresses or even refuse such addresses at all.
11888
11889      Following addressing modes are affected:
11890       [base+scale*index]
11891       [scale*index+disp]
11892       [base+index]
11893
11894      The first and last case  may be avoidable by explicitly coding the zero in
11895      memory address, but I don't have AMD-K6 machine handy to check this
11896      theory.  */
11897
11898   if (TARGET_K6
11899       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
11900           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
11901           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
11902     cost += 10;
11903
11904   return cost;
11905 }
11906 \f
11907 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
11908    this is used for to form addresses to local data when -fPIC is in
11909    use.  */
11910
11911 static bool
11912 darwin_local_data_pic (rtx disp)
11913 {
11914   return (GET_CODE (disp) == UNSPEC
11915           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
11916 }
11917
11918 /* Determine if a given RTX is a valid constant.  We already know this
11919    satisfies CONSTANT_P.  */
11920
11921 static bool
11922 ix86_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
11923 {
11924   switch (GET_CODE (x))
11925     {
11926     case CONST:
11927       x = XEXP (x, 0);
11928
11929       if (GET_CODE (x) == PLUS)
11930         {
11931           if (!CONST_INT_P (XEXP (x, 1)))
11932             return false;
11933           x = XEXP (x, 0);
11934         }
11935
11936       if (TARGET_MACHO && darwin_local_data_pic (x))
11937         return true;
11938
11939       /* Only some unspecs are valid as "constants".  */
11940       if (GET_CODE (x) == UNSPEC)
11941         switch (XINT (x, 1))
11942           {
11943           case UNSPEC_GOT:
11944           case UNSPEC_GOTOFF:
11945           case UNSPEC_PLTOFF:
11946             return TARGET_64BIT;
11947           case UNSPEC_TPOFF:
11948           case UNSPEC_NTPOFF:
11949             x = XVECEXP (x, 0, 0);
11950             return (GET_CODE (x) == SYMBOL_REF
11951                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
11952           case UNSPEC_DTPOFF:
11953             x = XVECEXP (x, 0, 0);
11954             return (GET_CODE (x) == SYMBOL_REF
11955                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
11956           default:
11957             return false;
11958           }
11959
11960       /* We must have drilled down to a symbol.  */
11961       if (GET_CODE (x) == LABEL_REF)
11962         return true;
11963       if (GET_CODE (x) != SYMBOL_REF)
11964         return false;
11965       /* FALLTHRU */
11966
11967     case SYMBOL_REF:
11968       /* TLS symbols are never valid.  */
11969       if (SYMBOL_REF_TLS_MODEL (x))
11970         return false;
11971
11972       /* DLLIMPORT symbols are never valid.  */
11973       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
11974           && SYMBOL_REF_DLLIMPORT_P (x))
11975         return false;
11976
11977 #if TARGET_MACHO
11978       /* mdynamic-no-pic */
11979       if (MACHO_DYNAMIC_NO_PIC_P)
11980         return machopic_symbol_defined_p (x);
11981 #endif
11982       break;
11983
11984     case CONST_DOUBLE:
11985       if (GET_MODE (x) == TImode
11986           && x != CONST0_RTX (TImode)
11987           && !TARGET_64BIT)
11988         return false;
11989       break;
11990
11991     case CONST_VECTOR:
11992       if (!standard_sse_constant_p (x))
11993         return false;
11994
11995     default:
11996       break;
11997     }
11998
11999   /* Otherwise we handle everything else in the move patterns.  */
12000   return true;
12001 }
12002
12003 /* Determine if it's legal to put X into the constant pool.  This
12004    is not possible for the address of thread-local symbols, which
12005    is checked above.  */
12006
12007 static bool
12008 ix86_cannot_force_const_mem (enum machine_mode mode, rtx x)
12009 {
12010   /* We can always put integral constants and vectors in memory.  */
12011   switch (GET_CODE (x))
12012     {
12013     case CONST_INT:
12014     case CONST_DOUBLE:
12015     case CONST_VECTOR:
12016       return false;
12017
12018     default:
12019       break;
12020     }
12021   return !ix86_legitimate_constant_p (mode, x);
12022 }
12023
12024
12025 /* Nonzero if the constant value X is a legitimate general operand
12026    when generating PIC code.  It is given that flag_pic is on and
12027    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
12028
12029 bool
12030 legitimate_pic_operand_p (rtx x)
12031 {
12032   rtx inner;
12033
12034   switch (GET_CODE (x))
12035     {
12036     case CONST:
12037       inner = XEXP (x, 0);
12038       if (GET_CODE (inner) == PLUS
12039           && CONST_INT_P (XEXP (inner, 1)))
12040         inner = XEXP (inner, 0);
12041
12042       /* Only some unspecs are valid as "constants".  */
12043       if (GET_CODE (inner) == UNSPEC)
12044         switch (XINT (inner, 1))
12045           {
12046           case UNSPEC_GOT:
12047           case UNSPEC_GOTOFF:
12048           case UNSPEC_PLTOFF:
12049             return TARGET_64BIT;
12050           case UNSPEC_TPOFF:
12051             x = XVECEXP (inner, 0, 0);
12052             return (GET_CODE (x) == SYMBOL_REF
12053                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
12054           case UNSPEC_MACHOPIC_OFFSET:
12055             return legitimate_pic_address_disp_p (x);
12056           default:
12057             return false;
12058           }
12059       /* FALLTHRU */
12060
12061     case SYMBOL_REF:
12062     case LABEL_REF:
12063       return legitimate_pic_address_disp_p (x);
12064
12065     default:
12066       return true;
12067     }
12068 }
12069
12070 /* Determine if a given CONST RTX is a valid memory displacement
12071    in PIC mode.  */
12072
12073 bool
12074 legitimate_pic_address_disp_p (rtx disp)
12075 {
12076   bool saw_plus;
12077
12078   /* In 64bit mode we can allow direct addresses of symbols and labels
12079      when they are not dynamic symbols.  */
12080   if (TARGET_64BIT)
12081     {
12082       rtx op0 = disp, op1;
12083
12084       switch (GET_CODE (disp))
12085         {
12086         case LABEL_REF:
12087           return true;
12088
12089         case CONST:
12090           if (GET_CODE (XEXP (disp, 0)) != PLUS)
12091             break;
12092           op0 = XEXP (XEXP (disp, 0), 0);
12093           op1 = XEXP (XEXP (disp, 0), 1);
12094           if (!CONST_INT_P (op1)
12095               || INTVAL (op1) >= 16*1024*1024
12096               || INTVAL (op1) < -16*1024*1024)
12097             break;
12098           if (GET_CODE (op0) == LABEL_REF)
12099             return true;
12100           if (GET_CODE (op0) != SYMBOL_REF)
12101             break;
12102           /* FALLTHRU */
12103
12104         case SYMBOL_REF:
12105           /* TLS references should always be enclosed in UNSPEC.  */
12106           if (SYMBOL_REF_TLS_MODEL (op0))
12107             return false;
12108           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
12109               && ix86_cmodel != CM_LARGE_PIC)
12110             return true;
12111           break;
12112
12113         default:
12114           break;
12115         }
12116     }
12117   if (GET_CODE (disp) != CONST)
12118     return false;
12119   disp = XEXP (disp, 0);
12120
12121   if (TARGET_64BIT)
12122     {
12123       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
12124          of GOT tables.  We should not need these anyway.  */
12125       if (GET_CODE (disp) != UNSPEC
12126           || (XINT (disp, 1) != UNSPEC_GOTPCREL
12127               && XINT (disp, 1) != UNSPEC_GOTOFF
12128               && XINT (disp, 1) != UNSPEC_PCREL
12129               && XINT (disp, 1) != UNSPEC_PLTOFF))
12130         return false;
12131
12132       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
12133           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
12134         return false;
12135       return true;
12136     }
12137
12138   saw_plus = false;
12139   if (GET_CODE (disp) == PLUS)
12140     {
12141       if (!CONST_INT_P (XEXP (disp, 1)))
12142         return false;
12143       disp = XEXP (disp, 0);
12144       saw_plus = true;
12145     }
12146
12147   if (TARGET_MACHO && darwin_local_data_pic (disp))
12148     return true;
12149
12150   if (GET_CODE (disp) != UNSPEC)
12151     return false;
12152
12153   switch (XINT (disp, 1))
12154     {
12155     case UNSPEC_GOT:
12156       if (saw_plus)
12157         return false;
12158       /* We need to check for both symbols and labels because VxWorks loads
12159          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
12160          details.  */
12161       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
12162               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
12163     case UNSPEC_GOTOFF:
12164       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
12165          While ABI specify also 32bit relocation but we don't produce it in
12166          small PIC model at all.  */
12167       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
12168            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
12169           && !TARGET_64BIT)
12170         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
12171       return false;
12172     case UNSPEC_GOTTPOFF:
12173     case UNSPEC_GOTNTPOFF:
12174     case UNSPEC_INDNTPOFF:
12175       if (saw_plus)
12176         return false;
12177       disp = XVECEXP (disp, 0, 0);
12178       return (GET_CODE (disp) == SYMBOL_REF
12179               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
12180     case UNSPEC_NTPOFF:
12181       disp = XVECEXP (disp, 0, 0);
12182       return (GET_CODE (disp) == SYMBOL_REF
12183               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
12184     case UNSPEC_DTPOFF:
12185       disp = XVECEXP (disp, 0, 0);
12186       return (GET_CODE (disp) == SYMBOL_REF
12187               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
12188     }
12189
12190   return false;
12191 }
12192
12193 /* Recognizes RTL expressions that are valid memory addresses for an
12194    instruction.  The MODE argument is the machine mode for the MEM
12195    expression that wants to use this address.
12196
12197    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
12198    convert common non-canonical forms to canonical form so that they will
12199    be recognized.  */
12200
12201 static bool
12202 ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
12203                            rtx addr, bool strict)
12204 {
12205   struct ix86_address parts;
12206   rtx base, index, disp;
12207   HOST_WIDE_INT scale;
12208
12209   if (ix86_decompose_address (addr, &parts) <= 0)
12210     /* Decomposition failed.  */
12211     return false;
12212
12213   base = parts.base;
12214   index = parts.index;
12215   disp = parts.disp;
12216   scale = parts.scale;
12217
12218   /* Validate base register.
12219
12220      Don't allow SUBREG's that span more than a word here.  It can lead to spill
12221      failures when the base is one word out of a two word structure, which is
12222      represented internally as a DImode int.  */
12223
12224   if (base)
12225     {
12226       rtx reg;
12227
12228       if (REG_P (base))
12229         reg = base;
12230       else if (GET_CODE (base) == SUBREG
12231                && REG_P (SUBREG_REG (base))
12232                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
12233                   <= UNITS_PER_WORD)
12234         reg = SUBREG_REG (base);
12235       else
12236         /* Base is not a register.  */
12237         return false;
12238
12239       if (GET_MODE (base) != Pmode)
12240         /* Base is not in Pmode.  */
12241         return false;
12242
12243       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
12244           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
12245         /* Base is not valid.  */
12246         return false;
12247     }
12248
12249   /* Validate index register.
12250
12251      Don't allow SUBREG's that span more than a word here -- same as above.  */
12252
12253   if (index)
12254     {
12255       rtx reg;
12256
12257       if (REG_P (index))
12258         reg = index;
12259       else if (GET_CODE (index) == SUBREG
12260                && REG_P (SUBREG_REG (index))
12261                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
12262                   <= UNITS_PER_WORD)
12263         reg = SUBREG_REG (index);
12264       else
12265         /* Index is not a register.  */
12266         return false;
12267
12268       if (GET_MODE (index) != Pmode)
12269         /* Index is not in Pmode.  */
12270         return false;
12271
12272       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
12273           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
12274         /* Index is not valid.  */
12275         return false;
12276     }
12277
12278   /* Validate scale factor.  */
12279   if (scale != 1)
12280     {
12281       if (!index)
12282         /* Scale without index.  */
12283         return false;
12284
12285       if (scale != 2 && scale != 4 && scale != 8)
12286         /* Scale is not a valid multiplier.  */
12287         return false;
12288     }
12289
12290   /* Validate displacement.  */
12291   if (disp)
12292     {
12293       if (GET_CODE (disp) == CONST
12294           && GET_CODE (XEXP (disp, 0)) == UNSPEC
12295           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
12296         switch (XINT (XEXP (disp, 0), 1))
12297           {
12298           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
12299              used.  While ABI specify also 32bit relocations, we don't produce
12300              them at all and use IP relative instead.  */
12301           case UNSPEC_GOT:
12302           case UNSPEC_GOTOFF:
12303             gcc_assert (flag_pic);
12304             if (!TARGET_64BIT)
12305               goto is_legitimate_pic;
12306
12307             /* 64bit address unspec.  */
12308             return false;
12309
12310           case UNSPEC_GOTPCREL:
12311           case UNSPEC_PCREL:
12312             gcc_assert (flag_pic);
12313             goto is_legitimate_pic;
12314
12315           case UNSPEC_GOTTPOFF:
12316           case UNSPEC_GOTNTPOFF:
12317           case UNSPEC_INDNTPOFF:
12318           case UNSPEC_NTPOFF:
12319           case UNSPEC_DTPOFF:
12320             break;
12321
12322           case UNSPEC_STACK_CHECK:
12323             gcc_assert (flag_split_stack);
12324             break;
12325
12326           default:
12327             /* Invalid address unspec.  */
12328             return false;
12329           }
12330
12331       else if (SYMBOLIC_CONST (disp)
12332                && (flag_pic
12333                    || (TARGET_MACHO
12334 #if TARGET_MACHO
12335                        && MACHOPIC_INDIRECT
12336                        && !machopic_operand_p (disp)
12337 #endif
12338                )))
12339         {
12340
12341         is_legitimate_pic:
12342           if (TARGET_64BIT && (index || base))
12343             {
12344               /* foo@dtpoff(%rX) is ok.  */
12345               if (GET_CODE (disp) != CONST
12346                   || GET_CODE (XEXP (disp, 0)) != PLUS
12347                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
12348                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
12349                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
12350                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
12351                 /* Non-constant pic memory reference.  */
12352                 return false;
12353             }
12354           else if ((!TARGET_MACHO || flag_pic)
12355                     && ! legitimate_pic_address_disp_p (disp))
12356             /* Displacement is an invalid pic construct.  */
12357             return false;
12358 #if TARGET_MACHO
12359           else if (MACHO_DYNAMIC_NO_PIC_P
12360                    && !ix86_legitimate_constant_p (Pmode, disp))
12361             /* displacment must be referenced via non_lazy_pointer */
12362             return false;
12363 #endif
12364
12365           /* This code used to verify that a symbolic pic displacement
12366              includes the pic_offset_table_rtx register.
12367
12368              While this is good idea, unfortunately these constructs may
12369              be created by "adds using lea" optimization for incorrect
12370              code like:
12371
12372              int a;
12373              int foo(int i)
12374                {
12375                  return *(&a+i);
12376                }
12377
12378              This code is nonsensical, but results in addressing
12379              GOT table with pic_offset_table_rtx base.  We can't
12380              just refuse it easily, since it gets matched by
12381              "addsi3" pattern, that later gets split to lea in the
12382              case output register differs from input.  While this
12383              can be handled by separate addsi pattern for this case
12384              that never results in lea, this seems to be easier and
12385              correct fix for crash to disable this test.  */
12386         }
12387       else if (GET_CODE (disp) != LABEL_REF
12388                && !CONST_INT_P (disp)
12389                && (GET_CODE (disp) != CONST
12390                    || !ix86_legitimate_constant_p (Pmode, disp))
12391                && (GET_CODE (disp) != SYMBOL_REF
12392                    || !ix86_legitimate_constant_p (Pmode, disp)))
12393         /* Displacement is not constant.  */
12394         return false;
12395       else if (TARGET_64BIT
12396                && !x86_64_immediate_operand (disp, VOIDmode))
12397         /* Displacement is out of range.  */
12398         return false;
12399     }
12400
12401   /* Everything looks valid.  */
12402   return true;
12403 }
12404
12405 /* Determine if a given RTX is a valid constant address.  */
12406
12407 bool
12408 constant_address_p (rtx x)
12409 {
12410   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
12411 }
12412 \f
12413 /* Return a unique alias set for the GOT.  */
12414
12415 static alias_set_type
12416 ix86_GOT_alias_set (void)
12417 {
12418   static alias_set_type set = -1;
12419   if (set == -1)
12420     set = new_alias_set ();
12421   return set;
12422 }
12423
12424 /* Return a legitimate reference for ORIG (an address) using the
12425    register REG.  If REG is 0, a new pseudo is generated.
12426
12427    There are two types of references that must be handled:
12428
12429    1. Global data references must load the address from the GOT, via
12430       the PIC reg.  An insn is emitted to do this load, and the reg is
12431       returned.
12432
12433    2. Static data references, constant pool addresses, and code labels
12434       compute the address as an offset from the GOT, whose base is in
12435       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
12436       differentiate them from global data objects.  The returned
12437       address is the PIC reg + an unspec constant.
12438
12439    TARGET_LEGITIMATE_ADDRESS_P rejects symbolic references unless the PIC
12440    reg also appears in the address.  */
12441
12442 static rtx
12443 legitimize_pic_address (rtx orig, rtx reg)
12444 {
12445   rtx addr = orig;
12446   rtx new_rtx = orig;
12447   rtx base;
12448
12449 #if TARGET_MACHO
12450   if (TARGET_MACHO && !TARGET_64BIT)
12451     {
12452       if (reg == 0)
12453         reg = gen_reg_rtx (Pmode);
12454       /* Use the generic Mach-O PIC machinery.  */
12455       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
12456     }
12457 #endif
12458
12459   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
12460     new_rtx = addr;
12461   else if (TARGET_64BIT
12462            && ix86_cmodel != CM_SMALL_PIC
12463            && gotoff_operand (addr, Pmode))
12464     {
12465       rtx tmpreg;
12466       /* This symbol may be referenced via a displacement from the PIC
12467          base address (@GOTOFF).  */
12468
12469       if (reload_in_progress)
12470         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12471       if (GET_CODE (addr) == CONST)
12472         addr = XEXP (addr, 0);
12473       if (GET_CODE (addr) == PLUS)
12474           {
12475             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
12476                                       UNSPEC_GOTOFF);
12477             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
12478           }
12479         else
12480           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
12481       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12482       if (!reg)
12483         tmpreg = gen_reg_rtx (Pmode);
12484       else
12485         tmpreg = reg;
12486       emit_move_insn (tmpreg, new_rtx);
12487
12488       if (reg != 0)
12489         {
12490           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
12491                                          tmpreg, 1, OPTAB_DIRECT);
12492           new_rtx = reg;
12493         }
12494       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
12495     }
12496   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
12497     {
12498       /* This symbol may be referenced via a displacement from the PIC
12499          base address (@GOTOFF).  */
12500
12501       if (reload_in_progress)
12502         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12503       if (GET_CODE (addr) == CONST)
12504         addr = XEXP (addr, 0);
12505       if (GET_CODE (addr) == PLUS)
12506           {
12507             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
12508                                       UNSPEC_GOTOFF);
12509             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
12510           }
12511         else
12512           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
12513       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12514       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12515
12516       if (reg != 0)
12517         {
12518           emit_move_insn (reg, new_rtx);
12519           new_rtx = reg;
12520         }
12521     }
12522   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
12523            /* We can't use @GOTOFF for text labels on VxWorks;
12524               see gotoff_operand.  */
12525            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
12526     {
12527       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
12528         {
12529           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
12530             return legitimize_dllimport_symbol (addr, true);
12531           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
12532               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
12533               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
12534             {
12535               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
12536               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
12537             }
12538         }
12539
12540       /* For x64 PE-COFF there is no GOT table.  So we use address
12541          directly.  */
12542       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
12543       {
12544           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PCREL);
12545           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12546
12547           if (reg == 0)
12548             reg = gen_reg_rtx (Pmode);
12549           emit_move_insn (reg, new_rtx);
12550           new_rtx = reg;
12551       }
12552       else if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
12553         {
12554           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
12555           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12556           new_rtx = gen_const_mem (Pmode, new_rtx);
12557           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
12558
12559           if (reg == 0)
12560             reg = gen_reg_rtx (Pmode);
12561           /* Use directly gen_movsi, otherwise the address is loaded
12562              into register for CSE.  We don't want to CSE this addresses,
12563              instead we CSE addresses from the GOT table, so skip this.  */
12564           emit_insn (gen_movsi (reg, new_rtx));
12565           new_rtx = reg;
12566         }
12567       else
12568         {
12569           /* This symbol must be referenced via a load from the
12570              Global Offset Table (@GOT).  */
12571
12572           if (reload_in_progress)
12573             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12574           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
12575           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12576           if (TARGET_64BIT)
12577             new_rtx = force_reg (Pmode, new_rtx);
12578           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12579           new_rtx = gen_const_mem (Pmode, new_rtx);
12580           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
12581
12582           if (reg == 0)
12583             reg = gen_reg_rtx (Pmode);
12584           emit_move_insn (reg, new_rtx);
12585           new_rtx = reg;
12586         }
12587     }
12588   else
12589     {
12590       if (CONST_INT_P (addr)
12591           && !x86_64_immediate_operand (addr, VOIDmode))
12592         {
12593           if (reg)
12594             {
12595               emit_move_insn (reg, addr);
12596               new_rtx = reg;
12597             }
12598           else
12599             new_rtx = force_reg (Pmode, addr);
12600         }
12601       else if (GET_CODE (addr) == CONST)
12602         {
12603           addr = XEXP (addr, 0);
12604
12605           /* We must match stuff we generate before.  Assume the only
12606              unspecs that can get here are ours.  Not that we could do
12607              anything with them anyway....  */
12608           if (GET_CODE (addr) == UNSPEC
12609               || (GET_CODE (addr) == PLUS
12610                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
12611             return orig;
12612           gcc_assert (GET_CODE (addr) == PLUS);
12613         }
12614       if (GET_CODE (addr) == PLUS)
12615         {
12616           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
12617
12618           /* Check first to see if this is a constant offset from a @GOTOFF
12619              symbol reference.  */
12620           if (gotoff_operand (op0, Pmode)
12621               && CONST_INT_P (op1))
12622             {
12623               if (!TARGET_64BIT)
12624                 {
12625                   if (reload_in_progress)
12626                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12627                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
12628                                             UNSPEC_GOTOFF);
12629                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
12630                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
12631                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
12632
12633                   if (reg != 0)
12634                     {
12635                       emit_move_insn (reg, new_rtx);
12636                       new_rtx = reg;
12637                     }
12638                 }
12639               else
12640                 {
12641                   if (INTVAL (op1) < -16*1024*1024
12642                       || INTVAL (op1) >= 16*1024*1024)
12643                     {
12644                       if (!x86_64_immediate_operand (op1, Pmode))
12645                         op1 = force_reg (Pmode, op1);
12646                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
12647                     }
12648                 }
12649             }
12650           else
12651             {
12652               base = legitimize_pic_address (XEXP (addr, 0), reg);
12653               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
12654                                                  base == reg ? NULL_RTX : reg);
12655
12656               if (CONST_INT_P (new_rtx))
12657                 new_rtx = plus_constant (base, INTVAL (new_rtx));
12658               else
12659                 {
12660                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
12661                     {
12662                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
12663                       new_rtx = XEXP (new_rtx, 1);
12664                     }
12665                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
12666                 }
12667             }
12668         }
12669     }
12670   return new_rtx;
12671 }
12672 \f
12673 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
12674
12675 static rtx
12676 get_thread_pointer (int to_reg)
12677 {
12678   rtx tp, reg, insn;
12679
12680   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
12681   if (!to_reg)
12682     return tp;
12683
12684   reg = gen_reg_rtx (Pmode);
12685   insn = gen_rtx_SET (VOIDmode, reg, tp);
12686   insn = emit_insn (insn);
12687
12688   return reg;
12689 }
12690
12691 /* A subroutine of ix86_legitimize_address and ix86_expand_move.  FOR_MOV is
12692    false if we expect this to be used for a memory address and true if
12693    we expect to load the address into a register.  */
12694
12695 static rtx
12696 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
12697 {
12698   rtx dest, base, off, pic, tp;
12699   int type;
12700
12701   switch (model)
12702     {
12703     case TLS_MODEL_GLOBAL_DYNAMIC:
12704       dest = gen_reg_rtx (Pmode);
12705       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
12706
12707       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
12708         {
12709           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
12710
12711           start_sequence ();
12712           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
12713           insns = get_insns ();
12714           end_sequence ();
12715
12716           RTL_CONST_CALL_P (insns) = 1;
12717           emit_libcall_block (insns, dest, rax, x);
12718         }
12719       else if (TARGET_64BIT && TARGET_GNU2_TLS)
12720         emit_insn (gen_tls_global_dynamic_64 (dest, x));
12721       else
12722         emit_insn (gen_tls_global_dynamic_32 (dest, x));
12723
12724       if (TARGET_GNU2_TLS)
12725         {
12726           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
12727
12728           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
12729         }
12730       break;
12731
12732     case TLS_MODEL_LOCAL_DYNAMIC:
12733       base = gen_reg_rtx (Pmode);
12734       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
12735
12736       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
12737         {
12738           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
12739
12740           start_sequence ();
12741           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
12742           insns = get_insns ();
12743           end_sequence ();
12744
12745           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
12746           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
12747           RTL_CONST_CALL_P (insns) = 1;
12748           emit_libcall_block (insns, base, rax, note);
12749         }
12750       else if (TARGET_64BIT && TARGET_GNU2_TLS)
12751         emit_insn (gen_tls_local_dynamic_base_64 (base));
12752       else
12753         emit_insn (gen_tls_local_dynamic_base_32 (base));
12754
12755       if (TARGET_GNU2_TLS)
12756         {
12757           rtx x = ix86_tls_module_base ();
12758
12759           set_unique_reg_note (get_last_insn (), REG_EQUIV,
12760                                gen_rtx_MINUS (Pmode, x, tp));
12761         }
12762
12763       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
12764       off = gen_rtx_CONST (Pmode, off);
12765
12766       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
12767
12768       if (TARGET_GNU2_TLS)
12769         {
12770           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
12771
12772           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
12773         }
12774
12775       break;
12776
12777     case TLS_MODEL_INITIAL_EXEC:
12778       if (TARGET_64BIT)
12779         {
12780           if (TARGET_SUN_TLS)
12781             {
12782               /* The Sun linker took the AMD64 TLS spec literally
12783                  and can only handle %rax as destination of the
12784                  initial executable code sequence.  */
12785
12786               dest = gen_reg_rtx (Pmode);
12787               emit_insn (gen_tls_initial_exec_64_sun (dest, x));
12788               return dest;
12789             }
12790
12791           pic = NULL;
12792           type = UNSPEC_GOTNTPOFF;
12793         }
12794       else if (flag_pic)
12795         {
12796           if (reload_in_progress)
12797             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
12798           pic = pic_offset_table_rtx;
12799           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
12800         }
12801       else if (!TARGET_ANY_GNU_TLS)
12802         {
12803           pic = gen_reg_rtx (Pmode);
12804           emit_insn (gen_set_got (pic));
12805           type = UNSPEC_GOTTPOFF;
12806         }
12807       else
12808         {
12809           pic = NULL;
12810           type = UNSPEC_INDNTPOFF;
12811         }
12812
12813       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
12814       off = gen_rtx_CONST (Pmode, off);
12815       if (pic)
12816         off = gen_rtx_PLUS (Pmode, pic, off);
12817       off = gen_const_mem (Pmode, off);
12818       set_mem_alias_set (off, ix86_GOT_alias_set ());
12819
12820       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12821         {
12822           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
12823           off = force_reg (Pmode, off);
12824           return gen_rtx_PLUS (Pmode, base, off);
12825         }
12826       else
12827         {
12828           base = get_thread_pointer (true);
12829           dest = gen_reg_rtx (Pmode);
12830           emit_insn (gen_subsi3 (dest, base, off));
12831         }
12832       break;
12833
12834     case TLS_MODEL_LOCAL_EXEC:
12835       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
12836                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12837                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
12838       off = gen_rtx_CONST (Pmode, off);
12839
12840       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
12841         {
12842           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
12843           return gen_rtx_PLUS (Pmode, base, off);
12844         }
12845       else
12846         {
12847           base = get_thread_pointer (true);
12848           dest = gen_reg_rtx (Pmode);
12849           emit_insn (gen_subsi3 (dest, base, off));
12850         }
12851       break;
12852
12853     default:
12854       gcc_unreachable ();
12855     }
12856
12857   return dest;
12858 }
12859
12860 /* Create or return the unique __imp_DECL dllimport symbol corresponding
12861    to symbol DECL.  */
12862
12863 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
12864   htab_t dllimport_map;
12865
12866 static tree
12867 get_dllimport_decl (tree decl)
12868 {
12869   struct tree_map *h, in;
12870   void **loc;
12871   const char *name;
12872   const char *prefix;
12873   size_t namelen, prefixlen;
12874   char *imp_name;
12875   tree to;
12876   rtx rtl;
12877
12878   if (!dllimport_map)
12879     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
12880
12881   in.hash = htab_hash_pointer (decl);
12882   in.base.from = decl;
12883   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
12884   h = (struct tree_map *) *loc;
12885   if (h)
12886     return h->to;
12887
12888   *loc = h = ggc_alloc_tree_map ();
12889   h->hash = in.hash;
12890   h->base.from = decl;
12891   h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
12892                            VAR_DECL, NULL, ptr_type_node);
12893   DECL_ARTIFICIAL (to) = 1;
12894   DECL_IGNORED_P (to) = 1;
12895   DECL_EXTERNAL (to) = 1;
12896   TREE_READONLY (to) = 1;
12897
12898   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
12899   name = targetm.strip_name_encoding (name);
12900   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
12901     ? "*__imp_" : "*__imp__";
12902   namelen = strlen (name);
12903   prefixlen = strlen (prefix);
12904   imp_name = (char *) alloca (namelen + prefixlen + 1);
12905   memcpy (imp_name, prefix, prefixlen);
12906   memcpy (imp_name + prefixlen, name, namelen + 1);
12907
12908   name = ggc_alloc_string (imp_name, namelen + prefixlen);
12909   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
12910   SET_SYMBOL_REF_DECL (rtl, to);
12911   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
12912
12913   rtl = gen_const_mem (Pmode, rtl);
12914   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
12915
12916   SET_DECL_RTL (to, rtl);
12917   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
12918
12919   return to;
12920 }
12921
12922 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
12923    true if we require the result be a register.  */
12924
12925 static rtx
12926 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
12927 {
12928   tree imp_decl;
12929   rtx x;
12930
12931   gcc_assert (SYMBOL_REF_DECL (symbol));
12932   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
12933
12934   x = DECL_RTL (imp_decl);
12935   if (want_reg)
12936     x = force_reg (Pmode, x);
12937   return x;
12938 }
12939
12940 /* Try machine-dependent ways of modifying an illegitimate address
12941    to be legitimate.  If we find one, return the new, valid address.
12942    This macro is used in only one place: `memory_address' in explow.c.
12943
12944    OLDX is the address as it was before break_out_memory_refs was called.
12945    In some cases it is useful to look at this to decide what needs to be done.
12946
12947    It is always safe for this macro to do nothing.  It exists to recognize
12948    opportunities to optimize the output.
12949
12950    For the 80386, we handle X+REG by loading X into a register R and
12951    using R+REG.  R will go in a general reg and indexing will be used.
12952    However, if REG is a broken-out memory address or multiplication,
12953    nothing needs to be done because REG can certainly go in a general reg.
12954
12955    When -fpic is used, special handling is needed for symbolic references.
12956    See comments by legitimize_pic_address in i386.c for details.  */
12957
12958 static rtx
12959 ix86_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
12960                          enum machine_mode mode)
12961 {
12962   int changed = 0;
12963   unsigned log;
12964
12965   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
12966   if (log)
12967     return legitimize_tls_address (x, (enum tls_model) log, false);
12968   if (GET_CODE (x) == CONST
12969       && GET_CODE (XEXP (x, 0)) == PLUS
12970       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
12971       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
12972     {
12973       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
12974                                       (enum tls_model) log, false);
12975       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
12976     }
12977
12978   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
12979     {
12980       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
12981         return legitimize_dllimport_symbol (x, true);
12982       if (GET_CODE (x) == CONST
12983           && GET_CODE (XEXP (x, 0)) == PLUS
12984           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
12985           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
12986         {
12987           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
12988           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
12989         }
12990     }
12991
12992   if (flag_pic && SYMBOLIC_CONST (x))
12993     return legitimize_pic_address (x, 0);
12994
12995 #if TARGET_MACHO
12996   if (MACHO_DYNAMIC_NO_PIC_P && SYMBOLIC_CONST (x))
12997     return machopic_indirect_data_reference (x, 0);
12998 #endif
12999
13000   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
13001   if (GET_CODE (x) == ASHIFT
13002       && CONST_INT_P (XEXP (x, 1))
13003       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
13004     {
13005       changed = 1;
13006       log = INTVAL (XEXP (x, 1));
13007       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
13008                         GEN_INT (1 << log));
13009     }
13010
13011   if (GET_CODE (x) == PLUS)
13012     {
13013       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
13014
13015       if (GET_CODE (XEXP (x, 0)) == ASHIFT
13016           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
13017           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
13018         {
13019           changed = 1;
13020           log = INTVAL (XEXP (XEXP (x, 0), 1));
13021           XEXP (x, 0) = gen_rtx_MULT (Pmode,
13022                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
13023                                       GEN_INT (1 << log));
13024         }
13025
13026       if (GET_CODE (XEXP (x, 1)) == ASHIFT
13027           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
13028           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
13029         {
13030           changed = 1;
13031           log = INTVAL (XEXP (XEXP (x, 1), 1));
13032           XEXP (x, 1) = gen_rtx_MULT (Pmode,
13033                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
13034                                       GEN_INT (1 << log));
13035         }
13036
13037       /* Put multiply first if it isn't already.  */
13038       if (GET_CODE (XEXP (x, 1)) == MULT)
13039         {
13040           rtx tmp = XEXP (x, 0);
13041           XEXP (x, 0) = XEXP (x, 1);
13042           XEXP (x, 1) = tmp;
13043           changed = 1;
13044         }
13045
13046       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
13047          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
13048          created by virtual register instantiation, register elimination, and
13049          similar optimizations.  */
13050       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
13051         {
13052           changed = 1;
13053           x = gen_rtx_PLUS (Pmode,
13054                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
13055                                           XEXP (XEXP (x, 1), 0)),
13056                             XEXP (XEXP (x, 1), 1));
13057         }
13058
13059       /* Canonicalize
13060          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
13061          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
13062       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
13063                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
13064                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
13065                && CONSTANT_P (XEXP (x, 1)))
13066         {
13067           rtx constant;
13068           rtx other = NULL_RTX;
13069
13070           if (CONST_INT_P (XEXP (x, 1)))
13071             {
13072               constant = XEXP (x, 1);
13073               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
13074             }
13075           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
13076             {
13077               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
13078               other = XEXP (x, 1);
13079             }
13080           else
13081             constant = 0;
13082
13083           if (constant)
13084             {
13085               changed = 1;
13086               x = gen_rtx_PLUS (Pmode,
13087                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
13088                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
13089                                 plus_constant (other, INTVAL (constant)));
13090             }
13091         }
13092
13093       if (changed && ix86_legitimate_address_p (mode, x, false))
13094         return x;
13095
13096       if (GET_CODE (XEXP (x, 0)) == MULT)
13097         {
13098           changed = 1;
13099           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
13100         }
13101
13102       if (GET_CODE (XEXP (x, 1)) == MULT)
13103         {
13104           changed = 1;
13105           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
13106         }
13107
13108       if (changed
13109           && REG_P (XEXP (x, 1))
13110           && REG_P (XEXP (x, 0)))
13111         return x;
13112
13113       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
13114         {
13115           changed = 1;
13116           x = legitimize_pic_address (x, 0);
13117         }
13118
13119       if (changed && ix86_legitimate_address_p (mode, x, false))
13120         return x;
13121
13122       if (REG_P (XEXP (x, 0)))
13123         {
13124           rtx temp = gen_reg_rtx (Pmode);
13125           rtx val  = force_operand (XEXP (x, 1), temp);
13126           if (val != temp)
13127             emit_move_insn (temp, val);
13128
13129           XEXP (x, 1) = temp;
13130           return x;
13131         }
13132
13133       else if (REG_P (XEXP (x, 1)))
13134         {
13135           rtx temp = gen_reg_rtx (Pmode);
13136           rtx val  = force_operand (XEXP (x, 0), temp);
13137           if (val != temp)
13138             emit_move_insn (temp, val);
13139
13140           XEXP (x, 0) = temp;
13141           return x;
13142         }
13143     }
13144
13145   return x;
13146 }
13147 \f
13148 /* Print an integer constant expression in assembler syntax.  Addition
13149    and subtraction are the only arithmetic that may appear in these
13150    expressions.  FILE is the stdio stream to write to, X is the rtx, and
13151    CODE is the operand print code from the output string.  */
13152
13153 static void
13154 output_pic_addr_const (FILE *file, rtx x, int code)
13155 {
13156   char buf[256];
13157
13158   switch (GET_CODE (x))
13159     {
13160     case PC:
13161       gcc_assert (flag_pic);
13162       putc ('.', file);
13163       break;
13164
13165     case SYMBOL_REF:
13166       if (TARGET_64BIT || ! TARGET_MACHO_BRANCH_ISLANDS)
13167         output_addr_const (file, x);
13168       else
13169         {
13170           const char *name = XSTR (x, 0);
13171
13172           /* Mark the decl as referenced so that cgraph will
13173              output the function.  */
13174           if (SYMBOL_REF_DECL (x))
13175             mark_decl_referenced (SYMBOL_REF_DECL (x));
13176
13177 #if TARGET_MACHO
13178           if (MACHOPIC_INDIRECT
13179               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
13180             name = machopic_indirection_name (x, /*stub_p=*/true);
13181 #endif
13182           assemble_name (file, name);
13183         }
13184       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
13185           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
13186         fputs ("@PLT", file);
13187       break;
13188
13189     case LABEL_REF:
13190       x = XEXP (x, 0);
13191       /* FALLTHRU */
13192     case CODE_LABEL:
13193       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
13194       assemble_name (asm_out_file, buf);
13195       break;
13196
13197     case CONST_INT:
13198       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
13199       break;
13200
13201     case CONST:
13202       /* This used to output parentheses around the expression,
13203          but that does not work on the 386 (either ATT or BSD assembler).  */
13204       output_pic_addr_const (file, XEXP (x, 0), code);
13205       break;
13206
13207     case CONST_DOUBLE:
13208       if (GET_MODE (x) == VOIDmode)
13209         {
13210           /* We can use %d if the number is <32 bits and positive.  */
13211           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
13212             fprintf (file, "0x%lx%08lx",
13213                      (unsigned long) CONST_DOUBLE_HIGH (x),
13214                      (unsigned long) CONST_DOUBLE_LOW (x));
13215           else
13216             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
13217         }
13218       else
13219         /* We can't handle floating point constants;
13220            TARGET_PRINT_OPERAND must handle them.  */
13221         output_operand_lossage ("floating constant misused");
13222       break;
13223
13224     case PLUS:
13225       /* Some assemblers need integer constants to appear first.  */
13226       if (CONST_INT_P (XEXP (x, 0)))
13227         {
13228           output_pic_addr_const (file, XEXP (x, 0), code);
13229           putc ('+', file);
13230           output_pic_addr_const (file, XEXP (x, 1), code);
13231         }
13232       else
13233         {
13234           gcc_assert (CONST_INT_P (XEXP (x, 1)));
13235           output_pic_addr_const (file, XEXP (x, 1), code);
13236           putc ('+', file);
13237           output_pic_addr_const (file, XEXP (x, 0), code);
13238         }
13239       break;
13240
13241     case MINUS:
13242       if (!TARGET_MACHO)
13243         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
13244       output_pic_addr_const (file, XEXP (x, 0), code);
13245       putc ('-', file);
13246       output_pic_addr_const (file, XEXP (x, 1), code);
13247       if (!TARGET_MACHO)
13248         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
13249       break;
13250
13251      case UNSPEC:
13252        if (XINT (x, 1) == UNSPEC_STACK_CHECK)
13253          {
13254            bool f = i386_asm_output_addr_const_extra (file, x);
13255            gcc_assert (f);
13256            break;
13257          }
13258
13259        gcc_assert (XVECLEN (x, 0) == 1);
13260        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
13261        switch (XINT (x, 1))
13262         {
13263         case UNSPEC_GOT:
13264           fputs ("@GOT", file);
13265           break;
13266         case UNSPEC_GOTOFF:
13267           fputs ("@GOTOFF", file);
13268           break;
13269         case UNSPEC_PLTOFF:
13270           fputs ("@PLTOFF", file);
13271           break;
13272         case UNSPEC_PCREL:
13273           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13274                  "(%rip)" : "[rip]", file);
13275           break;
13276         case UNSPEC_GOTPCREL:
13277           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13278                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
13279           break;
13280         case UNSPEC_GOTTPOFF:
13281           /* FIXME: This might be @TPOFF in Sun ld too.  */
13282           fputs ("@gottpoff", file);
13283           break;
13284         case UNSPEC_TPOFF:
13285           fputs ("@tpoff", file);
13286           break;
13287         case UNSPEC_NTPOFF:
13288           if (TARGET_64BIT)
13289             fputs ("@tpoff", file);
13290           else
13291             fputs ("@ntpoff", file);
13292           break;
13293         case UNSPEC_DTPOFF:
13294           fputs ("@dtpoff", file);
13295           break;
13296         case UNSPEC_GOTNTPOFF:
13297           if (TARGET_64BIT)
13298             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
13299                    "@gottpoff(%rip)": "@gottpoff[rip]", file);
13300           else
13301             fputs ("@gotntpoff", file);
13302           break;
13303         case UNSPEC_INDNTPOFF:
13304           fputs ("@indntpoff", file);
13305           break;
13306 #if TARGET_MACHO
13307         case UNSPEC_MACHOPIC_OFFSET:
13308           putc ('-', file);
13309           machopic_output_function_base_name (file);
13310           break;
13311 #endif
13312         default:
13313           output_operand_lossage ("invalid UNSPEC as operand");
13314           break;
13315         }
13316        break;
13317
13318     default:
13319       output_operand_lossage ("invalid expression as operand");
13320     }
13321 }
13322
13323 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
13324    We need to emit DTP-relative relocations.  */
13325
13326 static void ATTRIBUTE_UNUSED
13327 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
13328 {
13329   fputs (ASM_LONG, file);
13330   output_addr_const (file, x);
13331   fputs ("@dtpoff", file);
13332   switch (size)
13333     {
13334     case 4:
13335       break;
13336     case 8:
13337       fputs (", 0", file);
13338       break;
13339     default:
13340       gcc_unreachable ();
13341    }
13342 }
13343
13344 /* Return true if X is a representation of the PIC register.  This copes
13345    with calls from ix86_find_base_term, where the register might have
13346    been replaced by a cselib value.  */
13347
13348 static bool
13349 ix86_pic_register_p (rtx x)
13350 {
13351   if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
13352     return (pic_offset_table_rtx
13353             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
13354   else
13355     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
13356 }
13357
13358 /* Helper function for ix86_delegitimize_address.
13359    Attempt to delegitimize TLS local-exec accesses.  */
13360
13361 static rtx
13362 ix86_delegitimize_tls_address (rtx orig_x)
13363 {
13364   rtx x = orig_x, unspec;
13365   struct ix86_address addr;
13366
13367   if (!TARGET_TLS_DIRECT_SEG_REFS)
13368     return orig_x;
13369   if (MEM_P (x))
13370     x = XEXP (x, 0);
13371   if (GET_CODE (x) != PLUS || GET_MODE (x) != Pmode)
13372     return orig_x;
13373   if (ix86_decompose_address (x, &addr) == 0
13374       || addr.seg != (TARGET_64BIT ? SEG_FS : SEG_GS)
13375       || addr.disp == NULL_RTX
13376       || GET_CODE (addr.disp) != CONST)
13377     return orig_x;
13378   unspec = XEXP (addr.disp, 0);
13379   if (GET_CODE (unspec) == PLUS && CONST_INT_P (XEXP (unspec, 1)))
13380     unspec = XEXP (unspec, 0);
13381   if (GET_CODE (unspec) != UNSPEC || XINT (unspec, 1) != UNSPEC_NTPOFF)
13382     return orig_x;
13383   x = XVECEXP (unspec, 0, 0);
13384   gcc_assert (GET_CODE (x) == SYMBOL_REF);
13385   if (unspec != XEXP (addr.disp, 0))
13386     x = gen_rtx_PLUS (Pmode, x, XEXP (XEXP (addr.disp, 0), 1));
13387   if (addr.index)
13388     {
13389       rtx idx = addr.index;
13390       if (addr.scale != 1)
13391         idx = gen_rtx_MULT (Pmode, idx, GEN_INT (addr.scale));
13392       x = gen_rtx_PLUS (Pmode, idx, x);
13393     }
13394   if (addr.base)
13395     x = gen_rtx_PLUS (Pmode, addr.base, x);
13396   if (MEM_P (orig_x))
13397     x = replace_equiv_address_nv (orig_x, x);
13398   return x;
13399 }
13400
13401 /* In the name of slightly smaller debug output, and to cater to
13402    general assembler lossage, recognize PIC+GOTOFF and turn it back
13403    into a direct symbol reference.
13404
13405    On Darwin, this is necessary to avoid a crash, because Darwin
13406    has a different PIC label for each routine but the DWARF debugging
13407    information is not associated with any particular routine, so it's
13408    necessary to remove references to the PIC label from RTL stored by
13409    the DWARF output code.  */
13410
13411 static rtx
13412 ix86_delegitimize_address (rtx x)
13413 {
13414   rtx orig_x = delegitimize_mem_from_attrs (x);
13415   /* addend is NULL or some rtx if x is something+GOTOFF where
13416      something doesn't include the PIC register.  */
13417   rtx addend = NULL_RTX;
13418   /* reg_addend is NULL or a multiple of some register.  */
13419   rtx reg_addend = NULL_RTX;
13420   /* const_addend is NULL or a const_int.  */
13421   rtx const_addend = NULL_RTX;
13422   /* This is the result, or NULL.  */
13423   rtx result = NULL_RTX;
13424
13425   x = orig_x;
13426
13427   if (MEM_P (x))
13428     x = XEXP (x, 0);
13429
13430   if (TARGET_64BIT)
13431     {
13432       if (GET_CODE (x) != CONST
13433           || GET_CODE (XEXP (x, 0)) != UNSPEC
13434           || (XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
13435               && XINT (XEXP (x, 0), 1) != UNSPEC_PCREL)
13436           || !MEM_P (orig_x))
13437         return ix86_delegitimize_tls_address (orig_x);
13438       x = XVECEXP (XEXP (x, 0), 0, 0);
13439       if (GET_MODE (orig_x) != Pmode)
13440         {
13441           x = simplify_gen_subreg (GET_MODE (orig_x), x, Pmode, 0);
13442           if (x == NULL_RTX)
13443             return orig_x;
13444         }
13445       return x;
13446     }
13447
13448   if (GET_CODE (x) != PLUS
13449       || GET_CODE (XEXP (x, 1)) != CONST)
13450     return ix86_delegitimize_tls_address (orig_x);
13451
13452   if (ix86_pic_register_p (XEXP (x, 0)))
13453     /* %ebx + GOT/GOTOFF */
13454     ;
13455   else if (GET_CODE (XEXP (x, 0)) == PLUS)
13456     {
13457       /* %ebx + %reg * scale + GOT/GOTOFF */
13458       reg_addend = XEXP (x, 0);
13459       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
13460         reg_addend = XEXP (reg_addend, 1);
13461       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
13462         reg_addend = XEXP (reg_addend, 0);
13463       else
13464         {
13465           reg_addend = NULL_RTX;
13466           addend = XEXP (x, 0);
13467         }
13468     }
13469   else
13470     addend = XEXP (x, 0);
13471
13472   x = XEXP (XEXP (x, 1), 0);
13473   if (GET_CODE (x) == PLUS
13474       && CONST_INT_P (XEXP (x, 1)))
13475     {
13476       const_addend = XEXP (x, 1);
13477       x = XEXP (x, 0);
13478     }
13479
13480   if (GET_CODE (x) == UNSPEC
13481       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x) && !addend)
13482           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
13483     result = XVECEXP (x, 0, 0);
13484
13485   if (TARGET_MACHO && darwin_local_data_pic (x)
13486       && !MEM_P (orig_x))
13487     result = XVECEXP (x, 0, 0);
13488
13489   if (! result)
13490     return ix86_delegitimize_tls_address (orig_x);
13491
13492   if (const_addend)
13493     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
13494   if (reg_addend)
13495     result = gen_rtx_PLUS (Pmode, reg_addend, result);
13496   if (addend)
13497     {
13498       /* If the rest of original X doesn't involve the PIC register, add
13499          addend and subtract pic_offset_table_rtx.  This can happen e.g.
13500          for code like:
13501          leal (%ebx, %ecx, 4), %ecx
13502          ...
13503          movl foo@GOTOFF(%ecx), %edx
13504          in which case we return (%ecx - %ebx) + foo.  */
13505       if (pic_offset_table_rtx)
13506         result = gen_rtx_PLUS (Pmode, gen_rtx_MINUS (Pmode, copy_rtx (addend),
13507                                                      pic_offset_table_rtx),
13508                                result);
13509       else
13510         return orig_x;
13511     }
13512   if (GET_MODE (orig_x) != Pmode && MEM_P (orig_x))
13513     {
13514       result = simplify_gen_subreg (GET_MODE (orig_x), result, Pmode, 0);
13515       if (result == NULL_RTX)
13516         return orig_x;
13517     }
13518   return result;
13519 }
13520
13521 /* If X is a machine specific address (i.e. a symbol or label being
13522    referenced as a displacement from the GOT implemented using an
13523    UNSPEC), then return the base term.  Otherwise return X.  */
13524
13525 rtx
13526 ix86_find_base_term (rtx x)
13527 {
13528   rtx term;
13529
13530   if (TARGET_64BIT)
13531     {
13532       if (GET_CODE (x) != CONST)
13533         return x;
13534       term = XEXP (x, 0);
13535       if (GET_CODE (term) == PLUS
13536           && (CONST_INT_P (XEXP (term, 1))
13537               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
13538         term = XEXP (term, 0);
13539       if (GET_CODE (term) != UNSPEC
13540           || (XINT (term, 1) != UNSPEC_GOTPCREL
13541               && XINT (term, 1) != UNSPEC_PCREL))
13542         return x;
13543
13544       return XVECEXP (term, 0, 0);
13545     }
13546
13547   return ix86_delegitimize_address (x);
13548 }
13549 \f
13550 static void
13551 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
13552                     int fp, FILE *file)
13553 {
13554   const char *suffix;
13555
13556   if (mode == CCFPmode || mode == CCFPUmode)
13557     {
13558       code = ix86_fp_compare_code_to_integer (code);
13559       mode = CCmode;
13560     }
13561   if (reverse)
13562     code = reverse_condition (code);
13563
13564   switch (code)
13565     {
13566     case EQ:
13567       switch (mode)
13568         {
13569         case CCAmode:
13570           suffix = "a";
13571           break;
13572
13573         case CCCmode:
13574           suffix = "c";
13575           break;
13576
13577         case CCOmode:
13578           suffix = "o";
13579           break;
13580
13581         case CCSmode:
13582           suffix = "s";
13583           break;
13584
13585         default:
13586           suffix = "e";
13587         }
13588       break;
13589     case NE:
13590       switch (mode)
13591         {
13592         case CCAmode:
13593           suffix = "na";
13594           break;
13595
13596         case CCCmode:
13597           suffix = "nc";
13598           break;
13599
13600         case CCOmode:
13601           suffix = "no";
13602           break;
13603
13604         case CCSmode:
13605           suffix = "ns";
13606           break;
13607
13608         default:
13609           suffix = "ne";
13610         }
13611       break;
13612     case GT:
13613       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
13614       suffix = "g";
13615       break;
13616     case GTU:
13617       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
13618          Those same assemblers have the same but opposite lossage on cmov.  */
13619       if (mode == CCmode)
13620         suffix = fp ? "nbe" : "a";
13621       else if (mode == CCCmode)
13622         suffix = "b";
13623       else
13624         gcc_unreachable ();
13625       break;
13626     case LT:
13627       switch (mode)
13628         {
13629         case CCNOmode:
13630         case CCGOCmode:
13631           suffix = "s";
13632           break;
13633
13634         case CCmode:
13635         case CCGCmode:
13636           suffix = "l";
13637           break;
13638
13639         default:
13640           gcc_unreachable ();
13641         }
13642       break;
13643     case LTU:
13644       gcc_assert (mode == CCmode || mode == CCCmode);
13645       suffix = "b";
13646       break;
13647     case GE:
13648       switch (mode)
13649         {
13650         case CCNOmode:
13651         case CCGOCmode:
13652           suffix = "ns";
13653           break;
13654
13655         case CCmode:
13656         case CCGCmode:
13657           suffix = "ge";
13658           break;
13659
13660         default:
13661           gcc_unreachable ();
13662         }
13663       break;
13664     case GEU:
13665       /* ??? As above.  */
13666       gcc_assert (mode == CCmode || mode == CCCmode);
13667       suffix = fp ? "nb" : "ae";
13668       break;
13669     case LE:
13670       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
13671       suffix = "le";
13672       break;
13673     case LEU:
13674       /* ??? As above.  */
13675       if (mode == CCmode)
13676         suffix = "be";
13677       else if (mode == CCCmode)
13678         suffix = fp ? "nb" : "ae";
13679       else
13680         gcc_unreachable ();
13681       break;
13682     case UNORDERED:
13683       suffix = fp ? "u" : "p";
13684       break;
13685     case ORDERED:
13686       suffix = fp ? "nu" : "np";
13687       break;
13688     default:
13689       gcc_unreachable ();
13690     }
13691   fputs (suffix, file);
13692 }
13693
13694 /* Print the name of register X to FILE based on its machine mode and number.
13695    If CODE is 'w', pretend the mode is HImode.
13696    If CODE is 'b', pretend the mode is QImode.
13697    If CODE is 'k', pretend the mode is SImode.
13698    If CODE is 'q', pretend the mode is DImode.
13699    If CODE is 'x', pretend the mode is V4SFmode.
13700    If CODE is 't', pretend the mode is V8SFmode.
13701    If CODE is 'h', pretend the reg is the 'high' byte register.
13702    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
13703    If CODE is 'd', duplicate the operand for AVX instruction.
13704  */
13705
13706 void
13707 print_reg (rtx x, int code, FILE *file)
13708 {
13709   const char *reg;
13710   bool duplicated = code == 'd' && TARGET_AVX;
13711
13712   gcc_assert (x == pc_rtx
13713               || (REGNO (x) != ARG_POINTER_REGNUM
13714                   && REGNO (x) != FRAME_POINTER_REGNUM
13715                   && REGNO (x) != FLAGS_REG
13716                   && REGNO (x) != FPSR_REG
13717                   && REGNO (x) != FPCR_REG));
13718
13719   if (ASSEMBLER_DIALECT == ASM_ATT)
13720     putc ('%', file);
13721
13722   if (x == pc_rtx)
13723     {
13724       gcc_assert (TARGET_64BIT);
13725       fputs ("rip", file);
13726       return;
13727     }
13728
13729   if (code == 'w' || MMX_REG_P (x))
13730     code = 2;
13731   else if (code == 'b')
13732     code = 1;
13733   else if (code == 'k')
13734     code = 4;
13735   else if (code == 'q')
13736     code = 8;
13737   else if (code == 'y')
13738     code = 3;
13739   else if (code == 'h')
13740     code = 0;
13741   else if (code == 'x')
13742     code = 16;
13743   else if (code == 't')
13744     code = 32;
13745   else
13746     code = GET_MODE_SIZE (GET_MODE (x));
13747
13748   /* Irritatingly, AMD extended registers use different naming convention
13749      from the normal registers.  */
13750   if (REX_INT_REG_P (x))
13751     {
13752       gcc_assert (TARGET_64BIT);
13753       switch (code)
13754         {
13755           case 0:
13756             error ("extended registers have no high halves");
13757             break;
13758           case 1:
13759             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
13760             break;
13761           case 2:
13762             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
13763             break;
13764           case 4:
13765             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
13766             break;
13767           case 8:
13768             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
13769             break;
13770           default:
13771             error ("unsupported operand size for extended register");
13772             break;
13773         }
13774       return;
13775     }
13776
13777   reg = NULL;
13778   switch (code)
13779     {
13780     case 3:
13781       if (STACK_TOP_P (x))
13782         {
13783           reg = "st(0)";
13784           break;
13785         }
13786       /* FALLTHRU */
13787     case 8:
13788     case 4:
13789     case 12:
13790       if (! ANY_FP_REG_P (x))
13791         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
13792       /* FALLTHRU */
13793     case 16:
13794     case 2:
13795     normal:
13796       reg = hi_reg_name[REGNO (x)];
13797       break;
13798     case 1:
13799       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
13800         goto normal;
13801       reg = qi_reg_name[REGNO (x)];
13802       break;
13803     case 0:
13804       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
13805         goto normal;
13806       reg = qi_high_reg_name[REGNO (x)];
13807       break;
13808     case 32:
13809       if (SSE_REG_P (x))
13810         {
13811           gcc_assert (!duplicated);
13812           putc ('y', file);
13813           fputs (hi_reg_name[REGNO (x)] + 1, file);
13814           return;
13815         }
13816       break;
13817     default:
13818       gcc_unreachable ();
13819     }
13820
13821   fputs (reg, file);
13822   if (duplicated)
13823     {
13824       if (ASSEMBLER_DIALECT == ASM_ATT)
13825         fprintf (file, ", %%%s", reg);
13826       else
13827         fprintf (file, ", %s", reg);
13828     }
13829 }
13830
13831 /* Locate some local-dynamic symbol still in use by this function
13832    so that we can print its name in some tls_local_dynamic_base
13833    pattern.  */
13834
13835 static int
13836 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
13837 {
13838   rtx x = *px;
13839
13840   if (GET_CODE (x) == SYMBOL_REF
13841       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
13842     {
13843       cfun->machine->some_ld_name = XSTR (x, 0);
13844       return 1;
13845     }
13846
13847   return 0;
13848 }
13849
13850 static const char *
13851 get_some_local_dynamic_name (void)
13852 {
13853   rtx insn;
13854
13855   if (cfun->machine->some_ld_name)
13856     return cfun->machine->some_ld_name;
13857
13858   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
13859     if (NONDEBUG_INSN_P (insn)
13860         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
13861       return cfun->machine->some_ld_name;
13862
13863   return NULL;
13864 }
13865
13866 /* Meaning of CODE:
13867    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
13868    C -- print opcode suffix for set/cmov insn.
13869    c -- like C, but print reversed condition
13870    F,f -- likewise, but for floating-point.
13871    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
13872         otherwise nothing
13873    R -- print the prefix for register names.
13874    z -- print the opcode suffix for the size of the current operand.
13875    Z -- likewise, with special suffixes for x87 instructions.
13876    * -- print a star (in certain assembler syntax)
13877    A -- print an absolute memory reference.
13878    w -- print the operand as if it's a "word" (HImode) even if it isn't.
13879    s -- print a shift double count, followed by the assemblers argument
13880         delimiter.
13881    b -- print the QImode name of the register for the indicated operand.
13882         %b0 would print %al if operands[0] is reg 0.
13883    w --  likewise, print the HImode name of the register.
13884    k --  likewise, print the SImode name of the register.
13885    q --  likewise, print the DImode name of the register.
13886    x --  likewise, print the V4SFmode name of the register.
13887    t --  likewise, print the V8SFmode name of the register.
13888    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
13889    y -- print "st(0)" instead of "st" as a register.
13890    d -- print duplicated register operand for AVX instruction.
13891    D -- print condition for SSE cmp instruction.
13892    P -- if PIC, print an @PLT suffix.
13893    X -- don't print any sort of PIC '@' suffix for a symbol.
13894    & -- print some in-use local-dynamic symbol name.
13895    H -- print a memory address offset by 8; used for sse high-parts
13896    Y -- print condition for XOP pcom* instruction.
13897    + -- print a branch hint as 'cs' or 'ds' prefix
13898    ; -- print a semicolon (after prefixes due to bug in older gas).
13899    @ -- print a segment register of thread base pointer load
13900  */
13901
13902 void
13903 ix86_print_operand (FILE *file, rtx x, int code)
13904 {
13905   if (code)
13906     {
13907       switch (code)
13908         {
13909         case '*':
13910           if (ASSEMBLER_DIALECT == ASM_ATT)
13911             putc ('*', file);
13912           return;
13913
13914         case '&':
13915           {
13916             const char *name = get_some_local_dynamic_name ();
13917             if (name == NULL)
13918               output_operand_lossage ("'%%&' used without any "
13919                                       "local dynamic TLS references");
13920             else
13921               assemble_name (file, name);
13922             return;
13923           }
13924
13925         case 'A':
13926           switch (ASSEMBLER_DIALECT)
13927             {
13928             case ASM_ATT:
13929               putc ('*', file);
13930               break;
13931
13932             case ASM_INTEL:
13933               /* Intel syntax. For absolute addresses, registers should not
13934                  be surrounded by braces.  */
13935               if (!REG_P (x))
13936                 {
13937                   putc ('[', file);
13938                   ix86_print_operand (file, x, 0);
13939                   putc (']', file);
13940                   return;
13941                 }
13942               break;
13943
13944             default:
13945               gcc_unreachable ();
13946             }
13947
13948           ix86_print_operand (file, x, 0);
13949           return;
13950
13951
13952         case 'L':
13953           if (ASSEMBLER_DIALECT == ASM_ATT)
13954             putc ('l', file);
13955           return;
13956
13957         case 'W':
13958           if (ASSEMBLER_DIALECT == ASM_ATT)
13959             putc ('w', file);
13960           return;
13961
13962         case 'B':
13963           if (ASSEMBLER_DIALECT == ASM_ATT)
13964             putc ('b', file);
13965           return;
13966
13967         case 'Q':
13968           if (ASSEMBLER_DIALECT == ASM_ATT)
13969             putc ('l', file);
13970           return;
13971
13972         case 'S':
13973           if (ASSEMBLER_DIALECT == ASM_ATT)
13974             putc ('s', file);
13975           return;
13976
13977         case 'T':
13978           if (ASSEMBLER_DIALECT == ASM_ATT)
13979             putc ('t', file);
13980           return;
13981
13982         case 'z':
13983           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
13984             {
13985               /* Opcodes don't get size suffixes if using Intel opcodes.  */
13986               if (ASSEMBLER_DIALECT == ASM_INTEL)
13987                 return;
13988
13989               switch (GET_MODE_SIZE (GET_MODE (x)))
13990                 {
13991                 case 1:
13992                   putc ('b', file);
13993                   return;
13994
13995                 case 2:
13996                   putc ('w', file);
13997                   return;
13998
13999                 case 4:
14000                   putc ('l', file);
14001                   return;
14002
14003                 case 8:
14004                   putc ('q', file);
14005                   return;
14006
14007                 default:
14008                   output_operand_lossage
14009                     ("invalid operand size for operand code '%c'", code);
14010                   return;
14011                 }
14012             }
14013
14014           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
14015             warning
14016               (0, "non-integer operand used with operand code '%c'", code);
14017           /* FALLTHRU */
14018
14019         case 'Z':
14020           /* 387 opcodes don't get size suffixes if using Intel opcodes.  */
14021           if (ASSEMBLER_DIALECT == ASM_INTEL)
14022             return;
14023
14024           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
14025             {
14026               switch (GET_MODE_SIZE (GET_MODE (x)))
14027                 {
14028                 case 2:
14029 #ifdef HAVE_AS_IX86_FILDS
14030                   putc ('s', file);
14031 #endif
14032                   return;
14033
14034                 case 4:
14035                   putc ('l', file);
14036                   return;
14037
14038                 case 8:
14039 #ifdef HAVE_AS_IX86_FILDQ
14040                   putc ('q', file);
14041 #else
14042                   fputs ("ll", file);
14043 #endif
14044                   return;
14045
14046                 default:
14047                   break;
14048                 }
14049             }
14050           else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
14051             {
14052               /* 387 opcodes don't get size suffixes
14053                  if the operands are registers.  */
14054               if (STACK_REG_P (x))
14055                 return;
14056
14057               switch (GET_MODE_SIZE (GET_MODE (x)))
14058                 {
14059                 case 4:
14060                   putc ('s', file);
14061                   return;
14062
14063                 case 8:
14064                   putc ('l', file);
14065                   return;
14066
14067                 case 12:
14068                 case 16:
14069                   putc ('t', file);
14070                   return;
14071
14072                 default:
14073                   break;
14074                 }
14075             }
14076           else
14077             {
14078               output_operand_lossage
14079                 ("invalid operand type used with operand code '%c'", code);
14080               return;
14081             }
14082
14083           output_operand_lossage
14084             ("invalid operand size for operand code '%c'", code);
14085           return;
14086
14087         case 'd':
14088         case 'b':
14089         case 'w':
14090         case 'k':
14091         case 'q':
14092         case 'h':
14093         case 't':
14094         case 'y':
14095         case 'x':
14096         case 'X':
14097         case 'P':
14098           break;
14099
14100         case 's':
14101           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
14102             {
14103               ix86_print_operand (file, x, 0);
14104               fputs (", ", file);
14105             }
14106           return;
14107
14108         case 'D':
14109           /* Little bit of braindamage here.  The SSE compare instructions
14110              does use completely different names for the comparisons that the
14111              fp conditional moves.  */
14112           if (TARGET_AVX)
14113             {
14114               switch (GET_CODE (x))
14115                 {
14116                 case EQ:
14117                   fputs ("eq", file);
14118                   break;
14119                 case UNEQ:
14120                   fputs ("eq_us", file);
14121                   break;
14122                 case LT:
14123                   fputs ("lt", file);
14124                   break;
14125                 case UNLT:
14126                   fputs ("nge", file);
14127                   break;
14128                 case LE:
14129                   fputs ("le", file);
14130                   break;
14131                 case UNLE:
14132                   fputs ("ngt", file);
14133                   break;
14134                 case UNORDERED:
14135                   fputs ("unord", file);
14136                   break;
14137                 case NE:
14138                   fputs ("neq", file);
14139                   break;
14140                 case LTGT:
14141                   fputs ("neq_oq", file);
14142                   break;
14143                 case GE:
14144                   fputs ("ge", file);
14145                   break;
14146                 case UNGE:
14147                   fputs ("nlt", file);
14148                   break;
14149                 case GT:
14150                   fputs ("gt", file);
14151                   break;
14152                 case UNGT:
14153                   fputs ("nle", file);
14154                   break;
14155                 case ORDERED:
14156                   fputs ("ord", file);
14157                   break;
14158                 default:
14159                   output_operand_lossage ("operand is not a condition code, "
14160                                           "invalid operand code 'D'");
14161                   return;
14162                 }
14163             }
14164           else
14165             {
14166               switch (GET_CODE (x))
14167                 {
14168                 case EQ:
14169                 case UNEQ:
14170                   fputs ("eq", file);
14171                   break;
14172                 case LT:
14173                 case UNLT:
14174                   fputs ("lt", file);
14175                   break;
14176                 case LE:
14177                 case UNLE:
14178                   fputs ("le", file);
14179                   break;
14180                 case UNORDERED:
14181                   fputs ("unord", file);
14182                   break;
14183                 case NE:
14184                 case LTGT:
14185                   fputs ("neq", file);
14186                   break;
14187                 case UNGE:
14188                 case GE:
14189                   fputs ("nlt", file);
14190                   break;
14191                 case UNGT:
14192                 case GT:
14193                   fputs ("nle", file);
14194                   break;
14195                 case ORDERED:
14196                   fputs ("ord", file);
14197                   break;
14198                 default:
14199                   output_operand_lossage ("operand is not a condition code, "
14200                                           "invalid operand code 'D'");
14201                   return;
14202                 }
14203             }
14204           return;
14205         case 'O':
14206 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14207           if (ASSEMBLER_DIALECT == ASM_ATT)
14208             {
14209               switch (GET_MODE (x))
14210                 {
14211                 case HImode: putc ('w', file); break;
14212                 case SImode:
14213                 case SFmode: putc ('l', file); break;
14214                 case DImode:
14215                 case DFmode: putc ('q', file); break;
14216                 default: gcc_unreachable ();
14217                 }
14218               putc ('.', file);
14219             }
14220 #endif
14221           return;
14222         case 'C':
14223           if (!COMPARISON_P (x))
14224             {
14225               output_operand_lossage ("operand is neither a constant nor a "
14226                                       "condition code, invalid operand code "
14227                                       "'C'");
14228               return;
14229             }
14230           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
14231           return;
14232         case 'F':
14233           if (!COMPARISON_P (x))
14234             {
14235               output_operand_lossage ("operand is neither a constant nor a "
14236                                       "condition code, invalid operand code "
14237                                       "'F'");
14238               return;
14239             }
14240 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14241           if (ASSEMBLER_DIALECT == ASM_ATT)
14242             putc ('.', file);
14243 #endif
14244           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
14245           return;
14246
14247           /* Like above, but reverse condition */
14248         case 'c':
14249           /* Check to see if argument to %c is really a constant
14250              and not a condition code which needs to be reversed.  */
14251           if (!COMPARISON_P (x))
14252             {
14253               output_operand_lossage ("operand is neither a constant nor a "
14254                                       "condition code, invalid operand "
14255                                       "code 'c'");
14256               return;
14257             }
14258           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
14259           return;
14260         case 'f':
14261           if (!COMPARISON_P (x))
14262             {
14263               output_operand_lossage ("operand is neither a constant nor a "
14264                                       "condition code, invalid operand "
14265                                       "code 'f'");
14266               return;
14267             }
14268 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
14269           if (ASSEMBLER_DIALECT == ASM_ATT)
14270             putc ('.', file);
14271 #endif
14272           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
14273           return;
14274
14275         case 'H':
14276           /* It doesn't actually matter what mode we use here, as we're
14277              only going to use this for printing.  */
14278           x = adjust_address_nv (x, DImode, 8);
14279           break;
14280
14281         case '+':
14282           {
14283             rtx x;
14284
14285             if (!optimize
14286                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
14287               return;
14288
14289             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
14290             if (x)
14291               {
14292                 int pred_val = INTVAL (XEXP (x, 0));
14293
14294                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
14295                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
14296                   {
14297                     int taken = pred_val > REG_BR_PROB_BASE / 2;
14298                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
14299
14300                     /* Emit hints only in the case default branch prediction
14301                        heuristics would fail.  */
14302                     if (taken != cputaken)
14303                       {
14304                         /* We use 3e (DS) prefix for taken branches and
14305                            2e (CS) prefix for not taken branches.  */
14306                         if (taken)
14307                           fputs ("ds ; ", file);
14308                         else
14309                           fputs ("cs ; ", file);
14310                       }
14311                   }
14312               }
14313             return;
14314           }
14315
14316         case 'Y':
14317           switch (GET_CODE (x))
14318             {
14319             case NE:
14320               fputs ("neq", file);
14321               break;
14322             case EQ:
14323               fputs ("eq", file);
14324               break;
14325             case GE:
14326             case GEU:
14327               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
14328               break;
14329             case GT:
14330             case GTU:
14331               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
14332               break;
14333             case LE:
14334             case LEU:
14335               fputs ("le", file);
14336               break;
14337             case LT:
14338             case LTU:
14339               fputs ("lt", file);
14340               break;
14341             case UNORDERED:
14342               fputs ("unord", file);
14343               break;
14344             case ORDERED:
14345               fputs ("ord", file);
14346               break;
14347             case UNEQ:
14348               fputs ("ueq", file);
14349               break;
14350             case UNGE:
14351               fputs ("nlt", file);
14352               break;
14353             case UNGT:
14354               fputs ("nle", file);
14355               break;
14356             case UNLE:
14357               fputs ("ule", file);
14358               break;
14359             case UNLT:
14360               fputs ("ult", file);
14361               break;
14362             case LTGT:
14363               fputs ("une", file);
14364               break;
14365             default:
14366               output_operand_lossage ("operand is not a condition code, "
14367                                       "invalid operand code 'Y'");
14368               return;
14369             }
14370           return;
14371
14372         case ';':
14373 #ifndef HAVE_AS_IX86_REP_LOCK_PREFIX
14374           putc (';', file);
14375 #endif
14376           return;
14377
14378         case '@':
14379           if (ASSEMBLER_DIALECT == ASM_ATT)
14380             putc ('%', file);
14381
14382           /* The kernel uses a different segment register for performance
14383              reasons; a system call would not have to trash the userspace
14384              segment register, which would be expensive.  */
14385           if (TARGET_64BIT && ix86_cmodel != CM_KERNEL)
14386             fputs ("fs", file);
14387           else
14388             fputs ("gs", file);
14389           return;
14390
14391         default:
14392             output_operand_lossage ("invalid operand code '%c'", code);
14393         }
14394     }
14395
14396   if (REG_P (x))
14397     print_reg (x, code, file);
14398
14399   else if (MEM_P (x))
14400     {
14401       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
14402       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
14403           && GET_MODE (x) != BLKmode)
14404         {
14405           const char * size;
14406           switch (GET_MODE_SIZE (GET_MODE (x)))
14407             {
14408             case 1: size = "BYTE"; break;
14409             case 2: size = "WORD"; break;
14410             case 4: size = "DWORD"; break;
14411             case 8: size = "QWORD"; break;
14412             case 12: size = "TBYTE"; break;
14413             case 16:
14414               if (GET_MODE (x) == XFmode)
14415                 size = "TBYTE";
14416               else
14417                 size = "XMMWORD";
14418               break;
14419             case 32: size = "YMMWORD"; break;
14420             default:
14421               gcc_unreachable ();
14422             }
14423
14424           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
14425           if (code == 'b')
14426             size = "BYTE";
14427           else if (code == 'w')
14428             size = "WORD";
14429           else if (code == 'k')
14430             size = "DWORD";
14431
14432           fputs (size, file);
14433           fputs (" PTR ", file);
14434         }
14435
14436       x = XEXP (x, 0);
14437       /* Avoid (%rip) for call operands.  */
14438       if (CONSTANT_ADDRESS_P (x) && code == 'P'
14439           && !CONST_INT_P (x))
14440         output_addr_const (file, x);
14441       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
14442         output_operand_lossage ("invalid constraints for operand");
14443       else
14444         output_address (x);
14445     }
14446
14447   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
14448     {
14449       REAL_VALUE_TYPE r;
14450       long l;
14451
14452       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
14453       REAL_VALUE_TO_TARGET_SINGLE (r, l);
14454
14455       if (ASSEMBLER_DIALECT == ASM_ATT)
14456         putc ('$', file);
14457       /* Sign extend 32bit SFmode immediate to 8 bytes.  */
14458       if (code == 'q')
14459         fprintf (file, "0x%08llx", (unsigned long long) (int) l);
14460       else
14461         fprintf (file, "0x%08x", (unsigned int) l);
14462     }
14463
14464   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
14465     {
14466       REAL_VALUE_TYPE r;
14467       long l[2];
14468
14469       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
14470       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
14471
14472       if (ASSEMBLER_DIALECT == ASM_ATT)
14473         putc ('$', file);
14474       fprintf (file, "0x%lx%08lx", l[1] & 0xffffffff, l[0] & 0xffffffff);
14475     }
14476
14477   /* These float cases don't actually occur as immediate operands.  */
14478   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == XFmode)
14479     {
14480       char dstr[30];
14481
14482       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
14483       fputs (dstr, file);
14484     }
14485
14486   else
14487     {
14488       /* We have patterns that allow zero sets of memory, for instance.
14489          In 64-bit mode, we should probably support all 8-byte vectors,
14490          since we can in fact encode that into an immediate.  */
14491       if (GET_CODE (x) == CONST_VECTOR)
14492         {
14493           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
14494           x = const0_rtx;
14495         }
14496
14497       if (code != 'P')
14498         {
14499           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
14500             {
14501               if (ASSEMBLER_DIALECT == ASM_ATT)
14502                 putc ('$', file);
14503             }
14504           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
14505                    || GET_CODE (x) == LABEL_REF)
14506             {
14507               if (ASSEMBLER_DIALECT == ASM_ATT)
14508                 putc ('$', file);
14509               else
14510                 fputs ("OFFSET FLAT:", file);
14511             }
14512         }
14513       if (CONST_INT_P (x))
14514         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
14515       else if (flag_pic || MACHOPIC_INDIRECT)
14516         output_pic_addr_const (file, x, code);
14517       else
14518         output_addr_const (file, x);
14519     }
14520 }
14521
14522 static bool
14523 ix86_print_operand_punct_valid_p (unsigned char code)
14524 {
14525   return (code == '@' || code == '*' || code == '+'
14526           || code == '&' || code == ';');
14527 }
14528 \f
14529 /* Print a memory operand whose address is ADDR.  */
14530
14531 static void
14532 ix86_print_operand_address (FILE *file, rtx addr)
14533 {
14534   struct ix86_address parts;
14535   rtx base, index, disp;
14536   int scale;
14537   int ok = ix86_decompose_address (addr, &parts);
14538
14539   gcc_assert (ok);
14540
14541   base = parts.base;
14542   index = parts.index;
14543   disp = parts.disp;
14544   scale = parts.scale;
14545
14546   switch (parts.seg)
14547     {
14548     case SEG_DEFAULT:
14549       break;
14550     case SEG_FS:
14551     case SEG_GS:
14552       if (ASSEMBLER_DIALECT == ASM_ATT)
14553         putc ('%', file);
14554       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
14555       break;
14556     default:
14557       gcc_unreachable ();
14558     }
14559
14560   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
14561   if (TARGET_64BIT && !base && !index)
14562     {
14563       rtx symbol = disp;
14564
14565       if (GET_CODE (disp) == CONST
14566           && GET_CODE (XEXP (disp, 0)) == PLUS
14567           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
14568         symbol = XEXP (XEXP (disp, 0), 0);
14569
14570       if (GET_CODE (symbol) == LABEL_REF
14571           || (GET_CODE (symbol) == SYMBOL_REF
14572               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
14573         base = pc_rtx;
14574     }
14575   if (!base && !index)
14576     {
14577       /* Displacement only requires special attention.  */
14578
14579       if (CONST_INT_P (disp))
14580         {
14581           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
14582             fputs ("ds:", file);
14583           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
14584         }
14585       else if (flag_pic)
14586         output_pic_addr_const (file, disp, 0);
14587       else
14588         output_addr_const (file, disp);
14589     }
14590   else
14591     {
14592       if (ASSEMBLER_DIALECT == ASM_ATT)
14593         {
14594           if (disp)
14595             {
14596               if (flag_pic)
14597                 output_pic_addr_const (file, disp, 0);
14598               else if (GET_CODE (disp) == LABEL_REF)
14599                 output_asm_label (disp);
14600               else
14601                 output_addr_const (file, disp);
14602             }
14603
14604           putc ('(', file);
14605           if (base)
14606             print_reg (base, 0, file);
14607           if (index)
14608             {
14609               putc (',', file);
14610               print_reg (index, 0, file);
14611               if (scale != 1)
14612                 fprintf (file, ",%d", scale);
14613             }
14614           putc (')', file);
14615         }
14616       else
14617         {
14618           rtx offset = NULL_RTX;
14619
14620           if (disp)
14621             {
14622               /* Pull out the offset of a symbol; print any symbol itself.  */
14623               if (GET_CODE (disp) == CONST
14624                   && GET_CODE (XEXP (disp, 0)) == PLUS
14625                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
14626                 {
14627                   offset = XEXP (XEXP (disp, 0), 1);
14628                   disp = gen_rtx_CONST (VOIDmode,
14629                                         XEXP (XEXP (disp, 0), 0));
14630                 }
14631
14632               if (flag_pic)
14633                 output_pic_addr_const (file, disp, 0);
14634               else if (GET_CODE (disp) == LABEL_REF)
14635                 output_asm_label (disp);
14636               else if (CONST_INT_P (disp))
14637                 offset = disp;
14638               else
14639                 output_addr_const (file, disp);
14640             }
14641
14642           putc ('[', file);
14643           if (base)
14644             {
14645               print_reg (base, 0, file);
14646               if (offset)
14647                 {
14648                   if (INTVAL (offset) >= 0)
14649                     putc ('+', file);
14650                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
14651                 }
14652             }
14653           else if (offset)
14654             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
14655           else
14656             putc ('0', file);
14657
14658           if (index)
14659             {
14660               putc ('+', file);
14661               print_reg (index, 0, file);
14662               if (scale != 1)
14663                 fprintf (file, "*%d", scale);
14664             }
14665           putc (']', file);
14666         }
14667     }
14668 }
14669
14670 /* Implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
14671
14672 static bool
14673 i386_asm_output_addr_const_extra (FILE *file, rtx x)
14674 {
14675   rtx op;
14676
14677   if (GET_CODE (x) != UNSPEC)
14678     return false;
14679
14680   op = XVECEXP (x, 0, 0);
14681   switch (XINT (x, 1))
14682     {
14683     case UNSPEC_GOTTPOFF:
14684       output_addr_const (file, op);
14685       /* FIXME: This might be @TPOFF in Sun ld.  */
14686       fputs ("@gottpoff", file);
14687       break;
14688     case UNSPEC_TPOFF:
14689       output_addr_const (file, op);
14690       fputs ("@tpoff", file);
14691       break;
14692     case UNSPEC_NTPOFF:
14693       output_addr_const (file, op);
14694       if (TARGET_64BIT)
14695         fputs ("@tpoff", file);
14696       else
14697         fputs ("@ntpoff", file);
14698       break;
14699     case UNSPEC_DTPOFF:
14700       output_addr_const (file, op);
14701       fputs ("@dtpoff", file);
14702       break;
14703     case UNSPEC_GOTNTPOFF:
14704       output_addr_const (file, op);
14705       if (TARGET_64BIT)
14706         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
14707                "@gottpoff(%rip)" : "@gottpoff[rip]", file);
14708       else
14709         fputs ("@gotntpoff", file);
14710       break;
14711     case UNSPEC_INDNTPOFF:
14712       output_addr_const (file, op);
14713       fputs ("@indntpoff", file);
14714       break;
14715 #if TARGET_MACHO
14716     case UNSPEC_MACHOPIC_OFFSET:
14717       output_addr_const (file, op);
14718       putc ('-', file);
14719       machopic_output_function_base_name (file);
14720       break;
14721 #endif
14722
14723     case UNSPEC_STACK_CHECK:
14724       {
14725         int offset;
14726
14727         gcc_assert (flag_split_stack);
14728
14729 #ifdef TARGET_THREAD_SPLIT_STACK_OFFSET
14730         offset = TARGET_THREAD_SPLIT_STACK_OFFSET;
14731 #else
14732         gcc_unreachable ();
14733 #endif
14734
14735         fprintf (file, "%s:%d", TARGET_64BIT ? "%fs" : "%gs", offset);
14736       }
14737       break;
14738
14739     default:
14740       return false;
14741     }
14742
14743   return true;
14744 }
14745 \f
14746 /* Split one or more double-mode RTL references into pairs of half-mode
14747    references.  The RTL can be REG, offsettable MEM, integer constant, or
14748    CONST_DOUBLE.  "operands" is a pointer to an array of double-mode RTLs to
14749    split and "num" is its length.  lo_half and hi_half are output arrays
14750    that parallel "operands".  */
14751
14752 void
14753 split_double_mode (enum machine_mode mode, rtx operands[],
14754                    int num, rtx lo_half[], rtx hi_half[])
14755 {
14756   enum machine_mode half_mode;
14757   unsigned int byte;
14758
14759   switch (mode)
14760     {
14761     case TImode:
14762       half_mode = DImode;
14763       break;
14764     case DImode:
14765       half_mode = SImode;
14766       break;
14767     default:
14768       gcc_unreachable ();
14769     }
14770
14771   byte = GET_MODE_SIZE (half_mode);
14772
14773   while (num--)
14774     {
14775       rtx op = operands[num];
14776
14777       /* simplify_subreg refuse to split volatile memory addresses,
14778          but we still have to handle it.  */
14779       if (MEM_P (op))
14780         {
14781           lo_half[num] = adjust_address (op, half_mode, 0);
14782           hi_half[num] = adjust_address (op, half_mode, byte);
14783         }
14784       else
14785         {
14786           lo_half[num] = simplify_gen_subreg (half_mode, op,
14787                                               GET_MODE (op) == VOIDmode
14788                                               ? mode : GET_MODE (op), 0);
14789           hi_half[num] = simplify_gen_subreg (half_mode, op,
14790                                               GET_MODE (op) == VOIDmode
14791                                               ? mode : GET_MODE (op), byte);
14792         }
14793     }
14794 }
14795 \f
14796 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
14797    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
14798    is the expression of the binary operation.  The output may either be
14799    emitted here, or returned to the caller, like all output_* functions.
14800
14801    There is no guarantee that the operands are the same mode, as they
14802    might be within FLOAT or FLOAT_EXTEND expressions.  */
14803
14804 #ifndef SYSV386_COMPAT
14805 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
14806    wants to fix the assemblers because that causes incompatibility
14807    with gcc.  No-one wants to fix gcc because that causes
14808    incompatibility with assemblers...  You can use the option of
14809    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
14810 #define SYSV386_COMPAT 1
14811 #endif
14812
14813 const char *
14814 output_387_binary_op (rtx insn, rtx *operands)
14815 {
14816   static char buf[40];
14817   const char *p;
14818   const char *ssep;
14819   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
14820
14821 #ifdef ENABLE_CHECKING
14822   /* Even if we do not want to check the inputs, this documents input
14823      constraints.  Which helps in understanding the following code.  */
14824   if (STACK_REG_P (operands[0])
14825       && ((REG_P (operands[1])
14826            && REGNO (operands[0]) == REGNO (operands[1])
14827            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
14828           || (REG_P (operands[2])
14829               && REGNO (operands[0]) == REGNO (operands[2])
14830               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
14831       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
14832     ; /* ok */
14833   else
14834     gcc_assert (is_sse);
14835 #endif
14836
14837   switch (GET_CODE (operands[3]))
14838     {
14839     case PLUS:
14840       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14841           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14842         p = "fiadd";
14843       else
14844         p = "fadd";
14845       ssep = "vadd";
14846       break;
14847
14848     case MINUS:
14849       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14850           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14851         p = "fisub";
14852       else
14853         p = "fsub";
14854       ssep = "vsub";
14855       break;
14856
14857     case MULT:
14858       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14859           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14860         p = "fimul";
14861       else
14862         p = "fmul";
14863       ssep = "vmul";
14864       break;
14865
14866     case DIV:
14867       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
14868           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
14869         p = "fidiv";
14870       else
14871         p = "fdiv";
14872       ssep = "vdiv";
14873       break;
14874
14875     default:
14876       gcc_unreachable ();
14877     }
14878
14879   if (is_sse)
14880    {
14881      if (TARGET_AVX)
14882        {
14883          strcpy (buf, ssep);
14884          if (GET_MODE (operands[0]) == SFmode)
14885            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
14886          else
14887            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
14888        }
14889      else
14890        {
14891          strcpy (buf, ssep + 1);
14892          if (GET_MODE (operands[0]) == SFmode)
14893            strcat (buf, "ss\t{%2, %0|%0, %2}");
14894          else
14895            strcat (buf, "sd\t{%2, %0|%0, %2}");
14896        }
14897       return buf;
14898    }
14899   strcpy (buf, p);
14900
14901   switch (GET_CODE (operands[3]))
14902     {
14903     case MULT:
14904     case PLUS:
14905       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
14906         {
14907           rtx temp = operands[2];
14908           operands[2] = operands[1];
14909           operands[1] = temp;
14910         }
14911
14912       /* know operands[0] == operands[1].  */
14913
14914       if (MEM_P (operands[2]))
14915         {
14916           p = "%Z2\t%2";
14917           break;
14918         }
14919
14920       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
14921         {
14922           if (STACK_TOP_P (operands[0]))
14923             /* How is it that we are storing to a dead operand[2]?
14924                Well, presumably operands[1] is dead too.  We can't
14925                store the result to st(0) as st(0) gets popped on this
14926                instruction.  Instead store to operands[2] (which I
14927                think has to be st(1)).  st(1) will be popped later.
14928                gcc <= 2.8.1 didn't have this check and generated
14929                assembly code that the Unixware assembler rejected.  */
14930             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
14931           else
14932             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
14933           break;
14934         }
14935
14936       if (STACK_TOP_P (operands[0]))
14937         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
14938       else
14939         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
14940       break;
14941
14942     case MINUS:
14943     case DIV:
14944       if (MEM_P (operands[1]))
14945         {
14946           p = "r%Z1\t%1";
14947           break;
14948         }
14949
14950       if (MEM_P (operands[2]))
14951         {
14952           p = "%Z2\t%2";
14953           break;
14954         }
14955
14956       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
14957         {
14958 #if SYSV386_COMPAT
14959           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
14960              derived assemblers, confusingly reverse the direction of
14961              the operation for fsub{r} and fdiv{r} when the
14962              destination register is not st(0).  The Intel assembler
14963              doesn't have this brain damage.  Read !SYSV386_COMPAT to
14964              figure out what the hardware really does.  */
14965           if (STACK_TOP_P (operands[0]))
14966             p = "{p\t%0, %2|rp\t%2, %0}";
14967           else
14968             p = "{rp\t%2, %0|p\t%0, %2}";
14969 #else
14970           if (STACK_TOP_P (operands[0]))
14971             /* As above for fmul/fadd, we can't store to st(0).  */
14972             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
14973           else
14974             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
14975 #endif
14976           break;
14977         }
14978
14979       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
14980         {
14981 #if SYSV386_COMPAT
14982           if (STACK_TOP_P (operands[0]))
14983             p = "{rp\t%0, %1|p\t%1, %0}";
14984           else
14985             p = "{p\t%1, %0|rp\t%0, %1}";
14986 #else
14987           if (STACK_TOP_P (operands[0]))
14988             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
14989           else
14990             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
14991 #endif
14992           break;
14993         }
14994
14995       if (STACK_TOP_P (operands[0]))
14996         {
14997           if (STACK_TOP_P (operands[1]))
14998             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
14999           else
15000             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
15001           break;
15002         }
15003       else if (STACK_TOP_P (operands[1]))
15004         {
15005 #if SYSV386_COMPAT
15006           p = "{\t%1, %0|r\t%0, %1}";
15007 #else
15008           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
15009 #endif
15010         }
15011       else
15012         {
15013 #if SYSV386_COMPAT
15014           p = "{r\t%2, %0|\t%0, %2}";
15015 #else
15016           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
15017 #endif
15018         }
15019       break;
15020
15021     default:
15022       gcc_unreachable ();
15023     }
15024
15025   strcat (buf, p);
15026   return buf;
15027 }
15028
15029 /* Return needed mode for entity in optimize_mode_switching pass.  */
15030
15031 int
15032 ix86_mode_needed (int entity, rtx insn)
15033 {
15034   enum attr_i387_cw mode;
15035
15036   /* The mode UNINITIALIZED is used to store control word after a
15037      function call or ASM pattern.  The mode ANY specify that function
15038      has no requirements on the control word and make no changes in the
15039      bits we are interested in.  */
15040
15041   if (CALL_P (insn)
15042       || (NONJUMP_INSN_P (insn)
15043           && (asm_noperands (PATTERN (insn)) >= 0
15044               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
15045     return I387_CW_UNINITIALIZED;
15046
15047   if (recog_memoized (insn) < 0)
15048     return I387_CW_ANY;
15049
15050   mode = get_attr_i387_cw (insn);
15051
15052   switch (entity)
15053     {
15054     case I387_TRUNC:
15055       if (mode == I387_CW_TRUNC)
15056         return mode;
15057       break;
15058
15059     case I387_FLOOR:
15060       if (mode == I387_CW_FLOOR)
15061         return mode;
15062       break;
15063
15064     case I387_CEIL:
15065       if (mode == I387_CW_CEIL)
15066         return mode;
15067       break;
15068
15069     case I387_MASK_PM:
15070       if (mode == I387_CW_MASK_PM)
15071         return mode;
15072       break;
15073
15074     default:
15075       gcc_unreachable ();
15076     }
15077
15078   return I387_CW_ANY;
15079 }
15080
15081 /* Output code to initialize control word copies used by trunc?f?i and
15082    rounding patterns.  CURRENT_MODE is set to current control word,
15083    while NEW_MODE is set to new control word.  */
15084
15085 void
15086 emit_i387_cw_initialization (int mode)
15087 {
15088   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
15089   rtx new_mode;
15090
15091   enum ix86_stack_slot slot;
15092
15093   rtx reg = gen_reg_rtx (HImode);
15094
15095   emit_insn (gen_x86_fnstcw_1 (stored_mode));
15096   emit_move_insn (reg, copy_rtx (stored_mode));
15097
15098   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
15099       || optimize_function_for_size_p (cfun))
15100     {
15101       switch (mode)
15102         {
15103         case I387_CW_TRUNC:
15104           /* round toward zero (truncate) */
15105           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
15106           slot = SLOT_CW_TRUNC;
15107           break;
15108
15109         case I387_CW_FLOOR:
15110           /* round down toward -oo */
15111           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
15112           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
15113           slot = SLOT_CW_FLOOR;
15114           break;
15115
15116         case I387_CW_CEIL:
15117           /* round up toward +oo */
15118           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
15119           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
15120           slot = SLOT_CW_CEIL;
15121           break;
15122
15123         case I387_CW_MASK_PM:
15124           /* mask precision exception for nearbyint() */
15125           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
15126           slot = SLOT_CW_MASK_PM;
15127           break;
15128
15129         default:
15130           gcc_unreachable ();
15131         }
15132     }
15133   else
15134     {
15135       switch (mode)
15136         {
15137         case I387_CW_TRUNC:
15138           /* round toward zero (truncate) */
15139           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
15140           slot = SLOT_CW_TRUNC;
15141           break;
15142
15143         case I387_CW_FLOOR:
15144           /* round down toward -oo */
15145           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
15146           slot = SLOT_CW_FLOOR;
15147           break;
15148
15149         case I387_CW_CEIL:
15150           /* round up toward +oo */
15151           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
15152           slot = SLOT_CW_CEIL;
15153           break;
15154
15155         case I387_CW_MASK_PM:
15156           /* mask precision exception for nearbyint() */
15157           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
15158           slot = SLOT_CW_MASK_PM;
15159           break;
15160
15161         default:
15162           gcc_unreachable ();
15163         }
15164     }
15165
15166   gcc_assert (slot < MAX_386_STACK_LOCALS);
15167
15168   new_mode = assign_386_stack_local (HImode, slot);
15169   emit_move_insn (new_mode, reg);
15170 }
15171
15172 /* Output code for INSN to convert a float to a signed int.  OPERANDS
15173    are the insn operands.  The output may be [HSD]Imode and the input
15174    operand may be [SDX]Fmode.  */
15175
15176 const char *
15177 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
15178 {
15179   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
15180   int dimode_p = GET_MODE (operands[0]) == DImode;
15181   int round_mode = get_attr_i387_cw (insn);
15182
15183   /* Jump through a hoop or two for DImode, since the hardware has no
15184      non-popping instruction.  We used to do this a different way, but
15185      that was somewhat fragile and broke with post-reload splitters.  */
15186   if ((dimode_p || fisttp) && !stack_top_dies)
15187     output_asm_insn ("fld\t%y1", operands);
15188
15189   gcc_assert (STACK_TOP_P (operands[1]));
15190   gcc_assert (MEM_P (operands[0]));
15191   gcc_assert (GET_MODE (operands[1]) != TFmode);
15192
15193   if (fisttp)
15194       output_asm_insn ("fisttp%Z0\t%0", operands);
15195   else
15196     {
15197       if (round_mode != I387_CW_ANY)
15198         output_asm_insn ("fldcw\t%3", operands);
15199       if (stack_top_dies || dimode_p)
15200         output_asm_insn ("fistp%Z0\t%0", operands);
15201       else
15202         output_asm_insn ("fist%Z0\t%0", operands);
15203       if (round_mode != I387_CW_ANY)
15204         output_asm_insn ("fldcw\t%2", operands);
15205     }
15206
15207   return "";
15208 }
15209
15210 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
15211    have the values zero or one, indicates the ffreep insn's operand
15212    from the OPERANDS array.  */
15213
15214 static const char *
15215 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
15216 {
15217   if (TARGET_USE_FFREEP)
15218 #ifdef HAVE_AS_IX86_FFREEP
15219     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
15220 #else
15221     {
15222       static char retval[32];
15223       int regno = REGNO (operands[opno]);
15224
15225       gcc_assert (FP_REGNO_P (regno));
15226
15227       regno -= FIRST_STACK_REG;
15228
15229       snprintf (retval, sizeof (retval), ASM_SHORT "0xc%ddf", regno);
15230       return retval;
15231     }
15232 #endif
15233
15234   return opno ? "fstp\t%y1" : "fstp\t%y0";
15235 }
15236
15237
15238 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
15239    should be used.  UNORDERED_P is true when fucom should be used.  */
15240
15241 const char *
15242 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
15243 {
15244   int stack_top_dies;
15245   rtx cmp_op0, cmp_op1;
15246   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
15247
15248   if (eflags_p)
15249     {
15250       cmp_op0 = operands[0];
15251       cmp_op1 = operands[1];
15252     }
15253   else
15254     {
15255       cmp_op0 = operands[1];
15256       cmp_op1 = operands[2];
15257     }
15258
15259   if (is_sse)
15260     {
15261       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
15262       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
15263       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
15264       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
15265
15266       if (GET_MODE (operands[0]) == SFmode)
15267         if (unordered_p)
15268           return &ucomiss[TARGET_AVX ? 0 : 1];
15269         else
15270           return &comiss[TARGET_AVX ? 0 : 1];
15271       else
15272         if (unordered_p)
15273           return &ucomisd[TARGET_AVX ? 0 : 1];
15274         else
15275           return &comisd[TARGET_AVX ? 0 : 1];
15276     }
15277
15278   gcc_assert (STACK_TOP_P (cmp_op0));
15279
15280   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
15281
15282   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
15283     {
15284       if (stack_top_dies)
15285         {
15286           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
15287           return output_387_ffreep (operands, 1);
15288         }
15289       else
15290         return "ftst\n\tfnstsw\t%0";
15291     }
15292
15293   if (STACK_REG_P (cmp_op1)
15294       && stack_top_dies
15295       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
15296       && REGNO (cmp_op1) != FIRST_STACK_REG)
15297     {
15298       /* If both the top of the 387 stack dies, and the other operand
15299          is also a stack register that dies, then this must be a
15300          `fcompp' float compare */
15301
15302       if (eflags_p)
15303         {
15304           /* There is no double popping fcomi variant.  Fortunately,
15305              eflags is immune from the fstp's cc clobbering.  */
15306           if (unordered_p)
15307             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
15308           else
15309             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
15310           return output_387_ffreep (operands, 0);
15311         }
15312       else
15313         {
15314           if (unordered_p)
15315             return "fucompp\n\tfnstsw\t%0";
15316           else
15317             return "fcompp\n\tfnstsw\t%0";
15318         }
15319     }
15320   else
15321     {
15322       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
15323
15324       static const char * const alt[16] =
15325       {
15326         "fcom%Z2\t%y2\n\tfnstsw\t%0",
15327         "fcomp%Z2\t%y2\n\tfnstsw\t%0",
15328         "fucom%Z2\t%y2\n\tfnstsw\t%0",
15329         "fucomp%Z2\t%y2\n\tfnstsw\t%0",
15330
15331         "ficom%Z2\t%y2\n\tfnstsw\t%0",
15332         "ficomp%Z2\t%y2\n\tfnstsw\t%0",
15333         NULL,
15334         NULL,
15335
15336         "fcomi\t{%y1, %0|%0, %y1}",
15337         "fcomip\t{%y1, %0|%0, %y1}",
15338         "fucomi\t{%y1, %0|%0, %y1}",
15339         "fucomip\t{%y1, %0|%0, %y1}",
15340
15341         NULL,
15342         NULL,
15343         NULL,
15344         NULL
15345       };
15346
15347       int mask;
15348       const char *ret;
15349
15350       mask  = eflags_p << 3;
15351       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
15352       mask |= unordered_p << 1;
15353       mask |= stack_top_dies;
15354
15355       gcc_assert (mask < 16);
15356       ret = alt[mask];
15357       gcc_assert (ret);
15358
15359       return ret;
15360     }
15361 }
15362
15363 void
15364 ix86_output_addr_vec_elt (FILE *file, int value)
15365 {
15366   const char *directive = ASM_LONG;
15367
15368 #ifdef ASM_QUAD
15369   if (TARGET_64BIT)
15370     directive = ASM_QUAD;
15371 #else
15372   gcc_assert (!TARGET_64BIT);
15373 #endif
15374
15375   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
15376 }
15377
15378 void
15379 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
15380 {
15381   const char *directive = ASM_LONG;
15382
15383 #ifdef ASM_QUAD
15384   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
15385     directive = ASM_QUAD;
15386 #else
15387   gcc_assert (!TARGET_64BIT);
15388 #endif
15389   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
15390   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
15391     fprintf (file, "%s%s%d-%s%d\n",
15392              directive, LPREFIX, value, LPREFIX, rel);
15393   else if (HAVE_AS_GOTOFF_IN_DATA)
15394     fprintf (file, ASM_LONG "%s%d@GOTOFF\n", LPREFIX, value);
15395 #if TARGET_MACHO
15396   else if (TARGET_MACHO)
15397     {
15398       fprintf (file, ASM_LONG "%s%d-", LPREFIX, value);
15399       machopic_output_function_base_name (file);
15400       putc ('\n', file);
15401     }
15402 #endif
15403   else
15404     asm_fprintf (file, ASM_LONG "%U%s+[.-%s%d]\n",
15405                  GOT_SYMBOL_NAME, LPREFIX, value);
15406 }
15407 \f
15408 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
15409    for the target.  */
15410
15411 void
15412 ix86_expand_clear (rtx dest)
15413 {
15414   rtx tmp;
15415
15416   /* We play register width games, which are only valid after reload.  */
15417   gcc_assert (reload_completed);
15418
15419   /* Avoid HImode and its attendant prefix byte.  */
15420   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
15421     dest = gen_rtx_REG (SImode, REGNO (dest));
15422   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
15423
15424   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
15425   if (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ())
15426     {
15427       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
15428       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
15429     }
15430
15431   emit_insn (tmp);
15432 }
15433
15434 /* X is an unchanging MEM.  If it is a constant pool reference, return
15435    the constant pool rtx, else NULL.  */
15436
15437 rtx
15438 maybe_get_pool_constant (rtx x)
15439 {
15440   x = ix86_delegitimize_address (XEXP (x, 0));
15441
15442   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
15443     return get_pool_constant (x);
15444
15445   return NULL_RTX;
15446 }
15447
15448 void
15449 ix86_expand_move (enum machine_mode mode, rtx operands[])
15450 {
15451   rtx op0, op1;
15452   enum tls_model model;
15453
15454   op0 = operands[0];
15455   op1 = operands[1];
15456
15457   if (GET_CODE (op1) == SYMBOL_REF)
15458     {
15459       model = SYMBOL_REF_TLS_MODEL (op1);
15460       if (model)
15461         {
15462           op1 = legitimize_tls_address (op1, model, true);
15463           op1 = force_operand (op1, op0);
15464           if (op1 == op0)
15465             return;
15466         }
15467       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
15468                && SYMBOL_REF_DLLIMPORT_P (op1))
15469         op1 = legitimize_dllimport_symbol (op1, false);
15470     }
15471   else if (GET_CODE (op1) == CONST
15472            && GET_CODE (XEXP (op1, 0)) == PLUS
15473            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
15474     {
15475       rtx addend = XEXP (XEXP (op1, 0), 1);
15476       rtx symbol = XEXP (XEXP (op1, 0), 0);
15477       rtx tmp = NULL;
15478
15479       model = SYMBOL_REF_TLS_MODEL (symbol);
15480       if (model)
15481         tmp = legitimize_tls_address (symbol, model, true);
15482       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
15483                && SYMBOL_REF_DLLIMPORT_P (symbol))
15484         tmp = legitimize_dllimport_symbol (symbol, true);
15485
15486       if (tmp)
15487         {
15488           tmp = force_operand (tmp, NULL);
15489           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
15490                                      op0, 1, OPTAB_DIRECT);
15491           if (tmp == op0)
15492             return;
15493         }
15494     }
15495
15496   if ((flag_pic || MACHOPIC_INDIRECT) 
15497        && mode == Pmode && symbolic_operand (op1, Pmode))
15498     {
15499       if (TARGET_MACHO && !TARGET_64BIT)
15500         {
15501 #if TARGET_MACHO
15502           /* dynamic-no-pic */
15503           if (MACHOPIC_INDIRECT)
15504             {
15505               rtx temp = ((reload_in_progress
15506                            || ((op0 && REG_P (op0))
15507                                && mode == Pmode))
15508                           ? op0 : gen_reg_rtx (Pmode));
15509               op1 = machopic_indirect_data_reference (op1, temp);
15510               if (MACHOPIC_PURE)
15511                 op1 = machopic_legitimize_pic_address (op1, mode,
15512                                                        temp == op1 ? 0 : temp);
15513             }
15514           if (op0 != op1 && GET_CODE (op0) != MEM)
15515             {
15516               rtx insn = gen_rtx_SET (VOIDmode, op0, op1);
15517               emit_insn (insn);
15518               return;
15519             }
15520           if (GET_CODE (op0) == MEM)
15521             op1 = force_reg (Pmode, op1);
15522           else
15523             {
15524               rtx temp = op0;
15525               if (GET_CODE (temp) != REG)
15526                 temp = gen_reg_rtx (Pmode);
15527               temp = legitimize_pic_address (op1, temp);
15528               if (temp == op0)
15529             return;
15530               op1 = temp;
15531             }
15532       /* dynamic-no-pic */
15533 #endif
15534         }
15535       else
15536         {
15537           if (MEM_P (op0))
15538             op1 = force_reg (Pmode, op1);
15539           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
15540             {
15541               rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
15542               op1 = legitimize_pic_address (op1, reg);
15543               if (op0 == op1)
15544                 return;
15545             }
15546         }
15547     }
15548   else
15549     {
15550       if (MEM_P (op0)
15551           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
15552               || !push_operand (op0, mode))
15553           && MEM_P (op1))
15554         op1 = force_reg (mode, op1);
15555
15556       if (push_operand (op0, mode)
15557           && ! general_no_elim_operand (op1, mode))
15558         op1 = copy_to_mode_reg (mode, op1);
15559
15560       /* Force large constants in 64bit compilation into register
15561          to get them CSEed.  */
15562       if (can_create_pseudo_p ()
15563           && (mode == DImode) && TARGET_64BIT
15564           && immediate_operand (op1, mode)
15565           && !x86_64_zext_immediate_operand (op1, VOIDmode)
15566           && !register_operand (op0, mode)
15567           && optimize)
15568         op1 = copy_to_mode_reg (mode, op1);
15569
15570       if (can_create_pseudo_p ()
15571           && FLOAT_MODE_P (mode)
15572           && GET_CODE (op1) == CONST_DOUBLE)
15573         {
15574           /* If we are loading a floating point constant to a register,
15575              force the value to memory now, since we'll get better code
15576              out the back end.  */
15577
15578           op1 = validize_mem (force_const_mem (mode, op1));
15579           if (!register_operand (op0, mode))
15580             {
15581               rtx temp = gen_reg_rtx (mode);
15582               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
15583               emit_move_insn (op0, temp);
15584               return;
15585             }
15586         }
15587     }
15588
15589   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
15590 }
15591
15592 void
15593 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
15594 {
15595   rtx op0 = operands[0], op1 = operands[1];
15596   unsigned int align = GET_MODE_ALIGNMENT (mode);
15597
15598   /* Force constants other than zero into memory.  We do not know how
15599      the instructions used to build constants modify the upper 64 bits
15600      of the register, once we have that information we may be able
15601      to handle some of them more efficiently.  */
15602   if (can_create_pseudo_p ()
15603       && register_operand (op0, mode)
15604       && (CONSTANT_P (op1)
15605           || (GET_CODE (op1) == SUBREG
15606               && CONSTANT_P (SUBREG_REG (op1))))
15607       && !standard_sse_constant_p (op1))
15608     op1 = validize_mem (force_const_mem (mode, op1));
15609
15610   /* We need to check memory alignment for SSE mode since attribute
15611      can make operands unaligned.  */
15612   if (can_create_pseudo_p ()
15613       && SSE_REG_MODE_P (mode)
15614       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
15615           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
15616     {
15617       rtx tmp[2];
15618
15619       /* ix86_expand_vector_move_misalign() does not like constants ... */
15620       if (CONSTANT_P (op1)
15621           || (GET_CODE (op1) == SUBREG
15622               && CONSTANT_P (SUBREG_REG (op1))))
15623         op1 = validize_mem (force_const_mem (mode, op1));
15624
15625       /* ... nor both arguments in memory.  */
15626       if (!register_operand (op0, mode)
15627           && !register_operand (op1, mode))
15628         op1 = force_reg (mode, op1);
15629
15630       tmp[0] = op0; tmp[1] = op1;
15631       ix86_expand_vector_move_misalign (mode, tmp);
15632       return;
15633     }
15634
15635   /* Make operand1 a register if it isn't already.  */
15636   if (can_create_pseudo_p ()
15637       && !register_operand (op0, mode)
15638       && !register_operand (op1, mode))
15639     {
15640       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
15641       return;
15642     }
15643
15644   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
15645 }
15646
15647 /* Split 32-byte AVX unaligned load and store if needed.  */
15648
15649 static void
15650 ix86_avx256_split_vector_move_misalign (rtx op0, rtx op1)
15651 {
15652   rtx m;
15653   rtx (*extract) (rtx, rtx, rtx);
15654   rtx (*move_unaligned) (rtx, rtx);
15655   enum machine_mode mode;
15656
15657   switch (GET_MODE (op0))
15658     {
15659     default:
15660       gcc_unreachable ();
15661     case V32QImode:
15662       extract = gen_avx_vextractf128v32qi;
15663       move_unaligned = gen_avx_movdqu256;
15664       mode = V16QImode;
15665       break;
15666     case V8SFmode:
15667       extract = gen_avx_vextractf128v8sf;
15668       move_unaligned = gen_avx_movups256;
15669       mode = V4SFmode;
15670       break;
15671     case V4DFmode:
15672       extract = gen_avx_vextractf128v4df;
15673       move_unaligned = gen_avx_movupd256;
15674       mode = V2DFmode;
15675       break;
15676     }
15677
15678   if (MEM_P (op1) && TARGET_AVX256_SPLIT_UNALIGNED_LOAD)
15679     {
15680       rtx r = gen_reg_rtx (mode);
15681       m = adjust_address (op1, mode, 0);
15682       emit_move_insn (r, m);
15683       m = adjust_address (op1, mode, 16);
15684       r = gen_rtx_VEC_CONCAT (GET_MODE (op0), r, m);
15685       emit_move_insn (op0, r);
15686     }
15687   else if (MEM_P (op0) && TARGET_AVX256_SPLIT_UNALIGNED_STORE)
15688     {
15689       m = adjust_address (op0, mode, 0);
15690       emit_insn (extract (m, op1, const0_rtx));
15691       m = adjust_address (op0, mode, 16);
15692       emit_insn (extract (m, op1, const1_rtx));
15693     }
15694   else
15695     emit_insn (move_unaligned (op0, op1));
15696 }
15697
15698 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
15699    straight to ix86_expand_vector_move.  */
15700 /* Code generation for scalar reg-reg moves of single and double precision data:
15701      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
15702        movaps reg, reg
15703      else
15704        movss reg, reg
15705      if (x86_sse_partial_reg_dependency == true)
15706        movapd reg, reg
15707      else
15708        movsd reg, reg
15709
15710    Code generation for scalar loads of double precision data:
15711      if (x86_sse_split_regs == true)
15712        movlpd mem, reg      (gas syntax)
15713      else
15714        movsd mem, reg
15715
15716    Code generation for unaligned packed loads of single precision data
15717    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
15718      if (x86_sse_unaligned_move_optimal)
15719        movups mem, reg
15720
15721      if (x86_sse_partial_reg_dependency == true)
15722        {
15723          xorps  reg, reg
15724          movlps mem, reg
15725          movhps mem+8, reg
15726        }
15727      else
15728        {
15729          movlps mem, reg
15730          movhps mem+8, reg
15731        }
15732
15733    Code generation for unaligned packed loads of double precision data
15734    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
15735      if (x86_sse_unaligned_move_optimal)
15736        movupd mem, reg
15737
15738      if (x86_sse_split_regs == true)
15739        {
15740          movlpd mem, reg
15741          movhpd mem+8, reg
15742        }
15743      else
15744        {
15745          movsd  mem, reg
15746          movhpd mem+8, reg
15747        }
15748  */
15749
15750 void
15751 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
15752 {
15753   rtx op0, op1, m;
15754
15755   op0 = operands[0];
15756   op1 = operands[1];
15757
15758   if (TARGET_AVX)
15759     {
15760       switch (GET_MODE_CLASS (mode))
15761         {
15762         case MODE_VECTOR_INT:
15763         case MODE_INT:
15764           switch (GET_MODE_SIZE (mode))
15765             {
15766             case 16:
15767               /*  If we're optimizing for size, movups is the smallest.  */
15768               if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15769                 {
15770                   op0 = gen_lowpart (V4SFmode, op0);
15771                   op1 = gen_lowpart (V4SFmode, op1);
15772                   emit_insn (gen_sse_movups (op0, op1));
15773                   return;
15774                 }
15775               op0 = gen_lowpart (V16QImode, op0);
15776               op1 = gen_lowpart (V16QImode, op1);
15777               emit_insn (gen_sse2_movdqu (op0, op1));
15778               break;
15779             case 32:
15780               op0 = gen_lowpart (V32QImode, op0);
15781               op1 = gen_lowpart (V32QImode, op1);
15782               ix86_avx256_split_vector_move_misalign (op0, op1);
15783               break;
15784             default:
15785               gcc_unreachable ();
15786             }
15787           break;
15788         case MODE_VECTOR_FLOAT:
15789           op0 = gen_lowpart (mode, op0);
15790           op1 = gen_lowpart (mode, op1);
15791
15792           switch (mode)
15793             {
15794             case V4SFmode:
15795               emit_insn (gen_sse_movups (op0, op1));
15796               break;
15797             case V8SFmode:
15798               ix86_avx256_split_vector_move_misalign (op0, op1);
15799               break;
15800             case V2DFmode:
15801               if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15802                 {
15803                   op0 = gen_lowpart (V4SFmode, op0);
15804                   op1 = gen_lowpart (V4SFmode, op1);
15805                   emit_insn (gen_sse_movups (op0, op1));
15806                   return;
15807                 }
15808               emit_insn (gen_sse2_movupd (op0, op1));
15809               break;
15810             case V4DFmode:
15811               ix86_avx256_split_vector_move_misalign (op0, op1);
15812               break;
15813             default:
15814               gcc_unreachable ();
15815             }
15816           break;
15817
15818         default:
15819           gcc_unreachable ();
15820         }
15821
15822       return;
15823     }
15824
15825   if (MEM_P (op1))
15826     {
15827       /* If we're optimizing for size, movups is the smallest.  */
15828       if (optimize_insn_for_size_p ()
15829           || TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15830         {
15831           op0 = gen_lowpart (V4SFmode, op0);
15832           op1 = gen_lowpart (V4SFmode, op1);
15833           emit_insn (gen_sse_movups (op0, op1));
15834           return;
15835         }
15836
15837       /* ??? If we have typed data, then it would appear that using
15838          movdqu is the only way to get unaligned data loaded with
15839          integer type.  */
15840       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
15841         {
15842           op0 = gen_lowpart (V16QImode, op0);
15843           op1 = gen_lowpart (V16QImode, op1);
15844           emit_insn (gen_sse2_movdqu (op0, op1));
15845           return;
15846         }
15847
15848       if (TARGET_SSE2 && mode == V2DFmode)
15849         {
15850           rtx zero;
15851
15852           if (TARGET_SSE_UNALIGNED_LOAD_OPTIMAL)
15853             {
15854               op0 = gen_lowpart (V2DFmode, op0);
15855               op1 = gen_lowpart (V2DFmode, op1);
15856               emit_insn (gen_sse2_movupd (op0, op1));
15857               return;
15858             }
15859
15860           /* When SSE registers are split into halves, we can avoid
15861              writing to the top half twice.  */
15862           if (TARGET_SSE_SPLIT_REGS)
15863             {
15864               emit_clobber (op0);
15865               zero = op0;
15866             }
15867           else
15868             {
15869               /* ??? Not sure about the best option for the Intel chips.
15870                  The following would seem to satisfy; the register is
15871                  entirely cleared, breaking the dependency chain.  We
15872                  then store to the upper half, with a dependency depth
15873                  of one.  A rumor has it that Intel recommends two movsd
15874                  followed by an unpacklpd, but this is unconfirmed.  And
15875                  given that the dependency depth of the unpacklpd would
15876                  still be one, I'm not sure why this would be better.  */
15877               zero = CONST0_RTX (V2DFmode);
15878             }
15879
15880           m = adjust_address (op1, DFmode, 0);
15881           emit_insn (gen_sse2_loadlpd (op0, zero, m));
15882           m = adjust_address (op1, DFmode, 8);
15883           emit_insn (gen_sse2_loadhpd (op0, op0, m));
15884         }
15885       else
15886         {
15887           if (TARGET_SSE_UNALIGNED_LOAD_OPTIMAL)
15888             {
15889               op0 = gen_lowpart (V4SFmode, op0);
15890               op1 = gen_lowpart (V4SFmode, op1);
15891               emit_insn (gen_sse_movups (op0, op1));
15892               return;
15893             }
15894
15895           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
15896             emit_move_insn (op0, CONST0_RTX (mode));
15897           else
15898             emit_clobber (op0);
15899
15900           if (mode != V4SFmode)
15901             op0 = gen_lowpart (V4SFmode, op0);
15902           m = adjust_address (op1, V2SFmode, 0);
15903           emit_insn (gen_sse_loadlps (op0, op0, m));
15904           m = adjust_address (op1, V2SFmode, 8);
15905           emit_insn (gen_sse_loadhps (op0, op0, m));
15906         }
15907     }
15908   else if (MEM_P (op0))
15909     {
15910       /* If we're optimizing for size, movups is the smallest.  */
15911       if (optimize_insn_for_size_p ()
15912           || TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
15913         {
15914           op0 = gen_lowpart (V4SFmode, op0);
15915           op1 = gen_lowpart (V4SFmode, op1);
15916           emit_insn (gen_sse_movups (op0, op1));
15917           return;
15918         }
15919
15920       /* ??? Similar to above, only less clear because of quote
15921          typeless stores unquote.  */
15922       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
15923           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
15924         {
15925           op0 = gen_lowpart (V16QImode, op0);
15926           op1 = gen_lowpart (V16QImode, op1);
15927           emit_insn (gen_sse2_movdqu (op0, op1));
15928           return;
15929         }
15930
15931       if (TARGET_SSE2 && mode == V2DFmode)
15932         {
15933           if (TARGET_SSE_UNALIGNED_STORE_OPTIMAL)
15934             {
15935               op0 = gen_lowpart (V2DFmode, op0);
15936               op1 = gen_lowpart (V2DFmode, op1);
15937               emit_insn (gen_sse2_movupd (op0, op1));
15938             }
15939           else
15940             {
15941               m = adjust_address (op0, DFmode, 0);
15942               emit_insn (gen_sse2_storelpd (m, op1));
15943               m = adjust_address (op0, DFmode, 8);
15944               emit_insn (gen_sse2_storehpd (m, op1));
15945             }
15946         }
15947       else
15948         {
15949           if (mode != V4SFmode)
15950             op1 = gen_lowpart (V4SFmode, op1);
15951
15952           if (TARGET_SSE_UNALIGNED_STORE_OPTIMAL)
15953             {
15954               op0 = gen_lowpart (V4SFmode, op0);
15955               emit_insn (gen_sse_movups (op0, op1));
15956             }
15957           else
15958             {
15959               m = adjust_address (op0, V2SFmode, 0);
15960               emit_insn (gen_sse_storelps (m, op1));
15961               m = adjust_address (op0, V2SFmode, 8);
15962               emit_insn (gen_sse_storehps (m, op1));
15963             }
15964         }
15965     }
15966   else
15967     gcc_unreachable ();
15968 }
15969
15970 /* Expand a push in MODE.  This is some mode for which we do not support
15971    proper push instructions, at least from the registers that we expect
15972    the value to live in.  */
15973
15974 void
15975 ix86_expand_push (enum machine_mode mode, rtx x)
15976 {
15977   rtx tmp;
15978
15979   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
15980                              GEN_INT (-GET_MODE_SIZE (mode)),
15981                              stack_pointer_rtx, 1, OPTAB_DIRECT);
15982   if (tmp != stack_pointer_rtx)
15983     emit_move_insn (stack_pointer_rtx, tmp);
15984
15985   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
15986
15987   /* When we push an operand onto stack, it has to be aligned at least
15988      at the function argument boundary.  However since we don't have
15989      the argument type, we can't determine the actual argument
15990      boundary.  */
15991   emit_move_insn (tmp, x);
15992 }
15993
15994 /* Helper function of ix86_fixup_binary_operands to canonicalize
15995    operand order.  Returns true if the operands should be swapped.  */
15996
15997 static bool
15998 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
15999                              rtx operands[])
16000 {
16001   rtx dst = operands[0];
16002   rtx src1 = operands[1];
16003   rtx src2 = operands[2];
16004
16005   /* If the operation is not commutative, we can't do anything.  */
16006   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
16007     return false;
16008
16009   /* Highest priority is that src1 should match dst.  */
16010   if (rtx_equal_p (dst, src1))
16011     return false;
16012   if (rtx_equal_p (dst, src2))
16013     return true;
16014
16015   /* Next highest priority is that immediate constants come second.  */
16016   if (immediate_operand (src2, mode))
16017     return false;
16018   if (immediate_operand (src1, mode))
16019     return true;
16020
16021   /* Lowest priority is that memory references should come second.  */
16022   if (MEM_P (src2))
16023     return false;
16024   if (MEM_P (src1))
16025     return true;
16026
16027   return false;
16028 }
16029
16030
16031 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
16032    destination to use for the operation.  If different from the true
16033    destination in operands[0], a copy operation will be required.  */
16034
16035 rtx
16036 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
16037                             rtx operands[])
16038 {
16039   rtx dst = operands[0];
16040   rtx src1 = operands[1];
16041   rtx src2 = operands[2];
16042
16043   /* Canonicalize operand order.  */
16044   if (ix86_swap_binary_operands_p (code, mode, operands))
16045     {
16046       rtx temp;
16047
16048       /* It is invalid to swap operands of different modes.  */
16049       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
16050
16051       temp = src1;
16052       src1 = src2;
16053       src2 = temp;
16054     }
16055
16056   /* Both source operands cannot be in memory.  */
16057   if (MEM_P (src1) && MEM_P (src2))
16058     {
16059       /* Optimization: Only read from memory once.  */
16060       if (rtx_equal_p (src1, src2))
16061         {
16062           src2 = force_reg (mode, src2);
16063           src1 = src2;
16064         }
16065       else
16066         src2 = force_reg (mode, src2);
16067     }
16068
16069   /* If the destination is memory, and we do not have matching source
16070      operands, do things in registers.  */
16071   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
16072     dst = gen_reg_rtx (mode);
16073
16074   /* Source 1 cannot be a constant.  */
16075   if (CONSTANT_P (src1))
16076     src1 = force_reg (mode, src1);
16077
16078   /* Source 1 cannot be a non-matching memory.  */
16079   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
16080     src1 = force_reg (mode, src1);
16081
16082   operands[1] = src1;
16083   operands[2] = src2;
16084   return dst;
16085 }
16086
16087 /* Similarly, but assume that the destination has already been
16088    set up properly.  */
16089
16090 void
16091 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
16092                                     enum machine_mode mode, rtx operands[])
16093 {
16094   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
16095   gcc_assert (dst == operands[0]);
16096 }
16097
16098 /* Attempt to expand a binary operator.  Make the expansion closer to the
16099    actual machine, then just general_operand, which will allow 3 separate
16100    memory references (one output, two input) in a single insn.  */
16101
16102 void
16103 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
16104                              rtx operands[])
16105 {
16106   rtx src1, src2, dst, op, clob;
16107
16108   dst = ix86_fixup_binary_operands (code, mode, operands);
16109   src1 = operands[1];
16110   src2 = operands[2];
16111
16112  /* Emit the instruction.  */
16113
16114   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
16115   if (reload_in_progress)
16116     {
16117       /* Reload doesn't know about the flags register, and doesn't know that
16118          it doesn't want to clobber it.  We can only do this with PLUS.  */
16119       gcc_assert (code == PLUS);
16120       emit_insn (op);
16121     }
16122   else if (reload_completed
16123            && code == PLUS
16124            && !rtx_equal_p (dst, src1))
16125     {
16126       /* This is going to be an LEA; avoid splitting it later.  */
16127       emit_insn (op);
16128     }
16129   else
16130     {
16131       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
16132       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
16133     }
16134
16135   /* Fix up the destination if needed.  */
16136   if (dst != operands[0])
16137     emit_move_insn (operands[0], dst);
16138 }
16139
16140 /* Return TRUE or FALSE depending on whether the binary operator meets the
16141    appropriate constraints.  */
16142
16143 bool
16144 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
16145                          rtx operands[3])
16146 {
16147   rtx dst = operands[0];
16148   rtx src1 = operands[1];
16149   rtx src2 = operands[2];
16150
16151   /* Both source operands cannot be in memory.  */
16152   if (MEM_P (src1) && MEM_P (src2))
16153     return false;
16154
16155   /* Canonicalize operand order for commutative operators.  */
16156   if (ix86_swap_binary_operands_p (code, mode, operands))
16157     {
16158       rtx temp = src1;
16159       src1 = src2;
16160       src2 = temp;
16161     }
16162
16163   /* If the destination is memory, we must have a matching source operand.  */
16164   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
16165       return false;
16166
16167   /* Source 1 cannot be a constant.  */
16168   if (CONSTANT_P (src1))
16169     return false;
16170
16171   /* Source 1 cannot be a non-matching memory.  */
16172   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
16173     {
16174       /* Support "andhi/andsi/anddi" as a zero-extending move.  */
16175       return (code == AND
16176               && (mode == HImode
16177                   || mode == SImode
16178                   || (TARGET_64BIT && mode == DImode))
16179               && CONST_INT_P (src2)
16180               && (INTVAL (src2) == 0xff
16181                   || INTVAL (src2) == 0xffff));
16182     }
16183
16184   return true;
16185 }
16186
16187 /* Attempt to expand a unary operator.  Make the expansion closer to the
16188    actual machine, then just general_operand, which will allow 2 separate
16189    memory references (one output, one input) in a single insn.  */
16190
16191 void
16192 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
16193                             rtx operands[])
16194 {
16195   int matching_memory;
16196   rtx src, dst, op, clob;
16197
16198   dst = operands[0];
16199   src = operands[1];
16200
16201   /* If the destination is memory, and we do not have matching source
16202      operands, do things in registers.  */
16203   matching_memory = 0;
16204   if (MEM_P (dst))
16205     {
16206       if (rtx_equal_p (dst, src))
16207         matching_memory = 1;
16208       else
16209         dst = gen_reg_rtx (mode);
16210     }
16211
16212   /* When source operand is memory, destination must match.  */
16213   if (MEM_P (src) && !matching_memory)
16214     src = force_reg (mode, src);
16215
16216   /* Emit the instruction.  */
16217
16218   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
16219   if (reload_in_progress || code == NOT)
16220     {
16221       /* Reload doesn't know about the flags register, and doesn't know that
16222          it doesn't want to clobber it.  */
16223       gcc_assert (code == NOT);
16224       emit_insn (op);
16225     }
16226   else
16227     {
16228       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
16229       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
16230     }
16231
16232   /* Fix up the destination if needed.  */
16233   if (dst != operands[0])
16234     emit_move_insn (operands[0], dst);
16235 }
16236
16237 /* Split 32bit/64bit divmod with 8bit unsigned divmod if dividend and
16238    divisor are within the range [0-255].  */
16239
16240 void
16241 ix86_split_idivmod (enum machine_mode mode, rtx operands[],
16242                     bool signed_p)
16243 {
16244   rtx end_label, qimode_label;
16245   rtx insn, div, mod;
16246   rtx scratch, tmp0, tmp1, tmp2;
16247   rtx (*gen_divmod4_1) (rtx, rtx, rtx, rtx);
16248   rtx (*gen_zero_extend) (rtx, rtx);
16249   rtx (*gen_test_ccno_1) (rtx, rtx);
16250
16251   switch (mode)
16252     {
16253     case SImode:
16254       gen_divmod4_1 = signed_p ? gen_divmodsi4_1 : gen_udivmodsi4_1;
16255       gen_test_ccno_1 = gen_testsi_ccno_1;
16256       gen_zero_extend = gen_zero_extendqisi2;
16257       break;
16258     case DImode:
16259       gen_divmod4_1 = signed_p ? gen_divmoddi4_1 : gen_udivmoddi4_1;
16260       gen_test_ccno_1 = gen_testdi_ccno_1;
16261       gen_zero_extend = gen_zero_extendqidi2;
16262       break;
16263     default:
16264       gcc_unreachable ();
16265     }
16266
16267   end_label = gen_label_rtx ();
16268   qimode_label = gen_label_rtx ();
16269
16270   scratch = gen_reg_rtx (mode);
16271
16272   /* Use 8bit unsigned divimod if dividend and divisor are within
16273      the range [0-255].  */
16274   emit_move_insn (scratch, operands[2]);
16275   scratch = expand_simple_binop (mode, IOR, scratch, operands[3],
16276                                  scratch, 1, OPTAB_DIRECT);
16277   emit_insn (gen_test_ccno_1 (scratch, GEN_INT (-0x100)));
16278   tmp0 = gen_rtx_REG (CCNOmode, FLAGS_REG);
16279   tmp0 = gen_rtx_EQ (VOIDmode, tmp0, const0_rtx);
16280   tmp0 = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp0,
16281                                gen_rtx_LABEL_REF (VOIDmode, qimode_label),
16282                                pc_rtx);
16283   insn = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp0));
16284   predict_jump (REG_BR_PROB_BASE * 50 / 100);
16285   JUMP_LABEL (insn) = qimode_label;
16286
16287   /* Generate original signed/unsigned divimod.  */
16288   div = gen_divmod4_1 (operands[0], operands[1],
16289                        operands[2], operands[3]);
16290   emit_insn (div);
16291
16292   /* Branch to the end.  */
16293   emit_jump_insn (gen_jump (end_label));
16294   emit_barrier ();
16295
16296   /* Generate 8bit unsigned divide.  */
16297   emit_label (qimode_label);
16298   /* Don't use operands[0] for result of 8bit divide since not all
16299      registers support QImode ZERO_EXTRACT.  */
16300   tmp0 = simplify_gen_subreg (HImode, scratch, mode, 0);
16301   tmp1 = simplify_gen_subreg (HImode, operands[2], mode, 0);
16302   tmp2 = simplify_gen_subreg (QImode, operands[3], mode, 0);
16303   emit_insn (gen_udivmodhiqi3 (tmp0, tmp1, tmp2));
16304
16305   if (signed_p)
16306     {
16307       div = gen_rtx_DIV (SImode, operands[2], operands[3]);
16308       mod = gen_rtx_MOD (SImode, operands[2], operands[3]);
16309     }
16310   else
16311     {
16312       div = gen_rtx_UDIV (SImode, operands[2], operands[3]);
16313       mod = gen_rtx_UMOD (SImode, operands[2], operands[3]);
16314     }
16315
16316   /* Extract remainder from AH.  */
16317   tmp1 = gen_rtx_ZERO_EXTRACT (mode, tmp0, GEN_INT (8), GEN_INT (8));
16318   if (REG_P (operands[1]))
16319     insn = emit_move_insn (operands[1], tmp1);
16320   else
16321     {
16322       /* Need a new scratch register since the old one has result 
16323          of 8bit divide.  */
16324       scratch = gen_reg_rtx (mode);
16325       emit_move_insn (scratch, tmp1);
16326       insn = emit_move_insn (operands[1], scratch);
16327     }
16328   set_unique_reg_note (insn, REG_EQUAL, mod);
16329
16330   /* Zero extend quotient from AL.  */
16331   tmp1 = gen_lowpart (QImode, tmp0);
16332   insn = emit_insn (gen_zero_extend (operands[0], tmp1));
16333   set_unique_reg_note (insn, REG_EQUAL, div);
16334
16335   emit_label (end_label);
16336 }
16337
16338 #define LEA_SEARCH_THRESHOLD 12
16339
16340 /* Search backward for non-agu definition of register number REGNO1
16341    or register number REGNO2 in INSN's basic block until
16342    1. Pass LEA_SEARCH_THRESHOLD instructions, or
16343    2. Reach BB boundary, or
16344    3. Reach agu definition.
16345    Returns the distance between the non-agu definition point and INSN.
16346    If no definition point, returns -1.  */
16347
16348 static int
16349 distance_non_agu_define (unsigned int regno1, unsigned int regno2,
16350                          rtx insn)
16351 {
16352   basic_block bb = BLOCK_FOR_INSN (insn);
16353   int distance = 0;
16354   df_ref *def_rec;
16355   enum attr_type insn_type;
16356
16357   if (insn != BB_HEAD (bb))
16358     {
16359       rtx prev = PREV_INSN (insn);
16360       while (prev && distance < LEA_SEARCH_THRESHOLD)
16361         {
16362           if (NONDEBUG_INSN_P (prev))
16363             {
16364               distance++;
16365               for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
16366                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16367                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
16368                     && (regno1 == DF_REF_REGNO (*def_rec)
16369                         || regno2 == DF_REF_REGNO (*def_rec)))
16370                   {
16371                     insn_type = get_attr_type (prev);
16372                     if (insn_type != TYPE_LEA)
16373                       goto done;
16374                   }
16375             }
16376           if (prev == BB_HEAD (bb))
16377             break;
16378           prev = PREV_INSN (prev);
16379         }
16380     }
16381
16382   if (distance < LEA_SEARCH_THRESHOLD)
16383     {
16384       edge e;
16385       edge_iterator ei;
16386       bool simple_loop = false;
16387
16388       FOR_EACH_EDGE (e, ei, bb->preds)
16389         if (e->src == bb)
16390           {
16391             simple_loop = true;
16392             break;
16393           }
16394
16395       if (simple_loop)
16396         {
16397           rtx prev = BB_END (bb);
16398           while (prev
16399                  && prev != insn
16400                  && distance < LEA_SEARCH_THRESHOLD)
16401             {
16402               if (NONDEBUG_INSN_P (prev))
16403                 {
16404                   distance++;
16405                   for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
16406                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16407                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
16408                         && (regno1 == DF_REF_REGNO (*def_rec)
16409                             || regno2 == DF_REF_REGNO (*def_rec)))
16410                       {
16411                         insn_type = get_attr_type (prev);
16412                         if (insn_type != TYPE_LEA)
16413                           goto done;
16414                       }
16415                 }
16416               prev = PREV_INSN (prev);
16417             }
16418         }
16419     }
16420
16421   distance = -1;
16422
16423 done:
16424   /* get_attr_type may modify recog data.  We want to make sure
16425      that recog data is valid for instruction INSN, on which
16426      distance_non_agu_define is called.  INSN is unchanged here.  */
16427   extract_insn_cached (insn);
16428   return distance;
16429 }
16430
16431 /* Return the distance between INSN and the next insn that uses
16432    register number REGNO0 in memory address.  Return -1 if no such
16433    a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set.  */
16434
16435 static int
16436 distance_agu_use (unsigned int regno0, rtx insn)
16437 {
16438   basic_block bb = BLOCK_FOR_INSN (insn);
16439   int distance = 0;
16440   df_ref *def_rec;
16441   df_ref *use_rec;
16442
16443   if (insn != BB_END (bb))
16444     {
16445       rtx next = NEXT_INSN (insn);
16446       while (next && distance < LEA_SEARCH_THRESHOLD)
16447         {
16448           if (NONDEBUG_INSN_P (next))
16449             {
16450               distance++;
16451
16452               for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
16453                 if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
16454                      || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
16455                     && regno0 == DF_REF_REGNO (*use_rec))
16456                   {
16457                     /* Return DISTANCE if OP0 is used in memory
16458                        address in NEXT.  */
16459                     return distance;
16460                   }
16461
16462               for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
16463                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16464                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
16465                     && regno0 == DF_REF_REGNO (*def_rec))
16466                   {
16467                     /* Return -1 if OP0 is set in NEXT.  */
16468                     return -1;
16469                   }
16470             }
16471           if (next == BB_END (bb))
16472             break;
16473           next = NEXT_INSN (next);
16474         }
16475     }
16476
16477   if (distance < LEA_SEARCH_THRESHOLD)
16478     {
16479       edge e;
16480       edge_iterator ei;
16481       bool simple_loop = false;
16482
16483       FOR_EACH_EDGE (e, ei, bb->succs)
16484         if (e->dest == bb)
16485           {
16486             simple_loop = true;
16487             break;
16488           }
16489
16490       if (simple_loop)
16491         {
16492           rtx next = BB_HEAD (bb);
16493           while (next
16494                  && next != insn
16495                  && distance < LEA_SEARCH_THRESHOLD)
16496             {
16497               if (NONDEBUG_INSN_P (next))
16498                 {
16499                   distance++;
16500
16501                   for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
16502                     if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
16503                          || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
16504                         && regno0 == DF_REF_REGNO (*use_rec))
16505                       {
16506                         /* Return DISTANCE if OP0 is used in memory
16507                            address in NEXT.  */
16508                         return distance;
16509                       }
16510
16511                   for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
16512                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
16513                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
16514                         && regno0 == DF_REF_REGNO (*def_rec))
16515                       {
16516                         /* Return -1 if OP0 is set in NEXT.  */
16517                         return -1;
16518                       }
16519
16520                 }
16521               next = NEXT_INSN (next);
16522             }
16523         }
16524     }
16525
16526   return -1;
16527 }
16528
16529 /* Define this macro to tune LEA priority vs ADD, it take effect when
16530    there is a dilemma of choicing LEA or ADD
16531    Negative value: ADD is more preferred than LEA
16532    Zero: Netrual
16533    Positive value: LEA is more preferred than ADD*/
16534 #define IX86_LEA_PRIORITY 2
16535
16536 /* Return true if it is ok to optimize an ADD operation to LEA
16537    operation to avoid flag register consumation.  For most processors,
16538    ADD is faster than LEA.  For the processors like ATOM, if the
16539    destination register of LEA holds an actual address which will be
16540    used soon, LEA is better and otherwise ADD is better.  */
16541
16542 bool
16543 ix86_lea_for_add_ok (rtx insn, rtx operands[])
16544 {
16545   unsigned int regno0 = true_regnum (operands[0]);
16546   unsigned int regno1 = true_regnum (operands[1]);
16547   unsigned int regno2 = true_regnum (operands[2]);
16548
16549   /* If a = b + c, (a!=b && a!=c), must use lea form. */
16550   if (regno0 != regno1 && regno0 != regno2)
16551     return true;
16552
16553   if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
16554     return false;
16555   else
16556     {
16557       int dist_define, dist_use;
16558
16559       /* Return false if REGNO0 isn't used in memory address. */
16560       dist_use = distance_agu_use (regno0, insn);
16561       if (dist_use <= 0)
16562         return false;
16563
16564       dist_define = distance_non_agu_define (regno1, regno2, insn);
16565       if (dist_define <= 0)
16566         return true;
16567
16568       /* If this insn has both backward non-agu dependence and forward
16569          agu dependence, the one with short distance take effect. */
16570       if ((dist_define + IX86_LEA_PRIORITY) < dist_use)
16571         return false;
16572
16573       return true;
16574     }
16575 }
16576
16577 /* Return true if destination reg of SET_BODY is shift count of
16578    USE_BODY.  */
16579
16580 static bool
16581 ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
16582 {
16583   rtx set_dest;
16584   rtx shift_rtx;
16585   int i;
16586
16587   /* Retrieve destination of SET_BODY.  */
16588   switch (GET_CODE (set_body))
16589     {
16590     case SET:
16591       set_dest = SET_DEST (set_body);
16592       if (!set_dest || !REG_P (set_dest))
16593         return false;
16594       break;
16595     case PARALLEL:
16596       for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
16597         if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
16598                                           use_body))
16599           return true;
16600     default:
16601       return false;
16602       break;
16603     }
16604
16605   /* Retrieve shift count of USE_BODY.  */
16606   switch (GET_CODE (use_body))
16607     {
16608     case SET:
16609       shift_rtx = XEXP (use_body, 1);
16610       break;
16611     case PARALLEL:
16612       for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
16613         if (ix86_dep_by_shift_count_body (set_body,
16614                                           XVECEXP (use_body, 0, i)))
16615           return true;
16616     default:
16617       return false;
16618       break;
16619     }
16620
16621   if (shift_rtx
16622       && (GET_CODE (shift_rtx) == ASHIFT
16623           || GET_CODE (shift_rtx) == LSHIFTRT
16624           || GET_CODE (shift_rtx) == ASHIFTRT
16625           || GET_CODE (shift_rtx) == ROTATE
16626           || GET_CODE (shift_rtx) == ROTATERT))
16627     {
16628       rtx shift_count = XEXP (shift_rtx, 1);
16629
16630       /* Return true if shift count is dest of SET_BODY.  */
16631       if (REG_P (shift_count)
16632           && true_regnum (set_dest) == true_regnum (shift_count))
16633         return true;
16634     }
16635
16636   return false;
16637 }
16638
16639 /* Return true if destination reg of SET_INSN is shift count of
16640    USE_INSN.  */
16641
16642 bool
16643 ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
16644 {
16645   return ix86_dep_by_shift_count_body (PATTERN (set_insn),
16646                                        PATTERN (use_insn));
16647 }
16648
16649 /* Return TRUE or FALSE depending on whether the unary operator meets the
16650    appropriate constraints.  */
16651
16652 bool
16653 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
16654                         enum machine_mode mode ATTRIBUTE_UNUSED,
16655                         rtx operands[2] ATTRIBUTE_UNUSED)
16656 {
16657   /* If one of operands is memory, source and destination must match.  */
16658   if ((MEM_P (operands[0])
16659        || MEM_P (operands[1]))
16660       && ! rtx_equal_p (operands[0], operands[1]))
16661     return false;
16662   return true;
16663 }
16664
16665 /* Return TRUE if the operands to a vec_interleave_{high,low}v2df
16666    are ok, keeping in mind the possible movddup alternative.  */
16667
16668 bool
16669 ix86_vec_interleave_v2df_operator_ok (rtx operands[3], bool high)
16670 {
16671   if (MEM_P (operands[0]))
16672     return rtx_equal_p (operands[0], operands[1 + high]);
16673   if (MEM_P (operands[1]) && MEM_P (operands[2]))
16674     return TARGET_SSE3 && rtx_equal_p (operands[1], operands[2]);
16675   return true;
16676 }
16677
16678 /* Post-reload splitter for converting an SF or DFmode value in an
16679    SSE register into an unsigned SImode.  */
16680
16681 void
16682 ix86_split_convert_uns_si_sse (rtx operands[])
16683 {
16684   enum machine_mode vecmode;
16685   rtx value, large, zero_or_two31, input, two31, x;
16686
16687   large = operands[1];
16688   zero_or_two31 = operands[2];
16689   input = operands[3];
16690   two31 = operands[4];
16691   vecmode = GET_MODE (large);
16692   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
16693
16694   /* Load up the value into the low element.  We must ensure that the other
16695      elements are valid floats -- zero is the easiest such value.  */
16696   if (MEM_P (input))
16697     {
16698       if (vecmode == V4SFmode)
16699         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
16700       else
16701         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
16702     }
16703   else
16704     {
16705       input = gen_rtx_REG (vecmode, REGNO (input));
16706       emit_move_insn (value, CONST0_RTX (vecmode));
16707       if (vecmode == V4SFmode)
16708         emit_insn (gen_sse_movss (value, value, input));
16709       else
16710         emit_insn (gen_sse2_movsd (value, value, input));
16711     }
16712
16713   emit_move_insn (large, two31);
16714   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
16715
16716   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
16717   emit_insn (gen_rtx_SET (VOIDmode, large, x));
16718
16719   x = gen_rtx_AND (vecmode, zero_or_two31, large);
16720   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
16721
16722   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
16723   emit_insn (gen_rtx_SET (VOIDmode, value, x));
16724
16725   large = gen_rtx_REG (V4SImode, REGNO (large));
16726   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
16727
16728   x = gen_rtx_REG (V4SImode, REGNO (value));
16729   if (vecmode == V4SFmode)
16730     emit_insn (gen_sse2_cvttps2dq (x, value));
16731   else
16732     emit_insn (gen_sse2_cvttpd2dq (x, value));
16733   value = x;
16734
16735   emit_insn (gen_xorv4si3 (value, value, large));
16736 }
16737
16738 /* Convert an unsigned DImode value into a DFmode, using only SSE.
16739    Expects the 64-bit DImode to be supplied in a pair of integral
16740    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
16741    -mfpmath=sse, !optimize_size only.  */
16742
16743 void
16744 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
16745 {
16746   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
16747   rtx int_xmm, fp_xmm;
16748   rtx biases, exponents;
16749   rtx x;
16750
16751   int_xmm = gen_reg_rtx (V4SImode);
16752   if (TARGET_INTER_UNIT_MOVES)
16753     emit_insn (gen_movdi_to_sse (int_xmm, input));
16754   else if (TARGET_SSE_SPLIT_REGS)
16755     {
16756       emit_clobber (int_xmm);
16757       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
16758     }
16759   else
16760     {
16761       x = gen_reg_rtx (V2DImode);
16762       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
16763       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
16764     }
16765
16766   x = gen_rtx_CONST_VECTOR (V4SImode,
16767                             gen_rtvec (4, GEN_INT (0x43300000UL),
16768                                        GEN_INT (0x45300000UL),
16769                                        const0_rtx, const0_rtx));
16770   exponents = validize_mem (force_const_mem (V4SImode, x));
16771
16772   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
16773   emit_insn (gen_vec_interleave_lowv4si (int_xmm, int_xmm, exponents));
16774
16775   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
16776      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
16777      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
16778      (0x1.0p84 + double(fp_value_hi_xmm)).
16779      Note these exponents differ by 32.  */
16780
16781   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
16782
16783   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
16784      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
16785   real_ldexp (&bias_lo_rvt, &dconst1, 52);
16786   real_ldexp (&bias_hi_rvt, &dconst1, 84);
16787   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
16788   x = const_double_from_real_value (bias_hi_rvt, DFmode);
16789   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
16790   biases = validize_mem (force_const_mem (V2DFmode, biases));
16791   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
16792
16793   /* Add the upper and lower DFmode values together.  */
16794   if (TARGET_SSE3)
16795     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
16796   else
16797     {
16798       x = copy_to_mode_reg (V2DFmode, fp_xmm);
16799       emit_insn (gen_vec_interleave_highv2df (fp_xmm, fp_xmm, fp_xmm));
16800       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
16801     }
16802
16803   ix86_expand_vector_extract (false, target, fp_xmm, 0);
16804 }
16805
16806 /* Not used, but eases macroization of patterns.  */
16807 void
16808 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
16809                                   rtx input ATTRIBUTE_UNUSED)
16810 {
16811   gcc_unreachable ();
16812 }
16813
16814 /* Convert an unsigned SImode value into a DFmode.  Only currently used
16815    for SSE, but applicable anywhere.  */
16816
16817 void
16818 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
16819 {
16820   REAL_VALUE_TYPE TWO31r;
16821   rtx x, fp;
16822
16823   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
16824                            NULL, 1, OPTAB_DIRECT);
16825
16826   fp = gen_reg_rtx (DFmode);
16827   emit_insn (gen_floatsidf2 (fp, x));
16828
16829   real_ldexp (&TWO31r, &dconst1, 31);
16830   x = const_double_from_real_value (TWO31r, DFmode);
16831
16832   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
16833   if (x != target)
16834     emit_move_insn (target, x);
16835 }
16836
16837 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
16838    32-bit mode; otherwise we have a direct convert instruction.  */
16839
16840 void
16841 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
16842 {
16843   REAL_VALUE_TYPE TWO32r;
16844   rtx fp_lo, fp_hi, x;
16845
16846   fp_lo = gen_reg_rtx (DFmode);
16847   fp_hi = gen_reg_rtx (DFmode);
16848
16849   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
16850
16851   real_ldexp (&TWO32r, &dconst1, 32);
16852   x = const_double_from_real_value (TWO32r, DFmode);
16853   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
16854
16855   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
16856
16857   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
16858                            0, OPTAB_DIRECT);
16859   if (x != target)
16860     emit_move_insn (target, x);
16861 }
16862
16863 /* Convert an unsigned SImode value into a SFmode, using only SSE.
16864    For x86_32, -mfpmath=sse, !optimize_size only.  */
16865 void
16866 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
16867 {
16868   REAL_VALUE_TYPE ONE16r;
16869   rtx fp_hi, fp_lo, int_hi, int_lo, x;
16870
16871   real_ldexp (&ONE16r, &dconst1, 16);
16872   x = const_double_from_real_value (ONE16r, SFmode);
16873   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
16874                                       NULL, 0, OPTAB_DIRECT);
16875   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
16876                                       NULL, 0, OPTAB_DIRECT);
16877   fp_hi = gen_reg_rtx (SFmode);
16878   fp_lo = gen_reg_rtx (SFmode);
16879   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
16880   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
16881   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
16882                                0, OPTAB_DIRECT);
16883   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
16884                                0, OPTAB_DIRECT);
16885   if (!rtx_equal_p (target, fp_hi))
16886     emit_move_insn (target, fp_hi);
16887 }
16888
16889 /* A subroutine of ix86_build_signbit_mask.  If VECT is true,
16890    then replicate the value for all elements of the vector
16891    register.  */
16892
16893 rtx
16894 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
16895 {
16896   rtvec v;
16897   switch (mode)
16898     {
16899     case V4SImode:
16900       gcc_assert (vect);
16901       v = gen_rtvec (4, value, value, value, value);
16902       return gen_rtx_CONST_VECTOR (V4SImode, v);
16903
16904     case V2DImode:
16905       gcc_assert (vect);
16906       v = gen_rtvec (2, value, value);
16907       return gen_rtx_CONST_VECTOR (V2DImode, v);
16908
16909     case V8SFmode:
16910       if (vect)
16911         v = gen_rtvec (8, value, value, value, value,
16912                        value, value, value, value);
16913       else
16914         v = gen_rtvec (8, value, CONST0_RTX (SFmode),
16915                        CONST0_RTX (SFmode), CONST0_RTX (SFmode),
16916                        CONST0_RTX (SFmode), CONST0_RTX (SFmode),
16917                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
16918       return gen_rtx_CONST_VECTOR (V8SFmode, v);
16919
16920     case V4SFmode:
16921       if (vect)
16922         v = gen_rtvec (4, value, value, value, value);
16923       else
16924         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
16925                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
16926       return gen_rtx_CONST_VECTOR (V4SFmode, v);
16927
16928     case V4DFmode:
16929       if (vect)
16930         v = gen_rtvec (4, value, value, value, value);
16931       else
16932         v = gen_rtvec (4, value, CONST0_RTX (DFmode),
16933                        CONST0_RTX (DFmode), CONST0_RTX (DFmode));
16934       return gen_rtx_CONST_VECTOR (V4DFmode, v);
16935
16936     case V2DFmode:
16937       if (vect)
16938         v = gen_rtvec (2, value, value);
16939       else
16940         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
16941       return gen_rtx_CONST_VECTOR (V2DFmode, v);
16942
16943     default:
16944       gcc_unreachable ();
16945     }
16946 }
16947
16948 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
16949    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
16950    for an SSE register.  If VECT is true, then replicate the mask for
16951    all elements of the vector register.  If INVERT is true, then create
16952    a mask excluding the sign bit.  */
16953
16954 rtx
16955 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
16956 {
16957   enum machine_mode vec_mode, imode;
16958   HOST_WIDE_INT hi, lo;
16959   int shift = 63;
16960   rtx v;
16961   rtx mask;
16962
16963   /* Find the sign bit, sign extended to 2*HWI.  */
16964   switch (mode)
16965     {
16966     case V4SImode:
16967     case V8SFmode:
16968     case V4SFmode:
16969       vec_mode = mode;
16970       mode = GET_MODE_INNER (mode);
16971       imode = SImode;
16972       lo = 0x80000000, hi = lo < 0;
16973       break;
16974
16975     case V2DImode:
16976     case V4DFmode:
16977     case V2DFmode:
16978       vec_mode = mode;
16979       mode = GET_MODE_INNER (mode);
16980       imode = DImode;
16981       if (HOST_BITS_PER_WIDE_INT >= 64)
16982         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
16983       else
16984         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
16985       break;
16986
16987     case TImode:
16988     case TFmode:
16989       vec_mode = VOIDmode;
16990       if (HOST_BITS_PER_WIDE_INT >= 64)
16991         {
16992           imode = TImode;
16993           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
16994         }
16995       else
16996         {
16997           rtvec vec;
16998
16999           imode = DImode;
17000           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
17001
17002           if (invert)
17003             {
17004               lo = ~lo, hi = ~hi;
17005               v = constm1_rtx;
17006             }
17007           else
17008             v = const0_rtx;
17009
17010           mask = immed_double_const (lo, hi, imode);
17011
17012           vec = gen_rtvec (2, v, mask);
17013           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
17014           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
17015
17016           return v;
17017         }
17018      break;
17019
17020     default:
17021       gcc_unreachable ();
17022     }
17023
17024   if (invert)
17025     lo = ~lo, hi = ~hi;
17026
17027   /* Force this value into the low part of a fp vector constant.  */
17028   mask = immed_double_const (lo, hi, imode);
17029   mask = gen_lowpart (mode, mask);
17030
17031   if (vec_mode == VOIDmode)
17032     return force_reg (mode, mask);
17033
17034   v = ix86_build_const_vector (vec_mode, vect, mask);
17035   return force_reg (vec_mode, v);
17036 }
17037
17038 /* Generate code for floating point ABS or NEG.  */
17039
17040 void
17041 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
17042                                 rtx operands[])
17043 {
17044   rtx mask, set, dst, src;
17045   bool use_sse = false;
17046   bool vector_mode = VECTOR_MODE_P (mode);
17047   enum machine_mode vmode = mode;
17048
17049   if (vector_mode)
17050     use_sse = true;
17051   else if (mode == TFmode)
17052     use_sse = true;
17053   else if (TARGET_SSE_MATH)
17054     {
17055       use_sse = SSE_FLOAT_MODE_P (mode);
17056       if (mode == SFmode)
17057         vmode = V4SFmode;
17058       else if (mode == DFmode)
17059         vmode = V2DFmode;
17060     }
17061
17062   /* NEG and ABS performed with SSE use bitwise mask operations.
17063      Create the appropriate mask now.  */
17064   if (use_sse)
17065     mask = ix86_build_signbit_mask (vmode, vector_mode, code == ABS);
17066   else
17067     mask = NULL_RTX;
17068
17069   dst = operands[0];
17070   src = operands[1];
17071
17072   set = gen_rtx_fmt_e (code, mode, src);
17073   set = gen_rtx_SET (VOIDmode, dst, set);
17074
17075   if (mask)
17076     {
17077       rtx use, clob;
17078       rtvec par;
17079
17080       use = gen_rtx_USE (VOIDmode, mask);
17081       if (vector_mode)
17082         par = gen_rtvec (2, set, use);
17083       else
17084         {
17085           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
17086           par = gen_rtvec (3, set, use, clob);
17087         }
17088       emit_insn (gen_rtx_PARALLEL (VOIDmode, par));
17089     }
17090   else
17091     emit_insn (set);
17092 }
17093
17094 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
17095
17096 void
17097 ix86_expand_copysign (rtx operands[])
17098 {
17099   enum machine_mode mode, vmode;
17100   rtx dest, op0, op1, mask, nmask;
17101
17102   dest = operands[0];
17103   op0 = operands[1];
17104   op1 = operands[2];
17105
17106   mode = GET_MODE (dest);
17107
17108   if (mode == SFmode)
17109     vmode = V4SFmode;
17110   else if (mode == DFmode)
17111     vmode = V2DFmode;
17112   else
17113     vmode = mode;
17114
17115   if (GET_CODE (op0) == CONST_DOUBLE)
17116     {
17117       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
17118
17119       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
17120         op0 = simplify_unary_operation (ABS, mode, op0, mode);
17121
17122       if (mode == SFmode || mode == DFmode)
17123         {
17124           if (op0 == CONST0_RTX (mode))
17125             op0 = CONST0_RTX (vmode);
17126           else
17127             {
17128               rtx v = ix86_build_const_vector (vmode, false, op0);
17129
17130               op0 = force_reg (vmode, v);
17131             }
17132         }
17133       else if (op0 != CONST0_RTX (mode))
17134         op0 = force_reg (mode, op0);
17135
17136       mask = ix86_build_signbit_mask (vmode, 0, 0);
17137
17138       if (mode == SFmode)
17139         copysign_insn = gen_copysignsf3_const;
17140       else if (mode == DFmode)
17141         copysign_insn = gen_copysigndf3_const;
17142       else
17143         copysign_insn = gen_copysigntf3_const;
17144
17145         emit_insn (copysign_insn (dest, op0, op1, mask));
17146     }
17147   else
17148     {
17149       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
17150
17151       nmask = ix86_build_signbit_mask (vmode, 0, 1);
17152       mask = ix86_build_signbit_mask (vmode, 0, 0);
17153
17154       if (mode == SFmode)
17155         copysign_insn = gen_copysignsf3_var;
17156       else if (mode == DFmode)
17157         copysign_insn = gen_copysigndf3_var;
17158       else
17159         copysign_insn = gen_copysigntf3_var;
17160
17161       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
17162     }
17163 }
17164
17165 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
17166    be a constant, and so has already been expanded into a vector constant.  */
17167
17168 void
17169 ix86_split_copysign_const (rtx operands[])
17170 {
17171   enum machine_mode mode, vmode;
17172   rtx dest, op0, mask, x;
17173
17174   dest = operands[0];
17175   op0 = operands[1];
17176   mask = operands[3];
17177
17178   mode = GET_MODE (dest);
17179   vmode = GET_MODE (mask);
17180
17181   dest = simplify_gen_subreg (vmode, dest, mode, 0);
17182   x = gen_rtx_AND (vmode, dest, mask);
17183   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17184
17185   if (op0 != CONST0_RTX (vmode))
17186     {
17187       x = gen_rtx_IOR (vmode, dest, op0);
17188       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17189     }
17190 }
17191
17192 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
17193    so we have to do two masks.  */
17194
17195 void
17196 ix86_split_copysign_var (rtx operands[])
17197 {
17198   enum machine_mode mode, vmode;
17199   rtx dest, scratch, op0, op1, mask, nmask, x;
17200
17201   dest = operands[0];
17202   scratch = operands[1];
17203   op0 = operands[2];
17204   op1 = operands[3];
17205   nmask = operands[4];
17206   mask = operands[5];
17207
17208   mode = GET_MODE (dest);
17209   vmode = GET_MODE (mask);
17210
17211   if (rtx_equal_p (op0, op1))
17212     {
17213       /* Shouldn't happen often (it's useless, obviously), but when it does
17214          we'd generate incorrect code if we continue below.  */
17215       emit_move_insn (dest, op0);
17216       return;
17217     }
17218
17219   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
17220     {
17221       gcc_assert (REGNO (op1) == REGNO (scratch));
17222
17223       x = gen_rtx_AND (vmode, scratch, mask);
17224       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17225
17226       dest = mask;
17227       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
17228       x = gen_rtx_NOT (vmode, dest);
17229       x = gen_rtx_AND (vmode, x, op0);
17230       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17231     }
17232   else
17233     {
17234       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
17235         {
17236           x = gen_rtx_AND (vmode, scratch, mask);
17237         }
17238       else                                              /* alternative 2,4 */
17239         {
17240           gcc_assert (REGNO (mask) == REGNO (scratch));
17241           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
17242           x = gen_rtx_AND (vmode, scratch, op1);
17243         }
17244       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17245
17246       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
17247         {
17248           dest = simplify_gen_subreg (vmode, op0, mode, 0);
17249           x = gen_rtx_AND (vmode, dest, nmask);
17250         }
17251       else                                              /* alternative 3,4 */
17252         {
17253           gcc_assert (REGNO (nmask) == REGNO (dest));
17254           dest = nmask;
17255           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
17256           x = gen_rtx_AND (vmode, dest, op0);
17257         }
17258       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17259     }
17260
17261   x = gen_rtx_IOR (vmode, dest, scratch);
17262   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
17263 }
17264
17265 /* Return TRUE or FALSE depending on whether the first SET in INSN
17266    has source and destination with matching CC modes, and that the
17267    CC mode is at least as constrained as REQ_MODE.  */
17268
17269 bool
17270 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
17271 {
17272   rtx set;
17273   enum machine_mode set_mode;
17274
17275   set = PATTERN (insn);
17276   if (GET_CODE (set) == PARALLEL)
17277     set = XVECEXP (set, 0, 0);
17278   gcc_assert (GET_CODE (set) == SET);
17279   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
17280
17281   set_mode = GET_MODE (SET_DEST (set));
17282   switch (set_mode)
17283     {
17284     case CCNOmode:
17285       if (req_mode != CCNOmode
17286           && (req_mode != CCmode
17287               || XEXP (SET_SRC (set), 1) != const0_rtx))
17288         return false;
17289       break;
17290     case CCmode:
17291       if (req_mode == CCGCmode)
17292         return false;
17293       /* FALLTHRU */
17294     case CCGCmode:
17295       if (req_mode == CCGOCmode || req_mode == CCNOmode)
17296         return false;
17297       /* FALLTHRU */
17298     case CCGOCmode:
17299       if (req_mode == CCZmode)
17300         return false;
17301       /* FALLTHRU */
17302     case CCZmode:
17303       break;
17304
17305     case CCAmode:
17306     case CCCmode:
17307     case CCOmode:
17308     case CCSmode:
17309       if (set_mode != req_mode)
17310         return false;
17311       break;
17312
17313     default:
17314       gcc_unreachable ();
17315     }
17316
17317   return GET_MODE (SET_SRC (set)) == set_mode;
17318 }
17319
17320 /* Generate insn patterns to do an integer compare of OPERANDS.  */
17321
17322 static rtx
17323 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
17324 {
17325   enum machine_mode cmpmode;
17326   rtx tmp, flags;
17327
17328   cmpmode = SELECT_CC_MODE (code, op0, op1);
17329   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
17330
17331   /* This is very simple, but making the interface the same as in the
17332      FP case makes the rest of the code easier.  */
17333   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
17334   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
17335
17336   /* Return the test that should be put into the flags user, i.e.
17337      the bcc, scc, or cmov instruction.  */
17338   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
17339 }
17340
17341 /* Figure out whether to use ordered or unordered fp comparisons.
17342    Return the appropriate mode to use.  */
17343
17344 enum machine_mode
17345 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
17346 {
17347   /* ??? In order to make all comparisons reversible, we do all comparisons
17348      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
17349      all forms trapping and nontrapping comparisons, we can make inequality
17350      comparisons trapping again, since it results in better code when using
17351      FCOM based compares.  */
17352   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
17353 }
17354
17355 enum machine_mode
17356 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
17357 {
17358   enum machine_mode mode = GET_MODE (op0);
17359
17360   if (SCALAR_FLOAT_MODE_P (mode))
17361     {
17362       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
17363       return ix86_fp_compare_mode (code);
17364     }
17365
17366   switch (code)
17367     {
17368       /* Only zero flag is needed.  */
17369     case EQ:                    /* ZF=0 */
17370     case NE:                    /* ZF!=0 */
17371       return CCZmode;
17372       /* Codes needing carry flag.  */
17373     case GEU:                   /* CF=0 */
17374     case LTU:                   /* CF=1 */
17375       /* Detect overflow checks.  They need just the carry flag.  */
17376       if (GET_CODE (op0) == PLUS
17377           && rtx_equal_p (op1, XEXP (op0, 0)))
17378         return CCCmode;
17379       else
17380         return CCmode;
17381     case GTU:                   /* CF=0 & ZF=0 */
17382     case LEU:                   /* CF=1 | ZF=1 */
17383       /* Detect overflow checks.  They need just the carry flag.  */
17384       if (GET_CODE (op0) == MINUS
17385           && rtx_equal_p (op1, XEXP (op0, 0)))
17386         return CCCmode;
17387       else
17388         return CCmode;
17389       /* Codes possibly doable only with sign flag when
17390          comparing against zero.  */
17391     case GE:                    /* SF=OF   or   SF=0 */
17392     case LT:                    /* SF<>OF  or   SF=1 */
17393       if (op1 == const0_rtx)
17394         return CCGOCmode;
17395       else
17396         /* For other cases Carry flag is not required.  */
17397         return CCGCmode;
17398       /* Codes doable only with sign flag when comparing
17399          against zero, but we miss jump instruction for it
17400          so we need to use relational tests against overflow
17401          that thus needs to be zero.  */
17402     case GT:                    /* ZF=0 & SF=OF */
17403     case LE:                    /* ZF=1 | SF<>OF */
17404       if (op1 == const0_rtx)
17405         return CCNOmode;
17406       else
17407         return CCGCmode;
17408       /* strcmp pattern do (use flags) and combine may ask us for proper
17409          mode.  */
17410     case USE:
17411       return CCmode;
17412     default:
17413       gcc_unreachable ();
17414     }
17415 }
17416
17417 /* Return the fixed registers used for condition codes.  */
17418
17419 static bool
17420 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
17421 {
17422   *p1 = FLAGS_REG;
17423   *p2 = FPSR_REG;
17424   return true;
17425 }
17426
17427 /* If two condition code modes are compatible, return a condition code
17428    mode which is compatible with both.  Otherwise, return
17429    VOIDmode.  */
17430
17431 static enum machine_mode
17432 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
17433 {
17434   if (m1 == m2)
17435     return m1;
17436
17437   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
17438     return VOIDmode;
17439
17440   if ((m1 == CCGCmode && m2 == CCGOCmode)
17441       || (m1 == CCGOCmode && m2 == CCGCmode))
17442     return CCGCmode;
17443
17444   switch (m1)
17445     {
17446     default:
17447       gcc_unreachable ();
17448
17449     case CCmode:
17450     case CCGCmode:
17451     case CCGOCmode:
17452     case CCNOmode:
17453     case CCAmode:
17454     case CCCmode:
17455     case CCOmode:
17456     case CCSmode:
17457     case CCZmode:
17458       switch (m2)
17459         {
17460         default:
17461           return VOIDmode;
17462
17463         case CCmode:
17464         case CCGCmode:
17465         case CCGOCmode:
17466         case CCNOmode:
17467         case CCAmode:
17468         case CCCmode:
17469         case CCOmode:
17470         case CCSmode:
17471         case CCZmode:
17472           return CCmode;
17473         }
17474
17475     case CCFPmode:
17476     case CCFPUmode:
17477       /* These are only compatible with themselves, which we already
17478          checked above.  */
17479       return VOIDmode;
17480     }
17481 }
17482
17483
17484 /* Return a comparison we can do and that it is equivalent to
17485    swap_condition (code) apart possibly from orderedness.
17486    But, never change orderedness if TARGET_IEEE_FP, returning
17487    UNKNOWN in that case if necessary.  */
17488
17489 static enum rtx_code
17490 ix86_fp_swap_condition (enum rtx_code code)
17491 {
17492   switch (code)
17493     {
17494     case GT:                   /* GTU - CF=0 & ZF=0 */
17495       return TARGET_IEEE_FP ? UNKNOWN : UNLT;
17496     case GE:                   /* GEU - CF=0 */
17497       return TARGET_IEEE_FP ? UNKNOWN : UNLE;
17498     case UNLT:                 /* LTU - CF=1 */
17499       return TARGET_IEEE_FP ? UNKNOWN : GT;
17500     case UNLE:                 /* LEU - CF=1 | ZF=1 */
17501       return TARGET_IEEE_FP ? UNKNOWN : GE;
17502     default:
17503       return swap_condition (code);
17504     }
17505 }
17506
17507 /* Return cost of comparison CODE using the best strategy for performance.
17508    All following functions do use number of instructions as a cost metrics.
17509    In future this should be tweaked to compute bytes for optimize_size and
17510    take into account performance of various instructions on various CPUs.  */
17511
17512 static int
17513 ix86_fp_comparison_cost (enum rtx_code code)
17514 {
17515   int arith_cost;
17516
17517   /* The cost of code using bit-twiddling on %ah.  */
17518   switch (code)
17519     {
17520     case UNLE:
17521     case UNLT:
17522     case LTGT:
17523     case GT:
17524     case GE:
17525     case UNORDERED:
17526     case ORDERED:
17527     case UNEQ:
17528       arith_cost = 4;
17529       break;
17530     case LT:
17531     case NE:
17532     case EQ:
17533     case UNGE:
17534       arith_cost = TARGET_IEEE_FP ? 5 : 4;
17535       break;
17536     case LE:
17537     case UNGT:
17538       arith_cost = TARGET_IEEE_FP ? 6 : 4;
17539       break;
17540     default:
17541       gcc_unreachable ();
17542     }
17543
17544   switch (ix86_fp_comparison_strategy (code))
17545     {
17546     case IX86_FPCMP_COMI:
17547       return arith_cost > 4 ? 3 : 2;
17548     case IX86_FPCMP_SAHF:
17549       return arith_cost > 4 ? 4 : 3;
17550     default:
17551       return arith_cost;
17552     }
17553 }
17554
17555 /* Return strategy to use for floating-point.  We assume that fcomi is always
17556    preferrable where available, since that is also true when looking at size
17557    (2 bytes, vs. 3 for fnstsw+sahf and at least 5 for fnstsw+test).  */
17558
17559 enum ix86_fpcmp_strategy
17560 ix86_fp_comparison_strategy (enum rtx_code code ATTRIBUTE_UNUSED)
17561 {
17562   /* Do fcomi/sahf based test when profitable.  */
17563
17564   if (TARGET_CMOVE)
17565     return IX86_FPCMP_COMI;
17566
17567   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_function_for_size_p (cfun)))
17568     return IX86_FPCMP_SAHF;
17569
17570   return IX86_FPCMP_ARITH;
17571 }
17572
17573 /* Swap, force into registers, or otherwise massage the two operands
17574    to a fp comparison.  The operands are updated in place; the new
17575    comparison code is returned.  */
17576
17577 static enum rtx_code
17578 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
17579 {
17580   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
17581   rtx op0 = *pop0, op1 = *pop1;
17582   enum machine_mode op_mode = GET_MODE (op0);
17583   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
17584
17585   /* All of the unordered compare instructions only work on registers.
17586      The same is true of the fcomi compare instructions.  The XFmode
17587      compare instructions require registers except when comparing
17588      against zero or when converting operand 1 from fixed point to
17589      floating point.  */
17590
17591   if (!is_sse
17592       && (fpcmp_mode == CCFPUmode
17593           || (op_mode == XFmode
17594               && ! (standard_80387_constant_p (op0) == 1
17595                     || standard_80387_constant_p (op1) == 1)
17596               && GET_CODE (op1) != FLOAT)
17597           || ix86_fp_comparison_strategy (code) == IX86_FPCMP_COMI))
17598     {
17599       op0 = force_reg (op_mode, op0);
17600       op1 = force_reg (op_mode, op1);
17601     }
17602   else
17603     {
17604       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
17605          things around if they appear profitable, otherwise force op0
17606          into a register.  */
17607
17608       if (standard_80387_constant_p (op0) == 0
17609           || (MEM_P (op0)
17610               && ! (standard_80387_constant_p (op1) == 0
17611                     || MEM_P (op1))))
17612         {
17613           enum rtx_code new_code = ix86_fp_swap_condition (code);
17614           if (new_code != UNKNOWN)
17615             {
17616               rtx tmp;
17617               tmp = op0, op0 = op1, op1 = tmp;
17618               code = new_code;
17619             }
17620         }
17621
17622       if (!REG_P (op0))
17623         op0 = force_reg (op_mode, op0);
17624
17625       if (CONSTANT_P (op1))
17626         {
17627           int tmp = standard_80387_constant_p (op1);
17628           if (tmp == 0)
17629             op1 = validize_mem (force_const_mem (op_mode, op1));
17630           else if (tmp == 1)
17631             {
17632               if (TARGET_CMOVE)
17633                 op1 = force_reg (op_mode, op1);
17634             }
17635           else
17636             op1 = force_reg (op_mode, op1);
17637         }
17638     }
17639
17640   /* Try to rearrange the comparison to make it cheaper.  */
17641   if (ix86_fp_comparison_cost (code)
17642       > ix86_fp_comparison_cost (swap_condition (code))
17643       && (REG_P (op1) || can_create_pseudo_p ()))
17644     {
17645       rtx tmp;
17646       tmp = op0, op0 = op1, op1 = tmp;
17647       code = swap_condition (code);
17648       if (!REG_P (op0))
17649         op0 = force_reg (op_mode, op0);
17650     }
17651
17652   *pop0 = op0;
17653   *pop1 = op1;
17654   return code;
17655 }
17656
17657 /* Convert comparison codes we use to represent FP comparison to integer
17658    code that will result in proper branch.  Return UNKNOWN if no such code
17659    is available.  */
17660
17661 enum rtx_code
17662 ix86_fp_compare_code_to_integer (enum rtx_code code)
17663 {
17664   switch (code)
17665     {
17666     case GT:
17667       return GTU;
17668     case GE:
17669       return GEU;
17670     case ORDERED:
17671     case UNORDERED:
17672       return code;
17673       break;
17674     case UNEQ:
17675       return EQ;
17676       break;
17677     case UNLT:
17678       return LTU;
17679       break;
17680     case UNLE:
17681       return LEU;
17682       break;
17683     case LTGT:
17684       return NE;
17685       break;
17686     default:
17687       return UNKNOWN;
17688     }
17689 }
17690
17691 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
17692
17693 static rtx
17694 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch)
17695 {
17696   enum machine_mode fpcmp_mode, intcmp_mode;
17697   rtx tmp, tmp2;
17698
17699   fpcmp_mode = ix86_fp_compare_mode (code);
17700   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
17701
17702   /* Do fcomi/sahf based test when profitable.  */
17703   switch (ix86_fp_comparison_strategy (code))
17704     {
17705     case IX86_FPCMP_COMI:
17706       intcmp_mode = fpcmp_mode;
17707       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17708       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
17709                          tmp);
17710       emit_insn (tmp);
17711       break;
17712
17713     case IX86_FPCMP_SAHF:
17714       intcmp_mode = fpcmp_mode;
17715       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17716       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
17717                          tmp);
17718
17719       if (!scratch)
17720         scratch = gen_reg_rtx (HImode);
17721       tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
17722       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
17723       break;
17724
17725     case IX86_FPCMP_ARITH:
17726       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
17727       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
17728       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
17729       if (!scratch)
17730         scratch = gen_reg_rtx (HImode);
17731       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
17732
17733       /* In the unordered case, we have to check C2 for NaN's, which
17734          doesn't happen to work out to anything nice combination-wise.
17735          So do some bit twiddling on the value we've got in AH to come
17736          up with an appropriate set of condition codes.  */
17737
17738       intcmp_mode = CCNOmode;
17739       switch (code)
17740         {
17741         case GT:
17742         case UNGT:
17743           if (code == GT || !TARGET_IEEE_FP)
17744             {
17745               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
17746               code = EQ;
17747             }
17748           else
17749             {
17750               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17751               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
17752               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
17753               intcmp_mode = CCmode;
17754               code = GEU;
17755             }
17756           break;
17757         case LT:
17758         case UNLT:
17759           if (code == LT && TARGET_IEEE_FP)
17760             {
17761               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17762               emit_insn (gen_cmpqi_ext_3 (scratch, const1_rtx));
17763               intcmp_mode = CCmode;
17764               code = EQ;
17765             }
17766           else
17767             {
17768               emit_insn (gen_testqi_ext_ccno_0 (scratch, const1_rtx));
17769               code = NE;
17770             }
17771           break;
17772         case GE:
17773         case UNGE:
17774           if (code == GE || !TARGET_IEEE_FP)
17775             {
17776               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
17777               code = EQ;
17778             }
17779           else
17780             {
17781               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17782               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch, const1_rtx));
17783               code = NE;
17784             }
17785           break;
17786         case LE:
17787         case UNLE:
17788           if (code == LE && TARGET_IEEE_FP)
17789             {
17790               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17791               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
17792               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
17793               intcmp_mode = CCmode;
17794               code = LTU;
17795             }
17796           else
17797             {
17798               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
17799               code = NE;
17800             }
17801           break;
17802         case EQ:
17803         case UNEQ:
17804           if (code == EQ && TARGET_IEEE_FP)
17805             {
17806               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17807               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
17808               intcmp_mode = CCmode;
17809               code = EQ;
17810             }
17811           else
17812             {
17813               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
17814               code = NE;
17815             }
17816           break;
17817         case NE:
17818         case LTGT:
17819           if (code == NE && TARGET_IEEE_FP)
17820             {
17821               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
17822               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
17823                                              GEN_INT (0x40)));
17824               code = NE;
17825             }
17826           else
17827             {
17828               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
17829               code = EQ;
17830             }
17831           break;
17832
17833         case UNORDERED:
17834           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
17835           code = NE;
17836           break;
17837         case ORDERED:
17838           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
17839           code = EQ;
17840           break;
17841
17842         default:
17843           gcc_unreachable ();
17844         }
17845         break;
17846
17847     default:
17848       gcc_unreachable();
17849     }
17850
17851   /* Return the test that should be put into the flags user, i.e.
17852      the bcc, scc, or cmov instruction.  */
17853   return gen_rtx_fmt_ee (code, VOIDmode,
17854                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
17855                          const0_rtx);
17856 }
17857
17858 static rtx
17859 ix86_expand_compare (enum rtx_code code, rtx op0, rtx op1)
17860 {
17861   rtx ret;
17862
17863   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
17864     ret = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
17865
17866   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
17867     {
17868       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
17869       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
17870     }
17871   else
17872     ret = ix86_expand_int_compare (code, op0, op1);
17873
17874   return ret;
17875 }
17876
17877 void
17878 ix86_expand_branch (enum rtx_code code, rtx op0, rtx op1, rtx label)
17879 {
17880   enum machine_mode mode = GET_MODE (op0);
17881   rtx tmp;
17882
17883   switch (mode)
17884     {
17885     case SFmode:
17886     case DFmode:
17887     case XFmode:
17888     case QImode:
17889     case HImode:
17890     case SImode:
17891       simple:
17892       tmp = ix86_expand_compare (code, op0, op1);
17893       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
17894                                   gen_rtx_LABEL_REF (VOIDmode, label),
17895                                   pc_rtx);
17896       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
17897       return;
17898
17899     case DImode:
17900       if (TARGET_64BIT)
17901         goto simple;
17902     case TImode:
17903       /* Expand DImode branch into multiple compare+branch.  */
17904       {
17905         rtx lo[2], hi[2], label2;
17906         enum rtx_code code1, code2, code3;
17907         enum machine_mode submode;
17908
17909         if (CONSTANT_P (op0) && !CONSTANT_P (op1))
17910           {
17911             tmp = op0, op0 = op1, op1 = tmp;
17912             code = swap_condition (code);
17913           }
17914
17915         split_double_mode (mode, &op0, 1, lo+0, hi+0);
17916         split_double_mode (mode, &op1, 1, lo+1, hi+1);
17917
17918         submode = mode == DImode ? SImode : DImode;
17919
17920         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
17921            avoid two branches.  This costs one extra insn, so disable when
17922            optimizing for size.  */
17923
17924         if ((code == EQ || code == NE)
17925             && (!optimize_insn_for_size_p ()
17926                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
17927           {
17928             rtx xor0, xor1;
17929
17930             xor1 = hi[0];
17931             if (hi[1] != const0_rtx)
17932               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
17933                                    NULL_RTX, 0, OPTAB_WIDEN);
17934
17935             xor0 = lo[0];
17936             if (lo[1] != const0_rtx)
17937               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
17938                                    NULL_RTX, 0, OPTAB_WIDEN);
17939
17940             tmp = expand_binop (submode, ior_optab, xor1, xor0,
17941                                 NULL_RTX, 0, OPTAB_WIDEN);
17942
17943             ix86_expand_branch (code, tmp, const0_rtx, label);
17944             return;
17945           }
17946
17947         /* Otherwise, if we are doing less-than or greater-or-equal-than,
17948            op1 is a constant and the low word is zero, then we can just
17949            examine the high word.  Similarly for low word -1 and
17950            less-or-equal-than or greater-than.  */
17951
17952         if (CONST_INT_P (hi[1]))
17953           switch (code)
17954             {
17955             case LT: case LTU: case GE: case GEU:
17956               if (lo[1] == const0_rtx)
17957                 {
17958                   ix86_expand_branch (code, hi[0], hi[1], label);
17959                   return;
17960                 }
17961               break;
17962             case LE: case LEU: case GT: case GTU:
17963               if (lo[1] == constm1_rtx)
17964                 {
17965                   ix86_expand_branch (code, hi[0], hi[1], label);
17966                   return;
17967                 }
17968               break;
17969             default:
17970               break;
17971             }
17972
17973         /* Otherwise, we need two or three jumps.  */
17974
17975         label2 = gen_label_rtx ();
17976
17977         code1 = code;
17978         code2 = swap_condition (code);
17979         code3 = unsigned_condition (code);
17980
17981         switch (code)
17982           {
17983           case LT: case GT: case LTU: case GTU:
17984             break;
17985
17986           case LE:   code1 = LT;  code2 = GT;  break;
17987           case GE:   code1 = GT;  code2 = LT;  break;
17988           case LEU:  code1 = LTU; code2 = GTU; break;
17989           case GEU:  code1 = GTU; code2 = LTU; break;
17990
17991           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
17992           case NE:   code2 = UNKNOWN; break;
17993
17994           default:
17995             gcc_unreachable ();
17996           }
17997
17998         /*
17999          * a < b =>
18000          *    if (hi(a) < hi(b)) goto true;
18001          *    if (hi(a) > hi(b)) goto false;
18002          *    if (lo(a) < lo(b)) goto true;
18003          *  false:
18004          */
18005
18006         if (code1 != UNKNOWN)
18007           ix86_expand_branch (code1, hi[0], hi[1], label);
18008         if (code2 != UNKNOWN)
18009           ix86_expand_branch (code2, hi[0], hi[1], label2);
18010
18011         ix86_expand_branch (code3, lo[0], lo[1], label);
18012
18013         if (code2 != UNKNOWN)
18014           emit_label (label2);
18015         return;
18016       }
18017
18018     default:
18019       gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC);
18020       goto simple;
18021     }
18022 }
18023
18024 /* Split branch based on floating point condition.  */
18025 void
18026 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
18027                       rtx target1, rtx target2, rtx tmp, rtx pushed)
18028 {
18029   rtx condition;
18030   rtx i;
18031
18032   if (target2 != pc_rtx)
18033     {
18034       rtx tmp = target2;
18035       code = reverse_condition_maybe_unordered (code);
18036       target2 = target1;
18037       target1 = tmp;
18038     }
18039
18040   condition = ix86_expand_fp_compare (code, op1, op2,
18041                                       tmp);
18042
18043   /* Remove pushed operand from stack.  */
18044   if (pushed)
18045     ix86_free_from_memory (GET_MODE (pushed));
18046
18047   i = emit_jump_insn (gen_rtx_SET
18048                       (VOIDmode, pc_rtx,
18049                        gen_rtx_IF_THEN_ELSE (VOIDmode,
18050                                              condition, target1, target2)));
18051   if (split_branch_probability >= 0)
18052     add_reg_note (i, REG_BR_PROB, GEN_INT (split_branch_probability));
18053 }
18054
18055 void
18056 ix86_expand_setcc (rtx dest, enum rtx_code code, rtx op0, rtx op1)
18057 {
18058   rtx ret;
18059
18060   gcc_assert (GET_MODE (dest) == QImode);
18061
18062   ret = ix86_expand_compare (code, op0, op1);
18063   PUT_MODE (ret, QImode);
18064   emit_insn (gen_rtx_SET (VOIDmode, dest, ret));
18065 }
18066
18067 /* Expand comparison setting or clearing carry flag.  Return true when
18068    successful and set pop for the operation.  */
18069 static bool
18070 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
18071 {
18072   enum machine_mode mode =
18073     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
18074
18075   /* Do not handle double-mode compares that go through special path.  */
18076   if (mode == (TARGET_64BIT ? TImode : DImode))
18077     return false;
18078
18079   if (SCALAR_FLOAT_MODE_P (mode))
18080     {
18081       rtx compare_op, compare_seq;
18082
18083       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
18084
18085       /* Shortcut:  following common codes never translate
18086          into carry flag compares.  */
18087       if (code == EQ || code == NE || code == UNEQ || code == LTGT
18088           || code == ORDERED || code == UNORDERED)
18089         return false;
18090
18091       /* These comparisons require zero flag; swap operands so they won't.  */
18092       if ((code == GT || code == UNLE || code == LE || code == UNGT)
18093           && !TARGET_IEEE_FP)
18094         {
18095           rtx tmp = op0;
18096           op0 = op1;
18097           op1 = tmp;
18098           code = swap_condition (code);
18099         }
18100
18101       /* Try to expand the comparison and verify that we end up with
18102          carry flag based comparison.  This fails to be true only when
18103          we decide to expand comparison using arithmetic that is not
18104          too common scenario.  */
18105       start_sequence ();
18106       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
18107       compare_seq = get_insns ();
18108       end_sequence ();
18109
18110       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
18111           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
18112         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
18113       else
18114         code = GET_CODE (compare_op);
18115
18116       if (code != LTU && code != GEU)
18117         return false;
18118
18119       emit_insn (compare_seq);
18120       *pop = compare_op;
18121       return true;
18122     }
18123
18124   if (!INTEGRAL_MODE_P (mode))
18125     return false;
18126
18127   switch (code)
18128     {
18129     case LTU:
18130     case GEU:
18131       break;
18132
18133     /* Convert a==0 into (unsigned)a<1.  */
18134     case EQ:
18135     case NE:
18136       if (op1 != const0_rtx)
18137         return false;
18138       op1 = const1_rtx;
18139       code = (code == EQ ? LTU : GEU);
18140       break;
18141
18142     /* Convert a>b into b<a or a>=b-1.  */
18143     case GTU:
18144     case LEU:
18145       if (CONST_INT_P (op1))
18146         {
18147           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
18148           /* Bail out on overflow.  We still can swap operands but that
18149              would force loading of the constant into register.  */
18150           if (op1 == const0_rtx
18151               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
18152             return false;
18153           code = (code == GTU ? GEU : LTU);
18154         }
18155       else
18156         {
18157           rtx tmp = op1;
18158           op1 = op0;
18159           op0 = tmp;
18160           code = (code == GTU ? LTU : GEU);
18161         }
18162       break;
18163
18164     /* Convert a>=0 into (unsigned)a<0x80000000.  */
18165     case LT:
18166     case GE:
18167       if (mode == DImode || op1 != const0_rtx)
18168         return false;
18169       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
18170       code = (code == LT ? GEU : LTU);
18171       break;
18172     case LE:
18173     case GT:
18174       if (mode == DImode || op1 != constm1_rtx)
18175         return false;
18176       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
18177       code = (code == LE ? GEU : LTU);
18178       break;
18179
18180     default:
18181       return false;
18182     }
18183   /* Swapping operands may cause constant to appear as first operand.  */
18184   if (!nonimmediate_operand (op0, VOIDmode))
18185     {
18186       if (!can_create_pseudo_p ())
18187         return false;
18188       op0 = force_reg (mode, op0);
18189     }
18190   *pop = ix86_expand_compare (code, op0, op1);
18191   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
18192   return true;
18193 }
18194
18195 bool
18196 ix86_expand_int_movcc (rtx operands[])
18197 {
18198   enum rtx_code code = GET_CODE (operands[1]), compare_code;
18199   rtx compare_seq, compare_op;
18200   enum machine_mode mode = GET_MODE (operands[0]);
18201   bool sign_bit_compare_p = false;
18202   rtx op0 = XEXP (operands[1], 0);
18203   rtx op1 = XEXP (operands[1], 1);
18204
18205   start_sequence ();
18206   compare_op = ix86_expand_compare (code, op0, op1);
18207   compare_seq = get_insns ();
18208   end_sequence ();
18209
18210   compare_code = GET_CODE (compare_op);
18211
18212   if ((op1 == const0_rtx && (code == GE || code == LT))
18213       || (op1 == constm1_rtx && (code == GT || code == LE)))
18214     sign_bit_compare_p = true;
18215
18216   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
18217      HImode insns, we'd be swallowed in word prefix ops.  */
18218
18219   if ((mode != HImode || TARGET_FAST_PREFIX)
18220       && (mode != (TARGET_64BIT ? TImode : DImode))
18221       && CONST_INT_P (operands[2])
18222       && CONST_INT_P (operands[3]))
18223     {
18224       rtx out = operands[0];
18225       HOST_WIDE_INT ct = INTVAL (operands[2]);
18226       HOST_WIDE_INT cf = INTVAL (operands[3]);
18227       HOST_WIDE_INT diff;
18228
18229       diff = ct - cf;
18230       /*  Sign bit compares are better done using shifts than we do by using
18231           sbb.  */
18232       if (sign_bit_compare_p
18233           || ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
18234         {
18235           /* Detect overlap between destination and compare sources.  */
18236           rtx tmp = out;
18237
18238           if (!sign_bit_compare_p)
18239             {
18240               rtx flags;
18241               bool fpcmp = false;
18242
18243               compare_code = GET_CODE (compare_op);
18244
18245               flags = XEXP (compare_op, 0);
18246
18247               if (GET_MODE (flags) == CCFPmode
18248                   || GET_MODE (flags) == CCFPUmode)
18249                 {
18250                   fpcmp = true;
18251                   compare_code
18252                     = ix86_fp_compare_code_to_integer (compare_code);
18253                 }
18254
18255               /* To simplify rest of code, restrict to the GEU case.  */
18256               if (compare_code == LTU)
18257                 {
18258                   HOST_WIDE_INT tmp = ct;
18259                   ct = cf;
18260                   cf = tmp;
18261                   compare_code = reverse_condition (compare_code);
18262                   code = reverse_condition (code);
18263                 }
18264               else
18265                 {
18266                   if (fpcmp)
18267                     PUT_CODE (compare_op,
18268                               reverse_condition_maybe_unordered
18269                                 (GET_CODE (compare_op)));
18270                   else
18271                     PUT_CODE (compare_op,
18272                               reverse_condition (GET_CODE (compare_op)));
18273                 }
18274               diff = ct - cf;
18275
18276               if (reg_overlap_mentioned_p (out, op0)
18277                   || reg_overlap_mentioned_p (out, op1))
18278                 tmp = gen_reg_rtx (mode);
18279
18280               if (mode == DImode)
18281                 emit_insn (gen_x86_movdicc_0_m1 (tmp, flags, compare_op));
18282               else
18283                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp),
18284                                                  flags, compare_op));
18285             }
18286           else
18287             {
18288               if (code == GT || code == GE)
18289                 code = reverse_condition (code);
18290               else
18291                 {
18292                   HOST_WIDE_INT tmp = ct;
18293                   ct = cf;
18294                   cf = tmp;
18295                   diff = ct - cf;
18296                 }
18297               tmp = emit_store_flag (tmp, code, op0, op1, VOIDmode, 0, -1);
18298             }
18299
18300           if (diff == 1)
18301             {
18302               /*
18303                * cmpl op0,op1
18304                * sbbl dest,dest
18305                * [addl dest, ct]
18306                *
18307                * Size 5 - 8.
18308                */
18309               if (ct)
18310                 tmp = expand_simple_binop (mode, PLUS,
18311                                            tmp, GEN_INT (ct),
18312                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18313             }
18314           else if (cf == -1)
18315             {
18316               /*
18317                * cmpl op0,op1
18318                * sbbl dest,dest
18319                * orl $ct, dest
18320                *
18321                * Size 8.
18322                */
18323               tmp = expand_simple_binop (mode, IOR,
18324                                          tmp, GEN_INT (ct),
18325                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
18326             }
18327           else if (diff == -1 && ct)
18328             {
18329               /*
18330                * cmpl op0,op1
18331                * sbbl dest,dest
18332                * notl dest
18333                * [addl dest, cf]
18334                *
18335                * Size 8 - 11.
18336                */
18337               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
18338               if (cf)
18339                 tmp = expand_simple_binop (mode, PLUS,
18340                                            copy_rtx (tmp), GEN_INT (cf),
18341                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18342             }
18343           else
18344             {
18345               /*
18346                * cmpl op0,op1
18347                * sbbl dest,dest
18348                * [notl dest]
18349                * andl cf - ct, dest
18350                * [addl dest, ct]
18351                *
18352                * Size 8 - 11.
18353                */
18354
18355               if (cf == 0)
18356                 {
18357                   cf = ct;
18358                   ct = 0;
18359                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
18360                 }
18361
18362               tmp = expand_simple_binop (mode, AND,
18363                                          copy_rtx (tmp),
18364                                          gen_int_mode (cf - ct, mode),
18365                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
18366               if (ct)
18367                 tmp = expand_simple_binop (mode, PLUS,
18368                                            copy_rtx (tmp), GEN_INT (ct),
18369                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
18370             }
18371
18372           if (!rtx_equal_p (tmp, out))
18373             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
18374
18375           return true;
18376         }
18377
18378       if (diff < 0)
18379         {
18380           enum machine_mode cmp_mode = GET_MODE (op0);
18381
18382           HOST_WIDE_INT tmp;
18383           tmp = ct, ct = cf, cf = tmp;
18384           diff = -diff;
18385
18386           if (SCALAR_FLOAT_MODE_P (cmp_mode))
18387             {
18388               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
18389
18390               /* We may be reversing unordered compare to normal compare, that
18391                  is not valid in general (we may convert non-trapping condition
18392                  to trapping one), however on i386 we currently emit all
18393                  comparisons unordered.  */
18394               compare_code = reverse_condition_maybe_unordered (compare_code);
18395               code = reverse_condition_maybe_unordered (code);
18396             }
18397           else
18398             {
18399               compare_code = reverse_condition (compare_code);
18400               code = reverse_condition (code);
18401             }
18402         }
18403
18404       compare_code = UNKNOWN;
18405       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
18406           && CONST_INT_P (op1))
18407         {
18408           if (op1 == const0_rtx
18409               && (code == LT || code == GE))
18410             compare_code = code;
18411           else if (op1 == constm1_rtx)
18412             {
18413               if (code == LE)
18414                 compare_code = LT;
18415               else if (code == GT)
18416                 compare_code = GE;
18417             }
18418         }
18419
18420       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
18421       if (compare_code != UNKNOWN
18422           && GET_MODE (op0) == GET_MODE (out)
18423           && (cf == -1 || ct == -1))
18424         {
18425           /* If lea code below could be used, only optimize
18426              if it results in a 2 insn sequence.  */
18427
18428           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
18429                  || diff == 3 || diff == 5 || diff == 9)
18430               || (compare_code == LT && ct == -1)
18431               || (compare_code == GE && cf == -1))
18432             {
18433               /*
18434                * notl op1       (if necessary)
18435                * sarl $31, op1
18436                * orl cf, op1
18437                */
18438               if (ct != -1)
18439                 {
18440                   cf = ct;
18441                   ct = -1;
18442                   code = reverse_condition (code);
18443                 }
18444
18445               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, -1);
18446
18447               out = expand_simple_binop (mode, IOR,
18448                                          out, GEN_INT (cf),
18449                                          out, 1, OPTAB_DIRECT);
18450               if (out != operands[0])
18451                 emit_move_insn (operands[0], out);
18452
18453               return true;
18454             }
18455         }
18456
18457
18458       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
18459            || diff == 3 || diff == 5 || diff == 9)
18460           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
18461           && (mode != DImode
18462               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
18463         {
18464           /*
18465            * xorl dest,dest
18466            * cmpl op1,op2
18467            * setcc dest
18468            * lea cf(dest*(ct-cf)),dest
18469            *
18470            * Size 14.
18471            *
18472            * This also catches the degenerate setcc-only case.
18473            */
18474
18475           rtx tmp;
18476           int nops;
18477
18478           out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, 1);
18479
18480           nops = 0;
18481           /* On x86_64 the lea instruction operates on Pmode, so we need
18482              to get arithmetics done in proper mode to match.  */
18483           if (diff == 1)
18484             tmp = copy_rtx (out);
18485           else
18486             {
18487               rtx out1;
18488               out1 = copy_rtx (out);
18489               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
18490               nops++;
18491               if (diff & 1)
18492                 {
18493                   tmp = gen_rtx_PLUS (mode, tmp, out1);
18494                   nops++;
18495                 }
18496             }
18497           if (cf != 0)
18498             {
18499               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
18500               nops++;
18501             }
18502           if (!rtx_equal_p (tmp, out))
18503             {
18504               if (nops == 1)
18505                 out = force_operand (tmp, copy_rtx (out));
18506               else
18507                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
18508             }
18509           if (!rtx_equal_p (out, operands[0]))
18510             emit_move_insn (operands[0], copy_rtx (out));
18511
18512           return true;
18513         }
18514
18515       /*
18516        * General case:                  Jumpful:
18517        *   xorl dest,dest               cmpl op1, op2
18518        *   cmpl op1, op2                movl ct, dest
18519        *   setcc dest                   jcc 1f
18520        *   decl dest                    movl cf, dest
18521        *   andl (cf-ct),dest            1:
18522        *   addl ct,dest
18523        *
18524        * Size 20.                       Size 14.
18525        *
18526        * This is reasonably steep, but branch mispredict costs are
18527        * high on modern cpus, so consider failing only if optimizing
18528        * for space.
18529        */
18530
18531       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
18532           && BRANCH_COST (optimize_insn_for_speed_p (),
18533                           false) >= 2)
18534         {
18535           if (cf == 0)
18536             {
18537               enum machine_mode cmp_mode = GET_MODE (op0);
18538
18539               cf = ct;
18540               ct = 0;
18541
18542               if (SCALAR_FLOAT_MODE_P (cmp_mode))
18543                 {
18544                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
18545
18546                   /* We may be reversing unordered compare to normal compare,
18547                      that is not valid in general (we may convert non-trapping
18548                      condition to trapping one), however on i386 we currently
18549                      emit all comparisons unordered.  */
18550                   code = reverse_condition_maybe_unordered (code);
18551                 }
18552               else
18553                 {
18554                   code = reverse_condition (code);
18555                   if (compare_code != UNKNOWN)
18556                     compare_code = reverse_condition (compare_code);
18557                 }
18558             }
18559
18560           if (compare_code != UNKNOWN)
18561             {
18562               /* notl op1       (if needed)
18563                  sarl $31, op1
18564                  andl (cf-ct), op1
18565                  addl ct, op1
18566
18567                  For x < 0 (resp. x <= -1) there will be no notl,
18568                  so if possible swap the constants to get rid of the
18569                  complement.
18570                  True/false will be -1/0 while code below (store flag
18571                  followed by decrement) is 0/-1, so the constants need
18572                  to be exchanged once more.  */
18573
18574               if (compare_code == GE || !cf)
18575                 {
18576                   code = reverse_condition (code);
18577                   compare_code = LT;
18578                 }
18579               else
18580                 {
18581                   HOST_WIDE_INT tmp = cf;
18582                   cf = ct;
18583                   ct = tmp;
18584                 }
18585
18586               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, -1);
18587             }
18588           else
18589             {
18590               out = emit_store_flag (out, code, op0, op1, VOIDmode, 0, 1);
18591
18592               out = expand_simple_binop (mode, PLUS, copy_rtx (out),
18593                                          constm1_rtx,
18594                                          copy_rtx (out), 1, OPTAB_DIRECT);
18595             }
18596
18597           out = expand_simple_binop (mode, AND, copy_rtx (out),
18598                                      gen_int_mode (cf - ct, mode),
18599                                      copy_rtx (out), 1, OPTAB_DIRECT);
18600           if (ct)
18601             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
18602                                        copy_rtx (out), 1, OPTAB_DIRECT);
18603           if (!rtx_equal_p (out, operands[0]))
18604             emit_move_insn (operands[0], copy_rtx (out));
18605
18606           return true;
18607         }
18608     }
18609
18610   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
18611     {
18612       /* Try a few things more with specific constants and a variable.  */
18613
18614       optab op;
18615       rtx var, orig_out, out, tmp;
18616
18617       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
18618         return false;
18619
18620       /* If one of the two operands is an interesting constant, load a
18621          constant with the above and mask it in with a logical operation.  */
18622
18623       if (CONST_INT_P (operands[2]))
18624         {
18625           var = operands[3];
18626           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
18627             operands[3] = constm1_rtx, op = and_optab;
18628           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
18629             operands[3] = const0_rtx, op = ior_optab;
18630           else
18631             return false;
18632         }
18633       else if (CONST_INT_P (operands[3]))
18634         {
18635           var = operands[2];
18636           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
18637             operands[2] = constm1_rtx, op = and_optab;
18638           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
18639             operands[2] = const0_rtx, op = ior_optab;
18640           else
18641             return false;
18642         }
18643       else
18644         return false;
18645
18646       orig_out = operands[0];
18647       tmp = gen_reg_rtx (mode);
18648       operands[0] = tmp;
18649
18650       /* Recurse to get the constant loaded.  */
18651       if (ix86_expand_int_movcc (operands) == 0)
18652         return false;
18653
18654       /* Mask in the interesting variable.  */
18655       out = expand_binop (mode, op, var, tmp, orig_out, 0,
18656                           OPTAB_WIDEN);
18657       if (!rtx_equal_p (out, orig_out))
18658         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
18659
18660       return true;
18661     }
18662
18663   /*
18664    * For comparison with above,
18665    *
18666    * movl cf,dest
18667    * movl ct,tmp
18668    * cmpl op1,op2
18669    * cmovcc tmp,dest
18670    *
18671    * Size 15.
18672    */
18673
18674   if (! nonimmediate_operand (operands[2], mode))
18675     operands[2] = force_reg (mode, operands[2]);
18676   if (! nonimmediate_operand (operands[3], mode))
18677     operands[3] = force_reg (mode, operands[3]);
18678
18679   if (! register_operand (operands[2], VOIDmode)
18680       && (mode == QImode
18681           || ! register_operand (operands[3], VOIDmode)))
18682     operands[2] = force_reg (mode, operands[2]);
18683
18684   if (mode == QImode
18685       && ! register_operand (operands[3], VOIDmode))
18686     operands[3] = force_reg (mode, operands[3]);
18687
18688   emit_insn (compare_seq);
18689   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
18690                           gen_rtx_IF_THEN_ELSE (mode,
18691                                                 compare_op, operands[2],
18692                                                 operands[3])));
18693   return true;
18694 }
18695
18696 /* Swap, force into registers, or otherwise massage the two operands
18697    to an sse comparison with a mask result.  Thus we differ a bit from
18698    ix86_prepare_fp_compare_args which expects to produce a flags result.
18699
18700    The DEST operand exists to help determine whether to commute commutative
18701    operators.  The POP0/POP1 operands are updated in place.  The new
18702    comparison code is returned, or UNKNOWN if not implementable.  */
18703
18704 static enum rtx_code
18705 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
18706                                   rtx *pop0, rtx *pop1)
18707 {
18708   rtx tmp;
18709
18710   switch (code)
18711     {
18712     case LTGT:
18713     case UNEQ:
18714       /* We have no LTGT as an operator.  We could implement it with
18715          NE & ORDERED, but this requires an extra temporary.  It's
18716          not clear that it's worth it.  */
18717       return UNKNOWN;
18718
18719     case LT:
18720     case LE:
18721     case UNGT:
18722     case UNGE:
18723       /* These are supported directly.  */
18724       break;
18725
18726     case EQ:
18727     case NE:
18728     case UNORDERED:
18729     case ORDERED:
18730       /* For commutative operators, try to canonicalize the destination
18731          operand to be first in the comparison - this helps reload to
18732          avoid extra moves.  */
18733       if (!dest || !rtx_equal_p (dest, *pop1))
18734         break;
18735       /* FALLTHRU */
18736
18737     case GE:
18738     case GT:
18739     case UNLE:
18740     case UNLT:
18741       /* These are not supported directly.  Swap the comparison operands
18742          to transform into something that is supported.  */
18743       tmp = *pop0;
18744       *pop0 = *pop1;
18745       *pop1 = tmp;
18746       code = swap_condition (code);
18747       break;
18748
18749     default:
18750       gcc_unreachable ();
18751     }
18752
18753   return code;
18754 }
18755
18756 /* Detect conditional moves that exactly match min/max operational
18757    semantics.  Note that this is IEEE safe, as long as we don't
18758    interchange the operands.
18759
18760    Returns FALSE if this conditional move doesn't match a MIN/MAX,
18761    and TRUE if the operation is successful and instructions are emitted.  */
18762
18763 static bool
18764 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
18765                            rtx cmp_op1, rtx if_true, rtx if_false)
18766 {
18767   enum machine_mode mode;
18768   bool is_min;
18769   rtx tmp;
18770
18771   if (code == LT)
18772     ;
18773   else if (code == UNGE)
18774     {
18775       tmp = if_true;
18776       if_true = if_false;
18777       if_false = tmp;
18778     }
18779   else
18780     return false;
18781
18782   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
18783     is_min = true;
18784   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
18785     is_min = false;
18786   else
18787     return false;
18788
18789   mode = GET_MODE (dest);
18790
18791   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
18792      but MODE may be a vector mode and thus not appropriate.  */
18793   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
18794     {
18795       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
18796       rtvec v;
18797
18798       if_true = force_reg (mode, if_true);
18799       v = gen_rtvec (2, if_true, if_false);
18800       tmp = gen_rtx_UNSPEC (mode, v, u);
18801     }
18802   else
18803     {
18804       code = is_min ? SMIN : SMAX;
18805       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
18806     }
18807
18808   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
18809   return true;
18810 }
18811
18812 /* Expand an sse vector comparison.  Return the register with the result.  */
18813
18814 static rtx
18815 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
18816                      rtx op_true, rtx op_false)
18817 {
18818   enum machine_mode mode = GET_MODE (dest);
18819   rtx x;
18820
18821   cmp_op0 = force_reg (mode, cmp_op0);
18822   if (!nonimmediate_operand (cmp_op1, mode))
18823     cmp_op1 = force_reg (mode, cmp_op1);
18824
18825   if (optimize
18826       || reg_overlap_mentioned_p (dest, op_true)
18827       || reg_overlap_mentioned_p (dest, op_false))
18828     dest = gen_reg_rtx (mode);
18829
18830   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
18831   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18832
18833   return dest;
18834 }
18835
18836 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
18837    operations.  This is used for both scalar and vector conditional moves.  */
18838
18839 static void
18840 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
18841 {
18842   enum machine_mode mode = GET_MODE (dest);
18843   rtx t2, t3, x;
18844
18845   if (op_false == CONST0_RTX (mode))
18846     {
18847       op_true = force_reg (mode, op_true);
18848       x = gen_rtx_AND (mode, cmp, op_true);
18849       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18850     }
18851   else if (op_true == CONST0_RTX (mode))
18852     {
18853       op_false = force_reg (mode, op_false);
18854       x = gen_rtx_NOT (mode, cmp);
18855       x = gen_rtx_AND (mode, x, op_false);
18856       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18857     }
18858   else if (TARGET_XOP)
18859     {
18860       rtx pcmov = gen_rtx_SET (mode, dest,
18861                                gen_rtx_IF_THEN_ELSE (mode, cmp,
18862                                                      op_true,
18863                                                      op_false));
18864       emit_insn (pcmov);
18865     }
18866   else
18867     {
18868       op_true = force_reg (mode, op_true);
18869       op_false = force_reg (mode, op_false);
18870
18871       t2 = gen_reg_rtx (mode);
18872       if (optimize)
18873         t3 = gen_reg_rtx (mode);
18874       else
18875         t3 = dest;
18876
18877       x = gen_rtx_AND (mode, op_true, cmp);
18878       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
18879
18880       x = gen_rtx_NOT (mode, cmp);
18881       x = gen_rtx_AND (mode, x, op_false);
18882       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
18883
18884       x = gen_rtx_IOR (mode, t3, t2);
18885       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
18886     }
18887 }
18888
18889 /* Expand a floating-point conditional move.  Return true if successful.  */
18890
18891 bool
18892 ix86_expand_fp_movcc (rtx operands[])
18893 {
18894   enum machine_mode mode = GET_MODE (operands[0]);
18895   enum rtx_code code = GET_CODE (operands[1]);
18896   rtx tmp, compare_op;
18897   rtx op0 = XEXP (operands[1], 0);
18898   rtx op1 = XEXP (operands[1], 1);
18899
18900   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
18901     {
18902       enum machine_mode cmode;
18903
18904       /* Since we've no cmove for sse registers, don't force bad register
18905          allocation just to gain access to it.  Deny movcc when the
18906          comparison mode doesn't match the move mode.  */
18907       cmode = GET_MODE (op0);
18908       if (cmode == VOIDmode)
18909         cmode = GET_MODE (op1);
18910       if (cmode != mode)
18911         return false;
18912
18913       code = ix86_prepare_sse_fp_compare_args (operands[0], code, &op0, &op1);
18914       if (code == UNKNOWN)
18915         return false;
18916
18917       if (ix86_expand_sse_fp_minmax (operands[0], code, op0, op1,
18918                                      operands[2], operands[3]))
18919         return true;
18920
18921       tmp = ix86_expand_sse_cmp (operands[0], code, op0, op1,
18922                                  operands[2], operands[3]);
18923       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
18924       return true;
18925     }
18926
18927   /* The floating point conditional move instructions don't directly
18928      support conditions resulting from a signed integer comparison.  */
18929
18930   compare_op = ix86_expand_compare (code, op0, op1);
18931   if (!fcmov_comparison_operator (compare_op, VOIDmode))
18932     {
18933       tmp = gen_reg_rtx (QImode);
18934       ix86_expand_setcc (tmp, code, op0, op1);
18935
18936       compare_op = ix86_expand_compare (NE, tmp, const0_rtx);
18937     }
18938
18939   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
18940                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
18941                                                 operands[2], operands[3])));
18942
18943   return true;
18944 }
18945
18946 /* Expand a floating-point vector conditional move; a vcond operation
18947    rather than a movcc operation.  */
18948
18949 bool
18950 ix86_expand_fp_vcond (rtx operands[])
18951 {
18952   enum rtx_code code = GET_CODE (operands[3]);
18953   rtx cmp;
18954
18955   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
18956                                            &operands[4], &operands[5]);
18957   if (code == UNKNOWN)
18958     return false;
18959
18960   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
18961                                  operands[5], operands[1], operands[2]))
18962     return true;
18963
18964   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
18965                              operands[1], operands[2]);
18966   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
18967   return true;
18968 }
18969
18970 /* Expand a signed/unsigned integral vector conditional move.  */
18971
18972 bool
18973 ix86_expand_int_vcond (rtx operands[])
18974 {
18975   enum machine_mode mode = GET_MODE (operands[0]);
18976   enum rtx_code code = GET_CODE (operands[3]);
18977   bool negate = false;
18978   rtx x, cop0, cop1;
18979
18980   cop0 = operands[4];
18981   cop1 = operands[5];
18982
18983   /* XOP supports all of the comparisons on all vector int types.  */
18984   if (!TARGET_XOP)
18985     {
18986       /* Canonicalize the comparison to EQ, GT, GTU.  */
18987       switch (code)
18988         {
18989         case EQ:
18990         case GT:
18991         case GTU:
18992           break;
18993
18994         case NE:
18995         case LE:
18996         case LEU:
18997           code = reverse_condition (code);
18998           negate = true;
18999           break;
19000
19001         case GE:
19002         case GEU:
19003           code = reverse_condition (code);
19004           negate = true;
19005           /* FALLTHRU */
19006
19007         case LT:
19008         case LTU:
19009           code = swap_condition (code);
19010           x = cop0, cop0 = cop1, cop1 = x;
19011           break;
19012
19013         default:
19014           gcc_unreachable ();
19015         }
19016
19017       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
19018       if (mode == V2DImode)
19019         {
19020           switch (code)
19021             {
19022             case EQ:
19023               /* SSE4.1 supports EQ.  */
19024               if (!TARGET_SSE4_1)
19025                 return false;
19026               break;
19027
19028             case GT:
19029             case GTU:
19030               /* SSE4.2 supports GT/GTU.  */
19031               if (!TARGET_SSE4_2)
19032                 return false;
19033               break;
19034
19035             default:
19036               gcc_unreachable ();
19037             }
19038         }
19039
19040       /* Unsigned parallel compare is not supported by the hardware.
19041          Play some tricks to turn this into a signed comparison
19042          against 0.  */
19043       if (code == GTU)
19044         {
19045           cop0 = force_reg (mode, cop0);
19046
19047           switch (mode)
19048             {
19049             case V4SImode:
19050             case V2DImode:
19051                 {
19052                   rtx t1, t2, mask;
19053                   rtx (*gen_sub3) (rtx, rtx, rtx);
19054
19055                   /* Subtract (-(INT MAX) - 1) from both operands to make
19056                      them signed.  */
19057                   mask = ix86_build_signbit_mask (mode, true, false);
19058                   gen_sub3 = (mode == V4SImode
19059                               ? gen_subv4si3 : gen_subv2di3);
19060                   t1 = gen_reg_rtx (mode);
19061                   emit_insn (gen_sub3 (t1, cop0, mask));
19062
19063                   t2 = gen_reg_rtx (mode);
19064                   emit_insn (gen_sub3 (t2, cop1, mask));
19065
19066                   cop0 = t1;
19067                   cop1 = t2;
19068                   code = GT;
19069                 }
19070               break;
19071
19072             case V16QImode:
19073             case V8HImode:
19074               /* Perform a parallel unsigned saturating subtraction.  */
19075               x = gen_reg_rtx (mode);
19076               emit_insn (gen_rtx_SET (VOIDmode, x,
19077                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
19078
19079               cop0 = x;
19080               cop1 = CONST0_RTX (mode);
19081               code = EQ;
19082               negate = !negate;
19083               break;
19084
19085             default:
19086               gcc_unreachable ();
19087             }
19088         }
19089     }
19090
19091   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
19092                            operands[1+negate], operands[2-negate]);
19093
19094   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
19095                          operands[2-negate]);
19096   return true;
19097 }
19098
19099 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
19100    true if we should do zero extension, else sign extension.  HIGH_P is
19101    true if we want the N/2 high elements, else the low elements.  */
19102
19103 void
19104 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
19105 {
19106   enum machine_mode imode = GET_MODE (operands[1]);
19107   rtx tmp, dest;
19108
19109   if (TARGET_SSE4_1)
19110     {
19111       rtx (*unpack)(rtx, rtx);
19112
19113       switch (imode)
19114         {
19115         case V16QImode:
19116           if (unsigned_p)
19117             unpack = gen_sse4_1_zero_extendv8qiv8hi2;
19118           else
19119             unpack = gen_sse4_1_sign_extendv8qiv8hi2;
19120           break;
19121         case V8HImode:
19122           if (unsigned_p)
19123             unpack = gen_sse4_1_zero_extendv4hiv4si2;
19124           else
19125             unpack = gen_sse4_1_sign_extendv4hiv4si2;
19126           break;
19127         case V4SImode:
19128           if (unsigned_p)
19129             unpack = gen_sse4_1_zero_extendv2siv2di2;
19130           else
19131             unpack = gen_sse4_1_sign_extendv2siv2di2;
19132           break;
19133         default:
19134           gcc_unreachable ();
19135         }
19136
19137       if (high_p)
19138         {
19139           /* Shift higher 8 bytes to lower 8 bytes.  */
19140           tmp = gen_reg_rtx (imode);
19141           emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, tmp),
19142                                          gen_lowpart (V1TImode, operands[1]),
19143                                          GEN_INT (64)));
19144         }
19145       else
19146         tmp = operands[1];
19147
19148       emit_insn (unpack (operands[0], tmp));
19149     }
19150   else
19151     {
19152       rtx (*unpack)(rtx, rtx, rtx);
19153
19154       switch (imode)
19155         {
19156         case V16QImode:
19157           if (high_p)
19158             unpack = gen_vec_interleave_highv16qi;
19159           else
19160             unpack = gen_vec_interleave_lowv16qi;
19161           break;
19162         case V8HImode:
19163           if (high_p)
19164             unpack = gen_vec_interleave_highv8hi;
19165           else
19166             unpack = gen_vec_interleave_lowv8hi;
19167           break;
19168         case V4SImode:
19169           if (high_p)
19170             unpack = gen_vec_interleave_highv4si;
19171           else
19172             unpack = gen_vec_interleave_lowv4si;
19173           break;
19174         default:
19175           gcc_unreachable ();
19176         }
19177
19178       dest = gen_lowpart (imode, operands[0]);
19179
19180       if (unsigned_p)
19181         tmp = force_reg (imode, CONST0_RTX (imode));
19182       else
19183         tmp = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
19184                                    operands[1], pc_rtx, pc_rtx);
19185
19186       emit_insn (unpack (dest, operands[1], tmp));
19187     }
19188 }
19189
19190 /* Expand conditional increment or decrement using adb/sbb instructions.
19191    The default case using setcc followed by the conditional move can be
19192    done by generic code.  */
19193 bool
19194 ix86_expand_int_addcc (rtx operands[])
19195 {
19196   enum rtx_code code = GET_CODE (operands[1]);
19197   rtx flags;
19198   rtx (*insn)(rtx, rtx, rtx, rtx, rtx);
19199   rtx compare_op;
19200   rtx val = const0_rtx;
19201   bool fpcmp = false;
19202   enum machine_mode mode;
19203   rtx op0 = XEXP (operands[1], 0);
19204   rtx op1 = XEXP (operands[1], 1);
19205
19206   if (operands[3] != const1_rtx
19207       && operands[3] != constm1_rtx)
19208     return false;
19209   if (!ix86_expand_carry_flag_compare (code, op0, op1, &compare_op))
19210      return false;
19211   code = GET_CODE (compare_op);
19212
19213   flags = XEXP (compare_op, 0);
19214
19215   if (GET_MODE (flags) == CCFPmode
19216       || GET_MODE (flags) == CCFPUmode)
19217     {
19218       fpcmp = true;
19219       code = ix86_fp_compare_code_to_integer (code);
19220     }
19221
19222   if (code != LTU)
19223     {
19224       val = constm1_rtx;
19225       if (fpcmp)
19226         PUT_CODE (compare_op,
19227                   reverse_condition_maybe_unordered
19228                     (GET_CODE (compare_op)));
19229       else
19230         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
19231     }
19232
19233   mode = GET_MODE (operands[0]);
19234
19235   /* Construct either adc or sbb insn.  */
19236   if ((code == LTU) == (operands[3] == constm1_rtx))
19237     {
19238       switch (mode)
19239         {
19240           case QImode:
19241             insn = gen_subqi3_carry;
19242             break;
19243           case HImode:
19244             insn = gen_subhi3_carry;
19245             break;
19246           case SImode:
19247             insn = gen_subsi3_carry;
19248             break;
19249           case DImode:
19250             insn = gen_subdi3_carry;
19251             break;
19252           default:
19253             gcc_unreachable ();
19254         }
19255     }
19256   else
19257     {
19258       switch (mode)
19259         {
19260           case QImode:
19261             insn = gen_addqi3_carry;
19262             break;
19263           case HImode:
19264             insn = gen_addhi3_carry;
19265             break;
19266           case SImode:
19267             insn = gen_addsi3_carry;
19268             break;
19269           case DImode:
19270             insn = gen_adddi3_carry;
19271             break;
19272           default:
19273             gcc_unreachable ();
19274         }
19275     }
19276   emit_insn (insn (operands[0], operands[2], val, flags, compare_op));
19277
19278   return true;
19279 }
19280
19281
19282 /* Split operands 0 and 1 into half-mode parts.  Similar to split_double_mode,
19283    but works for floating pointer parameters and nonoffsetable memories.
19284    For pushes, it returns just stack offsets; the values will be saved
19285    in the right order.  Maximally three parts are generated.  */
19286
19287 static int
19288 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
19289 {
19290   int size;
19291
19292   if (!TARGET_64BIT)
19293     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
19294   else
19295     size = (GET_MODE_SIZE (mode) + 4) / 8;
19296
19297   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
19298   gcc_assert (size >= 2 && size <= 4);
19299
19300   /* Optimize constant pool reference to immediates.  This is used by fp
19301      moves, that force all constants to memory to allow combining.  */
19302   if (MEM_P (operand) && MEM_READONLY_P (operand))
19303     {
19304       rtx tmp = maybe_get_pool_constant (operand);
19305       if (tmp)
19306         operand = tmp;
19307     }
19308
19309   if (MEM_P (operand) && !offsettable_memref_p (operand))
19310     {
19311       /* The only non-offsetable memories we handle are pushes.  */
19312       int ok = push_operand (operand, VOIDmode);
19313
19314       gcc_assert (ok);
19315
19316       operand = copy_rtx (operand);
19317       PUT_MODE (operand, Pmode);
19318       parts[0] = parts[1] = parts[2] = parts[3] = operand;
19319       return size;
19320     }
19321
19322   if (GET_CODE (operand) == CONST_VECTOR)
19323     {
19324       enum machine_mode imode = int_mode_for_mode (mode);
19325       /* Caution: if we looked through a constant pool memory above,
19326          the operand may actually have a different mode now.  That's
19327          ok, since we want to pun this all the way back to an integer.  */
19328       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
19329       gcc_assert (operand != NULL);
19330       mode = imode;
19331     }
19332
19333   if (!TARGET_64BIT)
19334     {
19335       if (mode == DImode)
19336         split_double_mode (mode, &operand, 1, &parts[0], &parts[1]);
19337       else
19338         {
19339           int i;
19340
19341           if (REG_P (operand))
19342             {
19343               gcc_assert (reload_completed);
19344               for (i = 0; i < size; i++)
19345                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
19346             }
19347           else if (offsettable_memref_p (operand))
19348             {
19349               operand = adjust_address (operand, SImode, 0);
19350               parts[0] = operand;
19351               for (i = 1; i < size; i++)
19352                 parts[i] = adjust_address (operand, SImode, 4 * i);
19353             }
19354           else if (GET_CODE (operand) == CONST_DOUBLE)
19355             {
19356               REAL_VALUE_TYPE r;
19357               long l[4];
19358
19359               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
19360               switch (mode)
19361                 {
19362                 case TFmode:
19363                   real_to_target (l, &r, mode);
19364                   parts[3] = gen_int_mode (l[3], SImode);
19365                   parts[2] = gen_int_mode (l[2], SImode);
19366                   break;
19367                 case XFmode:
19368                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
19369                   parts[2] = gen_int_mode (l[2], SImode);
19370                   break;
19371                 case DFmode:
19372                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
19373                   break;
19374                 default:
19375                   gcc_unreachable ();
19376                 }
19377               parts[1] = gen_int_mode (l[1], SImode);
19378               parts[0] = gen_int_mode (l[0], SImode);
19379             }
19380           else
19381             gcc_unreachable ();
19382         }
19383     }
19384   else
19385     {
19386       if (mode == TImode)
19387         split_double_mode (mode, &operand, 1, &parts[0], &parts[1]);
19388       if (mode == XFmode || mode == TFmode)
19389         {
19390           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
19391           if (REG_P (operand))
19392             {
19393               gcc_assert (reload_completed);
19394               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
19395               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
19396             }
19397           else if (offsettable_memref_p (operand))
19398             {
19399               operand = adjust_address (operand, DImode, 0);
19400               parts[0] = operand;
19401               parts[1] = adjust_address (operand, upper_mode, 8);
19402             }
19403           else if (GET_CODE (operand) == CONST_DOUBLE)
19404             {
19405               REAL_VALUE_TYPE r;
19406               long l[4];
19407
19408               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
19409               real_to_target (l, &r, mode);
19410
19411               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
19412               if (HOST_BITS_PER_WIDE_INT >= 64)
19413                 parts[0]
19414                   = gen_int_mode
19415                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
19416                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
19417                        DImode);
19418               else
19419                 parts[0] = immed_double_const (l[0], l[1], DImode);
19420
19421               if (upper_mode == SImode)
19422                 parts[1] = gen_int_mode (l[2], SImode);
19423               else if (HOST_BITS_PER_WIDE_INT >= 64)
19424                 parts[1]
19425                   = gen_int_mode
19426                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
19427                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
19428                        DImode);
19429               else
19430                 parts[1] = immed_double_const (l[2], l[3], DImode);
19431             }
19432           else
19433             gcc_unreachable ();
19434         }
19435     }
19436
19437   return size;
19438 }
19439
19440 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
19441    Return false when normal moves are needed; true when all required
19442    insns have been emitted.  Operands 2-4 contain the input values
19443    int the correct order; operands 5-7 contain the output values.  */
19444
19445 void
19446 ix86_split_long_move (rtx operands[])
19447 {
19448   rtx part[2][4];
19449   int nparts, i, j;
19450   int push = 0;
19451   int collisions = 0;
19452   enum machine_mode mode = GET_MODE (operands[0]);
19453   bool collisionparts[4];
19454
19455   /* The DFmode expanders may ask us to move double.
19456      For 64bit target this is single move.  By hiding the fact
19457      here we simplify i386.md splitters.  */
19458   if (TARGET_64BIT && GET_MODE_SIZE (GET_MODE (operands[0])) == 8)
19459     {
19460       /* Optimize constant pool reference to immediates.  This is used by
19461          fp moves, that force all constants to memory to allow combining.  */
19462
19463       if (MEM_P (operands[1])
19464           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
19465           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
19466         operands[1] = get_pool_constant (XEXP (operands[1], 0));
19467       if (push_operand (operands[0], VOIDmode))
19468         {
19469           operands[0] = copy_rtx (operands[0]);
19470           PUT_MODE (operands[0], Pmode);
19471         }
19472       else
19473         operands[0] = gen_lowpart (DImode, operands[0]);
19474       operands[1] = gen_lowpart (DImode, operands[1]);
19475       emit_move_insn (operands[0], operands[1]);
19476       return;
19477     }
19478
19479   /* The only non-offsettable memory we handle is push.  */
19480   if (push_operand (operands[0], VOIDmode))
19481     push = 1;
19482   else
19483     gcc_assert (!MEM_P (operands[0])
19484                 || offsettable_memref_p (operands[0]));
19485
19486   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
19487   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
19488
19489   /* When emitting push, take care for source operands on the stack.  */
19490   if (push && MEM_P (operands[1])
19491       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
19492     {
19493       rtx src_base = XEXP (part[1][nparts - 1], 0);
19494
19495       /* Compensate for the stack decrement by 4.  */
19496       if (!TARGET_64BIT && nparts == 3
19497           && mode == XFmode && TARGET_128BIT_LONG_DOUBLE)
19498         src_base = plus_constant (src_base, 4);
19499
19500       /* src_base refers to the stack pointer and is
19501          automatically decreased by emitted push.  */
19502       for (i = 0; i < nparts; i++)
19503         part[1][i] = change_address (part[1][i],
19504                                      GET_MODE (part[1][i]), src_base);
19505     }
19506
19507   /* We need to do copy in the right order in case an address register
19508      of the source overlaps the destination.  */
19509   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
19510     {
19511       rtx tmp;
19512
19513       for (i = 0; i < nparts; i++)
19514         {
19515           collisionparts[i]
19516             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
19517           if (collisionparts[i])
19518             collisions++;
19519         }
19520
19521       /* Collision in the middle part can be handled by reordering.  */
19522       if (collisions == 1 && nparts == 3 && collisionparts [1])
19523         {
19524           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
19525           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
19526         }
19527       else if (collisions == 1
19528                && nparts == 4
19529                && (collisionparts [1] || collisionparts [2]))
19530         {
19531           if (collisionparts [1])
19532             {
19533               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
19534               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
19535             }
19536           else
19537             {
19538               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
19539               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
19540             }
19541         }
19542
19543       /* If there are more collisions, we can't handle it by reordering.
19544          Do an lea to the last part and use only one colliding move.  */
19545       else if (collisions > 1)
19546         {
19547           rtx base;
19548
19549           collisions = 1;
19550
19551           base = part[0][nparts - 1];
19552
19553           /* Handle the case when the last part isn't valid for lea.
19554              Happens in 64-bit mode storing the 12-byte XFmode.  */
19555           if (GET_MODE (base) != Pmode)
19556             base = gen_rtx_REG (Pmode, REGNO (base));
19557
19558           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
19559           part[1][0] = replace_equiv_address (part[1][0], base);
19560           for (i = 1; i < nparts; i++)
19561             {
19562               tmp = plus_constant (base, UNITS_PER_WORD * i);
19563               part[1][i] = replace_equiv_address (part[1][i], tmp);
19564             }
19565         }
19566     }
19567
19568   if (push)
19569     {
19570       if (!TARGET_64BIT)
19571         {
19572           if (nparts == 3)
19573             {
19574               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
19575                 emit_insn (gen_addsi3 (stack_pointer_rtx,
19576                                        stack_pointer_rtx, GEN_INT (-4)));
19577               emit_move_insn (part[0][2], part[1][2]);
19578             }
19579           else if (nparts == 4)
19580             {
19581               emit_move_insn (part[0][3], part[1][3]);
19582               emit_move_insn (part[0][2], part[1][2]);
19583             }
19584         }
19585       else
19586         {
19587           /* In 64bit mode we don't have 32bit push available.  In case this is
19588              register, it is OK - we will just use larger counterpart.  We also
19589              retype memory - these comes from attempt to avoid REX prefix on
19590              moving of second half of TFmode value.  */
19591           if (GET_MODE (part[1][1]) == SImode)
19592             {
19593               switch (GET_CODE (part[1][1]))
19594                 {
19595                 case MEM:
19596                   part[1][1] = adjust_address (part[1][1], DImode, 0);
19597                   break;
19598
19599                 case REG:
19600                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
19601                   break;
19602
19603                 default:
19604                   gcc_unreachable ();
19605                 }
19606
19607               if (GET_MODE (part[1][0]) == SImode)
19608                 part[1][0] = part[1][1];
19609             }
19610         }
19611       emit_move_insn (part[0][1], part[1][1]);
19612       emit_move_insn (part[0][0], part[1][0]);
19613       return;
19614     }
19615
19616   /* Choose correct order to not overwrite the source before it is copied.  */
19617   if ((REG_P (part[0][0])
19618        && REG_P (part[1][1])
19619        && (REGNO (part[0][0]) == REGNO (part[1][1])
19620            || (nparts == 3
19621                && REGNO (part[0][0]) == REGNO (part[1][2]))
19622            || (nparts == 4
19623                && REGNO (part[0][0]) == REGNO (part[1][3]))))
19624       || (collisions > 0
19625           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
19626     {
19627       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
19628         {
19629           operands[2 + i] = part[0][j];
19630           operands[6 + i] = part[1][j];
19631         }
19632     }
19633   else
19634     {
19635       for (i = 0; i < nparts; i++)
19636         {
19637           operands[2 + i] = part[0][i];
19638           operands[6 + i] = part[1][i];
19639         }
19640     }
19641
19642   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
19643   if (optimize_insn_for_size_p ())
19644     {
19645       for (j = 0; j < nparts - 1; j++)
19646         if (CONST_INT_P (operands[6 + j])
19647             && operands[6 + j] != const0_rtx
19648             && REG_P (operands[2 + j]))
19649           for (i = j; i < nparts - 1; i++)
19650             if (CONST_INT_P (operands[7 + i])
19651                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
19652               operands[7 + i] = operands[2 + j];
19653     }
19654
19655   for (i = 0; i < nparts; i++)
19656     emit_move_insn (operands[2 + i], operands[6 + i]);
19657
19658   return;
19659 }
19660
19661 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
19662    left shift by a constant, either using a single shift or
19663    a sequence of add instructions.  */
19664
19665 static void
19666 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
19667 {
19668   rtx (*insn)(rtx, rtx, rtx);
19669
19670   if (count == 1
19671       || (count * ix86_cost->add <= ix86_cost->shift_const
19672           && !optimize_insn_for_size_p ()))
19673     {
19674       insn = mode == DImode ? gen_addsi3 : gen_adddi3;
19675       while (count-- > 0)
19676         emit_insn (insn (operand, operand, operand));
19677     }
19678   else
19679     {
19680       insn = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
19681       emit_insn (insn (operand, operand, GEN_INT (count)));
19682     }
19683 }
19684
19685 void
19686 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
19687 {
19688   rtx (*gen_ashl3)(rtx, rtx, rtx);
19689   rtx (*gen_shld)(rtx, rtx, rtx);
19690   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19691
19692   rtx low[2], high[2];
19693   int count;
19694
19695   if (CONST_INT_P (operands[2]))
19696     {
19697       split_double_mode (mode, operands, 2, low, high);
19698       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19699
19700       if (count >= half_width)
19701         {
19702           emit_move_insn (high[0], low[1]);
19703           emit_move_insn (low[0], const0_rtx);
19704
19705           if (count > half_width)
19706             ix86_expand_ashl_const (high[0], count - half_width, mode);
19707         }
19708       else
19709         {
19710           gen_shld = mode == DImode ? gen_x86_shld : gen_x86_64_shld;
19711
19712           if (!rtx_equal_p (operands[0], operands[1]))
19713             emit_move_insn (operands[0], operands[1]);
19714
19715           emit_insn (gen_shld (high[0], low[0], GEN_INT (count)));
19716           ix86_expand_ashl_const (low[0], count, mode);
19717         }
19718       return;
19719     }
19720
19721   split_double_mode (mode, operands, 1, low, high);
19722
19723   gen_ashl3 = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
19724
19725   if (operands[1] == const1_rtx)
19726     {
19727       /* Assuming we've chosen a QImode capable registers, then 1 << N
19728          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
19729       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
19730         {
19731           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
19732
19733           ix86_expand_clear (low[0]);
19734           ix86_expand_clear (high[0]);
19735           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (half_width)));
19736
19737           d = gen_lowpart (QImode, low[0]);
19738           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
19739           s = gen_rtx_EQ (QImode, flags, const0_rtx);
19740           emit_insn (gen_rtx_SET (VOIDmode, d, s));
19741
19742           d = gen_lowpart (QImode, high[0]);
19743           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
19744           s = gen_rtx_NE (QImode, flags, const0_rtx);
19745           emit_insn (gen_rtx_SET (VOIDmode, d, s));
19746         }
19747
19748       /* Otherwise, we can get the same results by manually performing
19749          a bit extract operation on bit 5/6, and then performing the two
19750          shifts.  The two methods of getting 0/1 into low/high are exactly
19751          the same size.  Avoiding the shift in the bit extract case helps
19752          pentium4 a bit; no one else seems to care much either way.  */
19753       else
19754         {
19755           enum machine_mode half_mode;
19756           rtx (*gen_lshr3)(rtx, rtx, rtx);
19757           rtx (*gen_and3)(rtx, rtx, rtx);
19758           rtx (*gen_xor3)(rtx, rtx, rtx);
19759           HOST_WIDE_INT bits;
19760           rtx x;
19761
19762           if (mode == DImode)
19763             {
19764               half_mode = SImode;
19765               gen_lshr3 = gen_lshrsi3;
19766               gen_and3 = gen_andsi3;
19767               gen_xor3 = gen_xorsi3;
19768               bits = 5;
19769             }
19770           else
19771             {
19772               half_mode = DImode;
19773               gen_lshr3 = gen_lshrdi3;
19774               gen_and3 = gen_anddi3;
19775               gen_xor3 = gen_xordi3;
19776               bits = 6;
19777             }
19778
19779           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
19780             x = gen_rtx_ZERO_EXTEND (half_mode, operands[2]);
19781           else
19782             x = gen_lowpart (half_mode, operands[2]);
19783           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
19784
19785           emit_insn (gen_lshr3 (high[0], high[0], GEN_INT (bits)));
19786           emit_insn (gen_and3 (high[0], high[0], const1_rtx));
19787           emit_move_insn (low[0], high[0]);
19788           emit_insn (gen_xor3 (low[0], low[0], const1_rtx));
19789         }
19790
19791       emit_insn (gen_ashl3 (low[0], low[0], operands[2]));
19792       emit_insn (gen_ashl3 (high[0], high[0], operands[2]));
19793       return;
19794     }
19795
19796   if (operands[1] == constm1_rtx)
19797     {
19798       /* For -1 << N, we can avoid the shld instruction, because we
19799          know that we're shifting 0...31/63 ones into a -1.  */
19800       emit_move_insn (low[0], constm1_rtx);
19801       if (optimize_insn_for_size_p ())
19802         emit_move_insn (high[0], low[0]);
19803       else
19804         emit_move_insn (high[0], constm1_rtx);
19805     }
19806   else
19807     {
19808       gen_shld = mode == DImode ? gen_x86_shld : gen_x86_64_shld;
19809
19810       if (!rtx_equal_p (operands[0], operands[1]))
19811         emit_move_insn (operands[0], operands[1]);
19812
19813       split_double_mode (mode, operands, 1, low, high);
19814       emit_insn (gen_shld (high[0], low[0], operands[2]));
19815     }
19816
19817   emit_insn (gen_ashl3 (low[0], low[0], operands[2]));
19818
19819   if (TARGET_CMOVE && scratch)
19820     {
19821       rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19822         = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19823
19824       ix86_expand_clear (scratch);
19825       emit_insn (gen_x86_shift_adj_1 (high[0], low[0], operands[2], scratch));
19826     }
19827   else
19828     {
19829       rtx (*gen_x86_shift_adj_2)(rtx, rtx, rtx)
19830         = mode == DImode ? gen_x86_shiftsi_adj_2 : gen_x86_shiftdi_adj_2;
19831
19832       emit_insn (gen_x86_shift_adj_2 (high[0], low[0], operands[2]));
19833     }
19834 }
19835
19836 void
19837 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
19838 {
19839   rtx (*gen_ashr3)(rtx, rtx, rtx)
19840     = mode == DImode ? gen_ashrsi3 : gen_ashrdi3;
19841   rtx (*gen_shrd)(rtx, rtx, rtx);
19842   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19843
19844   rtx low[2], high[2];
19845   int count;
19846
19847   if (CONST_INT_P (operands[2]))
19848     {
19849       split_double_mode (mode, operands, 2, low, high);
19850       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19851
19852       if (count == GET_MODE_BITSIZE (mode) - 1)
19853         {
19854           emit_move_insn (high[0], high[1]);
19855           emit_insn (gen_ashr3 (high[0], high[0],
19856                                 GEN_INT (half_width - 1)));
19857           emit_move_insn (low[0], high[0]);
19858
19859         }
19860       else if (count >= half_width)
19861         {
19862           emit_move_insn (low[0], high[1]);
19863           emit_move_insn (high[0], low[0]);
19864           emit_insn (gen_ashr3 (high[0], high[0],
19865                                 GEN_INT (half_width - 1)));
19866
19867           if (count > half_width)
19868             emit_insn (gen_ashr3 (low[0], low[0],
19869                                   GEN_INT (count - half_width)));
19870         }
19871       else
19872         {
19873           gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19874
19875           if (!rtx_equal_p (operands[0], operands[1]))
19876             emit_move_insn (operands[0], operands[1]);
19877
19878           emit_insn (gen_shrd (low[0], high[0], GEN_INT (count)));
19879           emit_insn (gen_ashr3 (high[0], high[0], GEN_INT (count)));
19880         }
19881     }
19882   else
19883     {
19884       gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19885
19886      if (!rtx_equal_p (operands[0], operands[1]))
19887         emit_move_insn (operands[0], operands[1]);
19888
19889       split_double_mode (mode, operands, 1, low, high);
19890
19891       emit_insn (gen_shrd (low[0], high[0], operands[2]));
19892       emit_insn (gen_ashr3 (high[0], high[0], operands[2]));
19893
19894       if (TARGET_CMOVE && scratch)
19895         {
19896           rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19897             = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19898
19899           emit_move_insn (scratch, high[0]);
19900           emit_insn (gen_ashr3 (scratch, scratch,
19901                                 GEN_INT (half_width - 1)));
19902           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
19903                                           scratch));
19904         }
19905       else
19906         {
19907           rtx (*gen_x86_shift_adj_3)(rtx, rtx, rtx)
19908             = mode == DImode ? gen_x86_shiftsi_adj_3 : gen_x86_shiftdi_adj_3;
19909
19910           emit_insn (gen_x86_shift_adj_3 (low[0], high[0], operands[2]));
19911         }
19912     }
19913 }
19914
19915 void
19916 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
19917 {
19918   rtx (*gen_lshr3)(rtx, rtx, rtx)
19919     = mode == DImode ? gen_lshrsi3 : gen_lshrdi3;
19920   rtx (*gen_shrd)(rtx, rtx, rtx);
19921   int half_width = GET_MODE_BITSIZE (mode) >> 1;
19922
19923   rtx low[2], high[2];
19924   int count;
19925
19926   if (CONST_INT_P (operands[2]))
19927     {
19928       split_double_mode (mode, operands, 2, low, high);
19929       count = INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1);
19930
19931       if (count >= half_width)
19932         {
19933           emit_move_insn (low[0], high[1]);
19934           ix86_expand_clear (high[0]);
19935
19936           if (count > half_width)
19937             emit_insn (gen_lshr3 (low[0], low[0],
19938                                   GEN_INT (count - half_width)));
19939         }
19940       else
19941         {
19942           gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19943
19944           if (!rtx_equal_p (operands[0], operands[1]))
19945             emit_move_insn (operands[0], operands[1]);
19946
19947           emit_insn (gen_shrd (low[0], high[0], GEN_INT (count)));
19948           emit_insn (gen_lshr3 (high[0], high[0], GEN_INT (count)));
19949         }
19950     }
19951   else
19952     {
19953       gen_shrd = mode == DImode ? gen_x86_shrd : gen_x86_64_shrd;
19954
19955       if (!rtx_equal_p (operands[0], operands[1]))
19956         emit_move_insn (operands[0], operands[1]);
19957
19958       split_double_mode (mode, operands, 1, low, high);
19959
19960       emit_insn (gen_shrd (low[0], high[0], operands[2]));
19961       emit_insn (gen_lshr3 (high[0], high[0], operands[2]));
19962
19963       if (TARGET_CMOVE && scratch)
19964         {
19965           rtx (*gen_x86_shift_adj_1)(rtx, rtx, rtx, rtx)
19966             = mode == DImode ? gen_x86_shiftsi_adj_1 : gen_x86_shiftdi_adj_1;
19967
19968           ix86_expand_clear (scratch);
19969           emit_insn (gen_x86_shift_adj_1 (low[0], high[0], operands[2],
19970                                           scratch));
19971         }
19972       else
19973         {
19974           rtx (*gen_x86_shift_adj_2)(rtx, rtx, rtx)
19975             = mode == DImode ? gen_x86_shiftsi_adj_2 : gen_x86_shiftdi_adj_2;
19976
19977           emit_insn (gen_x86_shift_adj_2 (low[0], high[0], operands[2]));
19978         }
19979     }
19980 }
19981
19982 /* Predict just emitted jump instruction to be taken with probability PROB.  */
19983 static void
19984 predict_jump (int prob)
19985 {
19986   rtx insn = get_last_insn ();
19987   gcc_assert (JUMP_P (insn));
19988   add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
19989 }
19990
19991 /* Helper function for the string operations below.  Dest VARIABLE whether
19992    it is aligned to VALUE bytes.  If true, jump to the label.  */
19993 static rtx
19994 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
19995 {
19996   rtx label = gen_label_rtx ();
19997   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
19998   if (GET_MODE (variable) == DImode)
19999     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
20000   else
20001     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
20002   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
20003                            1, label);
20004   if (epilogue)
20005     predict_jump (REG_BR_PROB_BASE * 50 / 100);
20006   else
20007     predict_jump (REG_BR_PROB_BASE * 90 / 100);
20008   return label;
20009 }
20010
20011 /* Adjust COUNTER by the VALUE.  */
20012 static void
20013 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
20014 {
20015   rtx (*gen_add)(rtx, rtx, rtx)
20016     = GET_MODE (countreg) == DImode ? gen_adddi3 : gen_addsi3;
20017
20018   emit_insn (gen_add (countreg, countreg, GEN_INT (-value)));
20019 }
20020
20021 /* Zero extend possibly SImode EXP to Pmode register.  */
20022 rtx
20023 ix86_zero_extend_to_Pmode (rtx exp)
20024 {
20025   rtx r;
20026   if (GET_MODE (exp) == VOIDmode)
20027     return force_reg (Pmode, exp);
20028   if (GET_MODE (exp) == Pmode)
20029     return copy_to_mode_reg (Pmode, exp);
20030   r = gen_reg_rtx (Pmode);
20031   emit_insn (gen_zero_extendsidi2 (r, exp));
20032   return r;
20033 }
20034
20035 /* Divide COUNTREG by SCALE.  */
20036 static rtx
20037 scale_counter (rtx countreg, int scale)
20038 {
20039   rtx sc;
20040
20041   if (scale == 1)
20042     return countreg;
20043   if (CONST_INT_P (countreg))
20044     return GEN_INT (INTVAL (countreg) / scale);
20045   gcc_assert (REG_P (countreg));
20046
20047   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
20048                             GEN_INT (exact_log2 (scale)),
20049                             NULL, 1, OPTAB_DIRECT);
20050   return sc;
20051 }
20052
20053 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
20054    DImode for constant loop counts.  */
20055
20056 static enum machine_mode
20057 counter_mode (rtx count_exp)
20058 {
20059   if (GET_MODE (count_exp) != VOIDmode)
20060     return GET_MODE (count_exp);
20061   if (!CONST_INT_P (count_exp))
20062     return Pmode;
20063   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
20064     return DImode;
20065   return SImode;
20066 }
20067
20068 /* When SRCPTR is non-NULL, output simple loop to move memory
20069    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
20070    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
20071    equivalent loop to set memory by VALUE (supposed to be in MODE).
20072
20073    The size is rounded down to whole number of chunk size moved at once.
20074    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
20075
20076
20077 static void
20078 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
20079                                rtx destptr, rtx srcptr, rtx value,
20080                                rtx count, enum machine_mode mode, int unroll,
20081                                int expected_size)
20082 {
20083   rtx out_label, top_label, iter, tmp;
20084   enum machine_mode iter_mode = counter_mode (count);
20085   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
20086   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
20087   rtx size;
20088   rtx x_addr;
20089   rtx y_addr;
20090   int i;
20091
20092   top_label = gen_label_rtx ();
20093   out_label = gen_label_rtx ();
20094   iter = gen_reg_rtx (iter_mode);
20095
20096   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
20097                               NULL, 1, OPTAB_DIRECT);
20098   /* Those two should combine.  */
20099   if (piece_size == const1_rtx)
20100     {
20101       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
20102                                true, out_label);
20103       predict_jump (REG_BR_PROB_BASE * 10 / 100);
20104     }
20105   emit_move_insn (iter, const0_rtx);
20106
20107   emit_label (top_label);
20108
20109   tmp = convert_modes (Pmode, iter_mode, iter, true);
20110   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
20111   destmem = change_address (destmem, mode, x_addr);
20112
20113   if (srcmem)
20114     {
20115       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
20116       srcmem = change_address (srcmem, mode, y_addr);
20117
20118       /* When unrolling for chips that reorder memory reads and writes,
20119          we can save registers by using single temporary.
20120          Also using 4 temporaries is overkill in 32bit mode.  */
20121       if (!TARGET_64BIT && 0)
20122         {
20123           for (i = 0; i < unroll; i++)
20124             {
20125               if (i)
20126                 {
20127                   destmem =
20128                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20129                   srcmem =
20130                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
20131                 }
20132               emit_move_insn (destmem, srcmem);
20133             }
20134         }
20135       else
20136         {
20137           rtx tmpreg[4];
20138           gcc_assert (unroll <= 4);
20139           for (i = 0; i < unroll; i++)
20140             {
20141               tmpreg[i] = gen_reg_rtx (mode);
20142               if (i)
20143                 {
20144                   srcmem =
20145                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
20146                 }
20147               emit_move_insn (tmpreg[i], srcmem);
20148             }
20149           for (i = 0; i < unroll; i++)
20150             {
20151               if (i)
20152                 {
20153                   destmem =
20154                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20155                 }
20156               emit_move_insn (destmem, tmpreg[i]);
20157             }
20158         }
20159     }
20160   else
20161     for (i = 0; i < unroll; i++)
20162       {
20163         if (i)
20164           destmem =
20165             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
20166         emit_move_insn (destmem, value);
20167       }
20168
20169   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
20170                              true, OPTAB_LIB_WIDEN);
20171   if (tmp != iter)
20172     emit_move_insn (iter, tmp);
20173
20174   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
20175                            true, top_label);
20176   if (expected_size != -1)
20177     {
20178       expected_size /= GET_MODE_SIZE (mode) * unroll;
20179       if (expected_size == 0)
20180         predict_jump (0);
20181       else if (expected_size > REG_BR_PROB_BASE)
20182         predict_jump (REG_BR_PROB_BASE - 1);
20183       else
20184         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
20185     }
20186   else
20187     predict_jump (REG_BR_PROB_BASE * 80 / 100);
20188   iter = ix86_zero_extend_to_Pmode (iter);
20189   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
20190                              true, OPTAB_LIB_WIDEN);
20191   if (tmp != destptr)
20192     emit_move_insn (destptr, tmp);
20193   if (srcptr)
20194     {
20195       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
20196                                  true, OPTAB_LIB_WIDEN);
20197       if (tmp != srcptr)
20198         emit_move_insn (srcptr, tmp);
20199     }
20200   emit_label (out_label);
20201 }
20202
20203 /* Output "rep; mov" instruction.
20204    Arguments have same meaning as for previous function */
20205 static void
20206 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
20207                            rtx destptr, rtx srcptr,
20208                            rtx count,
20209                            enum machine_mode mode)
20210 {
20211   rtx destexp;
20212   rtx srcexp;
20213   rtx countreg;
20214
20215   /* If the size is known, it is shorter to use rep movs.  */
20216   if (mode == QImode && CONST_INT_P (count)
20217       && !(INTVAL (count) & 3))
20218     mode = SImode;
20219
20220   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
20221     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
20222   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
20223     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
20224   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
20225   if (mode != QImode)
20226     {
20227       destexp = gen_rtx_ASHIFT (Pmode, countreg,
20228                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20229       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
20230       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
20231                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20232       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
20233     }
20234   else
20235     {
20236       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
20237       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
20238     }
20239   if (CONST_INT_P (count))
20240     {
20241       count = GEN_INT (INTVAL (count)
20242                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
20243       destmem = shallow_copy_rtx (destmem);
20244       srcmem = shallow_copy_rtx (srcmem);
20245       set_mem_size (destmem, count);
20246       set_mem_size (srcmem, count);
20247     }
20248   else
20249     {
20250       if (MEM_SIZE (destmem))
20251         set_mem_size (destmem, NULL_RTX);
20252       if (MEM_SIZE (srcmem))
20253         set_mem_size (srcmem, NULL_RTX);
20254     }
20255   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
20256                           destexp, srcexp));
20257 }
20258
20259 /* Output "rep; stos" instruction.
20260    Arguments have same meaning as for previous function */
20261 static void
20262 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
20263                             rtx count, enum machine_mode mode,
20264                             rtx orig_value)
20265 {
20266   rtx destexp;
20267   rtx countreg;
20268
20269   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
20270     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
20271   value = force_reg (mode, gen_lowpart (mode, value));
20272   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
20273   if (mode != QImode)
20274     {
20275       destexp = gen_rtx_ASHIFT (Pmode, countreg,
20276                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
20277       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
20278     }
20279   else
20280     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
20281   if (orig_value == const0_rtx && CONST_INT_P (count))
20282     {
20283       count = GEN_INT (INTVAL (count)
20284                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
20285       destmem = shallow_copy_rtx (destmem);
20286       set_mem_size (destmem, count);
20287     }
20288   else if (MEM_SIZE (destmem))
20289     set_mem_size (destmem, NULL_RTX);
20290   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
20291 }
20292
20293 static void
20294 emit_strmov (rtx destmem, rtx srcmem,
20295              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
20296 {
20297   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
20298   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
20299   emit_insn (gen_strmov (destptr, dest, srcptr, src));
20300 }
20301
20302 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
20303 static void
20304 expand_movmem_epilogue (rtx destmem, rtx srcmem,
20305                         rtx destptr, rtx srcptr, rtx count, int max_size)
20306 {
20307   rtx src, dest;
20308   if (CONST_INT_P (count))
20309     {
20310       HOST_WIDE_INT countval = INTVAL (count);
20311       int offset = 0;
20312
20313       if ((countval & 0x10) && max_size > 16)
20314         {
20315           if (TARGET_64BIT)
20316             {
20317               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
20318               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
20319             }
20320           else
20321             gcc_unreachable ();
20322           offset += 16;
20323         }
20324       if ((countval & 0x08) && max_size > 8)
20325         {
20326           if (TARGET_64BIT)
20327             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
20328           else
20329             {
20330               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
20331               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
20332             }
20333           offset += 8;
20334         }
20335       if ((countval & 0x04) && max_size > 4)
20336         {
20337           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
20338           offset += 4;
20339         }
20340       if ((countval & 0x02) && max_size > 2)
20341         {
20342           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
20343           offset += 2;
20344         }
20345       if ((countval & 0x01) && max_size > 1)
20346         {
20347           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
20348           offset += 1;
20349         }
20350       return;
20351     }
20352   if (max_size > 8)
20353     {
20354       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
20355                                     count, 1, OPTAB_DIRECT);
20356       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
20357                                      count, QImode, 1, 4);
20358       return;
20359     }
20360
20361   /* When there are stringops, we can cheaply increase dest and src pointers.
20362      Otherwise we save code size by maintaining offset (zero is readily
20363      available from preceding rep operation) and using x86 addressing modes.
20364    */
20365   if (TARGET_SINGLE_STRINGOP)
20366     {
20367       if (max_size > 4)
20368         {
20369           rtx label = ix86_expand_aligntest (count, 4, true);
20370           src = change_address (srcmem, SImode, srcptr);
20371           dest = change_address (destmem, SImode, destptr);
20372           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20373           emit_label (label);
20374           LABEL_NUSES (label) = 1;
20375         }
20376       if (max_size > 2)
20377         {
20378           rtx label = ix86_expand_aligntest (count, 2, true);
20379           src = change_address (srcmem, HImode, srcptr);
20380           dest = change_address (destmem, HImode, destptr);
20381           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20382           emit_label (label);
20383           LABEL_NUSES (label) = 1;
20384         }
20385       if (max_size > 1)
20386         {
20387           rtx label = ix86_expand_aligntest (count, 1, true);
20388           src = change_address (srcmem, QImode, srcptr);
20389           dest = change_address (destmem, QImode, destptr);
20390           emit_insn (gen_strmov (destptr, dest, srcptr, src));
20391           emit_label (label);
20392           LABEL_NUSES (label) = 1;
20393         }
20394     }
20395   else
20396     {
20397       rtx offset = force_reg (Pmode, const0_rtx);
20398       rtx tmp;
20399
20400       if (max_size > 4)
20401         {
20402           rtx label = ix86_expand_aligntest (count, 4, true);
20403           src = change_address (srcmem, SImode, srcptr);
20404           dest = change_address (destmem, SImode, destptr);
20405           emit_move_insn (dest, src);
20406           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
20407                                      true, OPTAB_LIB_WIDEN);
20408           if (tmp != offset)
20409             emit_move_insn (offset, tmp);
20410           emit_label (label);
20411           LABEL_NUSES (label) = 1;
20412         }
20413       if (max_size > 2)
20414         {
20415           rtx label = ix86_expand_aligntest (count, 2, true);
20416           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
20417           src = change_address (srcmem, HImode, tmp);
20418           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
20419           dest = change_address (destmem, HImode, tmp);
20420           emit_move_insn (dest, src);
20421           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
20422                                      true, OPTAB_LIB_WIDEN);
20423           if (tmp != offset)
20424             emit_move_insn (offset, tmp);
20425           emit_label (label);
20426           LABEL_NUSES (label) = 1;
20427         }
20428       if (max_size > 1)
20429         {
20430           rtx label = ix86_expand_aligntest (count, 1, true);
20431           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
20432           src = change_address (srcmem, QImode, tmp);
20433           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
20434           dest = change_address (destmem, QImode, tmp);
20435           emit_move_insn (dest, src);
20436           emit_label (label);
20437           LABEL_NUSES (label) = 1;
20438         }
20439     }
20440 }
20441
20442 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
20443 static void
20444 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
20445                                  rtx count, int max_size)
20446 {
20447   count =
20448     expand_simple_binop (counter_mode (count), AND, count,
20449                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
20450   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
20451                                  gen_lowpart (QImode, value), count, QImode,
20452                                  1, max_size / 2);
20453 }
20454
20455 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
20456 static void
20457 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
20458 {
20459   rtx dest;
20460
20461   if (CONST_INT_P (count))
20462     {
20463       HOST_WIDE_INT countval = INTVAL (count);
20464       int offset = 0;
20465
20466       if ((countval & 0x10) && max_size > 16)
20467         {
20468           if (TARGET_64BIT)
20469             {
20470               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
20471               emit_insn (gen_strset (destptr, dest, value));
20472               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
20473               emit_insn (gen_strset (destptr, dest, value));
20474             }
20475           else
20476             gcc_unreachable ();
20477           offset += 16;
20478         }
20479       if ((countval & 0x08) && max_size > 8)
20480         {
20481           if (TARGET_64BIT)
20482             {
20483               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
20484               emit_insn (gen_strset (destptr, dest, value));
20485             }
20486           else
20487             {
20488               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
20489               emit_insn (gen_strset (destptr, dest, value));
20490               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
20491               emit_insn (gen_strset (destptr, dest, value));
20492             }
20493           offset += 8;
20494         }
20495       if ((countval & 0x04) && max_size > 4)
20496         {
20497           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
20498           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
20499           offset += 4;
20500         }
20501       if ((countval & 0x02) && max_size > 2)
20502         {
20503           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
20504           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
20505           offset += 2;
20506         }
20507       if ((countval & 0x01) && max_size > 1)
20508         {
20509           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
20510           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
20511           offset += 1;
20512         }
20513       return;
20514     }
20515   if (max_size > 32)
20516     {
20517       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
20518       return;
20519     }
20520   if (max_size > 16)
20521     {
20522       rtx label = ix86_expand_aligntest (count, 16, true);
20523       if (TARGET_64BIT)
20524         {
20525           dest = change_address (destmem, DImode, destptr);
20526           emit_insn (gen_strset (destptr, dest, value));
20527           emit_insn (gen_strset (destptr, dest, value));
20528         }
20529       else
20530         {
20531           dest = change_address (destmem, SImode, destptr);
20532           emit_insn (gen_strset (destptr, dest, value));
20533           emit_insn (gen_strset (destptr, dest, value));
20534           emit_insn (gen_strset (destptr, dest, value));
20535           emit_insn (gen_strset (destptr, dest, value));
20536         }
20537       emit_label (label);
20538       LABEL_NUSES (label) = 1;
20539     }
20540   if (max_size > 8)
20541     {
20542       rtx label = ix86_expand_aligntest (count, 8, true);
20543       if (TARGET_64BIT)
20544         {
20545           dest = change_address (destmem, DImode, destptr);
20546           emit_insn (gen_strset (destptr, dest, value));
20547         }
20548       else
20549         {
20550           dest = change_address (destmem, SImode, destptr);
20551           emit_insn (gen_strset (destptr, dest, value));
20552           emit_insn (gen_strset (destptr, dest, value));
20553         }
20554       emit_label (label);
20555       LABEL_NUSES (label) = 1;
20556     }
20557   if (max_size > 4)
20558     {
20559       rtx label = ix86_expand_aligntest (count, 4, true);
20560       dest = change_address (destmem, SImode, destptr);
20561       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
20562       emit_label (label);
20563       LABEL_NUSES (label) = 1;
20564     }
20565   if (max_size > 2)
20566     {
20567       rtx label = ix86_expand_aligntest (count, 2, true);
20568       dest = change_address (destmem, HImode, destptr);
20569       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
20570       emit_label (label);
20571       LABEL_NUSES (label) = 1;
20572     }
20573   if (max_size > 1)
20574     {
20575       rtx label = ix86_expand_aligntest (count, 1, true);
20576       dest = change_address (destmem, QImode, destptr);
20577       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
20578       emit_label (label);
20579       LABEL_NUSES (label) = 1;
20580     }
20581 }
20582
20583 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
20584    DESIRED_ALIGNMENT.  */
20585 static void
20586 expand_movmem_prologue (rtx destmem, rtx srcmem,
20587                         rtx destptr, rtx srcptr, rtx count,
20588                         int align, int desired_alignment)
20589 {
20590   if (align <= 1 && desired_alignment > 1)
20591     {
20592       rtx label = ix86_expand_aligntest (destptr, 1, false);
20593       srcmem = change_address (srcmem, QImode, srcptr);
20594       destmem = change_address (destmem, QImode, destptr);
20595       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20596       ix86_adjust_counter (count, 1);
20597       emit_label (label);
20598       LABEL_NUSES (label) = 1;
20599     }
20600   if (align <= 2 && desired_alignment > 2)
20601     {
20602       rtx label = ix86_expand_aligntest (destptr, 2, false);
20603       srcmem = change_address (srcmem, HImode, srcptr);
20604       destmem = change_address (destmem, HImode, destptr);
20605       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20606       ix86_adjust_counter (count, 2);
20607       emit_label (label);
20608       LABEL_NUSES (label) = 1;
20609     }
20610   if (align <= 4 && desired_alignment > 4)
20611     {
20612       rtx label = ix86_expand_aligntest (destptr, 4, false);
20613       srcmem = change_address (srcmem, SImode, srcptr);
20614       destmem = change_address (destmem, SImode, destptr);
20615       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
20616       ix86_adjust_counter (count, 4);
20617       emit_label (label);
20618       LABEL_NUSES (label) = 1;
20619     }
20620   gcc_assert (desired_alignment <= 8);
20621 }
20622
20623 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
20624    ALIGN_BYTES is how many bytes need to be copied.  */
20625 static rtx
20626 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
20627                                  int desired_align, int align_bytes)
20628 {
20629   rtx src = *srcp;
20630   rtx src_size, dst_size;
20631   int off = 0;
20632   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
20633   if (src_align_bytes >= 0)
20634     src_align_bytes = desired_align - src_align_bytes;
20635   src_size = MEM_SIZE (src);
20636   dst_size = MEM_SIZE (dst);
20637   if (align_bytes & 1)
20638     {
20639       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
20640       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
20641       off = 1;
20642       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20643     }
20644   if (align_bytes & 2)
20645     {
20646       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
20647       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
20648       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
20649         set_mem_align (dst, 2 * BITS_PER_UNIT);
20650       if (src_align_bytes >= 0
20651           && (src_align_bytes & 1) == (align_bytes & 1)
20652           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
20653         set_mem_align (src, 2 * BITS_PER_UNIT);
20654       off = 2;
20655       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20656     }
20657   if (align_bytes & 4)
20658     {
20659       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
20660       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
20661       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
20662         set_mem_align (dst, 4 * BITS_PER_UNIT);
20663       if (src_align_bytes >= 0)
20664         {
20665           unsigned int src_align = 0;
20666           if ((src_align_bytes & 3) == (align_bytes & 3))
20667             src_align = 4;
20668           else if ((src_align_bytes & 1) == (align_bytes & 1))
20669             src_align = 2;
20670           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
20671             set_mem_align (src, src_align * BITS_PER_UNIT);
20672         }
20673       off = 4;
20674       emit_insn (gen_strmov (destreg, dst, srcreg, src));
20675     }
20676   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
20677   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
20678   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
20679     set_mem_align (dst, desired_align * BITS_PER_UNIT);
20680   if (src_align_bytes >= 0)
20681     {
20682       unsigned int src_align = 0;
20683       if ((src_align_bytes & 7) == (align_bytes & 7))
20684         src_align = 8;
20685       else if ((src_align_bytes & 3) == (align_bytes & 3))
20686         src_align = 4;
20687       else if ((src_align_bytes & 1) == (align_bytes & 1))
20688         src_align = 2;
20689       if (src_align > (unsigned int) desired_align)
20690         src_align = desired_align;
20691       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
20692         set_mem_align (src, src_align * BITS_PER_UNIT);
20693     }
20694   if (dst_size)
20695     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
20696   if (src_size)
20697     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
20698   *srcp = src;
20699   return dst;
20700 }
20701
20702 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
20703    DESIRED_ALIGNMENT.  */
20704 static void
20705 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
20706                         int align, int desired_alignment)
20707 {
20708   if (align <= 1 && desired_alignment > 1)
20709     {
20710       rtx label = ix86_expand_aligntest (destptr, 1, false);
20711       destmem = change_address (destmem, QImode, destptr);
20712       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
20713       ix86_adjust_counter (count, 1);
20714       emit_label (label);
20715       LABEL_NUSES (label) = 1;
20716     }
20717   if (align <= 2 && desired_alignment > 2)
20718     {
20719       rtx label = ix86_expand_aligntest (destptr, 2, false);
20720       destmem = change_address (destmem, HImode, destptr);
20721       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
20722       ix86_adjust_counter (count, 2);
20723       emit_label (label);
20724       LABEL_NUSES (label) = 1;
20725     }
20726   if (align <= 4 && desired_alignment > 4)
20727     {
20728       rtx label = ix86_expand_aligntest (destptr, 4, false);
20729       destmem = change_address (destmem, SImode, destptr);
20730       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
20731       ix86_adjust_counter (count, 4);
20732       emit_label (label);
20733       LABEL_NUSES (label) = 1;
20734     }
20735   gcc_assert (desired_alignment <= 8);
20736 }
20737
20738 /* Set enough from DST to align DST known to by aligned by ALIGN to
20739    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
20740 static rtx
20741 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
20742                                  int desired_align, int align_bytes)
20743 {
20744   int off = 0;
20745   rtx dst_size = MEM_SIZE (dst);
20746   if (align_bytes & 1)
20747     {
20748       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
20749       off = 1;
20750       emit_insn (gen_strset (destreg, dst,
20751                              gen_lowpart (QImode, value)));
20752     }
20753   if (align_bytes & 2)
20754     {
20755       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
20756       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
20757         set_mem_align (dst, 2 * BITS_PER_UNIT);
20758       off = 2;
20759       emit_insn (gen_strset (destreg, dst,
20760                              gen_lowpart (HImode, value)));
20761     }
20762   if (align_bytes & 4)
20763     {
20764       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
20765       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
20766         set_mem_align (dst, 4 * BITS_PER_UNIT);
20767       off = 4;
20768       emit_insn (gen_strset (destreg, dst,
20769                              gen_lowpart (SImode, value)));
20770     }
20771   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
20772   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
20773     set_mem_align (dst, desired_align * BITS_PER_UNIT);
20774   if (dst_size)
20775     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
20776   return dst;
20777 }
20778
20779 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
20780 static enum stringop_alg
20781 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
20782             int *dynamic_check)
20783 {
20784   const struct stringop_algs * algs;
20785   bool optimize_for_speed;
20786   /* Algorithms using the rep prefix want at least edi and ecx;
20787      additionally, memset wants eax and memcpy wants esi.  Don't
20788      consider such algorithms if the user has appropriated those
20789      registers for their own purposes.  */
20790   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
20791                              || (memset
20792                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
20793
20794 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
20795                            || (alg != rep_prefix_1_byte         \
20796                                && alg != rep_prefix_4_byte      \
20797                                && alg != rep_prefix_8_byte))
20798   const struct processor_costs *cost;
20799
20800   /* Even if the string operation call is cold, we still might spend a lot
20801      of time processing large blocks.  */
20802   if (optimize_function_for_size_p (cfun)
20803       || (optimize_insn_for_size_p ()
20804           && expected_size != -1 && expected_size < 256))
20805     optimize_for_speed = false;
20806   else
20807     optimize_for_speed = true;
20808
20809   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
20810
20811   *dynamic_check = -1;
20812   if (memset)
20813     algs = &cost->memset[TARGET_64BIT != 0];
20814   else
20815     algs = &cost->memcpy[TARGET_64BIT != 0];
20816   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
20817     return stringop_alg;
20818   /* rep; movq or rep; movl is the smallest variant.  */
20819   else if (!optimize_for_speed)
20820     {
20821       if (!count || (count & 3))
20822         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
20823       else
20824         return rep_prefix_usable ? rep_prefix_4_byte : loop;
20825     }
20826   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
20827    */
20828   else if (expected_size != -1 && expected_size < 4)
20829     return loop_1_byte;
20830   else if (expected_size != -1)
20831     {
20832       unsigned int i;
20833       enum stringop_alg alg = libcall;
20834       for (i = 0; i < MAX_STRINGOP_ALGS; i++)
20835         {
20836           /* We get here if the algorithms that were not libcall-based
20837              were rep-prefix based and we are unable to use rep prefixes
20838              based on global register usage.  Break out of the loop and
20839              use the heuristic below.  */
20840           if (algs->size[i].max == 0)
20841             break;
20842           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
20843             {
20844               enum stringop_alg candidate = algs->size[i].alg;
20845
20846               if (candidate != libcall && ALG_USABLE_P (candidate))
20847                 alg = candidate;
20848               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
20849                  last non-libcall inline algorithm.  */
20850               if (TARGET_INLINE_ALL_STRINGOPS)
20851                 {
20852                   /* When the current size is best to be copied by a libcall,
20853                      but we are still forced to inline, run the heuristic below
20854                      that will pick code for medium sized blocks.  */
20855                   if (alg != libcall)
20856                     return alg;
20857                   break;
20858                 }
20859               else if (ALG_USABLE_P (candidate))
20860                 return candidate;
20861             }
20862         }
20863       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
20864     }
20865   /* When asked to inline the call anyway, try to pick meaningful choice.
20866      We look for maximal size of block that is faster to copy by hand and
20867      take blocks of at most of that size guessing that average size will
20868      be roughly half of the block.
20869
20870      If this turns out to be bad, we might simply specify the preferred
20871      choice in ix86_costs.  */
20872   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20873       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
20874     {
20875       int max = -1;
20876       enum stringop_alg alg;
20877       int i;
20878       bool any_alg_usable_p = true;
20879
20880       for (i = 0; i < MAX_STRINGOP_ALGS; i++)
20881         {
20882           enum stringop_alg candidate = algs->size[i].alg;
20883           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
20884
20885           if (candidate != libcall && candidate
20886               && ALG_USABLE_P (candidate))
20887               max = algs->size[i].max;
20888         }
20889       /* If there aren't any usable algorithms, then recursing on
20890          smaller sizes isn't going to find anything.  Just return the
20891          simple byte-at-a-time copy loop.  */
20892       if (!any_alg_usable_p)
20893         {
20894           /* Pick something reasonable.  */
20895           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20896             *dynamic_check = 128;
20897           return loop_1_byte;
20898         }
20899       if (max == -1)
20900         max = 4096;
20901       alg = decide_alg (count, max / 2, memset, dynamic_check);
20902       gcc_assert (*dynamic_check == -1);
20903       gcc_assert (alg != libcall);
20904       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
20905         *dynamic_check = max;
20906       return alg;
20907     }
20908   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
20909 #undef ALG_USABLE_P
20910 }
20911
20912 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
20913    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
20914 static int
20915 decide_alignment (int align,
20916                   enum stringop_alg alg,
20917                   int expected_size)
20918 {
20919   int desired_align = 0;
20920   switch (alg)
20921     {
20922       case no_stringop:
20923         gcc_unreachable ();
20924       case loop:
20925       case unrolled_loop:
20926         desired_align = GET_MODE_SIZE (Pmode);
20927         break;
20928       case rep_prefix_8_byte:
20929         desired_align = 8;
20930         break;
20931       case rep_prefix_4_byte:
20932         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
20933            copying whole cacheline at once.  */
20934         if (TARGET_PENTIUMPRO)
20935           desired_align = 8;
20936         else
20937           desired_align = 4;
20938         break;
20939       case rep_prefix_1_byte:
20940         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
20941            copying whole cacheline at once.  */
20942         if (TARGET_PENTIUMPRO)
20943           desired_align = 8;
20944         else
20945           desired_align = 1;
20946         break;
20947       case loop_1_byte:
20948         desired_align = 1;
20949         break;
20950       case libcall:
20951         return 0;
20952     }
20953
20954   if (optimize_size)
20955     desired_align = 1;
20956   if (desired_align < align)
20957     desired_align = align;
20958   if (expected_size != -1 && expected_size < 4)
20959     desired_align = align;
20960   return desired_align;
20961 }
20962
20963 /* Return the smallest power of 2 greater than VAL.  */
20964 static int
20965 smallest_pow2_greater_than (int val)
20966 {
20967   int ret = 1;
20968   while (ret <= val)
20969     ret <<= 1;
20970   return ret;
20971 }
20972
20973 /* Expand string move (memcpy) operation.  Use i386 string operations
20974    when profitable.  expand_setmem contains similar code.  The code
20975    depends upon architecture, block size and alignment, but always has
20976    the same overall structure:
20977
20978    1) Prologue guard: Conditional that jumps up to epilogues for small
20979       blocks that can be handled by epilogue alone.  This is faster
20980       but also needed for correctness, since prologue assume the block
20981       is larger than the desired alignment.
20982
20983       Optional dynamic check for size and libcall for large
20984       blocks is emitted here too, with -minline-stringops-dynamically.
20985
20986    2) Prologue: copy first few bytes in order to get destination
20987       aligned to DESIRED_ALIGN.  It is emitted only when ALIGN is less
20988       than DESIRED_ALIGN and up to DESIRED_ALIGN - ALIGN bytes can be
20989       copied.  We emit either a jump tree on power of two sized
20990       blocks, or a byte loop.
20991
20992    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
20993       with specified algorithm.
20994
20995    4) Epilogue: code copying tail of the block that is too small to be
20996       handled by main body (or up to size guarded by prologue guard).  */
20997
20998 bool
20999 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
21000                     rtx expected_align_exp, rtx expected_size_exp)
21001 {
21002   rtx destreg;
21003   rtx srcreg;
21004   rtx label = NULL;
21005   rtx tmp;
21006   rtx jump_around_label = NULL;
21007   HOST_WIDE_INT align = 1;
21008   unsigned HOST_WIDE_INT count = 0;
21009   HOST_WIDE_INT expected_size = -1;
21010   int size_needed = 0, epilogue_size_needed;
21011   int desired_align = 0, align_bytes = 0;
21012   enum stringop_alg alg;
21013   int dynamic_check;
21014   bool need_zero_guard = false;
21015
21016   if (CONST_INT_P (align_exp))
21017     align = INTVAL (align_exp);
21018   /* i386 can do misaligned access on reasonably increased cost.  */
21019   if (CONST_INT_P (expected_align_exp)
21020       && INTVAL (expected_align_exp) > align)
21021     align = INTVAL (expected_align_exp);
21022   /* ALIGN is the minimum of destination and source alignment, but we care here
21023      just about destination alignment.  */
21024   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
21025     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
21026
21027   if (CONST_INT_P (count_exp))
21028     count = expected_size = INTVAL (count_exp);
21029   if (CONST_INT_P (expected_size_exp) && count == 0)
21030     expected_size = INTVAL (expected_size_exp);
21031
21032   /* Make sure we don't need to care about overflow later on.  */
21033   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
21034     return false;
21035
21036   /* Step 0: Decide on preferred algorithm, desired alignment and
21037      size of chunks to be copied by main loop.  */
21038
21039   alg = decide_alg (count, expected_size, false, &dynamic_check);
21040   desired_align = decide_alignment (align, alg, expected_size);
21041
21042   if (!TARGET_ALIGN_STRINGOPS)
21043     align = desired_align;
21044
21045   if (alg == libcall)
21046     return false;
21047   gcc_assert (alg != no_stringop);
21048   if (!count)
21049     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
21050   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
21051   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
21052   switch (alg)
21053     {
21054     case libcall:
21055     case no_stringop:
21056       gcc_unreachable ();
21057     case loop:
21058       need_zero_guard = true;
21059       size_needed = GET_MODE_SIZE (Pmode);
21060       break;
21061     case unrolled_loop:
21062       need_zero_guard = true;
21063       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
21064       break;
21065     case rep_prefix_8_byte:
21066       size_needed = 8;
21067       break;
21068     case rep_prefix_4_byte:
21069       size_needed = 4;
21070       break;
21071     case rep_prefix_1_byte:
21072       size_needed = 1;
21073       break;
21074     case loop_1_byte:
21075       need_zero_guard = true;
21076       size_needed = 1;
21077       break;
21078     }
21079
21080   epilogue_size_needed = size_needed;
21081
21082   /* Step 1: Prologue guard.  */
21083
21084   /* Alignment code needs count to be in register.  */
21085   if (CONST_INT_P (count_exp) && desired_align > align)
21086     {
21087       if (INTVAL (count_exp) > desired_align
21088           && INTVAL (count_exp) > size_needed)
21089         {
21090           align_bytes
21091             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
21092           if (align_bytes <= 0)
21093             align_bytes = 0;
21094           else
21095             align_bytes = desired_align - align_bytes;
21096         }
21097       if (align_bytes == 0)
21098         count_exp = force_reg (counter_mode (count_exp), count_exp);
21099     }
21100   gcc_assert (desired_align >= 1 && align >= 1);
21101
21102   /* Ensure that alignment prologue won't copy past end of block.  */
21103   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
21104     {
21105       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
21106       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
21107          Make sure it is power of 2.  */
21108       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
21109
21110       if (count)
21111         {
21112           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
21113             {
21114               /* If main algorithm works on QImode, no epilogue is needed.
21115                  For small sizes just don't align anything.  */
21116               if (size_needed == 1)
21117                 desired_align = align;
21118               else
21119                 goto epilogue;
21120             }
21121         }
21122       else
21123         {
21124           label = gen_label_rtx ();
21125           emit_cmp_and_jump_insns (count_exp,
21126                                    GEN_INT (epilogue_size_needed),
21127                                    LTU, 0, counter_mode (count_exp), 1, label);
21128           if (expected_size == -1 || expected_size < epilogue_size_needed)
21129             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21130           else
21131             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21132         }
21133     }
21134
21135   /* Emit code to decide on runtime whether library call or inline should be
21136      used.  */
21137   if (dynamic_check != -1)
21138     {
21139       if (CONST_INT_P (count_exp))
21140         {
21141           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
21142             {
21143               emit_block_move_via_libcall (dst, src, count_exp, false);
21144               count_exp = const0_rtx;
21145               goto epilogue;
21146             }
21147         }
21148       else
21149         {
21150           rtx hot_label = gen_label_rtx ();
21151           jump_around_label = gen_label_rtx ();
21152           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
21153                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
21154           predict_jump (REG_BR_PROB_BASE * 90 / 100);
21155           emit_block_move_via_libcall (dst, src, count_exp, false);
21156           emit_jump (jump_around_label);
21157           emit_label (hot_label);
21158         }
21159     }
21160
21161   /* Step 2: Alignment prologue.  */
21162
21163   if (desired_align > align)
21164     {
21165       if (align_bytes == 0)
21166         {
21167           /* Except for the first move in epilogue, we no longer know
21168              constant offset in aliasing info.  It don't seems to worth
21169              the pain to maintain it for the first move, so throw away
21170              the info early.  */
21171           src = change_address (src, BLKmode, srcreg);
21172           dst = change_address (dst, BLKmode, destreg);
21173           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
21174                                   desired_align);
21175         }
21176       else
21177         {
21178           /* If we know how many bytes need to be stored before dst is
21179              sufficiently aligned, maintain aliasing info accurately.  */
21180           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
21181                                                  desired_align, align_bytes);
21182           count_exp = plus_constant (count_exp, -align_bytes);
21183           count -= align_bytes;
21184         }
21185       if (need_zero_guard
21186           && (count < (unsigned HOST_WIDE_INT) size_needed
21187               || (align_bytes == 0
21188                   && count < ((unsigned HOST_WIDE_INT) size_needed
21189                               + desired_align - align))))
21190         {
21191           /* It is possible that we copied enough so the main loop will not
21192              execute.  */
21193           gcc_assert (size_needed > 1);
21194           if (label == NULL_RTX)
21195             label = gen_label_rtx ();
21196           emit_cmp_and_jump_insns (count_exp,
21197                                    GEN_INT (size_needed),
21198                                    LTU, 0, counter_mode (count_exp), 1, label);
21199           if (expected_size == -1
21200               || expected_size < (desired_align - align) / 2 + size_needed)
21201             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21202           else
21203             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21204         }
21205     }
21206   if (label && size_needed == 1)
21207     {
21208       emit_label (label);
21209       LABEL_NUSES (label) = 1;
21210       label = NULL;
21211       epilogue_size_needed = 1;
21212     }
21213   else if (label == NULL_RTX)
21214     epilogue_size_needed = size_needed;
21215
21216   /* Step 3: Main loop.  */
21217
21218   switch (alg)
21219     {
21220     case libcall:
21221     case no_stringop:
21222       gcc_unreachable ();
21223     case loop_1_byte:
21224       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21225                                      count_exp, QImode, 1, expected_size);
21226       break;
21227     case loop:
21228       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21229                                      count_exp, Pmode, 1, expected_size);
21230       break;
21231     case unrolled_loop:
21232       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
21233          registers for 4 temporaries anyway.  */
21234       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
21235                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
21236                                      expected_size);
21237       break;
21238     case rep_prefix_8_byte:
21239       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21240                                  DImode);
21241       break;
21242     case rep_prefix_4_byte:
21243       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21244                                  SImode);
21245       break;
21246     case rep_prefix_1_byte:
21247       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
21248                                  QImode);
21249       break;
21250     }
21251   /* Adjust properly the offset of src and dest memory for aliasing.  */
21252   if (CONST_INT_P (count_exp))
21253     {
21254       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
21255                                           (count / size_needed) * size_needed);
21256       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
21257                                           (count / size_needed) * size_needed);
21258     }
21259   else
21260     {
21261       src = change_address (src, BLKmode, srcreg);
21262       dst = change_address (dst, BLKmode, destreg);
21263     }
21264
21265   /* Step 4: Epilogue to copy the remaining bytes.  */
21266  epilogue:
21267   if (label)
21268     {
21269       /* When the main loop is done, COUNT_EXP might hold original count,
21270          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
21271          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
21272          bytes. Compensate if needed.  */
21273
21274       if (size_needed < epilogue_size_needed)
21275         {
21276           tmp =
21277             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
21278                                  GEN_INT (size_needed - 1), count_exp, 1,
21279                                  OPTAB_DIRECT);
21280           if (tmp != count_exp)
21281             emit_move_insn (count_exp, tmp);
21282         }
21283       emit_label (label);
21284       LABEL_NUSES (label) = 1;
21285     }
21286
21287   if (count_exp != const0_rtx && epilogue_size_needed > 1)
21288     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
21289                             epilogue_size_needed);
21290   if (jump_around_label)
21291     emit_label (jump_around_label);
21292   return true;
21293 }
21294
21295 /* Helper function for memcpy.  For QImode value 0xXY produce
21296    0xXYXYXYXY of wide specified by MODE.  This is essentially
21297    a * 0x10101010, but we can do slightly better than
21298    synth_mult by unwinding the sequence by hand on CPUs with
21299    slow multiply.  */
21300 static rtx
21301 promote_duplicated_reg (enum machine_mode mode, rtx val)
21302 {
21303   enum machine_mode valmode = GET_MODE (val);
21304   rtx tmp;
21305   int nops = mode == DImode ? 3 : 2;
21306
21307   gcc_assert (mode == SImode || mode == DImode);
21308   if (val == const0_rtx)
21309     return copy_to_mode_reg (mode, const0_rtx);
21310   if (CONST_INT_P (val))
21311     {
21312       HOST_WIDE_INT v = INTVAL (val) & 255;
21313
21314       v |= v << 8;
21315       v |= v << 16;
21316       if (mode == DImode)
21317         v |= (v << 16) << 16;
21318       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
21319     }
21320
21321   if (valmode == VOIDmode)
21322     valmode = QImode;
21323   if (valmode != QImode)
21324     val = gen_lowpart (QImode, val);
21325   if (mode == QImode)
21326     return val;
21327   if (!TARGET_PARTIAL_REG_STALL)
21328     nops--;
21329   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
21330       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
21331       <= (ix86_cost->shift_const + ix86_cost->add) * nops
21332           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
21333     {
21334       rtx reg = convert_modes (mode, QImode, val, true);
21335       tmp = promote_duplicated_reg (mode, const1_rtx);
21336       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
21337                                   OPTAB_DIRECT);
21338     }
21339   else
21340     {
21341       rtx reg = convert_modes (mode, QImode, val, true);
21342
21343       if (!TARGET_PARTIAL_REG_STALL)
21344         if (mode == SImode)
21345           emit_insn (gen_movsi_insv_1 (reg, reg));
21346         else
21347           emit_insn (gen_movdi_insv_1 (reg, reg));
21348       else
21349         {
21350           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
21351                                      NULL, 1, OPTAB_DIRECT);
21352           reg =
21353             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21354         }
21355       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
21356                                  NULL, 1, OPTAB_DIRECT);
21357       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21358       if (mode == SImode)
21359         return reg;
21360       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
21361                                  NULL, 1, OPTAB_DIRECT);
21362       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
21363       return reg;
21364     }
21365 }
21366
21367 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
21368    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
21369    alignment from ALIGN to DESIRED_ALIGN.  */
21370 static rtx
21371 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
21372 {
21373   rtx promoted_val;
21374
21375   if (TARGET_64BIT
21376       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
21377     promoted_val = promote_duplicated_reg (DImode, val);
21378   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
21379     promoted_val = promote_duplicated_reg (SImode, val);
21380   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
21381     promoted_val = promote_duplicated_reg (HImode, val);
21382   else
21383     promoted_val = val;
21384
21385   return promoted_val;
21386 }
21387
21388 /* Expand string clear operation (bzero).  Use i386 string operations when
21389    profitable.  See expand_movmem comment for explanation of individual
21390    steps performed.  */
21391 bool
21392 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
21393                     rtx expected_align_exp, rtx expected_size_exp)
21394 {
21395   rtx destreg;
21396   rtx label = NULL;
21397   rtx tmp;
21398   rtx jump_around_label = NULL;
21399   HOST_WIDE_INT align = 1;
21400   unsigned HOST_WIDE_INT count = 0;
21401   HOST_WIDE_INT expected_size = -1;
21402   int size_needed = 0, epilogue_size_needed;
21403   int desired_align = 0, align_bytes = 0;
21404   enum stringop_alg alg;
21405   rtx promoted_val = NULL;
21406   bool force_loopy_epilogue = false;
21407   int dynamic_check;
21408   bool need_zero_guard = false;
21409
21410   if (CONST_INT_P (align_exp))
21411     align = INTVAL (align_exp);
21412   /* i386 can do misaligned access on reasonably increased cost.  */
21413   if (CONST_INT_P (expected_align_exp)
21414       && INTVAL (expected_align_exp) > align)
21415     align = INTVAL (expected_align_exp);
21416   if (CONST_INT_P (count_exp))
21417     count = expected_size = INTVAL (count_exp);
21418   if (CONST_INT_P (expected_size_exp) && count == 0)
21419     expected_size = INTVAL (expected_size_exp);
21420
21421   /* Make sure we don't need to care about overflow later on.  */
21422   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
21423     return false;
21424
21425   /* Step 0: Decide on preferred algorithm, desired alignment and
21426      size of chunks to be copied by main loop.  */
21427
21428   alg = decide_alg (count, expected_size, true, &dynamic_check);
21429   desired_align = decide_alignment (align, alg, expected_size);
21430
21431   if (!TARGET_ALIGN_STRINGOPS)
21432     align = desired_align;
21433
21434   if (alg == libcall)
21435     return false;
21436   gcc_assert (alg != no_stringop);
21437   if (!count)
21438     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
21439   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
21440   switch (alg)
21441     {
21442     case libcall:
21443     case no_stringop:
21444       gcc_unreachable ();
21445     case loop:
21446       need_zero_guard = true;
21447       size_needed = GET_MODE_SIZE (Pmode);
21448       break;
21449     case unrolled_loop:
21450       need_zero_guard = true;
21451       size_needed = GET_MODE_SIZE (Pmode) * 4;
21452       break;
21453     case rep_prefix_8_byte:
21454       size_needed = 8;
21455       break;
21456     case rep_prefix_4_byte:
21457       size_needed = 4;
21458       break;
21459     case rep_prefix_1_byte:
21460       size_needed = 1;
21461       break;
21462     case loop_1_byte:
21463       need_zero_guard = true;
21464       size_needed = 1;
21465       break;
21466     }
21467   epilogue_size_needed = size_needed;
21468
21469   /* Step 1: Prologue guard.  */
21470
21471   /* Alignment code needs count to be in register.  */
21472   if (CONST_INT_P (count_exp) && desired_align > align)
21473     {
21474       if (INTVAL (count_exp) > desired_align
21475           && INTVAL (count_exp) > size_needed)
21476         {
21477           align_bytes
21478             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
21479           if (align_bytes <= 0)
21480             align_bytes = 0;
21481           else
21482             align_bytes = desired_align - align_bytes;
21483         }
21484       if (align_bytes == 0)
21485         {
21486           enum machine_mode mode = SImode;
21487           if (TARGET_64BIT && (count & ~0xffffffff))
21488             mode = DImode;
21489           count_exp = force_reg (mode, count_exp);
21490         }
21491     }
21492   /* Do the cheap promotion to allow better CSE across the
21493      main loop and epilogue (ie one load of the big constant in the
21494      front of all code.  */
21495   if (CONST_INT_P (val_exp))
21496     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
21497                                                    desired_align, align);
21498   /* Ensure that alignment prologue won't copy past end of block.  */
21499   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
21500     {
21501       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
21502       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
21503          Make sure it is power of 2.  */
21504       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
21505
21506       /* To improve performance of small blocks, we jump around the VAL
21507          promoting mode.  This mean that if the promoted VAL is not constant,
21508          we might not use it in the epilogue and have to use byte
21509          loop variant.  */
21510       if (epilogue_size_needed > 2 && !promoted_val)
21511         force_loopy_epilogue = true;
21512       if (count)
21513         {
21514           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
21515             {
21516               /* If main algorithm works on QImode, no epilogue is needed.
21517                  For small sizes just don't align anything.  */
21518               if (size_needed == 1)
21519                 desired_align = align;
21520               else
21521                 goto epilogue;
21522             }
21523         }
21524       else
21525         {
21526           label = gen_label_rtx ();
21527           emit_cmp_and_jump_insns (count_exp,
21528                                    GEN_INT (epilogue_size_needed),
21529                                    LTU, 0, counter_mode (count_exp), 1, label);
21530           if (expected_size == -1 || expected_size <= epilogue_size_needed)
21531             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21532           else
21533             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21534         }
21535     }
21536   if (dynamic_check != -1)
21537     {
21538       rtx hot_label = gen_label_rtx ();
21539       jump_around_label = gen_label_rtx ();
21540       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
21541                                LEU, 0, counter_mode (count_exp), 1, hot_label);
21542       predict_jump (REG_BR_PROB_BASE * 90 / 100);
21543       set_storage_via_libcall (dst, count_exp, val_exp, false);
21544       emit_jump (jump_around_label);
21545       emit_label (hot_label);
21546     }
21547
21548   /* Step 2: Alignment prologue.  */
21549
21550   /* Do the expensive promotion once we branched off the small blocks.  */
21551   if (!promoted_val)
21552     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
21553                                                    desired_align, align);
21554   gcc_assert (desired_align >= 1 && align >= 1);
21555
21556   if (desired_align > align)
21557     {
21558       if (align_bytes == 0)
21559         {
21560           /* Except for the first move in epilogue, we no longer know
21561              constant offset in aliasing info.  It don't seems to worth
21562              the pain to maintain it for the first move, so throw away
21563              the info early.  */
21564           dst = change_address (dst, BLKmode, destreg);
21565           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
21566                                   desired_align);
21567         }
21568       else
21569         {
21570           /* If we know how many bytes need to be stored before dst is
21571              sufficiently aligned, maintain aliasing info accurately.  */
21572           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
21573                                                  desired_align, align_bytes);
21574           count_exp = plus_constant (count_exp, -align_bytes);
21575           count -= align_bytes;
21576         }
21577       if (need_zero_guard
21578           && (count < (unsigned HOST_WIDE_INT) size_needed
21579               || (align_bytes == 0
21580                   && count < ((unsigned HOST_WIDE_INT) size_needed
21581                               + desired_align - align))))
21582         {
21583           /* It is possible that we copied enough so the main loop will not
21584              execute.  */
21585           gcc_assert (size_needed > 1);
21586           if (label == NULL_RTX)
21587             label = gen_label_rtx ();
21588           emit_cmp_and_jump_insns (count_exp,
21589                                    GEN_INT (size_needed),
21590                                    LTU, 0, counter_mode (count_exp), 1, label);
21591           if (expected_size == -1
21592               || expected_size < (desired_align - align) / 2 + size_needed)
21593             predict_jump (REG_BR_PROB_BASE * 20 / 100);
21594           else
21595             predict_jump (REG_BR_PROB_BASE * 60 / 100);
21596         }
21597     }
21598   if (label && size_needed == 1)
21599     {
21600       emit_label (label);
21601       LABEL_NUSES (label) = 1;
21602       label = NULL;
21603       promoted_val = val_exp;
21604       epilogue_size_needed = 1;
21605     }
21606   else if (label == NULL_RTX)
21607     epilogue_size_needed = size_needed;
21608
21609   /* Step 3: Main loop.  */
21610
21611   switch (alg)
21612     {
21613     case libcall:
21614     case no_stringop:
21615       gcc_unreachable ();
21616     case loop_1_byte:
21617       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21618                                      count_exp, QImode, 1, expected_size);
21619       break;
21620     case loop:
21621       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21622                                      count_exp, Pmode, 1, expected_size);
21623       break;
21624     case unrolled_loop:
21625       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
21626                                      count_exp, Pmode, 4, expected_size);
21627       break;
21628     case rep_prefix_8_byte:
21629       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21630                                   DImode, val_exp);
21631       break;
21632     case rep_prefix_4_byte:
21633       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21634                                   SImode, val_exp);
21635       break;
21636     case rep_prefix_1_byte:
21637       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
21638                                   QImode, val_exp);
21639       break;
21640     }
21641   /* Adjust properly the offset of src and dest memory for aliasing.  */
21642   if (CONST_INT_P (count_exp))
21643     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
21644                                         (count / size_needed) * size_needed);
21645   else
21646     dst = change_address (dst, BLKmode, destreg);
21647
21648   /* Step 4: Epilogue to copy the remaining bytes.  */
21649
21650   if (label)
21651     {
21652       /* When the main loop is done, COUNT_EXP might hold original count,
21653          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
21654          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
21655          bytes. Compensate if needed.  */
21656
21657       if (size_needed < epilogue_size_needed)
21658         {
21659           tmp =
21660             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
21661                                  GEN_INT (size_needed - 1), count_exp, 1,
21662                                  OPTAB_DIRECT);
21663           if (tmp != count_exp)
21664             emit_move_insn (count_exp, tmp);
21665         }
21666       emit_label (label);
21667       LABEL_NUSES (label) = 1;
21668     }
21669  epilogue:
21670   if (count_exp != const0_rtx && epilogue_size_needed > 1)
21671     {
21672       if (force_loopy_epilogue)
21673         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
21674                                          epilogue_size_needed);
21675       else
21676         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
21677                                 epilogue_size_needed);
21678     }
21679   if (jump_around_label)
21680     emit_label (jump_around_label);
21681   return true;
21682 }
21683
21684 /* Expand the appropriate insns for doing strlen if not just doing
21685    repnz; scasb
21686
21687    out = result, initialized with the start address
21688    align_rtx = alignment of the address.
21689    scratch = scratch register, initialized with the startaddress when
21690         not aligned, otherwise undefined
21691
21692    This is just the body. It needs the initializations mentioned above and
21693    some address computing at the end.  These things are done in i386.md.  */
21694
21695 static void
21696 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
21697 {
21698   int align;
21699   rtx tmp;
21700   rtx align_2_label = NULL_RTX;
21701   rtx align_3_label = NULL_RTX;
21702   rtx align_4_label = gen_label_rtx ();
21703   rtx end_0_label = gen_label_rtx ();
21704   rtx mem;
21705   rtx tmpreg = gen_reg_rtx (SImode);
21706   rtx scratch = gen_reg_rtx (SImode);
21707   rtx cmp;
21708
21709   align = 0;
21710   if (CONST_INT_P (align_rtx))
21711     align = INTVAL (align_rtx);
21712
21713   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
21714
21715   /* Is there a known alignment and is it less than 4?  */
21716   if (align < 4)
21717     {
21718       rtx scratch1 = gen_reg_rtx (Pmode);
21719       emit_move_insn (scratch1, out);
21720       /* Is there a known alignment and is it not 2? */
21721       if (align != 2)
21722         {
21723           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
21724           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
21725
21726           /* Leave just the 3 lower bits.  */
21727           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
21728                                     NULL_RTX, 0, OPTAB_WIDEN);
21729
21730           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
21731                                    Pmode, 1, align_4_label);
21732           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
21733                                    Pmode, 1, align_2_label);
21734           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
21735                                    Pmode, 1, align_3_label);
21736         }
21737       else
21738         {
21739           /* Since the alignment is 2, we have to check 2 or 0 bytes;
21740              check if is aligned to 4 - byte.  */
21741
21742           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
21743                                     NULL_RTX, 0, OPTAB_WIDEN);
21744
21745           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
21746                                    Pmode, 1, align_4_label);
21747         }
21748
21749       mem = change_address (src, QImode, out);
21750
21751       /* Now compare the bytes.  */
21752
21753       /* Compare the first n unaligned byte on a byte per byte basis.  */
21754       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
21755                                QImode, 1, end_0_label);
21756
21757       /* Increment the address.  */
21758       emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21759
21760       /* Not needed with an alignment of 2 */
21761       if (align != 2)
21762         {
21763           emit_label (align_2_label);
21764
21765           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
21766                                    end_0_label);
21767
21768           emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21769
21770           emit_label (align_3_label);
21771         }
21772
21773       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
21774                                end_0_label);
21775
21776       emit_insn (ix86_gen_add3 (out, out, const1_rtx));
21777     }
21778
21779   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
21780      align this loop.  It gives only huge programs, but does not help to
21781      speed up.  */
21782   emit_label (align_4_label);
21783
21784   mem = change_address (src, SImode, out);
21785   emit_move_insn (scratch, mem);
21786   emit_insn (ix86_gen_add3 (out, out, GEN_INT (4)));
21787
21788   /* This formula yields a nonzero result iff one of the bytes is zero.
21789      This saves three branches inside loop and many cycles.  */
21790
21791   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
21792   emit_insn (gen_one_cmplsi2 (scratch, scratch));
21793   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
21794   emit_insn (gen_andsi3 (tmpreg, tmpreg,
21795                          gen_int_mode (0x80808080, SImode)));
21796   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
21797                            align_4_label);
21798
21799   if (TARGET_CMOVE)
21800     {
21801        rtx reg = gen_reg_rtx (SImode);
21802        rtx reg2 = gen_reg_rtx (Pmode);
21803        emit_move_insn (reg, tmpreg);
21804        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
21805
21806        /* If zero is not in the first two bytes, move two bytes forward.  */
21807        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
21808        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21809        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
21810        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
21811                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
21812                                                      reg,
21813                                                      tmpreg)));
21814        /* Emit lea manually to avoid clobbering of flags.  */
21815        emit_insn (gen_rtx_SET (SImode, reg2,
21816                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
21817
21818        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21819        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
21820        emit_insn (gen_rtx_SET (VOIDmode, out,
21821                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
21822                                                      reg2,
21823                                                      out)));
21824     }
21825   else
21826     {
21827        rtx end_2_label = gen_label_rtx ();
21828        /* Is zero in the first two bytes? */
21829
21830        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
21831        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
21832        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
21833        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
21834                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
21835                             pc_rtx);
21836        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
21837        JUMP_LABEL (tmp) = end_2_label;
21838
21839        /* Not in the first two.  Move two bytes forward.  */
21840        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
21841        emit_insn (ix86_gen_add3 (out, out, const2_rtx));
21842
21843        emit_label (end_2_label);
21844
21845     }
21846
21847   /* Avoid branch in fixing the byte.  */
21848   tmpreg = gen_lowpart (QImode, tmpreg);
21849   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
21850   tmp = gen_rtx_REG (CCmode, FLAGS_REG);
21851   cmp = gen_rtx_LTU (VOIDmode, tmp, const0_rtx);
21852   emit_insn (ix86_gen_sub3_carry (out, out, GEN_INT (3), tmp, cmp));
21853
21854   emit_label (end_0_label);
21855 }
21856
21857 /* Expand strlen.  */
21858
21859 bool
21860 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
21861 {
21862   rtx addr, scratch1, scratch2, scratch3, scratch4;
21863
21864   /* The generic case of strlen expander is long.  Avoid it's
21865      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
21866
21867   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
21868       && !TARGET_INLINE_ALL_STRINGOPS
21869       && !optimize_insn_for_size_p ()
21870       && (!CONST_INT_P (align) || INTVAL (align) < 4))
21871     return false;
21872
21873   addr = force_reg (Pmode, XEXP (src, 0));
21874   scratch1 = gen_reg_rtx (Pmode);
21875
21876   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
21877       && !optimize_insn_for_size_p ())
21878     {
21879       /* Well it seems that some optimizer does not combine a call like
21880          foo(strlen(bar), strlen(bar));
21881          when the move and the subtraction is done here.  It does calculate
21882          the length just once when these instructions are done inside of
21883          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
21884          often used and I use one fewer register for the lifetime of
21885          output_strlen_unroll() this is better.  */
21886
21887       emit_move_insn (out, addr);
21888
21889       ix86_expand_strlensi_unroll_1 (out, src, align);
21890
21891       /* strlensi_unroll_1 returns the address of the zero at the end of
21892          the string, like memchr(), so compute the length by subtracting
21893          the start address.  */
21894       emit_insn (ix86_gen_sub3 (out, out, addr));
21895     }
21896   else
21897     {
21898       rtx unspec;
21899
21900       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
21901       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
21902         return false;
21903
21904       scratch2 = gen_reg_rtx (Pmode);
21905       scratch3 = gen_reg_rtx (Pmode);
21906       scratch4 = force_reg (Pmode, constm1_rtx);
21907
21908       emit_move_insn (scratch3, addr);
21909       eoschar = force_reg (QImode, eoschar);
21910
21911       src = replace_equiv_address_nv (src, scratch3);
21912
21913       /* If .md starts supporting :P, this can be done in .md.  */
21914       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
21915                                                  scratch4), UNSPEC_SCAS);
21916       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
21917       emit_insn (ix86_gen_one_cmpl2 (scratch2, scratch1));
21918       emit_insn (ix86_gen_add3 (out, scratch2, constm1_rtx));
21919     }
21920   return true;
21921 }
21922
21923 /* For given symbol (function) construct code to compute address of it's PLT
21924    entry in large x86-64 PIC model.  */
21925 rtx
21926 construct_plt_address (rtx symbol)
21927 {
21928   rtx tmp = gen_reg_rtx (Pmode);
21929   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
21930
21931   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
21932   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
21933
21934   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
21935   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
21936   return tmp;
21937 }
21938
21939 rtx
21940 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
21941                   rtx callarg2,
21942                   rtx pop, int sibcall)
21943 {
21944   rtx use = NULL, call;
21945
21946   if (pop == const0_rtx)
21947     pop = NULL;
21948   gcc_assert (!TARGET_64BIT || !pop);
21949
21950   if (TARGET_MACHO && !TARGET_64BIT)
21951     {
21952 #if TARGET_MACHO
21953       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
21954         fnaddr = machopic_indirect_call_target (fnaddr);
21955 #endif
21956     }
21957   else
21958     {
21959       /* Static functions and indirect calls don't need the pic register.  */
21960       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
21961           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
21962           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
21963         use_reg (&use, pic_offset_table_rtx);
21964     }
21965
21966   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
21967     {
21968       rtx al = gen_rtx_REG (QImode, AX_REG);
21969       emit_move_insn (al, callarg2);
21970       use_reg (&use, al);
21971     }
21972
21973   if (ix86_cmodel == CM_LARGE_PIC
21974       && MEM_P (fnaddr)
21975       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
21976       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
21977     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
21978   else if (sibcall
21979            ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
21980            : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
21981     {
21982       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
21983       fnaddr = gen_rtx_MEM (QImode, fnaddr);
21984     }
21985
21986   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
21987   if (retval)
21988     call = gen_rtx_SET (VOIDmode, retval, call);
21989   if (pop)
21990     {
21991       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
21992       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
21993       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
21994     }
21995   if (TARGET_64BIT_MS_ABI
21996       && (!callarg2 || INTVAL (callarg2) != -2))
21997     {
21998       /* We need to represent that SI and DI registers are clobbered
21999          by SYSV calls.  */
22000       static int clobbered_registers[] = {
22001         XMM6_REG, XMM7_REG, XMM8_REG,
22002         XMM9_REG, XMM10_REG, XMM11_REG,
22003         XMM12_REG, XMM13_REG, XMM14_REG,
22004         XMM15_REG, SI_REG, DI_REG
22005       };
22006       unsigned int i;
22007       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
22008       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
22009                                    UNSPEC_MS_TO_SYSV_CALL);
22010
22011       vec[0] = call;
22012       vec[1] = unspec;
22013       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
22014         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
22015                                       ? TImode : DImode,
22016                                       gen_rtx_REG
22017                                         (SSE_REGNO_P (clobbered_registers[i])
22018                                                       ? TImode : DImode,
22019                                          clobbered_registers[i]));
22020
22021       call = gen_rtx_PARALLEL (VOIDmode,
22022                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
22023                                + 2, vec));
22024     }
22025
22026   /* Add UNSPEC_CALL_NEEDS_VZEROUPPER decoration.  */
22027   if (TARGET_VZEROUPPER)
22028     {
22029       rtx unspec;
22030       int avx256;
22031
22032       if (cfun->machine->callee_pass_avx256_p)
22033         {
22034           if (cfun->machine->callee_return_avx256_p)
22035             avx256 = callee_return_pass_avx256;
22036           else
22037             avx256 = callee_pass_avx256;
22038         }
22039       else if (cfun->machine->callee_return_avx256_p)
22040         avx256 = callee_return_avx256;
22041       else
22042         avx256 = call_no_avx256;
22043
22044       if (reload_completed)
22045         emit_insn (gen_avx_vzeroupper (GEN_INT (avx256)));
22046       else
22047         {
22048           unspec = gen_rtx_UNSPEC (VOIDmode,
22049                                    gen_rtvec (1, GEN_INT (avx256)),
22050                                    UNSPEC_CALL_NEEDS_VZEROUPPER);
22051           call = gen_rtx_PARALLEL (VOIDmode,
22052                                    gen_rtvec (2, call, unspec));
22053         }
22054     }
22055
22056   call = emit_call_insn (call);
22057   if (use)
22058     CALL_INSN_FUNCTION_USAGE (call) = use;
22059
22060   return call;
22061 }
22062
22063 void
22064 ix86_split_call_vzeroupper (rtx insn, rtx vzeroupper)
22065 {
22066   rtx call = XVECEXP (PATTERN (insn), 0, 0);
22067   emit_insn (gen_avx_vzeroupper (vzeroupper));
22068   emit_call_insn (call);
22069 }
22070
22071 /* Output the assembly for a call instruction.  */
22072
22073 const char *
22074 ix86_output_call_insn (rtx insn, rtx call_op, int addr_op)
22075 {
22076   bool direct_p = constant_call_address_operand (call_op, Pmode);
22077   bool seh_nop_p = false;
22078
22079   gcc_assert (addr_op == 0 || addr_op == 1);
22080
22081   if (SIBLING_CALL_P (insn))
22082     {
22083       if (direct_p)
22084         return addr_op ? "jmp\t%P1" : "jmp\t%P0";
22085       /* SEH epilogue detection requires the indirect branch case
22086          to include REX.W.  */
22087       else if (TARGET_SEH)
22088         return addr_op ? "rex.W jmp %A1" : "rex.W jmp %A0";
22089       else
22090         return addr_op ? "jmp\t%A1" : "jmp\t%A0";
22091     }
22092
22093   /* SEH unwinding can require an extra nop to be emitted in several
22094      circumstances.  Determine if we have one of those.  */
22095   if (TARGET_SEH)
22096     {
22097       rtx i;
22098
22099       for (i = NEXT_INSN (insn); i ; i = NEXT_INSN (i))
22100         {
22101           /* If we get to another real insn, we don't need the nop.  */
22102           if (INSN_P (i))
22103             break;
22104
22105           /* If we get to the epilogue note, prevent a catch region from
22106              being adjacent to the standard epilogue sequence.  If non-
22107              call-exceptions, we'll have done this during epilogue emission. */
22108           if (NOTE_P (i) && NOTE_KIND (i) == NOTE_INSN_EPILOGUE_BEG
22109               && !flag_non_call_exceptions
22110               && !can_throw_internal (insn))
22111             {
22112               seh_nop_p = true;
22113               break;
22114             }
22115         }
22116
22117       /* If we didn't find a real insn following the call, prevent the
22118          unwinder from looking into the next function.  */
22119       if (i == NULL)
22120         seh_nop_p = true;
22121     }
22122
22123   if (direct_p)
22124     {
22125       if (seh_nop_p)
22126         return addr_op ? "call\t%P1\n\tnop" : "call\t%P0\n\tnop";
22127       else
22128         return addr_op ? "call\t%P1" : "call\t%P0";
22129     }
22130   else
22131     {
22132       if (seh_nop_p)
22133         return addr_op ? "call\t%A1\n\tnop" : "call\t%A0\n\tnop";
22134       else
22135         return addr_op ? "call\t%A1" : "call\t%A0";
22136     }
22137 }
22138 \f
22139 /* Clear stack slot assignments remembered from previous functions.
22140    This is called from INIT_EXPANDERS once before RTL is emitted for each
22141    function.  */
22142
22143 static struct machine_function *
22144 ix86_init_machine_status (void)
22145 {
22146   struct machine_function *f;
22147
22148   f = ggc_alloc_cleared_machine_function ();
22149   f->use_fast_prologue_epilogue_nregs = -1;
22150   f->tls_descriptor_call_expanded_p = 0;
22151   f->call_abi = ix86_abi;
22152
22153   return f;
22154 }
22155
22156 /* Return a MEM corresponding to a stack slot with mode MODE.
22157    Allocate a new slot if necessary.
22158
22159    The RTL for a function can have several slots available: N is
22160    which slot to use.  */
22161
22162 rtx
22163 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
22164 {
22165   struct stack_local_entry *s;
22166
22167   gcc_assert (n < MAX_386_STACK_LOCALS);
22168
22169   /* Virtual slot is valid only before vregs are instantiated.  */
22170   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
22171
22172   for (s = ix86_stack_locals; s; s = s->next)
22173     if (s->mode == mode && s->n == n)
22174       return copy_rtx (s->rtl);
22175
22176   s = ggc_alloc_stack_local_entry ();
22177   s->n = n;
22178   s->mode = mode;
22179   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
22180
22181   s->next = ix86_stack_locals;
22182   ix86_stack_locals = s;
22183   return s->rtl;
22184 }
22185
22186 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
22187
22188 static GTY(()) rtx ix86_tls_symbol;
22189 rtx
22190 ix86_tls_get_addr (void)
22191 {
22192
22193   if (!ix86_tls_symbol)
22194     {
22195       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
22196                                             (TARGET_ANY_GNU_TLS
22197                                              && !TARGET_64BIT)
22198                                             ? "___tls_get_addr"
22199                                             : "__tls_get_addr");
22200     }
22201
22202   return ix86_tls_symbol;
22203 }
22204
22205 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
22206
22207 static GTY(()) rtx ix86_tls_module_base_symbol;
22208 rtx
22209 ix86_tls_module_base (void)
22210 {
22211
22212   if (!ix86_tls_module_base_symbol)
22213     {
22214       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
22215                                                         "_TLS_MODULE_BASE_");
22216       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
22217         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
22218     }
22219
22220   return ix86_tls_module_base_symbol;
22221 }
22222 \f
22223 /* Calculate the length of the memory address in the instruction
22224    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
22225
22226 int
22227 memory_address_length (rtx addr)
22228 {
22229   struct ix86_address parts;
22230   rtx base, index, disp;
22231   int len;
22232   int ok;
22233
22234   if (GET_CODE (addr) == PRE_DEC
22235       || GET_CODE (addr) == POST_INC
22236       || GET_CODE (addr) == PRE_MODIFY
22237       || GET_CODE (addr) == POST_MODIFY)
22238     return 0;
22239
22240   ok = ix86_decompose_address (addr, &parts);
22241   gcc_assert (ok);
22242
22243   if (parts.base && GET_CODE (parts.base) == SUBREG)
22244     parts.base = SUBREG_REG (parts.base);
22245   if (parts.index && GET_CODE (parts.index) == SUBREG)
22246     parts.index = SUBREG_REG (parts.index);
22247
22248   base = parts.base;
22249   index = parts.index;
22250   disp = parts.disp;
22251   len = 0;
22252
22253   /* Rule of thumb:
22254        - esp as the base always wants an index,
22255        - ebp as the base always wants a displacement,
22256        - r12 as the base always wants an index,
22257        - r13 as the base always wants a displacement.  */
22258
22259   /* Register Indirect.  */
22260   if (base && !index && !disp)
22261     {
22262       /* esp (for its index) and ebp (for its displacement) need
22263          the two-byte modrm form.  Similarly for r12 and r13 in 64-bit
22264          code.  */
22265       if (REG_P (addr)
22266           && (addr == arg_pointer_rtx
22267               || addr == frame_pointer_rtx
22268               || REGNO (addr) == SP_REG
22269               || REGNO (addr) == BP_REG
22270               || REGNO (addr) == R12_REG
22271               || REGNO (addr) == R13_REG))
22272         len = 1;
22273     }
22274
22275   /* Direct Addressing.  In 64-bit mode mod 00 r/m 5
22276      is not disp32, but disp32(%rip), so for disp32
22277      SIB byte is needed, unless print_operand_address
22278      optimizes it into disp32(%rip) or (%rip) is implied
22279      by UNSPEC.  */
22280   else if (disp && !base && !index)
22281     {
22282       len = 4;
22283       if (TARGET_64BIT)
22284         {
22285           rtx symbol = disp;
22286
22287           if (GET_CODE (disp) == CONST)
22288             symbol = XEXP (disp, 0);
22289           if (GET_CODE (symbol) == PLUS
22290               && CONST_INT_P (XEXP (symbol, 1)))
22291             symbol = XEXP (symbol, 0);
22292
22293           if (GET_CODE (symbol) != LABEL_REF
22294               && (GET_CODE (symbol) != SYMBOL_REF
22295                   || SYMBOL_REF_TLS_MODEL (symbol) != 0)
22296               && (GET_CODE (symbol) != UNSPEC
22297                   || (XINT (symbol, 1) != UNSPEC_GOTPCREL
22298                       && XINT (symbol, 1) != UNSPEC_PCREL
22299                       && XINT (symbol, 1) != UNSPEC_GOTNTPOFF)))
22300             len += 1;
22301         }
22302     }
22303
22304   else
22305     {
22306       /* Find the length of the displacement constant.  */
22307       if (disp)
22308         {
22309           if (base && satisfies_constraint_K (disp))
22310             len = 1;
22311           else
22312             len = 4;
22313         }
22314       /* ebp always wants a displacement.  Similarly r13.  */
22315       else if (base && REG_P (base)
22316                && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
22317         len = 1;
22318
22319       /* An index requires the two-byte modrm form....  */
22320       if (index
22321           /* ...like esp (or r12), which always wants an index.  */
22322           || base == arg_pointer_rtx
22323           || base == frame_pointer_rtx
22324           || (base && REG_P (base)
22325               && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
22326         len += 1;
22327     }
22328
22329   switch (parts.seg)
22330     {
22331     case SEG_FS:
22332     case SEG_GS:
22333       len += 1;
22334       break;
22335     default:
22336       break;
22337     }
22338
22339   return len;
22340 }
22341
22342 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
22343    is set, expect that insn have 8bit immediate alternative.  */
22344 int
22345 ix86_attr_length_immediate_default (rtx insn, int shortform)
22346 {
22347   int len = 0;
22348   int i;
22349   extract_insn_cached (insn);
22350   for (i = recog_data.n_operands - 1; i >= 0; --i)
22351     if (CONSTANT_P (recog_data.operand[i]))
22352       {
22353         enum attr_mode mode = get_attr_mode (insn);
22354
22355         gcc_assert (!len);
22356         if (shortform && CONST_INT_P (recog_data.operand[i]))
22357           {
22358             HOST_WIDE_INT ival = INTVAL (recog_data.operand[i]);
22359             switch (mode)
22360               {
22361               case MODE_QI:
22362                 len = 1;
22363                 continue;
22364               case MODE_HI:
22365                 ival = trunc_int_for_mode (ival, HImode);
22366                 break;
22367               case MODE_SI:
22368                 ival = trunc_int_for_mode (ival, SImode);
22369                 break;
22370               default:
22371                 break;
22372               }
22373             if (IN_RANGE (ival, -128, 127))
22374               {
22375                 len = 1;
22376                 continue;
22377               }
22378           }
22379         switch (mode)
22380           {
22381           case MODE_QI:
22382             len = 1;
22383             break;
22384           case MODE_HI:
22385             len = 2;
22386             break;
22387           case MODE_SI:
22388             len = 4;
22389             break;
22390           /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
22391           case MODE_DI:
22392             len = 4;
22393             break;
22394           default:
22395             fatal_insn ("unknown insn mode", insn);
22396         }
22397       }
22398   return len;
22399 }
22400 /* Compute default value for "length_address" attribute.  */
22401 int
22402 ix86_attr_length_address_default (rtx insn)
22403 {
22404   int i;
22405
22406   if (get_attr_type (insn) == TYPE_LEA)
22407     {
22408       rtx set = PATTERN (insn), addr;
22409
22410       if (GET_CODE (set) == PARALLEL)
22411         set = XVECEXP (set, 0, 0);
22412
22413       gcc_assert (GET_CODE (set) == SET);
22414
22415       addr = SET_SRC (set);
22416       if (TARGET_64BIT && get_attr_mode (insn) == MODE_SI)
22417         {
22418           if (GET_CODE (addr) == ZERO_EXTEND)
22419             addr = XEXP (addr, 0);
22420           if (GET_CODE (addr) == SUBREG)
22421             addr = SUBREG_REG (addr);
22422         }
22423
22424       return memory_address_length (addr);
22425     }
22426
22427   extract_insn_cached (insn);
22428   for (i = recog_data.n_operands - 1; i >= 0; --i)
22429     if (MEM_P (recog_data.operand[i]))
22430       {
22431         constrain_operands_cached (reload_completed);
22432         if (which_alternative != -1)
22433           {
22434             const char *constraints = recog_data.constraints[i];
22435             int alt = which_alternative;
22436
22437             while (*constraints == '=' || *constraints == '+')
22438               constraints++;
22439             while (alt-- > 0)
22440               while (*constraints++ != ',')
22441                 ;
22442             /* Skip ignored operands.  */
22443             if (*constraints == 'X')
22444               continue;
22445           }
22446         return memory_address_length (XEXP (recog_data.operand[i], 0));
22447       }
22448   return 0;
22449 }
22450
22451 /* Compute default value for "length_vex" attribute. It includes
22452    2 or 3 byte VEX prefix and 1 opcode byte.  */
22453
22454 int
22455 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
22456                               int has_vex_w)
22457 {
22458   int i;
22459
22460   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
22461      byte VEX prefix.  */
22462   if (!has_0f_opcode || has_vex_w)
22463     return 3 + 1;
22464
22465  /* We can always use 2 byte VEX prefix in 32bit.  */
22466   if (!TARGET_64BIT)
22467     return 2 + 1;
22468
22469   extract_insn_cached (insn);
22470
22471   for (i = recog_data.n_operands - 1; i >= 0; --i)
22472     if (REG_P (recog_data.operand[i]))
22473       {
22474         /* REX.W bit uses 3 byte VEX prefix.  */
22475         if (GET_MODE (recog_data.operand[i]) == DImode
22476             && GENERAL_REG_P (recog_data.operand[i]))
22477           return 3 + 1;
22478       }
22479     else
22480       {
22481         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
22482         if (MEM_P (recog_data.operand[i])
22483             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
22484           return 3 + 1;
22485       }
22486
22487   return 2 + 1;
22488 }
22489 \f
22490 /* Return the maximum number of instructions a cpu can issue.  */
22491
22492 static int
22493 ix86_issue_rate (void)
22494 {
22495   switch (ix86_tune)
22496     {
22497     case PROCESSOR_PENTIUM:
22498     case PROCESSOR_ATOM:
22499     case PROCESSOR_K6:
22500       return 2;
22501
22502     case PROCESSOR_PENTIUMPRO:
22503     case PROCESSOR_PENTIUM4:
22504     case PROCESSOR_CORE2_32:
22505     case PROCESSOR_CORE2_64:
22506     case PROCESSOR_COREI7_32:
22507     case PROCESSOR_COREI7_64:
22508     case PROCESSOR_ATHLON:
22509     case PROCESSOR_K8:
22510     case PROCESSOR_AMDFAM10:
22511     case PROCESSOR_NOCONA:
22512     case PROCESSOR_GENERIC32:
22513     case PROCESSOR_GENERIC64:
22514     case PROCESSOR_BDVER1:
22515     case PROCESSOR_BTVER1:
22516       return 3;
22517
22518     default:
22519       return 1;
22520     }
22521 }
22522
22523 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
22524    by DEP_INSN and nothing set by DEP_INSN.  */
22525
22526 static int
22527 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
22528 {
22529   rtx set, set2;
22530
22531   /* Simplify the test for uninteresting insns.  */
22532   if (insn_type != TYPE_SETCC
22533       && insn_type != TYPE_ICMOV
22534       && insn_type != TYPE_FCMOV
22535       && insn_type != TYPE_IBR)
22536     return 0;
22537
22538   if ((set = single_set (dep_insn)) != 0)
22539     {
22540       set = SET_DEST (set);
22541       set2 = NULL_RTX;
22542     }
22543   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
22544            && XVECLEN (PATTERN (dep_insn), 0) == 2
22545            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
22546            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
22547     {
22548       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
22549       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
22550     }
22551   else
22552     return 0;
22553
22554   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
22555     return 0;
22556
22557   /* This test is true if the dependent insn reads the flags but
22558      not any other potentially set register.  */
22559   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
22560     return 0;
22561
22562   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
22563     return 0;
22564
22565   return 1;
22566 }
22567
22568 /* Return true iff USE_INSN has a memory address with operands set by
22569    SET_INSN.  */
22570
22571 bool
22572 ix86_agi_dependent (rtx set_insn, rtx use_insn)
22573 {
22574   int i;
22575   extract_insn_cached (use_insn);
22576   for (i = recog_data.n_operands - 1; i >= 0; --i)
22577     if (MEM_P (recog_data.operand[i]))
22578       {
22579         rtx addr = XEXP (recog_data.operand[i], 0);
22580         return modified_in_p (addr, set_insn) != 0;
22581       }
22582   return false;
22583 }
22584
22585 static int
22586 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22587 {
22588   enum attr_type insn_type, dep_insn_type;
22589   enum attr_memory memory;
22590   rtx set, set2;
22591   int dep_insn_code_number;
22592
22593   /* Anti and output dependencies have zero cost on all CPUs.  */
22594   if (REG_NOTE_KIND (link) != 0)
22595     return 0;
22596
22597   dep_insn_code_number = recog_memoized (dep_insn);
22598
22599   /* If we can't recognize the insns, we can't really do anything.  */
22600   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
22601     return cost;
22602
22603   insn_type = get_attr_type (insn);
22604   dep_insn_type = get_attr_type (dep_insn);
22605
22606   switch (ix86_tune)
22607     {
22608     case PROCESSOR_PENTIUM:
22609       /* Address Generation Interlock adds a cycle of latency.  */
22610       if (insn_type == TYPE_LEA)
22611         {
22612           rtx addr = PATTERN (insn);
22613
22614           if (GET_CODE (addr) == PARALLEL)
22615             addr = XVECEXP (addr, 0, 0);
22616
22617           gcc_assert (GET_CODE (addr) == SET);
22618
22619           addr = SET_SRC (addr);
22620           if (modified_in_p (addr, dep_insn))
22621             cost += 1;
22622         }
22623       else if (ix86_agi_dependent (dep_insn, insn))
22624         cost += 1;
22625
22626       /* ??? Compares pair with jump/setcc.  */
22627       if (ix86_flags_dependent (insn, dep_insn, insn_type))
22628         cost = 0;
22629
22630       /* Floating point stores require value to be ready one cycle earlier.  */
22631       if (insn_type == TYPE_FMOV
22632           && get_attr_memory (insn) == MEMORY_STORE
22633           && !ix86_agi_dependent (dep_insn, insn))
22634         cost += 1;
22635       break;
22636
22637     case PROCESSOR_PENTIUMPRO:
22638       memory = get_attr_memory (insn);
22639
22640       /* INT->FP conversion is expensive.  */
22641       if (get_attr_fp_int_src (dep_insn))
22642         cost += 5;
22643
22644       /* There is one cycle extra latency between an FP op and a store.  */
22645       if (insn_type == TYPE_FMOV
22646           && (set = single_set (dep_insn)) != NULL_RTX
22647           && (set2 = single_set (insn)) != NULL_RTX
22648           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
22649           && MEM_P (SET_DEST (set2)))
22650         cost += 1;
22651
22652       /* Show ability of reorder buffer to hide latency of load by executing
22653          in parallel with previous instruction in case
22654          previous instruction is not needed to compute the address.  */
22655       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22656           && !ix86_agi_dependent (dep_insn, insn))
22657         {
22658           /* Claim moves to take one cycle, as core can issue one load
22659              at time and the next load can start cycle later.  */
22660           if (dep_insn_type == TYPE_IMOV
22661               || dep_insn_type == TYPE_FMOV)
22662             cost = 1;
22663           else if (cost > 1)
22664             cost--;
22665         }
22666       break;
22667
22668     case PROCESSOR_K6:
22669       memory = get_attr_memory (insn);
22670
22671       /* The esp dependency is resolved before the instruction is really
22672          finished.  */
22673       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
22674           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
22675         return 1;
22676
22677       /* INT->FP conversion is expensive.  */
22678       if (get_attr_fp_int_src (dep_insn))
22679         cost += 5;
22680
22681       /* Show ability of reorder buffer to hide latency of load by executing
22682          in parallel with previous instruction in case
22683          previous instruction is not needed to compute the address.  */
22684       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22685           && !ix86_agi_dependent (dep_insn, insn))
22686         {
22687           /* Claim moves to take one cycle, as core can issue one load
22688              at time and the next load can start cycle later.  */
22689           if (dep_insn_type == TYPE_IMOV
22690               || dep_insn_type == TYPE_FMOV)
22691             cost = 1;
22692           else if (cost > 2)
22693             cost -= 2;
22694           else
22695             cost = 1;
22696         }
22697       break;
22698
22699     case PROCESSOR_ATHLON:
22700     case PROCESSOR_K8:
22701     case PROCESSOR_AMDFAM10:
22702     case PROCESSOR_BDVER1:
22703     case PROCESSOR_BTVER1:
22704     case PROCESSOR_ATOM:
22705     case PROCESSOR_GENERIC32:
22706     case PROCESSOR_GENERIC64:
22707       memory = get_attr_memory (insn);
22708
22709       /* Show ability of reorder buffer to hide latency of load by executing
22710          in parallel with previous instruction in case
22711          previous instruction is not needed to compute the address.  */
22712       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
22713           && !ix86_agi_dependent (dep_insn, insn))
22714         {
22715           enum attr_unit unit = get_attr_unit (insn);
22716           int loadcost = 3;
22717
22718           /* Because of the difference between the length of integer and
22719              floating unit pipeline preparation stages, the memory operands
22720              for floating point are cheaper.
22721
22722              ??? For Athlon it the difference is most probably 2.  */
22723           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
22724             loadcost = 3;
22725           else
22726             loadcost = TARGET_ATHLON ? 2 : 0;
22727
22728           if (cost >= loadcost)
22729             cost -= loadcost;
22730           else
22731             cost = 0;
22732         }
22733
22734     default:
22735       break;
22736     }
22737
22738   return cost;
22739 }
22740
22741 /* How many alternative schedules to try.  This should be as wide as the
22742    scheduling freedom in the DFA, but no wider.  Making this value too
22743    large results extra work for the scheduler.  */
22744
22745 static int
22746 ia32_multipass_dfa_lookahead (void)
22747 {
22748   switch (ix86_tune)
22749     {
22750     case PROCESSOR_PENTIUM:
22751       return 2;
22752
22753     case PROCESSOR_PENTIUMPRO:
22754     case PROCESSOR_K6:
22755       return 1;
22756
22757     case PROCESSOR_CORE2_32:
22758     case PROCESSOR_CORE2_64:
22759     case PROCESSOR_COREI7_32:
22760     case PROCESSOR_COREI7_64:
22761       /* Generally, we want haifa-sched:max_issue() to look ahead as far
22762          as many instructions can be executed on a cycle, i.e.,
22763          issue_rate.  I wonder why tuning for many CPUs does not do this.  */
22764       return ix86_issue_rate ();
22765
22766     default:
22767       return 0;
22768     }
22769 }
22770
22771 \f
22772
22773 /* Model decoder of Core 2/i7.
22774    Below hooks for multipass scheduling (see haifa-sched.c:max_issue)
22775    track the instruction fetch block boundaries and make sure that long
22776    (9+ bytes) instructions are assigned to D0.  */
22777
22778 /* Maximum length of an insn that can be handled by
22779    a secondary decoder unit.  '8' for Core 2/i7.  */
22780 static int core2i7_secondary_decoder_max_insn_size;
22781
22782 /* Ifetch block size, i.e., number of bytes decoder reads per cycle.
22783    '16' for Core 2/i7.  */
22784 static int core2i7_ifetch_block_size;
22785
22786 /* Maximum number of instructions decoder can handle per cycle.
22787    '6' for Core 2/i7.  */
22788 static int core2i7_ifetch_block_max_insns;
22789
22790 typedef struct ix86_first_cycle_multipass_data_ *
22791   ix86_first_cycle_multipass_data_t;
22792 typedef const struct ix86_first_cycle_multipass_data_ *
22793   const_ix86_first_cycle_multipass_data_t;
22794
22795 /* A variable to store target state across calls to max_issue within
22796    one cycle.  */
22797 static struct ix86_first_cycle_multipass_data_ _ix86_first_cycle_multipass_data,
22798   *ix86_first_cycle_multipass_data = &_ix86_first_cycle_multipass_data;
22799
22800 /* Initialize DATA.  */
22801 static void
22802 core2i7_first_cycle_multipass_init (void *_data)
22803 {
22804   ix86_first_cycle_multipass_data_t data
22805     = (ix86_first_cycle_multipass_data_t) _data;
22806
22807   data->ifetch_block_len = 0;
22808   data->ifetch_block_n_insns = 0;
22809   data->ready_try_change = NULL;
22810   data->ready_try_change_size = 0;
22811 }
22812
22813 /* Advancing the cycle; reset ifetch block counts.  */
22814 static void
22815 core2i7_dfa_post_advance_cycle (void)
22816 {
22817   ix86_first_cycle_multipass_data_t data = ix86_first_cycle_multipass_data;
22818
22819   gcc_assert (data->ifetch_block_n_insns <= core2i7_ifetch_block_max_insns);
22820
22821   data->ifetch_block_len = 0;
22822   data->ifetch_block_n_insns = 0;
22823 }
22824
22825 static int min_insn_size (rtx);
22826
22827 /* Filter out insns from ready_try that the core will not be able to issue
22828    on current cycle due to decoder.  */
22829 static void
22830 core2i7_first_cycle_multipass_filter_ready_try
22831 (const_ix86_first_cycle_multipass_data_t data,
22832  char *ready_try, int n_ready, bool first_cycle_insn_p)
22833 {
22834   while (n_ready--)
22835     {
22836       rtx insn;
22837       int insn_size;
22838
22839       if (ready_try[n_ready])
22840         continue;
22841
22842       insn = get_ready_element (n_ready);
22843       insn_size = min_insn_size (insn);
22844
22845       if (/* If this is a too long an insn for a secondary decoder ...  */
22846           (!first_cycle_insn_p
22847            && insn_size > core2i7_secondary_decoder_max_insn_size)
22848           /* ... or it would not fit into the ifetch block ...  */
22849           || data->ifetch_block_len + insn_size > core2i7_ifetch_block_size
22850           /* ... or the decoder is full already ...  */
22851           || data->ifetch_block_n_insns + 1 > core2i7_ifetch_block_max_insns)
22852         /* ... mask the insn out.  */
22853         {
22854           ready_try[n_ready] = 1;
22855
22856           if (data->ready_try_change)
22857             SET_BIT (data->ready_try_change, n_ready);
22858         }
22859     }
22860 }
22861
22862 /* Prepare for a new round of multipass lookahead scheduling.  */
22863 static void
22864 core2i7_first_cycle_multipass_begin (void *_data, char *ready_try, int n_ready,
22865                                      bool first_cycle_insn_p)
22866 {
22867   ix86_first_cycle_multipass_data_t data
22868     = (ix86_first_cycle_multipass_data_t) _data;
22869   const_ix86_first_cycle_multipass_data_t prev_data
22870     = ix86_first_cycle_multipass_data;
22871
22872   /* Restore the state from the end of the previous round.  */
22873   data->ifetch_block_len = prev_data->ifetch_block_len;
22874   data->ifetch_block_n_insns = prev_data->ifetch_block_n_insns;
22875
22876   /* Filter instructions that cannot be issued on current cycle due to
22877      decoder restrictions.  */
22878   core2i7_first_cycle_multipass_filter_ready_try (data, ready_try, n_ready,
22879                                                   first_cycle_insn_p);
22880 }
22881
22882 /* INSN is being issued in current solution.  Account for its impact on
22883    the decoder model.  */
22884 static void
22885 core2i7_first_cycle_multipass_issue (void *_data, char *ready_try, int n_ready,
22886                                      rtx insn, const void *_prev_data)
22887 {
22888   ix86_first_cycle_multipass_data_t data
22889     = (ix86_first_cycle_multipass_data_t) _data;
22890   const_ix86_first_cycle_multipass_data_t prev_data
22891     = (const_ix86_first_cycle_multipass_data_t) _prev_data;
22892
22893   int insn_size = min_insn_size (insn);
22894
22895   data->ifetch_block_len = prev_data->ifetch_block_len + insn_size;
22896   data->ifetch_block_n_insns = prev_data->ifetch_block_n_insns + 1;
22897   gcc_assert (data->ifetch_block_len <= core2i7_ifetch_block_size
22898               && data->ifetch_block_n_insns <= core2i7_ifetch_block_max_insns);
22899
22900   /* Allocate or resize the bitmap for storing INSN's effect on ready_try.  */
22901   if (!data->ready_try_change)
22902     {
22903       data->ready_try_change = sbitmap_alloc (n_ready);
22904       data->ready_try_change_size = n_ready;
22905     }
22906   else if (data->ready_try_change_size < n_ready)
22907     {
22908       data->ready_try_change = sbitmap_resize (data->ready_try_change,
22909                                                n_ready, 0);
22910       data->ready_try_change_size = n_ready;
22911     }
22912   sbitmap_zero (data->ready_try_change);
22913
22914   /* Filter out insns from ready_try that the core will not be able to issue
22915      on current cycle due to decoder.  */
22916   core2i7_first_cycle_multipass_filter_ready_try (data, ready_try, n_ready,
22917                                                   false);
22918 }
22919
22920 /* Revert the effect on ready_try.  */
22921 static void
22922 core2i7_first_cycle_multipass_backtrack (const void *_data,
22923                                          char *ready_try,
22924                                          int n_ready ATTRIBUTE_UNUSED)
22925 {
22926   const_ix86_first_cycle_multipass_data_t data
22927     = (const_ix86_first_cycle_multipass_data_t) _data;
22928   unsigned int i = 0;
22929   sbitmap_iterator sbi;
22930
22931   gcc_assert (sbitmap_last_set_bit (data->ready_try_change) < n_ready);
22932   EXECUTE_IF_SET_IN_SBITMAP (data->ready_try_change, 0, i, sbi)
22933     {
22934       ready_try[i] = 0;
22935     }
22936 }
22937
22938 /* Save the result of multipass lookahead scheduling for the next round.  */
22939 static void
22940 core2i7_first_cycle_multipass_end (const void *_data)
22941 {
22942   const_ix86_first_cycle_multipass_data_t data
22943     = (const_ix86_first_cycle_multipass_data_t) _data;
22944   ix86_first_cycle_multipass_data_t next_data
22945     = ix86_first_cycle_multipass_data;
22946
22947   if (data != NULL)
22948     {
22949       next_data->ifetch_block_len = data->ifetch_block_len;
22950       next_data->ifetch_block_n_insns = data->ifetch_block_n_insns;
22951     }
22952 }
22953
22954 /* Deallocate target data.  */
22955 static void
22956 core2i7_first_cycle_multipass_fini (void *_data)
22957 {
22958   ix86_first_cycle_multipass_data_t data
22959     = (ix86_first_cycle_multipass_data_t) _data;
22960
22961   if (data->ready_try_change)
22962     {
22963       sbitmap_free (data->ready_try_change);
22964       data->ready_try_change = NULL;
22965       data->ready_try_change_size = 0;
22966     }
22967 }
22968
22969 /* Prepare for scheduling pass.  */
22970 static void
22971 ix86_sched_init_global (FILE *dump ATTRIBUTE_UNUSED,
22972                         int verbose ATTRIBUTE_UNUSED,
22973                         int max_uid ATTRIBUTE_UNUSED)
22974 {
22975   /* Install scheduling hooks for current CPU.  Some of these hooks are used
22976      in time-critical parts of the scheduler, so we only set them up when
22977      they are actually used.  */
22978   switch (ix86_tune)
22979     {
22980     case PROCESSOR_CORE2_32:
22981     case PROCESSOR_CORE2_64:
22982     case PROCESSOR_COREI7_32:
22983     case PROCESSOR_COREI7_64:
22984       targetm.sched.dfa_post_advance_cycle
22985         = core2i7_dfa_post_advance_cycle;
22986       targetm.sched.first_cycle_multipass_init
22987         = core2i7_first_cycle_multipass_init;
22988       targetm.sched.first_cycle_multipass_begin
22989         = core2i7_first_cycle_multipass_begin;
22990       targetm.sched.first_cycle_multipass_issue
22991         = core2i7_first_cycle_multipass_issue;
22992       targetm.sched.first_cycle_multipass_backtrack
22993         = core2i7_first_cycle_multipass_backtrack;
22994       targetm.sched.first_cycle_multipass_end
22995         = core2i7_first_cycle_multipass_end;
22996       targetm.sched.first_cycle_multipass_fini
22997         = core2i7_first_cycle_multipass_fini;
22998
22999       /* Set decoder parameters.  */
23000       core2i7_secondary_decoder_max_insn_size = 8;
23001       core2i7_ifetch_block_size = 16;
23002       core2i7_ifetch_block_max_insns = 6;
23003       break;
23004
23005     default:
23006       targetm.sched.dfa_post_advance_cycle = NULL;
23007       targetm.sched.first_cycle_multipass_init = NULL;
23008       targetm.sched.first_cycle_multipass_begin = NULL;
23009       targetm.sched.first_cycle_multipass_issue = NULL;
23010       targetm.sched.first_cycle_multipass_backtrack = NULL;
23011       targetm.sched.first_cycle_multipass_end = NULL;
23012       targetm.sched.first_cycle_multipass_fini = NULL;
23013       break;
23014     }
23015 }
23016
23017 \f
23018 /* Compute the alignment given to a constant that is being placed in memory.
23019    EXP is the constant and ALIGN is the alignment that the object would
23020    ordinarily have.
23021    The value of this function is used instead of that alignment to align
23022    the object.  */
23023
23024 int
23025 ix86_constant_alignment (tree exp, int align)
23026 {
23027   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
23028       || TREE_CODE (exp) == INTEGER_CST)
23029     {
23030       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
23031         return 64;
23032       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
23033         return 128;
23034     }
23035   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
23036            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
23037     return BITS_PER_WORD;
23038
23039   return align;
23040 }
23041
23042 /* Compute the alignment for a static variable.
23043    TYPE is the data type, and ALIGN is the alignment that
23044    the object would ordinarily have.  The value of this function is used
23045    instead of that alignment to align the object.  */
23046
23047 int
23048 ix86_data_alignment (tree type, int align)
23049 {
23050   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
23051
23052   if (AGGREGATE_TYPE_P (type)
23053       && TYPE_SIZE (type)
23054       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23055       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
23056           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
23057       && align < max_align)
23058     align = max_align;
23059
23060   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
23061      to 16byte boundary.  */
23062   if (TARGET_64BIT)
23063     {
23064       if (AGGREGATE_TYPE_P (type)
23065            && TYPE_SIZE (type)
23066            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23067            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
23068                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
23069         return 128;
23070     }
23071
23072   if (TREE_CODE (type) == ARRAY_TYPE)
23073     {
23074       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
23075         return 64;
23076       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
23077         return 128;
23078     }
23079   else if (TREE_CODE (type) == COMPLEX_TYPE)
23080     {
23081
23082       if (TYPE_MODE (type) == DCmode && align < 64)
23083         return 64;
23084       if ((TYPE_MODE (type) == XCmode
23085            || TYPE_MODE (type) == TCmode) && align < 128)
23086         return 128;
23087     }
23088   else if ((TREE_CODE (type) == RECORD_TYPE
23089             || TREE_CODE (type) == UNION_TYPE
23090             || TREE_CODE (type) == QUAL_UNION_TYPE)
23091            && TYPE_FIELDS (type))
23092     {
23093       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
23094         return 64;
23095       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
23096         return 128;
23097     }
23098   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
23099            || TREE_CODE (type) == INTEGER_TYPE)
23100     {
23101       if (TYPE_MODE (type) == DFmode && align < 64)
23102         return 64;
23103       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
23104         return 128;
23105     }
23106
23107   return align;
23108 }
23109
23110 /* Compute the alignment for a local variable or a stack slot.  EXP is
23111    the data type or decl itself, MODE is the widest mode available and
23112    ALIGN is the alignment that the object would ordinarily have.  The
23113    value of this macro is used instead of that alignment to align the
23114    object.  */
23115
23116 unsigned int
23117 ix86_local_alignment (tree exp, enum machine_mode mode,
23118                       unsigned int align)
23119 {
23120   tree type, decl;
23121
23122   if (exp && DECL_P (exp))
23123     {
23124       type = TREE_TYPE (exp);
23125       decl = exp;
23126     }
23127   else
23128     {
23129       type = exp;
23130       decl = NULL;
23131     }
23132
23133   /* Don't do dynamic stack realignment for long long objects with
23134      -mpreferred-stack-boundary=2.  */
23135   if (!TARGET_64BIT
23136       && align == 64
23137       && ix86_preferred_stack_boundary < 64
23138       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
23139       && (!type || !TYPE_USER_ALIGN (type))
23140       && (!decl || !DECL_USER_ALIGN (decl)))
23141     align = 32;
23142
23143   /* If TYPE is NULL, we are allocating a stack slot for caller-save
23144      register in MODE.  We will return the largest alignment of XF
23145      and DF.  */
23146   if (!type)
23147     {
23148       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
23149         align = GET_MODE_ALIGNMENT (DFmode);
23150       return align;
23151     }
23152
23153   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
23154      to 16byte boundary.  Exact wording is:
23155
23156      An array uses the same alignment as its elements, except that a local or
23157      global array variable of length at least 16 bytes or
23158      a C99 variable-length array variable always has alignment of at least 16 bytes.
23159
23160      This was added to allow use of aligned SSE instructions at arrays.  This
23161      rule is meant for static storage (where compiler can not do the analysis
23162      by itself).  We follow it for automatic variables only when convenient.
23163      We fully control everything in the function compiled and functions from
23164      other unit can not rely on the alignment.
23165
23166      Exclude va_list type.  It is the common case of local array where
23167      we can not benefit from the alignment.  */
23168   if (TARGET_64BIT && optimize_function_for_speed_p (cfun)
23169       && TARGET_SSE)
23170     {
23171       if (AGGREGATE_TYPE_P (type)
23172            && (va_list_type_node == NULL_TREE
23173                || (TYPE_MAIN_VARIANT (type)
23174                    != TYPE_MAIN_VARIANT (va_list_type_node)))
23175            && TYPE_SIZE (type)
23176            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
23177            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
23178                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
23179         return 128;
23180     }
23181   if (TREE_CODE (type) == ARRAY_TYPE)
23182     {
23183       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
23184         return 64;
23185       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
23186         return 128;
23187     }
23188   else if (TREE_CODE (type) == COMPLEX_TYPE)
23189     {
23190       if (TYPE_MODE (type) == DCmode && align < 64)
23191         return 64;
23192       if ((TYPE_MODE (type) == XCmode
23193            || TYPE_MODE (type) == TCmode) && align < 128)
23194         return 128;
23195     }
23196   else if ((TREE_CODE (type) == RECORD_TYPE
23197             || TREE_CODE (type) == UNION_TYPE
23198             || TREE_CODE (type) == QUAL_UNION_TYPE)
23199            && TYPE_FIELDS (type))
23200     {
23201       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
23202         return 64;
23203       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
23204         return 128;
23205     }
23206   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
23207            || TREE_CODE (type) == INTEGER_TYPE)
23208     {
23209
23210       if (TYPE_MODE (type) == DFmode && align < 64)
23211         return 64;
23212       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
23213         return 128;
23214     }
23215   return align;
23216 }
23217
23218 /* Compute the minimum required alignment for dynamic stack realignment
23219    purposes for a local variable, parameter or a stack slot.  EXP is
23220    the data type or decl itself, MODE is its mode and ALIGN is the
23221    alignment that the object would ordinarily have.  */
23222
23223 unsigned int
23224 ix86_minimum_alignment (tree exp, enum machine_mode mode,
23225                         unsigned int align)
23226 {
23227   tree type, decl;
23228
23229   if (exp && DECL_P (exp))
23230     {
23231       type = TREE_TYPE (exp);
23232       decl = exp;
23233     }
23234   else
23235     {
23236       type = exp;
23237       decl = NULL;
23238     }
23239
23240   if (TARGET_64BIT || align != 64 || ix86_preferred_stack_boundary >= 64)
23241     return align;
23242
23243   /* Don't do dynamic stack realignment for long long objects with
23244      -mpreferred-stack-boundary=2.  */
23245   if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
23246       && (!type || !TYPE_USER_ALIGN (type))
23247       && (!decl || !DECL_USER_ALIGN (decl)))
23248     return 32;
23249
23250   return align;
23251 }
23252 \f
23253 /* Find a location for the static chain incoming to a nested function.
23254    This is a register, unless all free registers are used by arguments.  */
23255
23256 static rtx
23257 ix86_static_chain (const_tree fndecl, bool incoming_p)
23258 {
23259   unsigned regno;
23260
23261   if (!DECL_STATIC_CHAIN (fndecl))
23262     return NULL;
23263
23264   if (TARGET_64BIT)
23265     {
23266       /* We always use R10 in 64-bit mode.  */
23267       regno = R10_REG;
23268     }
23269   else
23270     {
23271       tree fntype;
23272       unsigned int ccvt;
23273
23274       /* By default in 32-bit mode we use ECX to pass the static chain.  */
23275       regno = CX_REG;
23276
23277       fntype = TREE_TYPE (fndecl);
23278       ccvt = ix86_get_callcvt (fntype);
23279       if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) != 0)
23280         {
23281           /* Fastcall functions use ecx/edx for arguments, which leaves
23282              us with EAX for the static chain.
23283              Thiscall functions use ecx for arguments, which also
23284              leaves us with EAX for the static chain.  */
23285           regno = AX_REG;
23286         }
23287       else if (ix86_function_regparm (fntype, fndecl) == 3)
23288         {
23289           /* For regparm 3, we have no free call-clobbered registers in
23290              which to store the static chain.  In order to implement this,
23291              we have the trampoline push the static chain to the stack.
23292              However, we can't push a value below the return address when
23293              we call the nested function directly, so we have to use an
23294              alternate entry point.  For this we use ESI, and have the
23295              alternate entry point push ESI, so that things appear the
23296              same once we're executing the nested function.  */
23297           if (incoming_p)
23298             {
23299               if (fndecl == current_function_decl)
23300                 ix86_static_chain_on_stack = true;
23301               return gen_frame_mem (SImode,
23302                                     plus_constant (arg_pointer_rtx, -8));
23303             }
23304           regno = SI_REG;
23305         }
23306     }
23307
23308   return gen_rtx_REG (Pmode, regno);
23309 }
23310
23311 /* Emit RTL insns to initialize the variable parts of a trampoline.
23312    FNDECL is the decl of the target address; M_TRAMP is a MEM for
23313    the trampoline, and CHAIN_VALUE is an RTX for the static chain
23314    to be passed to the target function.  */
23315
23316 static void
23317 ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
23318 {
23319   rtx mem, fnaddr;
23320
23321   fnaddr = XEXP (DECL_RTL (fndecl), 0);
23322
23323   if (!TARGET_64BIT)
23324     {
23325       rtx disp, chain;
23326       int opcode;
23327
23328       /* Depending on the static chain location, either load a register
23329          with a constant, or push the constant to the stack.  All of the
23330          instructions are the same size.  */
23331       chain = ix86_static_chain (fndecl, true);
23332       if (REG_P (chain))
23333         {
23334           if (REGNO (chain) == CX_REG)
23335             opcode = 0xb9;
23336           else if (REGNO (chain) == AX_REG)
23337             opcode = 0xb8;
23338           else
23339             gcc_unreachable ();
23340         }
23341       else
23342         opcode = 0x68;
23343
23344       mem = adjust_address (m_tramp, QImode, 0);
23345       emit_move_insn (mem, gen_int_mode (opcode, QImode));
23346
23347       mem = adjust_address (m_tramp, SImode, 1);
23348       emit_move_insn (mem, chain_value);
23349
23350       /* Compute offset from the end of the jmp to the target function.
23351          In the case in which the trampoline stores the static chain on
23352          the stack, we need to skip the first insn which pushes the
23353          (call-saved) register static chain; this push is 1 byte.  */
23354       disp = expand_binop (SImode, sub_optab, fnaddr,
23355                            plus_constant (XEXP (m_tramp, 0),
23356                                           MEM_P (chain) ? 9 : 10),
23357                            NULL_RTX, 1, OPTAB_DIRECT);
23358
23359       mem = adjust_address (m_tramp, QImode, 5);
23360       emit_move_insn (mem, gen_int_mode (0xe9, QImode));
23361
23362       mem = adjust_address (m_tramp, SImode, 6);
23363       emit_move_insn (mem, disp);
23364     }
23365   else
23366     {
23367       int offset = 0;
23368
23369       /* Load the function address to r11.  Try to load address using
23370          the shorter movl instead of movabs.  We may want to support
23371          movq for kernel mode, but kernel does not use trampolines at
23372          the moment.  */
23373       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
23374         {
23375           fnaddr = copy_to_mode_reg (DImode, fnaddr);
23376
23377           mem = adjust_address (m_tramp, HImode, offset);
23378           emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
23379
23380           mem = adjust_address (m_tramp, SImode, offset + 2);
23381           emit_move_insn (mem, gen_lowpart (SImode, fnaddr));
23382           offset += 6;
23383         }
23384       else
23385         {
23386           mem = adjust_address (m_tramp, HImode, offset);
23387           emit_move_insn (mem, gen_int_mode (0xbb49, HImode));
23388
23389           mem = adjust_address (m_tramp, DImode, offset + 2);
23390           emit_move_insn (mem, fnaddr);
23391           offset += 10;
23392         }
23393
23394       /* Load static chain using movabs to r10.  */
23395       mem = adjust_address (m_tramp, HImode, offset);
23396       emit_move_insn (mem, gen_int_mode (0xba49, HImode));
23397
23398       mem = adjust_address (m_tramp, DImode, offset + 2);
23399       emit_move_insn (mem, chain_value);
23400       offset += 10;
23401
23402       /* Jump to r11; the last (unused) byte is a nop, only there to
23403          pad the write out to a single 32-bit store.  */
23404       mem = adjust_address (m_tramp, SImode, offset);
23405       emit_move_insn (mem, gen_int_mode (0x90e3ff49, SImode));
23406       offset += 4;
23407
23408       gcc_assert (offset <= TRAMPOLINE_SIZE);
23409     }
23410
23411 #ifdef ENABLE_EXECUTE_STACK
23412 #ifdef CHECK_EXECUTE_STACK_ENABLED
23413   if (CHECK_EXECUTE_STACK_ENABLED)
23414 #endif
23415   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
23416                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
23417 #endif
23418 }
23419 \f
23420 /* The following file contains several enumerations and data structures
23421    built from the definitions in i386-builtin-types.def.  */
23422
23423 #include "i386-builtin-types.inc"
23424
23425 /* Table for the ix86 builtin non-function types.  */
23426 static GTY(()) tree ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1];
23427
23428 /* Retrieve an element from the above table, building some of
23429    the types lazily.  */
23430
23431 static tree
23432 ix86_get_builtin_type (enum ix86_builtin_type tcode)
23433 {
23434   unsigned int index;
23435   tree type, itype;
23436
23437   gcc_assert ((unsigned)tcode < ARRAY_SIZE(ix86_builtin_type_tab));
23438
23439   type = ix86_builtin_type_tab[(int) tcode];
23440   if (type != NULL)
23441     return type;
23442
23443   gcc_assert (tcode > IX86_BT_LAST_PRIM);
23444   if (tcode <= IX86_BT_LAST_VECT)
23445     {
23446       enum machine_mode mode;
23447
23448       index = tcode - IX86_BT_LAST_PRIM - 1;
23449       itype = ix86_get_builtin_type (ix86_builtin_type_vect_base[index]);
23450       mode = ix86_builtin_type_vect_mode[index];
23451
23452       type = build_vector_type_for_mode (itype, mode);
23453     }
23454   else
23455     {
23456       int quals;
23457
23458       index = tcode - IX86_BT_LAST_VECT - 1;
23459       if (tcode <= IX86_BT_LAST_PTR)
23460         quals = TYPE_UNQUALIFIED;
23461       else
23462         quals = TYPE_QUAL_CONST;
23463
23464       itype = ix86_get_builtin_type (ix86_builtin_type_ptr_base[index]);
23465       if (quals != TYPE_UNQUALIFIED)
23466         itype = build_qualified_type (itype, quals);
23467
23468       type = build_pointer_type (itype);
23469     }
23470
23471   ix86_builtin_type_tab[(int) tcode] = type;
23472   return type;
23473 }
23474
23475 /* Table for the ix86 builtin function types.  */
23476 static GTY(()) tree ix86_builtin_func_type_tab[(int) IX86_BT_LAST_ALIAS + 1];
23477
23478 /* Retrieve an element from the above table, building some of
23479    the types lazily.  */
23480
23481 static tree
23482 ix86_get_builtin_func_type (enum ix86_builtin_func_type tcode)
23483 {
23484   tree type;
23485
23486   gcc_assert ((unsigned)tcode < ARRAY_SIZE (ix86_builtin_func_type_tab));
23487
23488   type = ix86_builtin_func_type_tab[(int) tcode];
23489   if (type != NULL)
23490     return type;
23491
23492   if (tcode <= IX86_BT_LAST_FUNC)
23493     {
23494       unsigned start = ix86_builtin_func_start[(int) tcode];
23495       unsigned after = ix86_builtin_func_start[(int) tcode + 1];
23496       tree rtype, atype, args = void_list_node;
23497       unsigned i;
23498
23499       rtype = ix86_get_builtin_type (ix86_builtin_func_args[start]);
23500       for (i = after - 1; i > start; --i)
23501         {
23502           atype = ix86_get_builtin_type (ix86_builtin_func_args[i]);
23503           args = tree_cons (NULL, atype, args);
23504         }
23505
23506       type = build_function_type (rtype, args);
23507     }
23508   else
23509     {
23510       unsigned index = tcode - IX86_BT_LAST_FUNC - 1;
23511       enum ix86_builtin_func_type icode;
23512
23513       icode = ix86_builtin_func_alias_base[index];
23514       type = ix86_get_builtin_func_type (icode);
23515     }
23516
23517   ix86_builtin_func_type_tab[(int) tcode] = type;
23518   return type;
23519 }
23520
23521
23522 /* Codes for all the SSE/MMX builtins.  */
23523 enum ix86_builtins
23524 {
23525   IX86_BUILTIN_ADDPS,
23526   IX86_BUILTIN_ADDSS,
23527   IX86_BUILTIN_DIVPS,
23528   IX86_BUILTIN_DIVSS,
23529   IX86_BUILTIN_MULPS,
23530   IX86_BUILTIN_MULSS,
23531   IX86_BUILTIN_SUBPS,
23532   IX86_BUILTIN_SUBSS,
23533
23534   IX86_BUILTIN_CMPEQPS,
23535   IX86_BUILTIN_CMPLTPS,
23536   IX86_BUILTIN_CMPLEPS,
23537   IX86_BUILTIN_CMPGTPS,
23538   IX86_BUILTIN_CMPGEPS,
23539   IX86_BUILTIN_CMPNEQPS,
23540   IX86_BUILTIN_CMPNLTPS,
23541   IX86_BUILTIN_CMPNLEPS,
23542   IX86_BUILTIN_CMPNGTPS,
23543   IX86_BUILTIN_CMPNGEPS,
23544   IX86_BUILTIN_CMPORDPS,
23545   IX86_BUILTIN_CMPUNORDPS,
23546   IX86_BUILTIN_CMPEQSS,
23547   IX86_BUILTIN_CMPLTSS,
23548   IX86_BUILTIN_CMPLESS,
23549   IX86_BUILTIN_CMPNEQSS,
23550   IX86_BUILTIN_CMPNLTSS,
23551   IX86_BUILTIN_CMPNLESS,
23552   IX86_BUILTIN_CMPNGTSS,
23553   IX86_BUILTIN_CMPNGESS,
23554   IX86_BUILTIN_CMPORDSS,
23555   IX86_BUILTIN_CMPUNORDSS,
23556
23557   IX86_BUILTIN_COMIEQSS,
23558   IX86_BUILTIN_COMILTSS,
23559   IX86_BUILTIN_COMILESS,
23560   IX86_BUILTIN_COMIGTSS,
23561   IX86_BUILTIN_COMIGESS,
23562   IX86_BUILTIN_COMINEQSS,
23563   IX86_BUILTIN_UCOMIEQSS,
23564   IX86_BUILTIN_UCOMILTSS,
23565   IX86_BUILTIN_UCOMILESS,
23566   IX86_BUILTIN_UCOMIGTSS,
23567   IX86_BUILTIN_UCOMIGESS,
23568   IX86_BUILTIN_UCOMINEQSS,
23569
23570   IX86_BUILTIN_CVTPI2PS,
23571   IX86_BUILTIN_CVTPS2PI,
23572   IX86_BUILTIN_CVTSI2SS,
23573   IX86_BUILTIN_CVTSI642SS,
23574   IX86_BUILTIN_CVTSS2SI,
23575   IX86_BUILTIN_CVTSS2SI64,
23576   IX86_BUILTIN_CVTTPS2PI,
23577   IX86_BUILTIN_CVTTSS2SI,
23578   IX86_BUILTIN_CVTTSS2SI64,
23579
23580   IX86_BUILTIN_MAXPS,
23581   IX86_BUILTIN_MAXSS,
23582   IX86_BUILTIN_MINPS,
23583   IX86_BUILTIN_MINSS,
23584
23585   IX86_BUILTIN_LOADUPS,
23586   IX86_BUILTIN_STOREUPS,
23587   IX86_BUILTIN_MOVSS,
23588
23589   IX86_BUILTIN_MOVHLPS,
23590   IX86_BUILTIN_MOVLHPS,
23591   IX86_BUILTIN_LOADHPS,
23592   IX86_BUILTIN_LOADLPS,
23593   IX86_BUILTIN_STOREHPS,
23594   IX86_BUILTIN_STORELPS,
23595
23596   IX86_BUILTIN_MASKMOVQ,
23597   IX86_BUILTIN_MOVMSKPS,
23598   IX86_BUILTIN_PMOVMSKB,
23599
23600   IX86_BUILTIN_MOVNTPS,
23601   IX86_BUILTIN_MOVNTQ,
23602
23603   IX86_BUILTIN_LOADDQU,
23604   IX86_BUILTIN_STOREDQU,
23605
23606   IX86_BUILTIN_PACKSSWB,
23607   IX86_BUILTIN_PACKSSDW,
23608   IX86_BUILTIN_PACKUSWB,
23609
23610   IX86_BUILTIN_PADDB,
23611   IX86_BUILTIN_PADDW,
23612   IX86_BUILTIN_PADDD,
23613   IX86_BUILTIN_PADDQ,
23614   IX86_BUILTIN_PADDSB,
23615   IX86_BUILTIN_PADDSW,
23616   IX86_BUILTIN_PADDUSB,
23617   IX86_BUILTIN_PADDUSW,
23618   IX86_BUILTIN_PSUBB,
23619   IX86_BUILTIN_PSUBW,
23620   IX86_BUILTIN_PSUBD,
23621   IX86_BUILTIN_PSUBQ,
23622   IX86_BUILTIN_PSUBSB,
23623   IX86_BUILTIN_PSUBSW,
23624   IX86_BUILTIN_PSUBUSB,
23625   IX86_BUILTIN_PSUBUSW,
23626
23627   IX86_BUILTIN_PAND,
23628   IX86_BUILTIN_PANDN,
23629   IX86_BUILTIN_POR,
23630   IX86_BUILTIN_PXOR,
23631
23632   IX86_BUILTIN_PAVGB,
23633   IX86_BUILTIN_PAVGW,
23634
23635   IX86_BUILTIN_PCMPEQB,
23636   IX86_BUILTIN_PCMPEQW,
23637   IX86_BUILTIN_PCMPEQD,
23638   IX86_BUILTIN_PCMPGTB,
23639   IX86_BUILTIN_PCMPGTW,
23640   IX86_BUILTIN_PCMPGTD,
23641
23642   IX86_BUILTIN_PMADDWD,
23643
23644   IX86_BUILTIN_PMAXSW,
23645   IX86_BUILTIN_PMAXUB,
23646   IX86_BUILTIN_PMINSW,
23647   IX86_BUILTIN_PMINUB,
23648
23649   IX86_BUILTIN_PMULHUW,
23650   IX86_BUILTIN_PMULHW,
23651   IX86_BUILTIN_PMULLW,
23652
23653   IX86_BUILTIN_PSADBW,
23654   IX86_BUILTIN_PSHUFW,
23655
23656   IX86_BUILTIN_PSLLW,
23657   IX86_BUILTIN_PSLLD,
23658   IX86_BUILTIN_PSLLQ,
23659   IX86_BUILTIN_PSRAW,
23660   IX86_BUILTIN_PSRAD,
23661   IX86_BUILTIN_PSRLW,
23662   IX86_BUILTIN_PSRLD,
23663   IX86_BUILTIN_PSRLQ,
23664   IX86_BUILTIN_PSLLWI,
23665   IX86_BUILTIN_PSLLDI,
23666   IX86_BUILTIN_PSLLQI,
23667   IX86_BUILTIN_PSRAWI,
23668   IX86_BUILTIN_PSRADI,
23669   IX86_BUILTIN_PSRLWI,
23670   IX86_BUILTIN_PSRLDI,
23671   IX86_BUILTIN_PSRLQI,
23672
23673   IX86_BUILTIN_PUNPCKHBW,
23674   IX86_BUILTIN_PUNPCKHWD,
23675   IX86_BUILTIN_PUNPCKHDQ,
23676   IX86_BUILTIN_PUNPCKLBW,
23677   IX86_BUILTIN_PUNPCKLWD,
23678   IX86_BUILTIN_PUNPCKLDQ,
23679
23680   IX86_BUILTIN_SHUFPS,
23681
23682   IX86_BUILTIN_RCPPS,
23683   IX86_BUILTIN_RCPSS,
23684   IX86_BUILTIN_RSQRTPS,
23685   IX86_BUILTIN_RSQRTPS_NR,
23686   IX86_BUILTIN_RSQRTSS,
23687   IX86_BUILTIN_RSQRTF,
23688   IX86_BUILTIN_SQRTPS,
23689   IX86_BUILTIN_SQRTPS_NR,
23690   IX86_BUILTIN_SQRTSS,
23691
23692   IX86_BUILTIN_UNPCKHPS,
23693   IX86_BUILTIN_UNPCKLPS,
23694
23695   IX86_BUILTIN_ANDPS,
23696   IX86_BUILTIN_ANDNPS,
23697   IX86_BUILTIN_ORPS,
23698   IX86_BUILTIN_XORPS,
23699
23700   IX86_BUILTIN_EMMS,
23701   IX86_BUILTIN_LDMXCSR,
23702   IX86_BUILTIN_STMXCSR,
23703   IX86_BUILTIN_SFENCE,
23704
23705   /* 3DNow! Original */
23706   IX86_BUILTIN_FEMMS,
23707   IX86_BUILTIN_PAVGUSB,
23708   IX86_BUILTIN_PF2ID,
23709   IX86_BUILTIN_PFACC,
23710   IX86_BUILTIN_PFADD,
23711   IX86_BUILTIN_PFCMPEQ,
23712   IX86_BUILTIN_PFCMPGE,
23713   IX86_BUILTIN_PFCMPGT,
23714   IX86_BUILTIN_PFMAX,
23715   IX86_BUILTIN_PFMIN,
23716   IX86_BUILTIN_PFMUL,
23717   IX86_BUILTIN_PFRCP,
23718   IX86_BUILTIN_PFRCPIT1,
23719   IX86_BUILTIN_PFRCPIT2,
23720   IX86_BUILTIN_PFRSQIT1,
23721   IX86_BUILTIN_PFRSQRT,
23722   IX86_BUILTIN_PFSUB,
23723   IX86_BUILTIN_PFSUBR,
23724   IX86_BUILTIN_PI2FD,
23725   IX86_BUILTIN_PMULHRW,
23726
23727   /* 3DNow! Athlon Extensions */
23728   IX86_BUILTIN_PF2IW,
23729   IX86_BUILTIN_PFNACC,
23730   IX86_BUILTIN_PFPNACC,
23731   IX86_BUILTIN_PI2FW,
23732   IX86_BUILTIN_PSWAPDSI,
23733   IX86_BUILTIN_PSWAPDSF,
23734
23735   /* SSE2 */
23736   IX86_BUILTIN_ADDPD,
23737   IX86_BUILTIN_ADDSD,
23738   IX86_BUILTIN_DIVPD,
23739   IX86_BUILTIN_DIVSD,
23740   IX86_BUILTIN_MULPD,
23741   IX86_BUILTIN_MULSD,
23742   IX86_BUILTIN_SUBPD,
23743   IX86_BUILTIN_SUBSD,
23744
23745   IX86_BUILTIN_CMPEQPD,
23746   IX86_BUILTIN_CMPLTPD,
23747   IX86_BUILTIN_CMPLEPD,
23748   IX86_BUILTIN_CMPGTPD,
23749   IX86_BUILTIN_CMPGEPD,
23750   IX86_BUILTIN_CMPNEQPD,
23751   IX86_BUILTIN_CMPNLTPD,
23752   IX86_BUILTIN_CMPNLEPD,
23753   IX86_BUILTIN_CMPNGTPD,
23754   IX86_BUILTIN_CMPNGEPD,
23755   IX86_BUILTIN_CMPORDPD,
23756   IX86_BUILTIN_CMPUNORDPD,
23757   IX86_BUILTIN_CMPEQSD,
23758   IX86_BUILTIN_CMPLTSD,
23759   IX86_BUILTIN_CMPLESD,
23760   IX86_BUILTIN_CMPNEQSD,
23761   IX86_BUILTIN_CMPNLTSD,
23762   IX86_BUILTIN_CMPNLESD,
23763   IX86_BUILTIN_CMPORDSD,
23764   IX86_BUILTIN_CMPUNORDSD,
23765
23766   IX86_BUILTIN_COMIEQSD,
23767   IX86_BUILTIN_COMILTSD,
23768   IX86_BUILTIN_COMILESD,
23769   IX86_BUILTIN_COMIGTSD,
23770   IX86_BUILTIN_COMIGESD,
23771   IX86_BUILTIN_COMINEQSD,
23772   IX86_BUILTIN_UCOMIEQSD,
23773   IX86_BUILTIN_UCOMILTSD,
23774   IX86_BUILTIN_UCOMILESD,
23775   IX86_BUILTIN_UCOMIGTSD,
23776   IX86_BUILTIN_UCOMIGESD,
23777   IX86_BUILTIN_UCOMINEQSD,
23778
23779   IX86_BUILTIN_MAXPD,
23780   IX86_BUILTIN_MAXSD,
23781   IX86_BUILTIN_MINPD,
23782   IX86_BUILTIN_MINSD,
23783
23784   IX86_BUILTIN_ANDPD,
23785   IX86_BUILTIN_ANDNPD,
23786   IX86_BUILTIN_ORPD,
23787   IX86_BUILTIN_XORPD,
23788
23789   IX86_BUILTIN_SQRTPD,
23790   IX86_BUILTIN_SQRTSD,
23791
23792   IX86_BUILTIN_UNPCKHPD,
23793   IX86_BUILTIN_UNPCKLPD,
23794
23795   IX86_BUILTIN_SHUFPD,
23796
23797   IX86_BUILTIN_LOADUPD,
23798   IX86_BUILTIN_STOREUPD,
23799   IX86_BUILTIN_MOVSD,
23800
23801   IX86_BUILTIN_LOADHPD,
23802   IX86_BUILTIN_LOADLPD,
23803
23804   IX86_BUILTIN_CVTDQ2PD,
23805   IX86_BUILTIN_CVTDQ2PS,
23806
23807   IX86_BUILTIN_CVTPD2DQ,
23808   IX86_BUILTIN_CVTPD2PI,
23809   IX86_BUILTIN_CVTPD2PS,
23810   IX86_BUILTIN_CVTTPD2DQ,
23811   IX86_BUILTIN_CVTTPD2PI,
23812
23813   IX86_BUILTIN_CVTPI2PD,
23814   IX86_BUILTIN_CVTSI2SD,
23815   IX86_BUILTIN_CVTSI642SD,
23816
23817   IX86_BUILTIN_CVTSD2SI,
23818   IX86_BUILTIN_CVTSD2SI64,
23819   IX86_BUILTIN_CVTSD2SS,
23820   IX86_BUILTIN_CVTSS2SD,
23821   IX86_BUILTIN_CVTTSD2SI,
23822   IX86_BUILTIN_CVTTSD2SI64,
23823
23824   IX86_BUILTIN_CVTPS2DQ,
23825   IX86_BUILTIN_CVTPS2PD,
23826   IX86_BUILTIN_CVTTPS2DQ,
23827
23828   IX86_BUILTIN_MOVNTI,
23829   IX86_BUILTIN_MOVNTPD,
23830   IX86_BUILTIN_MOVNTDQ,
23831
23832   IX86_BUILTIN_MOVQ128,
23833
23834   /* SSE2 MMX */
23835   IX86_BUILTIN_MASKMOVDQU,
23836   IX86_BUILTIN_MOVMSKPD,
23837   IX86_BUILTIN_PMOVMSKB128,
23838
23839   IX86_BUILTIN_PACKSSWB128,
23840   IX86_BUILTIN_PACKSSDW128,
23841   IX86_BUILTIN_PACKUSWB128,
23842
23843   IX86_BUILTIN_PADDB128,
23844   IX86_BUILTIN_PADDW128,
23845   IX86_BUILTIN_PADDD128,
23846   IX86_BUILTIN_PADDQ128,
23847   IX86_BUILTIN_PADDSB128,
23848   IX86_BUILTIN_PADDSW128,
23849   IX86_BUILTIN_PADDUSB128,
23850   IX86_BUILTIN_PADDUSW128,
23851   IX86_BUILTIN_PSUBB128,
23852   IX86_BUILTIN_PSUBW128,
23853   IX86_BUILTIN_PSUBD128,
23854   IX86_BUILTIN_PSUBQ128,
23855   IX86_BUILTIN_PSUBSB128,
23856   IX86_BUILTIN_PSUBSW128,
23857   IX86_BUILTIN_PSUBUSB128,
23858   IX86_BUILTIN_PSUBUSW128,
23859
23860   IX86_BUILTIN_PAND128,
23861   IX86_BUILTIN_PANDN128,
23862   IX86_BUILTIN_POR128,
23863   IX86_BUILTIN_PXOR128,
23864
23865   IX86_BUILTIN_PAVGB128,
23866   IX86_BUILTIN_PAVGW128,
23867
23868   IX86_BUILTIN_PCMPEQB128,
23869   IX86_BUILTIN_PCMPEQW128,
23870   IX86_BUILTIN_PCMPEQD128,
23871   IX86_BUILTIN_PCMPGTB128,
23872   IX86_BUILTIN_PCMPGTW128,
23873   IX86_BUILTIN_PCMPGTD128,
23874
23875   IX86_BUILTIN_PMADDWD128,
23876
23877   IX86_BUILTIN_PMAXSW128,
23878   IX86_BUILTIN_PMAXUB128,
23879   IX86_BUILTIN_PMINSW128,
23880   IX86_BUILTIN_PMINUB128,
23881
23882   IX86_BUILTIN_PMULUDQ,
23883   IX86_BUILTIN_PMULUDQ128,
23884   IX86_BUILTIN_PMULHUW128,
23885   IX86_BUILTIN_PMULHW128,
23886   IX86_BUILTIN_PMULLW128,
23887
23888   IX86_BUILTIN_PSADBW128,
23889   IX86_BUILTIN_PSHUFHW,
23890   IX86_BUILTIN_PSHUFLW,
23891   IX86_BUILTIN_PSHUFD,
23892
23893   IX86_BUILTIN_PSLLDQI128,
23894   IX86_BUILTIN_PSLLWI128,
23895   IX86_BUILTIN_PSLLDI128,
23896   IX86_BUILTIN_PSLLQI128,
23897   IX86_BUILTIN_PSRAWI128,
23898   IX86_BUILTIN_PSRADI128,
23899   IX86_BUILTIN_PSRLDQI128,
23900   IX86_BUILTIN_PSRLWI128,
23901   IX86_BUILTIN_PSRLDI128,
23902   IX86_BUILTIN_PSRLQI128,
23903
23904   IX86_BUILTIN_PSLLDQ128,
23905   IX86_BUILTIN_PSLLW128,
23906   IX86_BUILTIN_PSLLD128,
23907   IX86_BUILTIN_PSLLQ128,
23908   IX86_BUILTIN_PSRAW128,
23909   IX86_BUILTIN_PSRAD128,
23910   IX86_BUILTIN_PSRLW128,
23911   IX86_BUILTIN_PSRLD128,
23912   IX86_BUILTIN_PSRLQ128,
23913
23914   IX86_BUILTIN_PUNPCKHBW128,
23915   IX86_BUILTIN_PUNPCKHWD128,
23916   IX86_BUILTIN_PUNPCKHDQ128,
23917   IX86_BUILTIN_PUNPCKHQDQ128,
23918   IX86_BUILTIN_PUNPCKLBW128,
23919   IX86_BUILTIN_PUNPCKLWD128,
23920   IX86_BUILTIN_PUNPCKLDQ128,
23921   IX86_BUILTIN_PUNPCKLQDQ128,
23922
23923   IX86_BUILTIN_CLFLUSH,
23924   IX86_BUILTIN_MFENCE,
23925   IX86_BUILTIN_LFENCE,
23926
23927   IX86_BUILTIN_BSRSI,
23928   IX86_BUILTIN_BSRDI,
23929   IX86_BUILTIN_RDPMC,
23930   IX86_BUILTIN_RDTSC,
23931   IX86_BUILTIN_RDTSCP,
23932   IX86_BUILTIN_ROLQI,
23933   IX86_BUILTIN_ROLHI,
23934   IX86_BUILTIN_RORQI,
23935   IX86_BUILTIN_RORHI,
23936
23937   /* SSE3.  */
23938   IX86_BUILTIN_ADDSUBPS,
23939   IX86_BUILTIN_HADDPS,
23940   IX86_BUILTIN_HSUBPS,
23941   IX86_BUILTIN_MOVSHDUP,
23942   IX86_BUILTIN_MOVSLDUP,
23943   IX86_BUILTIN_ADDSUBPD,
23944   IX86_BUILTIN_HADDPD,
23945   IX86_BUILTIN_HSUBPD,
23946   IX86_BUILTIN_LDDQU,
23947
23948   IX86_BUILTIN_MONITOR,
23949   IX86_BUILTIN_MWAIT,
23950
23951   /* SSSE3.  */
23952   IX86_BUILTIN_PHADDW,
23953   IX86_BUILTIN_PHADDD,
23954   IX86_BUILTIN_PHADDSW,
23955   IX86_BUILTIN_PHSUBW,
23956   IX86_BUILTIN_PHSUBD,
23957   IX86_BUILTIN_PHSUBSW,
23958   IX86_BUILTIN_PMADDUBSW,
23959   IX86_BUILTIN_PMULHRSW,
23960   IX86_BUILTIN_PSHUFB,
23961   IX86_BUILTIN_PSIGNB,
23962   IX86_BUILTIN_PSIGNW,
23963   IX86_BUILTIN_PSIGND,
23964   IX86_BUILTIN_PALIGNR,
23965   IX86_BUILTIN_PABSB,
23966   IX86_BUILTIN_PABSW,
23967   IX86_BUILTIN_PABSD,
23968
23969   IX86_BUILTIN_PHADDW128,
23970   IX86_BUILTIN_PHADDD128,
23971   IX86_BUILTIN_PHADDSW128,
23972   IX86_BUILTIN_PHSUBW128,
23973   IX86_BUILTIN_PHSUBD128,
23974   IX86_BUILTIN_PHSUBSW128,
23975   IX86_BUILTIN_PMADDUBSW128,
23976   IX86_BUILTIN_PMULHRSW128,
23977   IX86_BUILTIN_PSHUFB128,
23978   IX86_BUILTIN_PSIGNB128,
23979   IX86_BUILTIN_PSIGNW128,
23980   IX86_BUILTIN_PSIGND128,
23981   IX86_BUILTIN_PALIGNR128,
23982   IX86_BUILTIN_PABSB128,
23983   IX86_BUILTIN_PABSW128,
23984   IX86_BUILTIN_PABSD128,
23985
23986   /* AMDFAM10 - SSE4A New Instructions.  */
23987   IX86_BUILTIN_MOVNTSD,
23988   IX86_BUILTIN_MOVNTSS,
23989   IX86_BUILTIN_EXTRQI,
23990   IX86_BUILTIN_EXTRQ,
23991   IX86_BUILTIN_INSERTQI,
23992   IX86_BUILTIN_INSERTQ,
23993
23994   /* SSE4.1.  */
23995   IX86_BUILTIN_BLENDPD,
23996   IX86_BUILTIN_BLENDPS,
23997   IX86_BUILTIN_BLENDVPD,
23998   IX86_BUILTIN_BLENDVPS,
23999   IX86_BUILTIN_PBLENDVB128,
24000   IX86_BUILTIN_PBLENDW128,
24001
24002   IX86_BUILTIN_DPPD,
24003   IX86_BUILTIN_DPPS,
24004
24005   IX86_BUILTIN_INSERTPS128,
24006
24007   IX86_BUILTIN_MOVNTDQA,
24008   IX86_BUILTIN_MPSADBW128,
24009   IX86_BUILTIN_PACKUSDW128,
24010   IX86_BUILTIN_PCMPEQQ,
24011   IX86_BUILTIN_PHMINPOSUW128,
24012
24013   IX86_BUILTIN_PMAXSB128,
24014   IX86_BUILTIN_PMAXSD128,
24015   IX86_BUILTIN_PMAXUD128,
24016   IX86_BUILTIN_PMAXUW128,
24017
24018   IX86_BUILTIN_PMINSB128,
24019   IX86_BUILTIN_PMINSD128,
24020   IX86_BUILTIN_PMINUD128,
24021   IX86_BUILTIN_PMINUW128,
24022
24023   IX86_BUILTIN_PMOVSXBW128,
24024   IX86_BUILTIN_PMOVSXBD128,
24025   IX86_BUILTIN_PMOVSXBQ128,
24026   IX86_BUILTIN_PMOVSXWD128,
24027   IX86_BUILTIN_PMOVSXWQ128,
24028   IX86_BUILTIN_PMOVSXDQ128,
24029
24030   IX86_BUILTIN_PMOVZXBW128,
24031   IX86_BUILTIN_PMOVZXBD128,
24032   IX86_BUILTIN_PMOVZXBQ128,
24033   IX86_BUILTIN_PMOVZXWD128,
24034   IX86_BUILTIN_PMOVZXWQ128,
24035   IX86_BUILTIN_PMOVZXDQ128,
24036
24037   IX86_BUILTIN_PMULDQ128,
24038   IX86_BUILTIN_PMULLD128,
24039
24040   IX86_BUILTIN_ROUNDPD,
24041   IX86_BUILTIN_ROUNDPS,
24042   IX86_BUILTIN_ROUNDSD,
24043   IX86_BUILTIN_ROUNDSS,
24044
24045   IX86_BUILTIN_FLOORPD,
24046   IX86_BUILTIN_CEILPD,
24047   IX86_BUILTIN_TRUNCPD,
24048   IX86_BUILTIN_RINTPD,
24049   IX86_BUILTIN_FLOORPS,
24050   IX86_BUILTIN_CEILPS,
24051   IX86_BUILTIN_TRUNCPS,
24052   IX86_BUILTIN_RINTPS,
24053
24054   IX86_BUILTIN_PTESTZ,
24055   IX86_BUILTIN_PTESTC,
24056   IX86_BUILTIN_PTESTNZC,
24057
24058   IX86_BUILTIN_VEC_INIT_V2SI,
24059   IX86_BUILTIN_VEC_INIT_V4HI,
24060   IX86_BUILTIN_VEC_INIT_V8QI,
24061   IX86_BUILTIN_VEC_EXT_V2DF,
24062   IX86_BUILTIN_VEC_EXT_V2DI,
24063   IX86_BUILTIN_VEC_EXT_V4SF,
24064   IX86_BUILTIN_VEC_EXT_V4SI,
24065   IX86_BUILTIN_VEC_EXT_V8HI,
24066   IX86_BUILTIN_VEC_EXT_V2SI,
24067   IX86_BUILTIN_VEC_EXT_V4HI,
24068   IX86_BUILTIN_VEC_EXT_V16QI,
24069   IX86_BUILTIN_VEC_SET_V2DI,
24070   IX86_BUILTIN_VEC_SET_V4SF,
24071   IX86_BUILTIN_VEC_SET_V4SI,
24072   IX86_BUILTIN_VEC_SET_V8HI,
24073   IX86_BUILTIN_VEC_SET_V4HI,
24074   IX86_BUILTIN_VEC_SET_V16QI,
24075
24076   IX86_BUILTIN_VEC_PACK_SFIX,
24077
24078   /* SSE4.2.  */
24079   IX86_BUILTIN_CRC32QI,
24080   IX86_BUILTIN_CRC32HI,
24081   IX86_BUILTIN_CRC32SI,
24082   IX86_BUILTIN_CRC32DI,
24083
24084   IX86_BUILTIN_PCMPESTRI128,
24085   IX86_BUILTIN_PCMPESTRM128,
24086   IX86_BUILTIN_PCMPESTRA128,
24087   IX86_BUILTIN_PCMPESTRC128,
24088   IX86_BUILTIN_PCMPESTRO128,
24089   IX86_BUILTIN_PCMPESTRS128,
24090   IX86_BUILTIN_PCMPESTRZ128,
24091   IX86_BUILTIN_PCMPISTRI128,
24092   IX86_BUILTIN_PCMPISTRM128,
24093   IX86_BUILTIN_PCMPISTRA128,
24094   IX86_BUILTIN_PCMPISTRC128,
24095   IX86_BUILTIN_PCMPISTRO128,
24096   IX86_BUILTIN_PCMPISTRS128,
24097   IX86_BUILTIN_PCMPISTRZ128,
24098
24099   IX86_BUILTIN_PCMPGTQ,
24100
24101   /* AES instructions */
24102   IX86_BUILTIN_AESENC128,
24103   IX86_BUILTIN_AESENCLAST128,
24104   IX86_BUILTIN_AESDEC128,
24105   IX86_BUILTIN_AESDECLAST128,
24106   IX86_BUILTIN_AESIMC128,
24107   IX86_BUILTIN_AESKEYGENASSIST128,
24108
24109   /* PCLMUL instruction */
24110   IX86_BUILTIN_PCLMULQDQ128,
24111
24112   /* AVX */
24113   IX86_BUILTIN_ADDPD256,
24114   IX86_BUILTIN_ADDPS256,
24115   IX86_BUILTIN_ADDSUBPD256,
24116   IX86_BUILTIN_ADDSUBPS256,
24117   IX86_BUILTIN_ANDPD256,
24118   IX86_BUILTIN_ANDPS256,
24119   IX86_BUILTIN_ANDNPD256,
24120   IX86_BUILTIN_ANDNPS256,
24121   IX86_BUILTIN_BLENDPD256,
24122   IX86_BUILTIN_BLENDPS256,
24123   IX86_BUILTIN_BLENDVPD256,
24124   IX86_BUILTIN_BLENDVPS256,
24125   IX86_BUILTIN_DIVPD256,
24126   IX86_BUILTIN_DIVPS256,
24127   IX86_BUILTIN_DPPS256,
24128   IX86_BUILTIN_HADDPD256,
24129   IX86_BUILTIN_HADDPS256,
24130   IX86_BUILTIN_HSUBPD256,
24131   IX86_BUILTIN_HSUBPS256,
24132   IX86_BUILTIN_MAXPD256,
24133   IX86_BUILTIN_MAXPS256,
24134   IX86_BUILTIN_MINPD256,
24135   IX86_BUILTIN_MINPS256,
24136   IX86_BUILTIN_MULPD256,
24137   IX86_BUILTIN_MULPS256,
24138   IX86_BUILTIN_ORPD256,
24139   IX86_BUILTIN_ORPS256,
24140   IX86_BUILTIN_SHUFPD256,
24141   IX86_BUILTIN_SHUFPS256,
24142   IX86_BUILTIN_SUBPD256,
24143   IX86_BUILTIN_SUBPS256,
24144   IX86_BUILTIN_XORPD256,
24145   IX86_BUILTIN_XORPS256,
24146   IX86_BUILTIN_CMPSD,
24147   IX86_BUILTIN_CMPSS,
24148   IX86_BUILTIN_CMPPD,
24149   IX86_BUILTIN_CMPPS,
24150   IX86_BUILTIN_CMPPD256,
24151   IX86_BUILTIN_CMPPS256,
24152   IX86_BUILTIN_CVTDQ2PD256,
24153   IX86_BUILTIN_CVTDQ2PS256,
24154   IX86_BUILTIN_CVTPD2PS256,
24155   IX86_BUILTIN_CVTPS2DQ256,
24156   IX86_BUILTIN_CVTPS2PD256,
24157   IX86_BUILTIN_CVTTPD2DQ256,
24158   IX86_BUILTIN_CVTPD2DQ256,
24159   IX86_BUILTIN_CVTTPS2DQ256,
24160   IX86_BUILTIN_EXTRACTF128PD256,
24161   IX86_BUILTIN_EXTRACTF128PS256,
24162   IX86_BUILTIN_EXTRACTF128SI256,
24163   IX86_BUILTIN_VZEROALL,
24164   IX86_BUILTIN_VZEROUPPER,
24165   IX86_BUILTIN_VPERMILVARPD,
24166   IX86_BUILTIN_VPERMILVARPS,
24167   IX86_BUILTIN_VPERMILVARPD256,
24168   IX86_BUILTIN_VPERMILVARPS256,
24169   IX86_BUILTIN_VPERMILPD,
24170   IX86_BUILTIN_VPERMILPS,
24171   IX86_BUILTIN_VPERMILPD256,
24172   IX86_BUILTIN_VPERMILPS256,
24173   IX86_BUILTIN_VPERMIL2PD,
24174   IX86_BUILTIN_VPERMIL2PS,
24175   IX86_BUILTIN_VPERMIL2PD256,
24176   IX86_BUILTIN_VPERMIL2PS256,
24177   IX86_BUILTIN_VPERM2F128PD256,
24178   IX86_BUILTIN_VPERM2F128PS256,
24179   IX86_BUILTIN_VPERM2F128SI256,
24180   IX86_BUILTIN_VBROADCASTSS,
24181   IX86_BUILTIN_VBROADCASTSD256,
24182   IX86_BUILTIN_VBROADCASTSS256,
24183   IX86_BUILTIN_VBROADCASTPD256,
24184   IX86_BUILTIN_VBROADCASTPS256,
24185   IX86_BUILTIN_VINSERTF128PD256,
24186   IX86_BUILTIN_VINSERTF128PS256,
24187   IX86_BUILTIN_VINSERTF128SI256,
24188   IX86_BUILTIN_LOADUPD256,
24189   IX86_BUILTIN_LOADUPS256,
24190   IX86_BUILTIN_STOREUPD256,
24191   IX86_BUILTIN_STOREUPS256,
24192   IX86_BUILTIN_LDDQU256,
24193   IX86_BUILTIN_MOVNTDQ256,
24194   IX86_BUILTIN_MOVNTPD256,
24195   IX86_BUILTIN_MOVNTPS256,
24196   IX86_BUILTIN_LOADDQU256,
24197   IX86_BUILTIN_STOREDQU256,
24198   IX86_BUILTIN_MASKLOADPD,
24199   IX86_BUILTIN_MASKLOADPS,
24200   IX86_BUILTIN_MASKSTOREPD,
24201   IX86_BUILTIN_MASKSTOREPS,
24202   IX86_BUILTIN_MASKLOADPD256,
24203   IX86_BUILTIN_MASKLOADPS256,
24204   IX86_BUILTIN_MASKSTOREPD256,
24205   IX86_BUILTIN_MASKSTOREPS256,
24206   IX86_BUILTIN_MOVSHDUP256,
24207   IX86_BUILTIN_MOVSLDUP256,
24208   IX86_BUILTIN_MOVDDUP256,
24209
24210   IX86_BUILTIN_SQRTPD256,
24211   IX86_BUILTIN_SQRTPS256,
24212   IX86_BUILTIN_SQRTPS_NR256,
24213   IX86_BUILTIN_RSQRTPS256,
24214   IX86_BUILTIN_RSQRTPS_NR256,
24215
24216   IX86_BUILTIN_RCPPS256,
24217
24218   IX86_BUILTIN_ROUNDPD256,
24219   IX86_BUILTIN_ROUNDPS256,
24220
24221   IX86_BUILTIN_FLOORPD256,
24222   IX86_BUILTIN_CEILPD256,
24223   IX86_BUILTIN_TRUNCPD256,
24224   IX86_BUILTIN_RINTPD256,
24225   IX86_BUILTIN_FLOORPS256,
24226   IX86_BUILTIN_CEILPS256,
24227   IX86_BUILTIN_TRUNCPS256,
24228   IX86_BUILTIN_RINTPS256,
24229
24230   IX86_BUILTIN_UNPCKHPD256,
24231   IX86_BUILTIN_UNPCKLPD256,
24232   IX86_BUILTIN_UNPCKHPS256,
24233   IX86_BUILTIN_UNPCKLPS256,
24234
24235   IX86_BUILTIN_SI256_SI,
24236   IX86_BUILTIN_PS256_PS,
24237   IX86_BUILTIN_PD256_PD,
24238   IX86_BUILTIN_SI_SI256,
24239   IX86_BUILTIN_PS_PS256,
24240   IX86_BUILTIN_PD_PD256,
24241
24242   IX86_BUILTIN_VTESTZPD,
24243   IX86_BUILTIN_VTESTCPD,
24244   IX86_BUILTIN_VTESTNZCPD,
24245   IX86_BUILTIN_VTESTZPS,
24246   IX86_BUILTIN_VTESTCPS,
24247   IX86_BUILTIN_VTESTNZCPS,
24248   IX86_BUILTIN_VTESTZPD256,
24249   IX86_BUILTIN_VTESTCPD256,
24250   IX86_BUILTIN_VTESTNZCPD256,
24251   IX86_BUILTIN_VTESTZPS256,
24252   IX86_BUILTIN_VTESTCPS256,
24253   IX86_BUILTIN_VTESTNZCPS256,
24254   IX86_BUILTIN_PTESTZ256,
24255   IX86_BUILTIN_PTESTC256,
24256   IX86_BUILTIN_PTESTNZC256,
24257
24258   IX86_BUILTIN_MOVMSKPD256,
24259   IX86_BUILTIN_MOVMSKPS256,
24260
24261   /* TFmode support builtins.  */
24262   IX86_BUILTIN_INFQ,
24263   IX86_BUILTIN_HUGE_VALQ,
24264   IX86_BUILTIN_FABSQ,
24265   IX86_BUILTIN_COPYSIGNQ,
24266
24267   /* Vectorizer support builtins.  */
24268   IX86_BUILTIN_CPYSGNPS,
24269   IX86_BUILTIN_CPYSGNPD,
24270   IX86_BUILTIN_CPYSGNPS256,
24271   IX86_BUILTIN_CPYSGNPD256,
24272
24273   IX86_BUILTIN_CVTUDQ2PS,
24274
24275   IX86_BUILTIN_VEC_PERM_V2DF,
24276   IX86_BUILTIN_VEC_PERM_V4SF,
24277   IX86_BUILTIN_VEC_PERM_V2DI,
24278   IX86_BUILTIN_VEC_PERM_V4SI,
24279   IX86_BUILTIN_VEC_PERM_V8HI,
24280   IX86_BUILTIN_VEC_PERM_V16QI,
24281   IX86_BUILTIN_VEC_PERM_V2DI_U,
24282   IX86_BUILTIN_VEC_PERM_V4SI_U,
24283   IX86_BUILTIN_VEC_PERM_V8HI_U,
24284   IX86_BUILTIN_VEC_PERM_V16QI_U,
24285   IX86_BUILTIN_VEC_PERM_V4DF,
24286   IX86_BUILTIN_VEC_PERM_V8SF,
24287
24288   /* FMA4 and XOP instructions.  */
24289   IX86_BUILTIN_VFMADDSS,
24290   IX86_BUILTIN_VFMADDSD,
24291   IX86_BUILTIN_VFMADDPS,
24292   IX86_BUILTIN_VFMADDPD,
24293   IX86_BUILTIN_VFMADDPS256,
24294   IX86_BUILTIN_VFMADDPD256,
24295   IX86_BUILTIN_VFMADDSUBPS,
24296   IX86_BUILTIN_VFMADDSUBPD,
24297   IX86_BUILTIN_VFMADDSUBPS256,
24298   IX86_BUILTIN_VFMADDSUBPD256,
24299
24300   IX86_BUILTIN_VPCMOV,
24301   IX86_BUILTIN_VPCMOV_V2DI,
24302   IX86_BUILTIN_VPCMOV_V4SI,
24303   IX86_BUILTIN_VPCMOV_V8HI,
24304   IX86_BUILTIN_VPCMOV_V16QI,
24305   IX86_BUILTIN_VPCMOV_V4SF,
24306   IX86_BUILTIN_VPCMOV_V2DF,
24307   IX86_BUILTIN_VPCMOV256,
24308   IX86_BUILTIN_VPCMOV_V4DI256,
24309   IX86_BUILTIN_VPCMOV_V8SI256,
24310   IX86_BUILTIN_VPCMOV_V16HI256,
24311   IX86_BUILTIN_VPCMOV_V32QI256,
24312   IX86_BUILTIN_VPCMOV_V8SF256,
24313   IX86_BUILTIN_VPCMOV_V4DF256,
24314
24315   IX86_BUILTIN_VPPERM,
24316
24317   IX86_BUILTIN_VPMACSSWW,
24318   IX86_BUILTIN_VPMACSWW,
24319   IX86_BUILTIN_VPMACSSWD,
24320   IX86_BUILTIN_VPMACSWD,
24321   IX86_BUILTIN_VPMACSSDD,
24322   IX86_BUILTIN_VPMACSDD,
24323   IX86_BUILTIN_VPMACSSDQL,
24324   IX86_BUILTIN_VPMACSSDQH,
24325   IX86_BUILTIN_VPMACSDQL,
24326   IX86_BUILTIN_VPMACSDQH,
24327   IX86_BUILTIN_VPMADCSSWD,
24328   IX86_BUILTIN_VPMADCSWD,
24329
24330   IX86_BUILTIN_VPHADDBW,
24331   IX86_BUILTIN_VPHADDBD,
24332   IX86_BUILTIN_VPHADDBQ,
24333   IX86_BUILTIN_VPHADDWD,
24334   IX86_BUILTIN_VPHADDWQ,
24335   IX86_BUILTIN_VPHADDDQ,
24336   IX86_BUILTIN_VPHADDUBW,
24337   IX86_BUILTIN_VPHADDUBD,
24338   IX86_BUILTIN_VPHADDUBQ,
24339   IX86_BUILTIN_VPHADDUWD,
24340   IX86_BUILTIN_VPHADDUWQ,
24341   IX86_BUILTIN_VPHADDUDQ,
24342   IX86_BUILTIN_VPHSUBBW,
24343   IX86_BUILTIN_VPHSUBWD,
24344   IX86_BUILTIN_VPHSUBDQ,
24345
24346   IX86_BUILTIN_VPROTB,
24347   IX86_BUILTIN_VPROTW,
24348   IX86_BUILTIN_VPROTD,
24349   IX86_BUILTIN_VPROTQ,
24350   IX86_BUILTIN_VPROTB_IMM,
24351   IX86_BUILTIN_VPROTW_IMM,
24352   IX86_BUILTIN_VPROTD_IMM,
24353   IX86_BUILTIN_VPROTQ_IMM,
24354
24355   IX86_BUILTIN_VPSHLB,
24356   IX86_BUILTIN_VPSHLW,
24357   IX86_BUILTIN_VPSHLD,
24358   IX86_BUILTIN_VPSHLQ,
24359   IX86_BUILTIN_VPSHAB,
24360   IX86_BUILTIN_VPSHAW,
24361   IX86_BUILTIN_VPSHAD,
24362   IX86_BUILTIN_VPSHAQ,
24363
24364   IX86_BUILTIN_VFRCZSS,
24365   IX86_BUILTIN_VFRCZSD,
24366   IX86_BUILTIN_VFRCZPS,
24367   IX86_BUILTIN_VFRCZPD,
24368   IX86_BUILTIN_VFRCZPS256,
24369   IX86_BUILTIN_VFRCZPD256,
24370
24371   IX86_BUILTIN_VPCOMEQUB,
24372   IX86_BUILTIN_VPCOMNEUB,
24373   IX86_BUILTIN_VPCOMLTUB,
24374   IX86_BUILTIN_VPCOMLEUB,
24375   IX86_BUILTIN_VPCOMGTUB,
24376   IX86_BUILTIN_VPCOMGEUB,
24377   IX86_BUILTIN_VPCOMFALSEUB,
24378   IX86_BUILTIN_VPCOMTRUEUB,
24379
24380   IX86_BUILTIN_VPCOMEQUW,
24381   IX86_BUILTIN_VPCOMNEUW,
24382   IX86_BUILTIN_VPCOMLTUW,
24383   IX86_BUILTIN_VPCOMLEUW,
24384   IX86_BUILTIN_VPCOMGTUW,
24385   IX86_BUILTIN_VPCOMGEUW,
24386   IX86_BUILTIN_VPCOMFALSEUW,
24387   IX86_BUILTIN_VPCOMTRUEUW,
24388
24389   IX86_BUILTIN_VPCOMEQUD,
24390   IX86_BUILTIN_VPCOMNEUD,
24391   IX86_BUILTIN_VPCOMLTUD,
24392   IX86_BUILTIN_VPCOMLEUD,
24393   IX86_BUILTIN_VPCOMGTUD,
24394   IX86_BUILTIN_VPCOMGEUD,
24395   IX86_BUILTIN_VPCOMFALSEUD,
24396   IX86_BUILTIN_VPCOMTRUEUD,
24397
24398   IX86_BUILTIN_VPCOMEQUQ,
24399   IX86_BUILTIN_VPCOMNEUQ,
24400   IX86_BUILTIN_VPCOMLTUQ,
24401   IX86_BUILTIN_VPCOMLEUQ,
24402   IX86_BUILTIN_VPCOMGTUQ,
24403   IX86_BUILTIN_VPCOMGEUQ,
24404   IX86_BUILTIN_VPCOMFALSEUQ,
24405   IX86_BUILTIN_VPCOMTRUEUQ,
24406
24407   IX86_BUILTIN_VPCOMEQB,
24408   IX86_BUILTIN_VPCOMNEB,
24409   IX86_BUILTIN_VPCOMLTB,
24410   IX86_BUILTIN_VPCOMLEB,
24411   IX86_BUILTIN_VPCOMGTB,
24412   IX86_BUILTIN_VPCOMGEB,
24413   IX86_BUILTIN_VPCOMFALSEB,
24414   IX86_BUILTIN_VPCOMTRUEB,
24415
24416   IX86_BUILTIN_VPCOMEQW,
24417   IX86_BUILTIN_VPCOMNEW,
24418   IX86_BUILTIN_VPCOMLTW,
24419   IX86_BUILTIN_VPCOMLEW,
24420   IX86_BUILTIN_VPCOMGTW,
24421   IX86_BUILTIN_VPCOMGEW,
24422   IX86_BUILTIN_VPCOMFALSEW,
24423   IX86_BUILTIN_VPCOMTRUEW,
24424
24425   IX86_BUILTIN_VPCOMEQD,
24426   IX86_BUILTIN_VPCOMNED,
24427   IX86_BUILTIN_VPCOMLTD,
24428   IX86_BUILTIN_VPCOMLED,
24429   IX86_BUILTIN_VPCOMGTD,
24430   IX86_BUILTIN_VPCOMGED,
24431   IX86_BUILTIN_VPCOMFALSED,
24432   IX86_BUILTIN_VPCOMTRUED,
24433
24434   IX86_BUILTIN_VPCOMEQQ,
24435   IX86_BUILTIN_VPCOMNEQ,
24436   IX86_BUILTIN_VPCOMLTQ,
24437   IX86_BUILTIN_VPCOMLEQ,
24438   IX86_BUILTIN_VPCOMGTQ,
24439   IX86_BUILTIN_VPCOMGEQ,
24440   IX86_BUILTIN_VPCOMFALSEQ,
24441   IX86_BUILTIN_VPCOMTRUEQ,
24442
24443   /* LWP instructions.  */
24444   IX86_BUILTIN_LLWPCB,
24445   IX86_BUILTIN_SLWPCB,
24446   IX86_BUILTIN_LWPVAL32,
24447   IX86_BUILTIN_LWPVAL64,
24448   IX86_BUILTIN_LWPINS32,
24449   IX86_BUILTIN_LWPINS64,
24450
24451   IX86_BUILTIN_CLZS,
24452
24453   /* BMI instructions.  */
24454   IX86_BUILTIN_BEXTR32,
24455   IX86_BUILTIN_BEXTR64,
24456   IX86_BUILTIN_CTZS,
24457
24458   /* TBM instructions.  */
24459   IX86_BUILTIN_BEXTRI32,
24460   IX86_BUILTIN_BEXTRI64,
24461
24462
24463   /* FSGSBASE instructions.  */
24464   IX86_BUILTIN_RDFSBASE32,
24465   IX86_BUILTIN_RDFSBASE64,
24466   IX86_BUILTIN_RDGSBASE32,
24467   IX86_BUILTIN_RDGSBASE64,
24468   IX86_BUILTIN_WRFSBASE32,
24469   IX86_BUILTIN_WRFSBASE64,
24470   IX86_BUILTIN_WRGSBASE32,
24471   IX86_BUILTIN_WRGSBASE64,
24472
24473   /* RDRND instructions.  */
24474   IX86_BUILTIN_RDRAND16_STEP,
24475   IX86_BUILTIN_RDRAND32_STEP,
24476   IX86_BUILTIN_RDRAND64_STEP,
24477
24478   /* F16C instructions.  */
24479   IX86_BUILTIN_CVTPH2PS,
24480   IX86_BUILTIN_CVTPH2PS256,
24481   IX86_BUILTIN_CVTPS2PH,
24482   IX86_BUILTIN_CVTPS2PH256,
24483
24484   /* CFString built-in for darwin */
24485   IX86_BUILTIN_CFSTRING,
24486
24487   IX86_BUILTIN_MAX
24488 };
24489
24490 /* Table for the ix86 builtin decls.  */
24491 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
24492
24493 /* Table of all of the builtin functions that are possible with different ISA's
24494    but are waiting to be built until a function is declared to use that
24495    ISA.  */
24496 struct builtin_isa {
24497   const char *name;             /* function name */
24498   enum ix86_builtin_func_type tcode; /* type to use in the declaration */
24499   int isa;                      /* isa_flags this builtin is defined for */
24500   bool const_p;                 /* true if the declaration is constant */
24501   bool set_and_not_built_p;
24502 };
24503
24504 static struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
24505
24506
24507 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
24508    of which isa_flags to use in the ix86_builtins_isa array.  Stores the
24509    function decl in the ix86_builtins array.  Returns the function decl or
24510    NULL_TREE, if the builtin was not added.
24511
24512    If the front end has a special hook for builtin functions, delay adding
24513    builtin functions that aren't in the current ISA until the ISA is changed
24514    with function specific optimization.  Doing so, can save about 300K for the
24515    default compiler.  When the builtin is expanded, check at that time whether
24516    it is valid.
24517
24518    If the front end doesn't have a special hook, record all builtins, even if
24519    it isn't an instruction set in the current ISA in case the user uses
24520    function specific options for a different ISA, so that we don't get scope
24521    errors if a builtin is added in the middle of a function scope.  */
24522
24523 static inline tree
24524 def_builtin (int mask, const char *name, enum ix86_builtin_func_type tcode,
24525              enum ix86_builtins code)
24526 {
24527   tree decl = NULL_TREE;
24528
24529   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
24530     {
24531       ix86_builtins_isa[(int) code].isa = mask;
24532
24533       mask &= ~OPTION_MASK_ISA_64BIT;
24534       if (mask == 0
24535           || (mask & ix86_isa_flags) != 0
24536           || (lang_hooks.builtin_function
24537               == lang_hooks.builtin_function_ext_scope))
24538
24539         {
24540           tree type = ix86_get_builtin_func_type (tcode);
24541           decl = add_builtin_function (name, type, code, BUILT_IN_MD,
24542                                        NULL, NULL_TREE);
24543           ix86_builtins[(int) code] = decl;
24544           ix86_builtins_isa[(int) code].set_and_not_built_p = false;
24545         }
24546       else
24547         {
24548           ix86_builtins[(int) code] = NULL_TREE;
24549           ix86_builtins_isa[(int) code].tcode = tcode;
24550           ix86_builtins_isa[(int) code].name = name;
24551           ix86_builtins_isa[(int) code].const_p = false;
24552           ix86_builtins_isa[(int) code].set_and_not_built_p = true;
24553         }
24554     }
24555
24556   return decl;
24557 }
24558
24559 /* Like def_builtin, but also marks the function decl "const".  */
24560
24561 static inline tree
24562 def_builtin_const (int mask, const char *name,
24563                    enum ix86_builtin_func_type tcode, enum ix86_builtins code)
24564 {
24565   tree decl = def_builtin (mask, name, tcode, code);
24566   if (decl)
24567     TREE_READONLY (decl) = 1;
24568   else
24569     ix86_builtins_isa[(int) code].const_p = true;
24570
24571   return decl;
24572 }
24573
24574 /* Add any new builtin functions for a given ISA that may not have been
24575    declared.  This saves a bit of space compared to adding all of the
24576    declarations to the tree, even if we didn't use them.  */
24577
24578 static void
24579 ix86_add_new_builtins (int isa)
24580 {
24581   int i;
24582
24583   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
24584     {
24585       if ((ix86_builtins_isa[i].isa & isa) != 0
24586           && ix86_builtins_isa[i].set_and_not_built_p)
24587         {
24588           tree decl, type;
24589
24590           /* Don't define the builtin again.  */
24591           ix86_builtins_isa[i].set_and_not_built_p = false;
24592
24593           type = ix86_get_builtin_func_type (ix86_builtins_isa[i].tcode);
24594           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
24595                                                  type, i, BUILT_IN_MD, NULL,
24596                                                  NULL_TREE);
24597
24598           ix86_builtins[i] = decl;
24599           if (ix86_builtins_isa[i].const_p)
24600             TREE_READONLY (decl) = 1;
24601         }
24602     }
24603 }
24604
24605 /* Bits for builtin_description.flag.  */
24606
24607 /* Set when we don't support the comparison natively, and should
24608    swap_comparison in order to support it.  */
24609 #define BUILTIN_DESC_SWAP_OPERANDS      1
24610
24611 struct builtin_description
24612 {
24613   const unsigned int mask;
24614   const enum insn_code icode;
24615   const char *const name;
24616   const enum ix86_builtins code;
24617   const enum rtx_code comparison;
24618   const int flag;
24619 };
24620
24621 static const struct builtin_description bdesc_comi[] =
24622 {
24623   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
24624   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
24625   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
24626   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
24627   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
24628   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
24629   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
24630   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
24631   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
24632   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
24633   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
24634   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
24635   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
24636   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
24637   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
24638   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
24639   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
24640   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
24641   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
24642   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
24643   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
24644   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
24645   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
24646   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
24647 };
24648
24649 static const struct builtin_description bdesc_pcmpestr[] =
24650 {
24651   /* SSE4.2 */
24652   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
24653   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
24654   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
24655   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
24656   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
24657   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
24658   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
24659 };
24660
24661 static const struct builtin_description bdesc_pcmpistr[] =
24662 {
24663   /* SSE4.2 */
24664   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
24665   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
24666   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
24667   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
24668   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
24669   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
24670   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
24671 };
24672
24673 /* Special builtins with variable number of arguments.  */
24674 static const struct builtin_description bdesc_special_args[] =
24675 {
24676   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtsc, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID },
24677   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtscp, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PUNSIGNED },
24678
24679   /* MMX */
24680   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
24681
24682   /* 3DNow! */
24683   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
24684
24685   /* SSE */
24686   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24687   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24688   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
24689
24690   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
24691   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
24692   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
24693   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
24694
24695   /* SSE or 3DNow!A  */
24696   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24697   { 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 },
24698
24699   /* SSE2 */
24700   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24701   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
24702   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24703   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
24704   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24705   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
24706   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
24707   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
24708   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
24709
24710   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
24711   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
24712
24713   /* SSE3 */
24714   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
24715
24716   /* SSE4.1 */
24717   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
24718
24719   /* SSE4A */
24720   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
24721   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
24722
24723   /* AVX */
24724   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
24725   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, "__builtin_ia32_vzeroupper", IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
24726
24727   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4sf, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
24728   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4df, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
24729   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv8sf, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
24730   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v4df, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
24731   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v8sf, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
24732
24733   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
24734   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
24735   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
24736   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
24737   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
24738   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
24739   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
24740
24741   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
24742   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
24743   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
24744
24745   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DI },
24746   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SI },
24747   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DI },
24748   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SI },
24749   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DI_V2DF },
24750   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SI_V4SF },
24751   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DI_V4DF },
24752   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SI_V8SF },
24753
24754   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcb, "__builtin_ia32_llwpcb", IX86_BUILTIN_LLWPCB, UNKNOWN, (int) VOID_FTYPE_PVOID },
24755   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcb, "__builtin_ia32_slwpcb", IX86_BUILTIN_SLWPCB, UNKNOWN, (int) PVOID_FTYPE_VOID },
24756   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL32, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT },
24757   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT },
24758   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS32, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT },
24759   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
24760
24761   /* FSGSBASE */
24762   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasesi, "__builtin_ia32_rdfsbase32", IX86_BUILTIN_RDFSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
24763   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasedi, "__builtin_ia32_rdfsbase64", IX86_BUILTIN_RDFSBASE64, UNKNOWN, (int) UINT64_FTYPE_VOID },
24764   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdgsbasesi, "__builtin_ia32_rdgsbase32", IX86_BUILTIN_RDGSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
24765   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdgsbasedi, "__builtin_ia32_rdgsbase64", IX86_BUILTIN_RDGSBASE64, UNKNOWN, (int) UINT64_FTYPE_VOID },
24766   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrfsbasesi, "__builtin_ia32_wrfsbase32", IX86_BUILTIN_WRFSBASE32, UNKNOWN, (int) VOID_FTYPE_UNSIGNED },
24767   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrfsbasedi, "__builtin_ia32_wrfsbase64", IX86_BUILTIN_WRFSBASE64, UNKNOWN, (int) VOID_FTYPE_UINT64 },
24768   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrgsbasesi, "__builtin_ia32_wrgsbase32", IX86_BUILTIN_WRGSBASE32, UNKNOWN, (int) VOID_FTYPE_UNSIGNED },
24769   { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_wrgsbasedi, "__builtin_ia32_wrgsbase64", IX86_BUILTIN_WRGSBASE64, UNKNOWN, (int) VOID_FTYPE_UINT64 },
24770 };
24771
24772 /* Builtins with variable number of arguments.  */
24773 static const struct builtin_description bdesc_args[] =
24774 {
24775   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT },
24776   { OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64 },
24777   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdpmc, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT },
24778   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
24779   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
24780   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
24781   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrhi3, "__builtin_ia32_rorhi", IX86_BUILTIN_RORHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
24782
24783   /* MMX */
24784   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24785   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24786   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24787   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24788   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24789   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24790
24791   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24792   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24793   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24794   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24795   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24796   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24797   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24798   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24799
24800   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24801   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24802
24803   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24804   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24805   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24806   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24807
24808   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24809   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24810   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24811   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24812   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24813   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24814
24815   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24816   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24817   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
24818   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24819   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
24820   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
24821
24822   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
24823   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
24824   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
24825
24826   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
24827
24828   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24829   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24830   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
24831   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24832   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24833   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
24834
24835   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24836   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24837   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
24838   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24839   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24840   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
24841
24842   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
24843   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
24844   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
24845   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
24846
24847   /* 3DNow! */
24848   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
24849   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
24850   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24851   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24852
24853   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
24854   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24855   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24856   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24857   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24858   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
24859   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24860   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24861   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24862   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24863   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24864   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24865   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24866   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24867   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
24868
24869   /* 3DNow!A */
24870   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
24871   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
24872   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
24873   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
24874   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24875   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
24876
24877   /* SSE */
24878   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
24879   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24880   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24881   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24882   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24883   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
24884   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
24885   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
24886   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
24887   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
24888   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
24889   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
24890
24891   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
24892
24893   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24894   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24895   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24896   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24897   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24898   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24899   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24900   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24901
24902   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
24903   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
24904   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
24905   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24906   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24907   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24908   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
24909   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
24910   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
24911   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24912   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
24913   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24914   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
24915   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
24916   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
24917   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24918   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
24919   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
24920   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
24921   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24922   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
24923   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
24924
24925   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24926   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24927   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24928   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24929
24930   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24931   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24932   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24933   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24934
24935   { OPTION_MASK_ISA_SSE, CODE_FOR_copysignv4sf3,  "__builtin_ia32_copysignps", IX86_BUILTIN_CPYSGNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24936
24937   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24938   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24939   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24940   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_highv4sf, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24941   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_lowv4sf, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
24942
24943   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
24944   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
24945   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
24946
24947   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
24948
24949   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24950   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24951   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
24952
24953   /* SSE MMX or 3Dnow!A */
24954   { 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 },
24955   { 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 },
24956   { 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 },
24957
24958   { 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 },
24959   { 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 },
24960   { 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 },
24961   { 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 },
24962
24963   { 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 },
24964   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
24965
24966   { 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 },
24967
24968   /* SSE2 */
24969   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
24970
24971   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2df", IX86_BUILTIN_VEC_PERM_V2DF, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DI },
24972   { OPTION_MASK_ISA_SSE, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4sf", IX86_BUILTIN_VEC_PERM_V4SF, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SI },
24973   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2di", IX86_BUILTIN_VEC_PERM_V2DI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_V2DI },
24974   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4si", IX86_BUILTIN_VEC_PERM_V4SI, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_V4SI },
24975   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8hi", IX86_BUILTIN_VEC_PERM_V8HI, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_V8HI },
24976   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v16qi", IX86_BUILTIN_VEC_PERM_V16QI, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
24977   { 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 },
24978   { 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 },
24979   { 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 },
24980   { 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 },
24981   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4df", IX86_BUILTIN_VEC_PERM_V4DF, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DI },
24982   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8sf", IX86_BUILTIN_VEC_PERM_V8SF, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SI },
24983
24984   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
24985   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
24986   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
24987   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
24988   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
24989   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtudq2ps, "__builtin_ia32_cvtudq2ps", IX86_BUILTIN_CVTUDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
24990
24991   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
24992   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
24993   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
24994   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
24995   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
24996
24997   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
24998
24999   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
25000   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
25001   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
25002   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
25003
25004   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
25005   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
25006   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
25007
25008   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25009   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25010   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25011   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25012   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25013   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25014   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25015   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25016
25017   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
25018   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
25019   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
25020   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
25021   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
25022   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25023   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
25024   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
25025   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
25026   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
25027   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
25028   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25029   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
25030   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
25031   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
25032   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25033   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
25034   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
25035   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
25036   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
25037
25038   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25039   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25040   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25041   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25042
25043   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25044   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25045   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25046   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25047
25048   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysignv2df3,  "__builtin_ia32_copysignpd", IX86_BUILTIN_CPYSGNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25049
25050   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25051   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2df, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25052   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2df, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25053
25054   { 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 },
25055
25056   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25057   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25058   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25059   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25060   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25061   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25062   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25063   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25064
25065   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25066   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25067   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25068   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25069   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25070   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25071   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25072   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25073
25074   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25075   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
25076
25077   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25078   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25079   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25080   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25081
25082   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25083   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25084
25085   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25086   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25087   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
25088   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25089   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25090   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
25091
25092   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25093   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25094   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25095   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25096
25097   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv16qi, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25098   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv8hi, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
25099   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv4si, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
25100   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2di, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25101   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv16qi, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25102   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv8hi, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25103   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv4si, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25104   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2di, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25105
25106   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
25107   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
25108   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
25109
25110   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25111   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
25112
25113   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
25114   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
25115
25116   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
25117
25118   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
25119   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
25120   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
25121   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
25122
25123   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlv1ti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
25124   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25125   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25126   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
25127   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25128   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25129   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
25130
25131   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrv1ti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
25132   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25133   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25134   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
25135   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25136   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25137   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
25138
25139   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
25140   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
25141   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
25142   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
25143
25144   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
25145   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
25146   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
25147
25148   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
25149
25150   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
25151   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
25152
25153   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
25154
25155   /* SSE2 MMX */
25156   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
25157   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
25158
25159   /* SSE3 */
25160   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
25161   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
25162
25163   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25164   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25165   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25166   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25167   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
25168   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
25169
25170   /* SSSE3 */
25171   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
25172   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
25173   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
25174   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
25175   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
25176   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
25177
25178   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25179   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25180   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25181   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25182   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25183   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25184   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25185   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25186   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25187   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25188   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25189   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25190   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
25191   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
25192   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25193   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25194   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25195   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
25196   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25197   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
25198   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25199   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
25200   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25201   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
25202
25203   /* SSSE3.  */
25204   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT_CONVERT },
25205   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_INT_CONVERT },
25206
25207   /* SSE4.1 */
25208   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25209   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25210   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
25211   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
25212   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25213   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25214   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25215   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
25216   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
25217   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
25218
25219   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
25220   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
25221   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
25222   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
25223   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
25224   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_sign_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
25225   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
25226   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
25227   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
25228   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
25229   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
25230   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
25231   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
25232
25233   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
25234   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25235   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25236   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25237   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25238   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25239   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
25240   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25241   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25242   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
25243   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
25244   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
25245
25246   /* SSE4.1 */
25247   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
25248   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
25249   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25250   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25251
25252   { 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 },
25253   { 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 },
25254   { 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 },
25255   { 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 },
25256
25257   { 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 },
25258   { 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 },
25259   { 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 },
25260   { 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 },
25261
25262   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25263   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25264   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
25265
25266   /* SSE4.2 */
25267   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25268   { 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 },
25269   { 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 },
25270   { 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 },
25271   { 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 },
25272
25273   /* SSE4A */
25274   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
25275   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
25276   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
25277   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25278
25279   /* AES */
25280   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
25281   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
25282
25283   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25284   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25285   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25286   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
25287
25288   /* PCLMUL */
25289   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
25290
25291   /* AVX */
25292   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25293   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25294   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25295   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25296   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25297   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25298   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25299   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25300   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25301   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25302   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25303   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25304   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25305   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25306   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25307   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25308   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25309   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25310   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25311   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25312   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25313   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25314   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25315   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25316   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25317   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25318
25319   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
25320   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
25321   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
25322   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
25323
25324   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25325   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25326   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
25327   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
25328   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25329   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25330   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25331   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vmcmpv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25332   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vmcmpv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25333   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
25334   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
25335   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25336   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25337   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
25338   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
25339   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
25340   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
25341   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
25342   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
25343   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
25344   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
25345   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
25346   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
25347   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
25348   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
25349   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
25350   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
25351   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
25352   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
25353   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
25354   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
25355   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
25356   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
25357   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
25358
25359   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25360   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25361   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
25362
25363   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
25364   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25365   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25366   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25367   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25368
25369   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
25370
25371   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
25372   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
25373
25374   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_floorpd256", IX86_BUILTIN_FLOORPD256, (enum rtx_code) ROUND_FLOOR, (int) V4DF_FTYPE_V4DF_ROUND },
25375   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_ceilpd256", IX86_BUILTIN_CEILPD256, (enum rtx_code) ROUND_CEIL, (int) V4DF_FTYPE_V4DF_ROUND },
25376   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_truncpd256", IX86_BUILTIN_TRUNCPD256, (enum rtx_code) ROUND_TRUNC, (int) V4DF_FTYPE_V4DF_ROUND },
25377   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_rintpd256", IX86_BUILTIN_RINTPD256, (enum rtx_code) ROUND_MXCSR, (int) V4DF_FTYPE_V4DF_ROUND },
25378
25379   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_floorps256", IX86_BUILTIN_FLOORPS256, (enum rtx_code) ROUND_FLOOR, (int) V8SF_FTYPE_V8SF_ROUND },
25380   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_ceilps256", IX86_BUILTIN_CEILPS256, (enum rtx_code) ROUND_CEIL, (int) V8SF_FTYPE_V8SF_ROUND },
25381   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_truncps256", IX86_BUILTIN_TRUNCPS256, (enum rtx_code) ROUND_TRUNC, (int) V8SF_FTYPE_V8SF_ROUND },
25382   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_rintps256", IX86_BUILTIN_RINTPS256, (enum rtx_code) ROUND_MXCSR, (int) V8SF_FTYPE_V8SF_ROUND },
25383
25384   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25385   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25386   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25387   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25388
25389   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
25390   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
25391   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
25392   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v8si, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
25393   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v8sf, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
25394   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_extract_lo_v4df, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
25395
25396   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25397   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25398   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
25399   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25400   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25401   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
25402   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25403   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25404   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
25405   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25406   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25407   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
25408   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25409   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25410   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
25411
25412   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
25413   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
25414
25415   { OPTION_MASK_ISA_AVX, CODE_FOR_copysignv8sf3,  "__builtin_ia32_copysignps256", IX86_BUILTIN_CPYSGNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
25416   { OPTION_MASK_ISA_AVX, CODE_FOR_copysignv4df3,  "__builtin_ia32_copysignpd256", IX86_BUILTIN_CPYSGNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
25417
25418   { OPTION_MASK_ISA_ABM, CODE_FOR_clzhi2_abm,   "__builtin_clzs",   IX86_BUILTIN_CLZS,    UNKNOWN,     (int) UINT16_FTYPE_UINT16 },
25419
25420   /* BMI */
25421   { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_si, "__builtin_ia32_bextr_u32", IX86_BUILTIN_BEXTR32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25422   { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_di, "__builtin_ia32_bextr_u64", IX86_BUILTIN_BEXTR64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25423   { OPTION_MASK_ISA_BMI, CODE_FOR_ctzhi2,       "__builtin_ctzs",           IX86_BUILTIN_CTZS,    UNKNOWN, (int) UINT16_FTYPE_UINT16 },
25424
25425   /* TBM */
25426   { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_si, "__builtin_ia32_bextri_u32", IX86_BUILTIN_BEXTRI32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
25427   { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_di, "__builtin_ia32_bextri_u64", IX86_BUILTIN_BEXTRI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
25428
25429   /* F16C */
25430   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps, "__builtin_ia32_vcvtph2ps", IX86_BUILTIN_CVTPH2PS, UNKNOWN, (int) V4SF_FTYPE_V8HI },
25431   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps256, "__builtin_ia32_vcvtph2ps256", IX86_BUILTIN_CVTPH2PS256, UNKNOWN, (int) V8SF_FTYPE_V8HI },
25432   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtps2ph, "__builtin_ia32_vcvtps2ph", IX86_BUILTIN_CVTPS2PH, UNKNOWN, (int) V8HI_FTYPE_V4SF_INT },
25433   { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtps2ph256, "__builtin_ia32_vcvtps2ph256", IX86_BUILTIN_CVTPS2PH256, UNKNOWN, (int) V8HI_FTYPE_V8SF_INT },
25434 };
25435
25436 /* FMA4 and XOP.  */
25437 #define MULTI_ARG_4_DF2_DI_I    V2DF_FTYPE_V2DF_V2DF_V2DI_INT
25438 #define MULTI_ARG_4_DF2_DI_I1   V4DF_FTYPE_V4DF_V4DF_V4DI_INT
25439 #define MULTI_ARG_4_SF2_SI_I    V4SF_FTYPE_V4SF_V4SF_V4SI_INT
25440 #define MULTI_ARG_4_SF2_SI_I1   V8SF_FTYPE_V8SF_V8SF_V8SI_INT
25441 #define MULTI_ARG_3_SF          V4SF_FTYPE_V4SF_V4SF_V4SF
25442 #define MULTI_ARG_3_DF          V2DF_FTYPE_V2DF_V2DF_V2DF
25443 #define MULTI_ARG_3_SF2         V8SF_FTYPE_V8SF_V8SF_V8SF
25444 #define MULTI_ARG_3_DF2         V4DF_FTYPE_V4DF_V4DF_V4DF
25445 #define MULTI_ARG_3_DI          V2DI_FTYPE_V2DI_V2DI_V2DI
25446 #define MULTI_ARG_3_SI          V4SI_FTYPE_V4SI_V4SI_V4SI
25447 #define MULTI_ARG_3_SI_DI       V4SI_FTYPE_V4SI_V4SI_V2DI
25448 #define MULTI_ARG_3_HI          V8HI_FTYPE_V8HI_V8HI_V8HI
25449 #define MULTI_ARG_3_HI_SI       V8HI_FTYPE_V8HI_V8HI_V4SI
25450 #define MULTI_ARG_3_QI          V16QI_FTYPE_V16QI_V16QI_V16QI
25451 #define MULTI_ARG_3_DI2         V4DI_FTYPE_V4DI_V4DI_V4DI
25452 #define MULTI_ARG_3_SI2         V8SI_FTYPE_V8SI_V8SI_V8SI
25453 #define MULTI_ARG_3_HI2         V16HI_FTYPE_V16HI_V16HI_V16HI
25454 #define MULTI_ARG_3_QI2         V32QI_FTYPE_V32QI_V32QI_V32QI
25455 #define MULTI_ARG_2_SF          V4SF_FTYPE_V4SF_V4SF
25456 #define MULTI_ARG_2_DF          V2DF_FTYPE_V2DF_V2DF
25457 #define MULTI_ARG_2_DI          V2DI_FTYPE_V2DI_V2DI
25458 #define MULTI_ARG_2_SI          V4SI_FTYPE_V4SI_V4SI
25459 #define MULTI_ARG_2_HI          V8HI_FTYPE_V8HI_V8HI
25460 #define MULTI_ARG_2_QI          V16QI_FTYPE_V16QI_V16QI
25461 #define MULTI_ARG_2_DI_IMM      V2DI_FTYPE_V2DI_SI
25462 #define MULTI_ARG_2_SI_IMM      V4SI_FTYPE_V4SI_SI
25463 #define MULTI_ARG_2_HI_IMM      V8HI_FTYPE_V8HI_SI
25464 #define MULTI_ARG_2_QI_IMM      V16QI_FTYPE_V16QI_SI
25465 #define MULTI_ARG_2_DI_CMP      V2DI_FTYPE_V2DI_V2DI_CMP
25466 #define MULTI_ARG_2_SI_CMP      V4SI_FTYPE_V4SI_V4SI_CMP
25467 #define MULTI_ARG_2_HI_CMP      V8HI_FTYPE_V8HI_V8HI_CMP
25468 #define MULTI_ARG_2_QI_CMP      V16QI_FTYPE_V16QI_V16QI_CMP
25469 #define MULTI_ARG_2_SF_TF       V4SF_FTYPE_V4SF_V4SF_TF
25470 #define MULTI_ARG_2_DF_TF       V2DF_FTYPE_V2DF_V2DF_TF
25471 #define MULTI_ARG_2_DI_TF       V2DI_FTYPE_V2DI_V2DI_TF
25472 #define MULTI_ARG_2_SI_TF       V4SI_FTYPE_V4SI_V4SI_TF
25473 #define MULTI_ARG_2_HI_TF       V8HI_FTYPE_V8HI_V8HI_TF
25474 #define MULTI_ARG_2_QI_TF       V16QI_FTYPE_V16QI_V16QI_TF
25475 #define MULTI_ARG_1_SF          V4SF_FTYPE_V4SF
25476 #define MULTI_ARG_1_DF          V2DF_FTYPE_V2DF
25477 #define MULTI_ARG_1_SF2         V8SF_FTYPE_V8SF
25478 #define MULTI_ARG_1_DF2         V4DF_FTYPE_V4DF
25479 #define MULTI_ARG_1_DI          V2DI_FTYPE_V2DI
25480 #define MULTI_ARG_1_SI          V4SI_FTYPE_V4SI
25481 #define MULTI_ARG_1_HI          V8HI_FTYPE_V8HI
25482 #define MULTI_ARG_1_QI          V16QI_FTYPE_V16QI
25483 #define MULTI_ARG_1_SI_DI       V2DI_FTYPE_V4SI
25484 #define MULTI_ARG_1_HI_DI       V2DI_FTYPE_V8HI
25485 #define MULTI_ARG_1_HI_SI       V4SI_FTYPE_V8HI
25486 #define MULTI_ARG_1_QI_DI       V2DI_FTYPE_V16QI
25487 #define MULTI_ARG_1_QI_SI       V4SI_FTYPE_V16QI
25488 #define MULTI_ARG_1_QI_HI       V8HI_FTYPE_V16QI
25489
25490 static const struct builtin_description bdesc_multi_arg[] =
25491 {
25492   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmadd_v4sf,
25493     "__builtin_ia32_vfmaddss", IX86_BUILTIN_VFMADDSS,
25494     UNKNOWN, (int)MULTI_ARG_3_SF },
25495   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmadd_v2df,
25496     "__builtin_ia32_vfmaddsd", IX86_BUILTIN_VFMADDSD,
25497     UNKNOWN, (int)MULTI_ARG_3_DF },
25498
25499   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v4sf,
25500     "__builtin_ia32_vfmaddps", IX86_BUILTIN_VFMADDPS,
25501     UNKNOWN, (int)MULTI_ARG_3_SF },
25502   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v2df,
25503     "__builtin_ia32_vfmaddpd", IX86_BUILTIN_VFMADDPD,
25504     UNKNOWN, (int)MULTI_ARG_3_DF },
25505   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v8sf,
25506     "__builtin_ia32_vfmaddps256", IX86_BUILTIN_VFMADDPS256,
25507     UNKNOWN, (int)MULTI_ARG_3_SF2 },
25508   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmadd_v4df,
25509     "__builtin_ia32_vfmaddpd256", IX86_BUILTIN_VFMADDPD256,
25510     UNKNOWN, (int)MULTI_ARG_3_DF2 },
25511
25512   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v4sf,
25513     "__builtin_ia32_vfmaddsubps", IX86_BUILTIN_VFMADDSUBPS,
25514     UNKNOWN, (int)MULTI_ARG_3_SF },
25515   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v2df,
25516     "__builtin_ia32_vfmaddsubpd", IX86_BUILTIN_VFMADDSUBPD,
25517     UNKNOWN, (int)MULTI_ARG_3_DF },
25518   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v8sf,
25519     "__builtin_ia32_vfmaddsubps256", IX86_BUILTIN_VFMADDSUBPS256,
25520     UNKNOWN, (int)MULTI_ARG_3_SF2 },
25521   { OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_FMA4, CODE_FOR_fmaddsub_v4df,
25522     "__builtin_ia32_vfmaddsubpd256", IX86_BUILTIN_VFMADDSUBPD256,
25523     UNKNOWN, (int)MULTI_ARG_3_DF2 },
25524
25525   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov",      IX86_BUILTIN_VPCMOV,      UNKNOWN,      (int)MULTI_ARG_3_DI },
25526   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov_v2di", IX86_BUILTIN_VPCMOV_V2DI, UNKNOWN,      (int)MULTI_ARG_3_DI },
25527   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4si,        "__builtin_ia32_vpcmov_v4si", IX86_BUILTIN_VPCMOV_V4SI, UNKNOWN,      (int)MULTI_ARG_3_SI },
25528   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8hi,        "__builtin_ia32_vpcmov_v8hi", IX86_BUILTIN_VPCMOV_V8HI, UNKNOWN,      (int)MULTI_ARG_3_HI },
25529   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16qi,       "__builtin_ia32_vpcmov_v16qi",IX86_BUILTIN_VPCMOV_V16QI,UNKNOWN,      (int)MULTI_ARG_3_QI },
25530   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2df,        "__builtin_ia32_vpcmov_v2df", IX86_BUILTIN_VPCMOV_V2DF, UNKNOWN,      (int)MULTI_ARG_3_DF },
25531   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4sf,        "__builtin_ia32_vpcmov_v4sf", IX86_BUILTIN_VPCMOV_V4SF, UNKNOWN,      (int)MULTI_ARG_3_SF },
25532
25533   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov256",       IX86_BUILTIN_VPCMOV256,       UNKNOWN,      (int)MULTI_ARG_3_DI2 },
25534   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov_v4di256",  IX86_BUILTIN_VPCMOV_V4DI256,  UNKNOWN,      (int)MULTI_ARG_3_DI2 },
25535   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8si256,        "__builtin_ia32_vpcmov_v8si256",  IX86_BUILTIN_VPCMOV_V8SI256,  UNKNOWN,      (int)MULTI_ARG_3_SI2 },
25536   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16hi256,       "__builtin_ia32_vpcmov_v16hi256", IX86_BUILTIN_VPCMOV_V16HI256, UNKNOWN,      (int)MULTI_ARG_3_HI2 },
25537   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v32qi256,       "__builtin_ia32_vpcmov_v32qi256", IX86_BUILTIN_VPCMOV_V32QI256, UNKNOWN,      (int)MULTI_ARG_3_QI2 },
25538   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4df256,        "__builtin_ia32_vpcmov_v4df256",  IX86_BUILTIN_VPCMOV_V4DF256,  UNKNOWN,      (int)MULTI_ARG_3_DF2 },
25539   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8sf256,        "__builtin_ia32_vpcmov_v8sf256",  IX86_BUILTIN_VPCMOV_V8SF256,  UNKNOWN,      (int)MULTI_ARG_3_SF2 },
25540
25541   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pperm,             "__builtin_ia32_vpperm",      IX86_BUILTIN_VPPERM,      UNKNOWN,      (int)MULTI_ARG_3_QI },
25542
25543   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssww,          "__builtin_ia32_vpmacssww",   IX86_BUILTIN_VPMACSSWW,   UNKNOWN,      (int)MULTI_ARG_3_HI },
25544   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsww,           "__builtin_ia32_vpmacsww",    IX86_BUILTIN_VPMACSWW,    UNKNOWN,      (int)MULTI_ARG_3_HI },
25545   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsswd,          "__builtin_ia32_vpmacsswd",   IX86_BUILTIN_VPMACSSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25546   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacswd,           "__builtin_ia32_vpmacswd",    IX86_BUILTIN_VPMACSWD,    UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25547   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdd,          "__builtin_ia32_vpmacssdd",   IX86_BUILTIN_VPMACSSDD,   UNKNOWN,      (int)MULTI_ARG_3_SI },
25548   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdd,           "__builtin_ia32_vpmacsdd",    IX86_BUILTIN_VPMACSDD,    UNKNOWN,      (int)MULTI_ARG_3_SI },
25549   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdql,         "__builtin_ia32_vpmacssdql",  IX86_BUILTIN_VPMACSSDQL,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25550   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdqh,         "__builtin_ia32_vpmacssdqh",  IX86_BUILTIN_VPMACSSDQH,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25551   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdql,          "__builtin_ia32_vpmacsdql",   IX86_BUILTIN_VPMACSDQL,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25552   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdqh,          "__builtin_ia32_vpmacsdqh",   IX86_BUILTIN_VPMACSDQH,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
25553   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcsswd,         "__builtin_ia32_vpmadcsswd",  IX86_BUILTIN_VPMADCSSWD,  UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25554   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcswd,          "__builtin_ia32_vpmadcswd",   IX86_BUILTIN_VPMADCSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
25555
25556   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv2di3,        "__builtin_ia32_vprotq",      IX86_BUILTIN_VPROTQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25557   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv4si3,        "__builtin_ia32_vprotd",      IX86_BUILTIN_VPROTD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25558   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv8hi3,        "__builtin_ia32_vprotw",      IX86_BUILTIN_VPROTW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25559   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv16qi3,       "__builtin_ia32_vprotb",      IX86_BUILTIN_VPROTB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25560   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv2di3,         "__builtin_ia32_vprotqi",     IX86_BUILTIN_VPROTQ_IMM,  UNKNOWN,      (int)MULTI_ARG_2_DI_IMM },
25561   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv4si3,         "__builtin_ia32_vprotdi",     IX86_BUILTIN_VPROTD_IMM,  UNKNOWN,      (int)MULTI_ARG_2_SI_IMM },
25562   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv8hi3,         "__builtin_ia32_vprotwi",     IX86_BUILTIN_VPROTW_IMM,  UNKNOWN,      (int)MULTI_ARG_2_HI_IMM },
25563   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv16qi3,        "__builtin_ia32_vprotbi",     IX86_BUILTIN_VPROTB_IMM,  UNKNOWN,      (int)MULTI_ARG_2_QI_IMM },
25564   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv2di3,         "__builtin_ia32_vpshaq",      IX86_BUILTIN_VPSHAQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25565   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv4si3,         "__builtin_ia32_vpshad",      IX86_BUILTIN_VPSHAD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25566   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv8hi3,         "__builtin_ia32_vpshaw",      IX86_BUILTIN_VPSHAW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25567   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv16qi3,        "__builtin_ia32_vpshab",      IX86_BUILTIN_VPSHAB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25568   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv2di3,         "__builtin_ia32_vpshlq",      IX86_BUILTIN_VPSHLQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
25569   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv4si3,         "__builtin_ia32_vpshld",      IX86_BUILTIN_VPSHLD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
25570   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv8hi3,         "__builtin_ia32_vpshlw",      IX86_BUILTIN_VPSHLW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
25571   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv16qi3,        "__builtin_ia32_vpshlb",      IX86_BUILTIN_VPSHLB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
25572
25573   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv4sf2,       "__builtin_ia32_vfrczss",     IX86_BUILTIN_VFRCZSS,     UNKNOWN,      (int)MULTI_ARG_2_SF },
25574   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv2df2,       "__builtin_ia32_vfrczsd",     IX86_BUILTIN_VFRCZSD,     UNKNOWN,      (int)MULTI_ARG_2_DF },
25575   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4sf2,         "__builtin_ia32_vfrczps",     IX86_BUILTIN_VFRCZPS,     UNKNOWN,      (int)MULTI_ARG_1_SF },
25576   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv2df2,         "__builtin_ia32_vfrczpd",     IX86_BUILTIN_VFRCZPD,     UNKNOWN,      (int)MULTI_ARG_1_DF },
25577   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv8sf2,         "__builtin_ia32_vfrczps256",  IX86_BUILTIN_VFRCZPS256,  UNKNOWN,      (int)MULTI_ARG_1_SF2 },
25578   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4df2,         "__builtin_ia32_vfrczpd256",  IX86_BUILTIN_VFRCZPD256,  UNKNOWN,      (int)MULTI_ARG_1_DF2 },
25579
25580   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbw,           "__builtin_ia32_vphaddbw",    IX86_BUILTIN_VPHADDBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25581   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbd,           "__builtin_ia32_vphaddbd",    IX86_BUILTIN_VPHADDBD,    UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
25582   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbq,           "__builtin_ia32_vphaddbq",    IX86_BUILTIN_VPHADDBQ,    UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
25583   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwd,           "__builtin_ia32_vphaddwd",    IX86_BUILTIN_VPHADDWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25584   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwq,           "__builtin_ia32_vphaddwq",    IX86_BUILTIN_VPHADDWQ,    UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
25585   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadddq,           "__builtin_ia32_vphadddq",    IX86_BUILTIN_VPHADDDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25586   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubw,          "__builtin_ia32_vphaddubw",   IX86_BUILTIN_VPHADDUBW,   UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25587   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubd,          "__builtin_ia32_vphaddubd",   IX86_BUILTIN_VPHADDUBD,   UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
25588   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubq,          "__builtin_ia32_vphaddubq",   IX86_BUILTIN_VPHADDUBQ,   UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
25589   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwd,          "__builtin_ia32_vphadduwd",   IX86_BUILTIN_VPHADDUWD,   UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25590   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwq,          "__builtin_ia32_vphadduwq",   IX86_BUILTIN_VPHADDUWQ,   UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
25591   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddudq,          "__builtin_ia32_vphaddudq",   IX86_BUILTIN_VPHADDUDQ,   UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25592   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubbw,           "__builtin_ia32_vphsubbw",    IX86_BUILTIN_VPHSUBBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
25593   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubwd,           "__builtin_ia32_vphsubwd",    IX86_BUILTIN_VPHSUBWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
25594   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubdq,           "__builtin_ia32_vphsubdq",    IX86_BUILTIN_VPHSUBDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
25595
25596   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomeqb",    IX86_BUILTIN_VPCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
25597   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneb",    IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
25598   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneqb",   IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
25599   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomltb",    IX86_BUILTIN_VPCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
25600   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomleb",    IX86_BUILTIN_VPCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
25601   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgtb",    IX86_BUILTIN_VPCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
25602   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgeb",    IX86_BUILTIN_VPCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
25603
25604   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomeqw",    IX86_BUILTIN_VPCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
25605   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomnew",    IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
25606   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomneqw",   IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
25607   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomltw",    IX86_BUILTIN_VPCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
25608   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomlew",    IX86_BUILTIN_VPCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
25609   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgtw",    IX86_BUILTIN_VPCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
25610   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgew",    IX86_BUILTIN_VPCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
25611
25612   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomeqd",    IX86_BUILTIN_VPCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
25613   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomned",    IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
25614   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomneqd",   IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
25615   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomltd",    IX86_BUILTIN_VPCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
25616   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomled",    IX86_BUILTIN_VPCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
25617   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomgtd",    IX86_BUILTIN_VPCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
25618   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomged",    IX86_BUILTIN_VPCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
25619
25620   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomeqq",    IX86_BUILTIN_VPCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
25621   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneq",    IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
25622   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneqq",   IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
25623   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomltq",    IX86_BUILTIN_VPCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
25624   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomleq",    IX86_BUILTIN_VPCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
25625   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgtq",    IX86_BUILTIN_VPCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
25626   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgeq",    IX86_BUILTIN_VPCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
25627
25628   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomequb",   IX86_BUILTIN_VPCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
25629   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomneub",   IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
25630   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomnequb",  IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
25631   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomltub",   IX86_BUILTIN_VPCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
25632   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomleub",   IX86_BUILTIN_VPCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
25633   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgtub",   IX86_BUILTIN_VPCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
25634   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgeub",   IX86_BUILTIN_VPCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
25635
25636   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomequw",   IX86_BUILTIN_VPCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
25637   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomneuw",   IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
25638   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomnequw",  IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
25639   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomltuw",   IX86_BUILTIN_VPCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
25640   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomleuw",   IX86_BUILTIN_VPCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
25641   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgtuw",   IX86_BUILTIN_VPCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
25642   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgeuw",   IX86_BUILTIN_VPCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
25643
25644   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomequd",   IX86_BUILTIN_VPCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
25645   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomneud",   IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
25646   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomnequd",  IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
25647   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomltud",   IX86_BUILTIN_VPCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
25648   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomleud",   IX86_BUILTIN_VPCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
25649   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgtud",   IX86_BUILTIN_VPCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
25650   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgeud",   IX86_BUILTIN_VPCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
25651
25652   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomequq",   IX86_BUILTIN_VPCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
25653   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomneuq",   IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
25654   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomnequq",  IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
25655   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomltuq",   IX86_BUILTIN_VPCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
25656   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomleuq",   IX86_BUILTIN_VPCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
25657   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgtuq",   IX86_BUILTIN_VPCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
25658   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgeuq",   IX86_BUILTIN_VPCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
25659
25660   { 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 },
25661   { 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 },
25662   { 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 },
25663   { 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 },
25664   { 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 },
25665   { 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 },
25666   { 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 },
25667   { 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 },
25668
25669   { 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 },
25670   { 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 },
25671   { 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 },
25672   { 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 },
25673   { 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 },
25674   { 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 },
25675   { 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 },
25676   { 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 },
25677
25678   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v2df3,     "__builtin_ia32_vpermil2pd",  IX86_BUILTIN_VPERMIL2PD, UNKNOWN, (int)MULTI_ARG_4_DF2_DI_I },
25679   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v4sf3,     "__builtin_ia32_vpermil2ps",  IX86_BUILTIN_VPERMIL2PS, UNKNOWN, (int)MULTI_ARG_4_SF2_SI_I },
25680   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v4df3,     "__builtin_ia32_vpermil2pd256", IX86_BUILTIN_VPERMIL2PD256, UNKNOWN, (int)MULTI_ARG_4_DF2_DI_I1 },
25681   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vpermil2v8sf3,     "__builtin_ia32_vpermil2ps256", IX86_BUILTIN_VPERMIL2PS256, UNKNOWN, (int)MULTI_ARG_4_SF2_SI_I1 },
25682
25683 };
25684
25685 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
25686    in the current target ISA to allow the user to compile particular modules
25687    with different target specific options that differ from the command line
25688    options.  */
25689 static void
25690 ix86_init_mmx_sse_builtins (void)
25691 {
25692   const struct builtin_description * d;
25693   enum ix86_builtin_func_type ftype;
25694   size_t i;
25695
25696   /* Add all special builtins with variable number of operands.  */
25697   for (i = 0, d = bdesc_special_args;
25698        i < ARRAY_SIZE (bdesc_special_args);
25699        i++, d++)
25700     {
25701       if (d->name == 0)
25702         continue;
25703
25704       ftype = (enum ix86_builtin_func_type) d->flag;
25705       def_builtin (d->mask, d->name, ftype, d->code);
25706     }
25707
25708   /* Add all builtins with variable number of operands.  */
25709   for (i = 0, d = bdesc_args;
25710        i < ARRAY_SIZE (bdesc_args);
25711        i++, d++)
25712     {
25713       if (d->name == 0)
25714         continue;
25715
25716       ftype = (enum ix86_builtin_func_type) d->flag;
25717       def_builtin_const (d->mask, d->name, ftype, d->code);
25718     }
25719
25720   /* pcmpestr[im] insns.  */
25721   for (i = 0, d = bdesc_pcmpestr;
25722        i < ARRAY_SIZE (bdesc_pcmpestr);
25723        i++, d++)
25724     {
25725       if (d->code == IX86_BUILTIN_PCMPESTRM128)
25726         ftype = V16QI_FTYPE_V16QI_INT_V16QI_INT_INT;
25727       else
25728         ftype = INT_FTYPE_V16QI_INT_V16QI_INT_INT;
25729       def_builtin_const (d->mask, d->name, ftype, d->code);
25730     }
25731
25732   /* pcmpistr[im] insns.  */
25733   for (i = 0, d = bdesc_pcmpistr;
25734        i < ARRAY_SIZE (bdesc_pcmpistr);
25735        i++, d++)
25736     {
25737       if (d->code == IX86_BUILTIN_PCMPISTRM128)
25738         ftype = V16QI_FTYPE_V16QI_V16QI_INT;
25739       else
25740         ftype = INT_FTYPE_V16QI_V16QI_INT;
25741       def_builtin_const (d->mask, d->name, ftype, d->code);
25742     }
25743
25744   /* comi/ucomi insns.  */
25745   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
25746     {
25747       if (d->mask == OPTION_MASK_ISA_SSE2)
25748         ftype = INT_FTYPE_V2DF_V2DF;
25749       else
25750         ftype = INT_FTYPE_V4SF_V4SF;
25751       def_builtin_const (d->mask, d->name, ftype, d->code);
25752     }
25753
25754   /* SSE */
25755   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr",
25756                VOID_FTYPE_UNSIGNED, IX86_BUILTIN_LDMXCSR);
25757   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr",
25758                UNSIGNED_FTYPE_VOID, IX86_BUILTIN_STMXCSR);
25759
25760   /* SSE or 3DNow!A */
25761   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25762                "__builtin_ia32_maskmovq", VOID_FTYPE_V8QI_V8QI_PCHAR,
25763                IX86_BUILTIN_MASKMOVQ);
25764
25765   /* SSE2 */
25766   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu",
25767                VOID_FTYPE_V16QI_V16QI_PCHAR, IX86_BUILTIN_MASKMOVDQU);
25768
25769   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush",
25770                VOID_FTYPE_PCVOID, IX86_BUILTIN_CLFLUSH);
25771   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence",
25772                             VOID_FTYPE_VOID, IX86_BUILTIN_MFENCE);
25773
25774   /* SSE3.  */
25775   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor",
25776                VOID_FTYPE_PCVOID_UNSIGNED_UNSIGNED, IX86_BUILTIN_MONITOR);
25777   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait",
25778                VOID_FTYPE_UNSIGNED_UNSIGNED, IX86_BUILTIN_MWAIT);
25779
25780   /* AES */
25781   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128",
25782                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENC128);
25783   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128",
25784                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENCLAST128);
25785   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128",
25786                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDEC128);
25787   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128",
25788                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDECLAST128);
25789   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128",
25790                      V2DI_FTYPE_V2DI, IX86_BUILTIN_AESIMC128);
25791   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128",
25792                      V2DI_FTYPE_V2DI_INT, IX86_BUILTIN_AESKEYGENASSIST128);
25793
25794   /* PCLMUL */
25795   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128",
25796                      V2DI_FTYPE_V2DI_V2DI_INT, IX86_BUILTIN_PCLMULQDQ128);
25797
25798   /* RDRND */
25799   def_builtin (OPTION_MASK_ISA_RDRND, "__builtin_ia32_rdrand16_step",
25800                INT_FTYPE_PUSHORT, IX86_BUILTIN_RDRAND16_STEP);
25801   def_builtin (OPTION_MASK_ISA_RDRND, "__builtin_ia32_rdrand32_step",
25802                INT_FTYPE_PUNSIGNED, IX86_BUILTIN_RDRAND32_STEP);
25803   def_builtin (OPTION_MASK_ISA_RDRND | OPTION_MASK_ISA_64BIT,
25804                "__builtin_ia32_rdrand64_step", INT_FTYPE_PULONGLONG,
25805                IX86_BUILTIN_RDRAND64_STEP);
25806
25807   /* MMX access to the vec_init patterns.  */
25808   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si",
25809                      V2SI_FTYPE_INT_INT, IX86_BUILTIN_VEC_INIT_V2SI);
25810
25811   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi",
25812                      V4HI_FTYPE_HI_HI_HI_HI,
25813                      IX86_BUILTIN_VEC_INIT_V4HI);
25814
25815   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi",
25816                      V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
25817                      IX86_BUILTIN_VEC_INIT_V8QI);
25818
25819   /* Access to the vec_extract patterns.  */
25820   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df",
25821                      DOUBLE_FTYPE_V2DF_INT, IX86_BUILTIN_VEC_EXT_V2DF);
25822   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di",
25823                      DI_FTYPE_V2DI_INT, IX86_BUILTIN_VEC_EXT_V2DI);
25824   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf",
25825                      FLOAT_FTYPE_V4SF_INT, IX86_BUILTIN_VEC_EXT_V4SF);
25826   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si",
25827                      SI_FTYPE_V4SI_INT, IX86_BUILTIN_VEC_EXT_V4SI);
25828   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi",
25829                      HI_FTYPE_V8HI_INT, IX86_BUILTIN_VEC_EXT_V8HI);
25830
25831   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25832                      "__builtin_ia32_vec_ext_v4hi",
25833                      HI_FTYPE_V4HI_INT, IX86_BUILTIN_VEC_EXT_V4HI);
25834
25835   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si",
25836                      SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
25837
25838   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi",
25839                      QI_FTYPE_V16QI_INT, IX86_BUILTIN_VEC_EXT_V16QI);
25840
25841   /* Access to the vec_set patterns.  */
25842   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT,
25843                      "__builtin_ia32_vec_set_v2di",
25844                      V2DI_FTYPE_V2DI_DI_INT, IX86_BUILTIN_VEC_SET_V2DI);
25845
25846   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf",
25847                      V4SF_FTYPE_V4SF_FLOAT_INT, IX86_BUILTIN_VEC_SET_V4SF);
25848
25849   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si",
25850                      V4SI_FTYPE_V4SI_SI_INT, IX86_BUILTIN_VEC_SET_V4SI);
25851
25852   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi",
25853                      V8HI_FTYPE_V8HI_HI_INT, IX86_BUILTIN_VEC_SET_V8HI);
25854
25855   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
25856                      "__builtin_ia32_vec_set_v4hi",
25857                      V4HI_FTYPE_V4HI_HI_INT, IX86_BUILTIN_VEC_SET_V4HI);
25858
25859   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi",
25860                      V16QI_FTYPE_V16QI_QI_INT, IX86_BUILTIN_VEC_SET_V16QI);
25861
25862   /* Add FMA4 multi-arg argument instructions */
25863   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
25864     {
25865       if (d->name == 0)
25866         continue;
25867
25868       ftype = (enum ix86_builtin_func_type) d->flag;
25869       def_builtin_const (d->mask, d->name, ftype, d->code);
25870     }
25871 }
25872
25873 /* Internal method for ix86_init_builtins.  */
25874
25875 static void
25876 ix86_init_builtins_va_builtins_abi (void)
25877 {
25878   tree ms_va_ref, sysv_va_ref;
25879   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
25880   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
25881   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
25882   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
25883
25884   if (!TARGET_64BIT)
25885     return;
25886   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
25887   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
25888   ms_va_ref = build_reference_type (ms_va_list_type_node);
25889   sysv_va_ref =
25890     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
25891
25892   fnvoid_va_end_ms =
25893     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
25894   fnvoid_va_start_ms =
25895     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
25896   fnvoid_va_end_sysv =
25897     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
25898   fnvoid_va_start_sysv =
25899     build_varargs_function_type_list (void_type_node, sysv_va_ref,
25900                                        NULL_TREE);
25901   fnvoid_va_copy_ms =
25902     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
25903                               NULL_TREE);
25904   fnvoid_va_copy_sysv =
25905     build_function_type_list (void_type_node, sysv_va_ref,
25906                               sysv_va_ref, NULL_TREE);
25907
25908   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
25909                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
25910   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
25911                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
25912   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
25913                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
25914   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
25915                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25916   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
25917                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25918   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
25919                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
25920 }
25921
25922 static void
25923 ix86_init_builtin_types (void)
25924 {
25925   tree float128_type_node, float80_type_node;
25926
25927   /* The __float80 type.  */
25928   float80_type_node = long_double_type_node;
25929   if (TYPE_MODE (float80_type_node) != XFmode)
25930     {
25931       /* The __float80 type.  */
25932       float80_type_node = make_node (REAL_TYPE);
25933
25934       TYPE_PRECISION (float80_type_node) = 80;
25935       layout_type (float80_type_node);
25936     }
25937   lang_hooks.types.register_builtin_type (float80_type_node, "__float80");
25938
25939   /* The __float128 type.  */
25940   float128_type_node = make_node (REAL_TYPE);
25941   TYPE_PRECISION (float128_type_node) = 128;
25942   layout_type (float128_type_node);
25943   lang_hooks.types.register_builtin_type (float128_type_node, "__float128");
25944
25945   /* This macro is built by i386-builtin-types.awk.  */
25946   DEFINE_BUILTIN_PRIMITIVE_TYPES;
25947 }
25948
25949 static void
25950 ix86_init_builtins (void)
25951 {
25952   tree t;
25953
25954   ix86_init_builtin_types ();
25955
25956   /* TFmode support builtins.  */
25957   def_builtin_const (0, "__builtin_infq",
25958                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_INFQ);
25959   def_builtin_const (0, "__builtin_huge_valq",
25960                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_HUGE_VALQ);
25961
25962   /* We will expand them to normal call if SSE2 isn't available since
25963      they are used by libgcc. */
25964   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128);
25965   t = add_builtin_function ("__builtin_fabsq", t, IX86_BUILTIN_FABSQ,
25966                             BUILT_IN_MD, "__fabstf2", NULL_TREE);
25967   TREE_READONLY (t) = 1;
25968   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = t;
25969
25970   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128_FLOAT128);
25971   t = add_builtin_function ("__builtin_copysignq", t, IX86_BUILTIN_COPYSIGNQ,
25972                             BUILT_IN_MD, "__copysigntf3", NULL_TREE);
25973   TREE_READONLY (t) = 1;
25974   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = t;
25975
25976   ix86_init_mmx_sse_builtins ();
25977
25978   if (TARGET_64BIT)
25979     ix86_init_builtins_va_builtins_abi ();
25980
25981 #ifdef SUBTARGET_INIT_BUILTINS
25982   SUBTARGET_INIT_BUILTINS;
25983 #endif
25984 }
25985
25986 /* Return the ix86 builtin for CODE.  */
25987
25988 static tree
25989 ix86_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
25990 {
25991   if (code >= IX86_BUILTIN_MAX)
25992     return error_mark_node;
25993
25994   return ix86_builtins[code];
25995 }
25996
25997 /* Errors in the source file can cause expand_expr to return const0_rtx
25998    where we expect a vector.  To avoid crashing, use one of the vector
25999    clear instructions.  */
26000 static rtx
26001 safe_vector_operand (rtx x, enum machine_mode mode)
26002 {
26003   if (x == const0_rtx)
26004     x = CONST0_RTX (mode);
26005   return x;
26006 }
26007
26008 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
26009
26010 static rtx
26011 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
26012 {
26013   rtx pat;
26014   tree arg0 = CALL_EXPR_ARG (exp, 0);
26015   tree arg1 = CALL_EXPR_ARG (exp, 1);
26016   rtx op0 = expand_normal (arg0);
26017   rtx op1 = expand_normal (arg1);
26018   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26019   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
26020   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
26021
26022   if (VECTOR_MODE_P (mode0))
26023     op0 = safe_vector_operand (op0, mode0);
26024   if (VECTOR_MODE_P (mode1))
26025     op1 = safe_vector_operand (op1, mode1);
26026
26027   if (optimize || !target
26028       || GET_MODE (target) != tmode
26029       || !insn_data[icode].operand[0].predicate (target, tmode))
26030     target = gen_reg_rtx (tmode);
26031
26032   if (GET_MODE (op1) == SImode && mode1 == TImode)
26033     {
26034       rtx x = gen_reg_rtx (V4SImode);
26035       emit_insn (gen_sse2_loadd (x, op1));
26036       op1 = gen_lowpart (TImode, x);
26037     }
26038
26039   if (!insn_data[icode].operand[1].predicate (op0, mode0))
26040     op0 = copy_to_mode_reg (mode0, op0);
26041   if (!insn_data[icode].operand[2].predicate (op1, mode1))
26042     op1 = copy_to_mode_reg (mode1, op1);
26043
26044   pat = GEN_FCN (icode) (target, op0, op1);
26045   if (! pat)
26046     return 0;
26047
26048   emit_insn (pat);
26049
26050   return target;
26051 }
26052
26053 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
26054
26055 static rtx
26056 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
26057                                enum ix86_builtin_func_type m_type,
26058                                enum rtx_code sub_code)
26059 {
26060   rtx pat;
26061   int i;
26062   int nargs;
26063   bool comparison_p = false;
26064   bool tf_p = false;
26065   bool last_arg_constant = false;
26066   int num_memory = 0;
26067   struct {
26068     rtx op;
26069     enum machine_mode mode;
26070   } args[4];
26071
26072   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26073
26074   switch (m_type)
26075     {
26076     case MULTI_ARG_4_DF2_DI_I:
26077     case MULTI_ARG_4_DF2_DI_I1:
26078     case MULTI_ARG_4_SF2_SI_I:
26079     case MULTI_ARG_4_SF2_SI_I1:
26080       nargs = 4;
26081       last_arg_constant = true;
26082       break;
26083
26084     case MULTI_ARG_3_SF:
26085     case MULTI_ARG_3_DF:
26086     case MULTI_ARG_3_SF2:
26087     case MULTI_ARG_3_DF2:
26088     case MULTI_ARG_3_DI:
26089     case MULTI_ARG_3_SI:
26090     case MULTI_ARG_3_SI_DI:
26091     case MULTI_ARG_3_HI:
26092     case MULTI_ARG_3_HI_SI:
26093     case MULTI_ARG_3_QI:
26094     case MULTI_ARG_3_DI2:
26095     case MULTI_ARG_3_SI2:
26096     case MULTI_ARG_3_HI2:
26097     case MULTI_ARG_3_QI2:
26098       nargs = 3;
26099       break;
26100
26101     case MULTI_ARG_2_SF:
26102     case MULTI_ARG_2_DF:
26103     case MULTI_ARG_2_DI:
26104     case MULTI_ARG_2_SI:
26105     case MULTI_ARG_2_HI:
26106     case MULTI_ARG_2_QI:
26107       nargs = 2;
26108       break;
26109
26110     case MULTI_ARG_2_DI_IMM:
26111     case MULTI_ARG_2_SI_IMM:
26112     case MULTI_ARG_2_HI_IMM:
26113     case MULTI_ARG_2_QI_IMM:
26114       nargs = 2;
26115       last_arg_constant = true;
26116       break;
26117
26118     case MULTI_ARG_1_SF:
26119     case MULTI_ARG_1_DF:
26120     case MULTI_ARG_1_SF2:
26121     case MULTI_ARG_1_DF2:
26122     case MULTI_ARG_1_DI:
26123     case MULTI_ARG_1_SI:
26124     case MULTI_ARG_1_HI:
26125     case MULTI_ARG_1_QI:
26126     case MULTI_ARG_1_SI_DI:
26127     case MULTI_ARG_1_HI_DI:
26128     case MULTI_ARG_1_HI_SI:
26129     case MULTI_ARG_1_QI_DI:
26130     case MULTI_ARG_1_QI_SI:
26131     case MULTI_ARG_1_QI_HI:
26132       nargs = 1;
26133       break;
26134
26135     case MULTI_ARG_2_DI_CMP:
26136     case MULTI_ARG_2_SI_CMP:
26137     case MULTI_ARG_2_HI_CMP:
26138     case MULTI_ARG_2_QI_CMP:
26139       nargs = 2;
26140       comparison_p = true;
26141       break;
26142
26143     case MULTI_ARG_2_SF_TF:
26144     case MULTI_ARG_2_DF_TF:
26145     case MULTI_ARG_2_DI_TF:
26146     case MULTI_ARG_2_SI_TF:
26147     case MULTI_ARG_2_HI_TF:
26148     case MULTI_ARG_2_QI_TF:
26149       nargs = 2;
26150       tf_p = true;
26151       break;
26152
26153     default:
26154       gcc_unreachable ();
26155     }
26156
26157   if (optimize || !target
26158       || GET_MODE (target) != tmode
26159       || !insn_data[icode].operand[0].predicate (target, tmode))
26160     target = gen_reg_rtx (tmode);
26161
26162   gcc_assert (nargs <= 4);
26163
26164   for (i = 0; i < nargs; i++)
26165     {
26166       tree arg = CALL_EXPR_ARG (exp, i);
26167       rtx op = expand_normal (arg);
26168       int adjust = (comparison_p) ? 1 : 0;
26169       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
26170
26171       if (last_arg_constant && i == nargs-1)
26172         {
26173           if (!CONST_INT_P (op))
26174             {
26175               error ("last argument must be an immediate");
26176               return gen_reg_rtx (tmode);
26177             }
26178         }
26179       else
26180         {
26181           if (VECTOR_MODE_P (mode))
26182             op = safe_vector_operand (op, mode);
26183
26184           /* If we aren't optimizing, only allow one memory operand to be
26185              generated.  */
26186           if (memory_operand (op, mode))
26187             num_memory++;
26188
26189           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
26190
26191           if (optimize
26192               || !insn_data[icode].operand[i+adjust+1].predicate (op, mode)
26193               || num_memory > 1)
26194             op = force_reg (mode, op);
26195         }
26196
26197       args[i].op = op;
26198       args[i].mode = mode;
26199     }
26200
26201   switch (nargs)
26202     {
26203     case 1:
26204       pat = GEN_FCN (icode) (target, args[0].op);
26205       break;
26206
26207     case 2:
26208       if (tf_p)
26209         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
26210                                GEN_INT ((int)sub_code));
26211       else if (! comparison_p)
26212         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
26213       else
26214         {
26215           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
26216                                        args[0].op,
26217                                        args[1].op);
26218
26219           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
26220         }
26221       break;
26222
26223     case 3:
26224       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
26225       break;
26226
26227     case 4:
26228       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op, args[3].op);
26229       break;
26230
26231     default:
26232       gcc_unreachable ();
26233     }
26234
26235   if (! pat)
26236     return 0;
26237
26238   emit_insn (pat);
26239   return target;
26240 }
26241
26242 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
26243    insns with vec_merge.  */
26244
26245 static rtx
26246 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
26247                                     rtx target)
26248 {
26249   rtx pat;
26250   tree arg0 = CALL_EXPR_ARG (exp, 0);
26251   rtx op1, op0 = expand_normal (arg0);
26252   enum machine_mode tmode = insn_data[icode].operand[0].mode;
26253   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
26254
26255   if (optimize || !target
26256       || GET_MODE (target) != tmode
26257       || !insn_data[icode].operand[0].predicate (target, tmode))
26258     target = gen_reg_rtx (tmode);
26259
26260   if (VECTOR_MODE_P (mode0))
26261     op0 = safe_vector_operand (op0, mode0);
26262
26263   if ((optimize && !register_operand (op0, mode0))
26264       || !insn_data[icode].operand[1].predicate (op0, mode0))
26265     op0 = copy_to_mode_reg (mode0, op0);
26266
26267   op1 = op0;
26268   if (!insn_data[icode].operand[2].predicate (op1, mode0))
26269     op1 = copy_to_mode_reg (mode0, op1);
26270
26271   pat = GEN_FCN (icode) (target, op0, op1);
26272   if (! pat)
26273     return 0;
26274   emit_insn (pat);
26275   return target;
26276 }
26277
26278 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
26279
26280 static rtx
26281 ix86_expand_sse_compare (const struct builtin_description *d,
26282                          tree exp, rtx target, bool swap)
26283 {
26284   rtx pat;
26285   tree arg0 = CALL_EXPR_ARG (exp, 0);
26286   tree arg1 = CALL_EXPR_ARG (exp, 1);
26287   rtx op0 = expand_normal (arg0);
26288   rtx op1 = expand_normal (arg1);
26289   rtx op2;
26290   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
26291   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
26292   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
26293   enum rtx_code comparison = d->comparison;
26294
26295   if (VECTOR_MODE_P (mode0))
26296     op0 = safe_vector_operand (op0, mode0);
26297   if (VECTOR_MODE_P (mode1))
26298     op1 = safe_vector_operand (op1, mode1);
26299
26300   /* Swap operands if we have a comparison that isn't available in
26301      hardware.  */
26302   if (swap)
26303     {
26304       rtx tmp = gen_reg_rtx (mode1);
26305       emit_move_insn (tmp, op1);
26306       op1 = op0;
26307       op0 = tmp;
26308     }
26309
26310   if (optimize || !target
26311       || GET_MODE (target) != tmode
26312       || !insn_data[d->icode].operand[0].predicate (target, tmode))
26313     target = gen_reg_rtx (tmode);
26314
26315   if ((optimize && !register_operand (op0, mode0))
26316       || !insn_data[d->icode].operand[1].predicate (op0, mode0))
26317     op0 = copy_to_mode_reg (mode0, op0);
26318   if ((optimize && !register_operand (op1, mode1))
26319       || !insn_data[d->icode].operand[2].predicate (op1, mode1))
26320     op1 = copy_to_mode_reg (mode1, op1);
26321
26322   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
26323   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
26324   if (! pat)
26325     return 0;
26326   emit_insn (pat);
26327   return target;
26328 }
26329
26330 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
26331
26332 static rtx
26333 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
26334                       rtx target)
26335 {
26336   rtx pat;
26337   tree arg0 = CALL_EXPR_ARG (exp, 0);
26338   tree arg1 = CALL_EXPR_ARG (exp, 1);
26339   rtx op0 = expand_normal (arg0);
26340   rtx op1 = expand_normal (arg1);
26341   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
26342   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
26343   enum rtx_code comparison = d->comparison;
26344
26345   if (VECTOR_MODE_P (mode0))
26346     op0 = safe_vector_operand (op0, mode0);
26347   if (VECTOR_MODE_P (mode1))
26348     op1 = safe_vector_operand (op1, mode1);
26349
26350   /* Swap operands if we have a comparison that isn't available in
26351      hardware.  */
26352   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
26353     {
26354       rtx tmp = op1;
26355       op1 = op0;
26356       op0 = tmp;
26357     }
26358
26359   target = gen_reg_rtx (SImode);
26360   emit_move_insn (target, const0_rtx);
26361   target = gen_rtx_SUBREG (QImode, target, 0);
26362
26363   if ((optimize && !register_operand (op0, mode0))
26364       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26365     op0 = copy_to_mode_reg (mode0, op0);
26366   if ((optimize && !register_operand (op1, mode1))
26367       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
26368     op1 = copy_to_mode_reg (mode1, op1);
26369
26370   pat = GEN_FCN (d->icode) (op0, op1);
26371   if (! pat)
26372     return 0;
26373   emit_insn (pat);
26374   emit_insn (gen_rtx_SET (VOIDmode,
26375                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26376                           gen_rtx_fmt_ee (comparison, QImode,
26377                                           SET_DEST (pat),
26378                                           const0_rtx)));
26379
26380   return SUBREG_REG (target);
26381 }
26382
26383 /* Subroutine of ix86_expand_args_builtin to take care of round insns.  */
26384
26385 static rtx
26386 ix86_expand_sse_round (const struct builtin_description *d, tree exp,
26387                        rtx target)
26388 {
26389   rtx pat;
26390   tree arg0 = CALL_EXPR_ARG (exp, 0);
26391   rtx op1, op0 = expand_normal (arg0);
26392   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
26393   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
26394
26395   if (optimize || target == 0
26396       || GET_MODE (target) != tmode
26397       || !insn_data[d->icode].operand[0].predicate (target, tmode))
26398     target = gen_reg_rtx (tmode);
26399
26400   if (VECTOR_MODE_P (mode0))
26401     op0 = safe_vector_operand (op0, mode0);
26402
26403   if ((optimize && !register_operand (op0, mode0))
26404       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26405     op0 = copy_to_mode_reg (mode0, op0);
26406
26407   op1 = GEN_INT (d->comparison);
26408
26409   pat = GEN_FCN (d->icode) (target, op0, op1);
26410   if (! pat)
26411     return 0;
26412   emit_insn (pat);
26413   return target;
26414 }
26415
26416 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
26417
26418 static rtx
26419 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
26420                        rtx target)
26421 {
26422   rtx pat;
26423   tree arg0 = CALL_EXPR_ARG (exp, 0);
26424   tree arg1 = CALL_EXPR_ARG (exp, 1);
26425   rtx op0 = expand_normal (arg0);
26426   rtx op1 = expand_normal (arg1);
26427   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
26428   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
26429   enum rtx_code comparison = d->comparison;
26430
26431   if (VECTOR_MODE_P (mode0))
26432     op0 = safe_vector_operand (op0, mode0);
26433   if (VECTOR_MODE_P (mode1))
26434     op1 = safe_vector_operand (op1, mode1);
26435
26436   target = gen_reg_rtx (SImode);
26437   emit_move_insn (target, const0_rtx);
26438   target = gen_rtx_SUBREG (QImode, target, 0);
26439
26440   if ((optimize && !register_operand (op0, mode0))
26441       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
26442     op0 = copy_to_mode_reg (mode0, op0);
26443   if ((optimize && !register_operand (op1, mode1))
26444       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
26445     op1 = copy_to_mode_reg (mode1, op1);
26446
26447   pat = GEN_FCN (d->icode) (op0, op1);
26448   if (! pat)
26449     return 0;
26450   emit_insn (pat);
26451   emit_insn (gen_rtx_SET (VOIDmode,
26452                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26453                           gen_rtx_fmt_ee (comparison, QImode,
26454                                           SET_DEST (pat),
26455                                           const0_rtx)));
26456
26457   return SUBREG_REG (target);
26458 }
26459
26460 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
26461
26462 static rtx
26463 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
26464                           tree exp, rtx target)
26465 {
26466   rtx pat;
26467   tree arg0 = CALL_EXPR_ARG (exp, 0);
26468   tree arg1 = CALL_EXPR_ARG (exp, 1);
26469   tree arg2 = CALL_EXPR_ARG (exp, 2);
26470   tree arg3 = CALL_EXPR_ARG (exp, 3);
26471   tree arg4 = CALL_EXPR_ARG (exp, 4);
26472   rtx scratch0, scratch1;
26473   rtx op0 = expand_normal (arg0);
26474   rtx op1 = expand_normal (arg1);
26475   rtx op2 = expand_normal (arg2);
26476   rtx op3 = expand_normal (arg3);
26477   rtx op4 = expand_normal (arg4);
26478   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
26479
26480   tmode0 = insn_data[d->icode].operand[0].mode;
26481   tmode1 = insn_data[d->icode].operand[1].mode;
26482   modev2 = insn_data[d->icode].operand[2].mode;
26483   modei3 = insn_data[d->icode].operand[3].mode;
26484   modev4 = insn_data[d->icode].operand[4].mode;
26485   modei5 = insn_data[d->icode].operand[5].mode;
26486   modeimm = insn_data[d->icode].operand[6].mode;
26487
26488   if (VECTOR_MODE_P (modev2))
26489     op0 = safe_vector_operand (op0, modev2);
26490   if (VECTOR_MODE_P (modev4))
26491     op2 = safe_vector_operand (op2, modev4);
26492
26493   if (!insn_data[d->icode].operand[2].predicate (op0, modev2))
26494     op0 = copy_to_mode_reg (modev2, op0);
26495   if (!insn_data[d->icode].operand[3].predicate (op1, modei3))
26496     op1 = copy_to_mode_reg (modei3, op1);
26497   if ((optimize && !register_operand (op2, modev4))
26498       || !insn_data[d->icode].operand[4].predicate (op2, modev4))
26499     op2 = copy_to_mode_reg (modev4, op2);
26500   if (!insn_data[d->icode].operand[5].predicate (op3, modei5))
26501     op3 = copy_to_mode_reg (modei5, op3);
26502
26503   if (!insn_data[d->icode].operand[6].predicate (op4, modeimm))
26504     {
26505       error ("the fifth argument must be a 8-bit immediate");
26506       return const0_rtx;
26507     }
26508
26509   if (d->code == IX86_BUILTIN_PCMPESTRI128)
26510     {
26511       if (optimize || !target
26512           || GET_MODE (target) != tmode0
26513           || !insn_data[d->icode].operand[0].predicate (target, tmode0))
26514         target = gen_reg_rtx (tmode0);
26515
26516       scratch1 = gen_reg_rtx (tmode1);
26517
26518       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
26519     }
26520   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
26521     {
26522       if (optimize || !target
26523           || GET_MODE (target) != tmode1
26524           || !insn_data[d->icode].operand[1].predicate (target, tmode1))
26525         target = gen_reg_rtx (tmode1);
26526
26527       scratch0 = gen_reg_rtx (tmode0);
26528
26529       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
26530     }
26531   else
26532     {
26533       gcc_assert (d->flag);
26534
26535       scratch0 = gen_reg_rtx (tmode0);
26536       scratch1 = gen_reg_rtx (tmode1);
26537
26538       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
26539     }
26540
26541   if (! pat)
26542     return 0;
26543
26544   emit_insn (pat);
26545
26546   if (d->flag)
26547     {
26548       target = gen_reg_rtx (SImode);
26549       emit_move_insn (target, const0_rtx);
26550       target = gen_rtx_SUBREG (QImode, target, 0);
26551
26552       emit_insn
26553         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26554                       gen_rtx_fmt_ee (EQ, QImode,
26555                                       gen_rtx_REG ((enum machine_mode) d->flag,
26556                                                    FLAGS_REG),
26557                                       const0_rtx)));
26558       return SUBREG_REG (target);
26559     }
26560   else
26561     return target;
26562 }
26563
26564
26565 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
26566
26567 static rtx
26568 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
26569                           tree exp, rtx target)
26570 {
26571   rtx pat;
26572   tree arg0 = CALL_EXPR_ARG (exp, 0);
26573   tree arg1 = CALL_EXPR_ARG (exp, 1);
26574   tree arg2 = CALL_EXPR_ARG (exp, 2);
26575   rtx scratch0, scratch1;
26576   rtx op0 = expand_normal (arg0);
26577   rtx op1 = expand_normal (arg1);
26578   rtx op2 = expand_normal (arg2);
26579   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
26580
26581   tmode0 = insn_data[d->icode].operand[0].mode;
26582   tmode1 = insn_data[d->icode].operand[1].mode;
26583   modev2 = insn_data[d->icode].operand[2].mode;
26584   modev3 = insn_data[d->icode].operand[3].mode;
26585   modeimm = insn_data[d->icode].operand[4].mode;
26586
26587   if (VECTOR_MODE_P (modev2))
26588     op0 = safe_vector_operand (op0, modev2);
26589   if (VECTOR_MODE_P (modev3))
26590     op1 = safe_vector_operand (op1, modev3);
26591
26592   if (!insn_data[d->icode].operand[2].predicate (op0, modev2))
26593     op0 = copy_to_mode_reg (modev2, op0);
26594   if ((optimize && !register_operand (op1, modev3))
26595       || !insn_data[d->icode].operand[3].predicate (op1, modev3))
26596     op1 = copy_to_mode_reg (modev3, op1);
26597
26598   if (!insn_data[d->icode].operand[4].predicate (op2, modeimm))
26599     {
26600       error ("the third argument must be a 8-bit immediate");
26601       return const0_rtx;
26602     }
26603
26604   if (d->code == IX86_BUILTIN_PCMPISTRI128)
26605     {
26606       if (optimize || !target
26607           || GET_MODE (target) != tmode0
26608           || !insn_data[d->icode].operand[0].predicate (target, tmode0))
26609         target = gen_reg_rtx (tmode0);
26610
26611       scratch1 = gen_reg_rtx (tmode1);
26612
26613       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
26614     }
26615   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
26616     {
26617       if (optimize || !target
26618           || GET_MODE (target) != tmode1
26619           || !insn_data[d->icode].operand[1].predicate (target, tmode1))
26620         target = gen_reg_rtx (tmode1);
26621
26622       scratch0 = gen_reg_rtx (tmode0);
26623
26624       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
26625     }
26626   else
26627     {
26628       gcc_assert (d->flag);
26629
26630       scratch0 = gen_reg_rtx (tmode0);
26631       scratch1 = gen_reg_rtx (tmode1);
26632
26633       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
26634     }
26635
26636   if (! pat)
26637     return 0;
26638
26639   emit_insn (pat);
26640
26641   if (d->flag)
26642     {
26643       target = gen_reg_rtx (SImode);
26644       emit_move_insn (target, const0_rtx);
26645       target = gen_rtx_SUBREG (QImode, target, 0);
26646
26647       emit_insn
26648         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
26649                       gen_rtx_fmt_ee (EQ, QImode,
26650                                       gen_rtx_REG ((enum machine_mode) d->flag,
26651                                                    FLAGS_REG),
26652                                       const0_rtx)));
26653       return SUBREG_REG (target);
26654     }
26655   else
26656     return target;
26657 }
26658
26659 /* Subroutine of ix86_expand_builtin to take care of insns with
26660    variable number of operands.  */
26661
26662 static rtx
26663 ix86_expand_args_builtin (const struct builtin_description *d,
26664                           tree exp, rtx target)
26665 {
26666   rtx pat, real_target;
26667   unsigned int i, nargs;
26668   unsigned int nargs_constant = 0;
26669   int num_memory = 0;
26670   struct
26671     {
26672       rtx op;
26673       enum machine_mode mode;
26674     } args[4];
26675   bool last_arg_count = false;
26676   enum insn_code icode = d->icode;
26677   const struct insn_data_d *insn_p = &insn_data[icode];
26678   enum machine_mode tmode = insn_p->operand[0].mode;
26679   enum machine_mode rmode = VOIDmode;
26680   bool swap = false;
26681   enum rtx_code comparison = d->comparison;
26682
26683   switch ((enum ix86_builtin_func_type) d->flag)
26684     {
26685     case V2DF_FTYPE_V2DF_ROUND:
26686     case V4DF_FTYPE_V4DF_ROUND:
26687     case V4SF_FTYPE_V4SF_ROUND:
26688     case V8SF_FTYPE_V8SF_ROUND:
26689       return ix86_expand_sse_round (d, exp, target);
26690     case INT_FTYPE_V8SF_V8SF_PTEST:
26691     case INT_FTYPE_V4DI_V4DI_PTEST:
26692     case INT_FTYPE_V4DF_V4DF_PTEST:
26693     case INT_FTYPE_V4SF_V4SF_PTEST:
26694     case INT_FTYPE_V2DI_V2DI_PTEST:
26695     case INT_FTYPE_V2DF_V2DF_PTEST:
26696       return ix86_expand_sse_ptest (d, exp, target);
26697     case FLOAT128_FTYPE_FLOAT128:
26698     case FLOAT_FTYPE_FLOAT:
26699     case INT_FTYPE_INT:
26700     case UINT64_FTYPE_INT:
26701     case UINT16_FTYPE_UINT16:
26702     case INT64_FTYPE_INT64:
26703     case INT64_FTYPE_V4SF:
26704     case INT64_FTYPE_V2DF:
26705     case INT_FTYPE_V16QI:
26706     case INT_FTYPE_V8QI:
26707     case INT_FTYPE_V8SF:
26708     case INT_FTYPE_V4DF:
26709     case INT_FTYPE_V4SF:
26710     case INT_FTYPE_V2DF:
26711     case V16QI_FTYPE_V16QI:
26712     case V8SI_FTYPE_V8SF:
26713     case V8SI_FTYPE_V4SI:
26714     case V8HI_FTYPE_V8HI:
26715     case V8HI_FTYPE_V16QI:
26716     case V8QI_FTYPE_V8QI:
26717     case V8SF_FTYPE_V8SF:
26718     case V8SF_FTYPE_V8SI:
26719     case V8SF_FTYPE_V4SF:
26720     case V8SF_FTYPE_V8HI:
26721     case V4SI_FTYPE_V4SI:
26722     case V4SI_FTYPE_V16QI:
26723     case V4SI_FTYPE_V4SF:
26724     case V4SI_FTYPE_V8SI:
26725     case V4SI_FTYPE_V8HI:
26726     case V4SI_FTYPE_V4DF:
26727     case V4SI_FTYPE_V2DF:
26728     case V4HI_FTYPE_V4HI:
26729     case V4DF_FTYPE_V4DF:
26730     case V4DF_FTYPE_V4SI:
26731     case V4DF_FTYPE_V4SF:
26732     case V4DF_FTYPE_V2DF:
26733     case V4SF_FTYPE_V4SF:
26734     case V4SF_FTYPE_V4SI:
26735     case V4SF_FTYPE_V8SF:
26736     case V4SF_FTYPE_V4DF:
26737     case V4SF_FTYPE_V8HI:
26738     case V4SF_FTYPE_V2DF:
26739     case V2DI_FTYPE_V2DI:
26740     case V2DI_FTYPE_V16QI:
26741     case V2DI_FTYPE_V8HI:
26742     case V2DI_FTYPE_V4SI:
26743     case V2DF_FTYPE_V2DF:
26744     case V2DF_FTYPE_V4SI:
26745     case V2DF_FTYPE_V4DF:
26746     case V2DF_FTYPE_V4SF:
26747     case V2DF_FTYPE_V2SI:
26748     case V2SI_FTYPE_V2SI:
26749     case V2SI_FTYPE_V4SF:
26750     case V2SI_FTYPE_V2SF:
26751     case V2SI_FTYPE_V2DF:
26752     case V2SF_FTYPE_V2SF:
26753     case V2SF_FTYPE_V2SI:
26754       nargs = 1;
26755       break;
26756     case V4SF_FTYPE_V4SF_VEC_MERGE:
26757     case V2DF_FTYPE_V2DF_VEC_MERGE:
26758       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
26759     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
26760     case V16QI_FTYPE_V16QI_V16QI:
26761     case V16QI_FTYPE_V8HI_V8HI:
26762     case V8QI_FTYPE_V8QI_V8QI:
26763     case V8QI_FTYPE_V4HI_V4HI:
26764     case V8HI_FTYPE_V8HI_V8HI:
26765     case V8HI_FTYPE_V16QI_V16QI:
26766     case V8HI_FTYPE_V4SI_V4SI:
26767     case V8SF_FTYPE_V8SF_V8SF:
26768     case V8SF_FTYPE_V8SF_V8SI:
26769     case V4SI_FTYPE_V4SI_V4SI:
26770     case V4SI_FTYPE_V8HI_V8HI:
26771     case V4SI_FTYPE_V4SF_V4SF:
26772     case V4SI_FTYPE_V2DF_V2DF:
26773     case V4HI_FTYPE_V4HI_V4HI:
26774     case V4HI_FTYPE_V8QI_V8QI:
26775     case V4HI_FTYPE_V2SI_V2SI:
26776     case V4DF_FTYPE_V4DF_V4DF:
26777     case V4DF_FTYPE_V4DF_V4DI:
26778     case V4SF_FTYPE_V4SF_V4SF:
26779     case V4SF_FTYPE_V4SF_V4SI:
26780     case V4SF_FTYPE_V4SF_V2SI:
26781     case V4SF_FTYPE_V4SF_V2DF:
26782     case V4SF_FTYPE_V4SF_DI:
26783     case V4SF_FTYPE_V4SF_SI:
26784     case V2DI_FTYPE_V2DI_V2DI:
26785     case V2DI_FTYPE_V16QI_V16QI:
26786     case V2DI_FTYPE_V4SI_V4SI:
26787     case V2DI_FTYPE_V2DI_V16QI:
26788     case V2DI_FTYPE_V2DF_V2DF:
26789     case V2SI_FTYPE_V2SI_V2SI:
26790     case V2SI_FTYPE_V4HI_V4HI:
26791     case V2SI_FTYPE_V2SF_V2SF:
26792     case V2DF_FTYPE_V2DF_V2DF:
26793     case V2DF_FTYPE_V2DF_V4SF:
26794     case V2DF_FTYPE_V2DF_V2DI:
26795     case V2DF_FTYPE_V2DF_DI:
26796     case V2DF_FTYPE_V2DF_SI:
26797     case V2SF_FTYPE_V2SF_V2SF:
26798     case V1DI_FTYPE_V1DI_V1DI:
26799     case V1DI_FTYPE_V8QI_V8QI:
26800     case V1DI_FTYPE_V2SI_V2SI:
26801       if (comparison == UNKNOWN)
26802         return ix86_expand_binop_builtin (icode, exp, target);
26803       nargs = 2;
26804       break;
26805     case V4SF_FTYPE_V4SF_V4SF_SWAP:
26806     case V2DF_FTYPE_V2DF_V2DF_SWAP:
26807       gcc_assert (comparison != UNKNOWN);
26808       nargs = 2;
26809       swap = true;
26810       break;
26811     case V8HI_FTYPE_V8HI_V8HI_COUNT:
26812     case V8HI_FTYPE_V8HI_SI_COUNT:
26813     case V4SI_FTYPE_V4SI_V4SI_COUNT:
26814     case V4SI_FTYPE_V4SI_SI_COUNT:
26815     case V4HI_FTYPE_V4HI_V4HI_COUNT:
26816     case V4HI_FTYPE_V4HI_SI_COUNT:
26817     case V2DI_FTYPE_V2DI_V2DI_COUNT:
26818     case V2DI_FTYPE_V2DI_SI_COUNT:
26819     case V2SI_FTYPE_V2SI_V2SI_COUNT:
26820     case V2SI_FTYPE_V2SI_SI_COUNT:
26821     case V1DI_FTYPE_V1DI_V1DI_COUNT:
26822     case V1DI_FTYPE_V1DI_SI_COUNT:
26823       nargs = 2;
26824       last_arg_count = true;
26825       break;
26826     case UINT64_FTYPE_UINT64_UINT64:
26827     case UINT_FTYPE_UINT_UINT:
26828     case UINT_FTYPE_UINT_USHORT:
26829     case UINT_FTYPE_UINT_UCHAR:
26830     case UINT16_FTYPE_UINT16_INT:
26831     case UINT8_FTYPE_UINT8_INT:
26832       nargs = 2;
26833       break;
26834     case V2DI_FTYPE_V2DI_INT_CONVERT:
26835       nargs = 2;
26836       rmode = V1TImode;
26837       nargs_constant = 1;
26838       break;
26839     case V8HI_FTYPE_V8HI_INT:
26840     case V8HI_FTYPE_V8SF_INT:
26841     case V8HI_FTYPE_V4SF_INT:
26842     case V8SF_FTYPE_V8SF_INT:
26843     case V4SI_FTYPE_V4SI_INT:
26844     case V4SI_FTYPE_V8SI_INT:
26845     case V4HI_FTYPE_V4HI_INT:
26846     case V4DF_FTYPE_V4DF_INT:
26847     case V4SF_FTYPE_V4SF_INT:
26848     case V4SF_FTYPE_V8SF_INT:
26849     case V2DI_FTYPE_V2DI_INT:
26850     case V2DF_FTYPE_V2DF_INT:
26851     case V2DF_FTYPE_V4DF_INT:
26852       nargs = 2;
26853       nargs_constant = 1;
26854       break;
26855     case V16QI_FTYPE_V16QI_V16QI_V16QI:
26856     case V8SF_FTYPE_V8SF_V8SF_V8SF:
26857     case V4DF_FTYPE_V4DF_V4DF_V4DF:
26858     case V4SF_FTYPE_V4SF_V4SF_V4SF:
26859     case V2DF_FTYPE_V2DF_V2DF_V2DF:
26860       nargs = 3;
26861       break;
26862     case V16QI_FTYPE_V16QI_V16QI_INT:
26863     case V8HI_FTYPE_V8HI_V8HI_INT:
26864     case V8SI_FTYPE_V8SI_V8SI_INT:
26865     case V8SI_FTYPE_V8SI_V4SI_INT:
26866     case V8SF_FTYPE_V8SF_V8SF_INT:
26867     case V8SF_FTYPE_V8SF_V4SF_INT:
26868     case V4SI_FTYPE_V4SI_V4SI_INT:
26869     case V4DF_FTYPE_V4DF_V4DF_INT:
26870     case V4DF_FTYPE_V4DF_V2DF_INT:
26871     case V4SF_FTYPE_V4SF_V4SF_INT:
26872     case V2DI_FTYPE_V2DI_V2DI_INT:
26873     case V2DF_FTYPE_V2DF_V2DF_INT:
26874       nargs = 3;
26875       nargs_constant = 1;
26876       break;
26877     case V2DI_FTYPE_V2DI_V2DI_INT_CONVERT:
26878       nargs = 3;
26879       rmode = V2DImode;
26880       nargs_constant = 1;
26881       break;
26882     case V1DI_FTYPE_V1DI_V1DI_INT_CONVERT:
26883       nargs = 3;
26884       rmode = DImode;
26885       nargs_constant = 1;
26886       break;
26887     case V2DI_FTYPE_V2DI_UINT_UINT:
26888       nargs = 3;
26889       nargs_constant = 2;
26890       break;
26891     case V2DF_FTYPE_V2DF_V2DF_V2DI_INT:
26892     case V4DF_FTYPE_V4DF_V4DF_V4DI_INT:
26893     case V4SF_FTYPE_V4SF_V4SF_V4SI_INT:
26894     case V8SF_FTYPE_V8SF_V8SF_V8SI_INT:
26895       nargs = 4;
26896       nargs_constant = 1;
26897       break;
26898     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
26899       nargs = 4;
26900       nargs_constant = 2;
26901       break;
26902     default:
26903       gcc_unreachable ();
26904     }
26905
26906   gcc_assert (nargs <= ARRAY_SIZE (args));
26907
26908   if (comparison != UNKNOWN)
26909     {
26910       gcc_assert (nargs == 2);
26911       return ix86_expand_sse_compare (d, exp, target, swap);
26912     }
26913
26914   if (rmode == VOIDmode || rmode == tmode)
26915     {
26916       if (optimize
26917           || target == 0
26918           || GET_MODE (target) != tmode
26919           || !insn_p->operand[0].predicate (target, tmode))
26920         target = gen_reg_rtx (tmode);
26921       real_target = target;
26922     }
26923   else
26924     {
26925       target = gen_reg_rtx (rmode);
26926       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
26927     }
26928
26929   for (i = 0; i < nargs; i++)
26930     {
26931       tree arg = CALL_EXPR_ARG (exp, i);
26932       rtx op = expand_normal (arg);
26933       enum machine_mode mode = insn_p->operand[i + 1].mode;
26934       bool match = insn_p->operand[i + 1].predicate (op, mode);
26935
26936       if (last_arg_count && (i + 1) == nargs)
26937         {
26938           /* SIMD shift insns take either an 8-bit immediate or
26939              register as count.  But builtin functions take int as
26940              count.  If count doesn't match, we put it in register.  */
26941           if (!match)
26942             {
26943               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
26944               if (!insn_p->operand[i + 1].predicate (op, mode))
26945                 op = copy_to_reg (op);
26946             }
26947         }
26948       else if ((nargs - i) <= nargs_constant)
26949         {
26950           if (!match)
26951             switch (icode)
26952               {
26953               case CODE_FOR_sse4_1_roundpd:
26954               case CODE_FOR_sse4_1_roundps:
26955               case CODE_FOR_sse4_1_roundsd:
26956               case CODE_FOR_sse4_1_roundss:
26957               case CODE_FOR_sse4_1_blendps:
26958               case CODE_FOR_avx_blendpd256:
26959               case CODE_FOR_avx_vpermilv4df:
26960               case CODE_FOR_avx_roundpd256:
26961               case CODE_FOR_avx_roundps256:
26962                 error ("the last argument must be a 4-bit immediate");
26963                 return const0_rtx;
26964
26965               case CODE_FOR_sse4_1_blendpd:
26966               case CODE_FOR_avx_vpermilv2df:
26967               case CODE_FOR_xop_vpermil2v2df3:
26968               case CODE_FOR_xop_vpermil2v4sf3:
26969               case CODE_FOR_xop_vpermil2v4df3:
26970               case CODE_FOR_xop_vpermil2v8sf3:
26971                 error ("the last argument must be a 2-bit immediate");
26972                 return const0_rtx;
26973
26974               case CODE_FOR_avx_vextractf128v4df:
26975               case CODE_FOR_avx_vextractf128v8sf:
26976               case CODE_FOR_avx_vextractf128v8si:
26977               case CODE_FOR_avx_vinsertf128v4df:
26978               case CODE_FOR_avx_vinsertf128v8sf:
26979               case CODE_FOR_avx_vinsertf128v8si:
26980                 error ("the last argument must be a 1-bit immediate");
26981                 return const0_rtx;
26982
26983               case CODE_FOR_avx_vmcmpv2df3:
26984               case CODE_FOR_avx_vmcmpv4sf3:
26985               case CODE_FOR_avx_cmpv2df3:
26986               case CODE_FOR_avx_cmpv4sf3:
26987               case CODE_FOR_avx_cmpv4df3:
26988               case CODE_FOR_avx_cmpv8sf3:
26989                 error ("the last argument must be a 5-bit immediate");
26990                 return const0_rtx;
26991
26992              default:
26993                 switch (nargs_constant)
26994                   {
26995                   case 2:
26996                     if ((nargs - i) == nargs_constant)
26997                       {
26998                         error ("the next to last argument must be an 8-bit immediate");
26999                         break;
27000                       }
27001                   case 1:
27002                     error ("the last argument must be an 8-bit immediate");
27003                     break;
27004                   default:
27005                     gcc_unreachable ();
27006                   }
27007                 return const0_rtx;
27008               }
27009         }
27010       else
27011         {
27012           if (VECTOR_MODE_P (mode))
27013             op = safe_vector_operand (op, mode);
27014
27015           /* If we aren't optimizing, only allow one memory operand to
27016              be generated.  */
27017           if (memory_operand (op, mode))
27018             num_memory++;
27019
27020           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
27021             {
27022               if (optimize || !match || num_memory > 1)
27023                 op = copy_to_mode_reg (mode, op);
27024             }
27025           else
27026             {
27027               op = copy_to_reg (op);
27028               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
27029             }
27030         }
27031
27032       args[i].op = op;
27033       args[i].mode = mode;
27034     }
27035
27036   switch (nargs)
27037     {
27038     case 1:
27039       pat = GEN_FCN (icode) (real_target, args[0].op);
27040       break;
27041     case 2:
27042       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
27043       break;
27044     case 3:
27045       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
27046                              args[2].op);
27047       break;
27048     case 4:
27049       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
27050                              args[2].op, args[3].op);
27051       break;
27052     default:
27053       gcc_unreachable ();
27054     }
27055
27056   if (! pat)
27057     return 0;
27058
27059   emit_insn (pat);
27060   return target;
27061 }
27062
27063 /* Subroutine of ix86_expand_builtin to take care of special insns
27064    with variable number of operands.  */
27065
27066 static rtx
27067 ix86_expand_special_args_builtin (const struct builtin_description *d,
27068                                     tree exp, rtx target)
27069 {
27070   tree arg;
27071   rtx pat, op;
27072   unsigned int i, nargs, arg_adjust, memory;
27073   struct
27074     {
27075       rtx op;
27076       enum machine_mode mode;
27077     } args[3];
27078   enum insn_code icode = d->icode;
27079   bool last_arg_constant = false;
27080   const struct insn_data_d *insn_p = &insn_data[icode];
27081   enum machine_mode tmode = insn_p->operand[0].mode;
27082   enum { load, store } klass;
27083
27084   switch ((enum ix86_builtin_func_type) d->flag)
27085     {
27086     case VOID_FTYPE_VOID:
27087       if (icode == CODE_FOR_avx_vzeroupper)
27088         target = GEN_INT (vzeroupper_intrinsic);
27089       emit_insn (GEN_FCN (icode) (target));
27090       return 0;
27091     case VOID_FTYPE_UINT64:
27092     case VOID_FTYPE_UNSIGNED:
27093       nargs = 0;
27094       klass = store;
27095       memory = 0;
27096       break;
27097       break;
27098     case UINT64_FTYPE_VOID:
27099     case UNSIGNED_FTYPE_VOID:
27100       nargs = 0;
27101       klass = load;
27102       memory = 0;
27103       break;
27104     case UINT64_FTYPE_PUNSIGNED:
27105     case V2DI_FTYPE_PV2DI:
27106     case V32QI_FTYPE_PCCHAR:
27107     case V16QI_FTYPE_PCCHAR:
27108     case V8SF_FTYPE_PCV4SF:
27109     case V8SF_FTYPE_PCFLOAT:
27110     case V4SF_FTYPE_PCFLOAT:
27111     case V4DF_FTYPE_PCV2DF:
27112     case V4DF_FTYPE_PCDOUBLE:
27113     case V2DF_FTYPE_PCDOUBLE:
27114     case VOID_FTYPE_PVOID:
27115       nargs = 1;
27116       klass = load;
27117       memory = 0;
27118       break;
27119     case VOID_FTYPE_PV2SF_V4SF:
27120     case VOID_FTYPE_PV4DI_V4DI:
27121     case VOID_FTYPE_PV2DI_V2DI:
27122     case VOID_FTYPE_PCHAR_V32QI:
27123     case VOID_FTYPE_PCHAR_V16QI:
27124     case VOID_FTYPE_PFLOAT_V8SF:
27125     case VOID_FTYPE_PFLOAT_V4SF:
27126     case VOID_FTYPE_PDOUBLE_V4DF:
27127     case VOID_FTYPE_PDOUBLE_V2DF:
27128     case VOID_FTYPE_PULONGLONG_ULONGLONG:
27129     case VOID_FTYPE_PINT_INT:
27130       nargs = 1;
27131       klass = store;
27132       /* Reserve memory operand for target.  */
27133       memory = ARRAY_SIZE (args);
27134       break;
27135     case V4SF_FTYPE_V4SF_PCV2SF:
27136     case V2DF_FTYPE_V2DF_PCDOUBLE:
27137       nargs = 2;
27138       klass = load;
27139       memory = 1;
27140       break;
27141     case V8SF_FTYPE_PCV8SF_V8SI:
27142     case V4DF_FTYPE_PCV4DF_V4DI:
27143     case V4SF_FTYPE_PCV4SF_V4SI:
27144     case V2DF_FTYPE_PCV2DF_V2DI:
27145       nargs = 2;
27146       klass = load;
27147       memory = 0;
27148       break;
27149     case VOID_FTYPE_PV8SF_V8SI_V8SF:
27150     case VOID_FTYPE_PV4DF_V4DI_V4DF:
27151     case VOID_FTYPE_PV4SF_V4SI_V4SF:
27152     case VOID_FTYPE_PV2DF_V2DI_V2DF:
27153       nargs = 2;
27154       klass = store;
27155       /* Reserve memory operand for target.  */
27156       memory = ARRAY_SIZE (args);
27157       break;
27158     case VOID_FTYPE_UINT_UINT_UINT:
27159     case VOID_FTYPE_UINT64_UINT_UINT:
27160     case UCHAR_FTYPE_UINT_UINT_UINT:
27161     case UCHAR_FTYPE_UINT64_UINT_UINT:
27162       nargs = 3;
27163       klass = load;
27164       memory = ARRAY_SIZE (args);
27165       last_arg_constant = true;
27166       break;
27167     default:
27168       gcc_unreachable ();
27169     }
27170
27171   gcc_assert (nargs <= ARRAY_SIZE (args));
27172
27173   if (klass == store)
27174     {
27175       arg = CALL_EXPR_ARG (exp, 0);
27176       op = expand_normal (arg);
27177       gcc_assert (target == 0);
27178       if (memory)
27179         target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
27180       else
27181         target = force_reg (tmode, op);
27182       arg_adjust = 1;
27183     }
27184   else
27185     {
27186       arg_adjust = 0;
27187       if (optimize
27188           || target == 0
27189           || GET_MODE (target) != tmode
27190           || !insn_p->operand[0].predicate (target, tmode))
27191         target = gen_reg_rtx (tmode);
27192     }
27193
27194   for (i = 0; i < nargs; i++)
27195     {
27196       enum machine_mode mode = insn_p->operand[i + 1].mode;
27197       bool match;
27198
27199       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
27200       op = expand_normal (arg);
27201       match = insn_p->operand[i + 1].predicate (op, mode);
27202
27203       if (last_arg_constant && (i + 1) == nargs)
27204         {
27205           if (!match)
27206             {
27207               if (icode == CODE_FOR_lwp_lwpvalsi3
27208                   || icode == CODE_FOR_lwp_lwpinssi3
27209                   || icode == CODE_FOR_lwp_lwpvaldi3
27210                   || icode == CODE_FOR_lwp_lwpinsdi3)
27211                 error ("the last argument must be a 32-bit immediate");
27212               else
27213                 error ("the last argument must be an 8-bit immediate");
27214               return const0_rtx;
27215             }
27216         }
27217       else
27218         {
27219           if (i == memory)
27220             {
27221               /* This must be the memory operand.  */
27222               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
27223               gcc_assert (GET_MODE (op) == mode
27224                           || GET_MODE (op) == VOIDmode);
27225             }
27226           else
27227             {
27228               /* This must be register.  */
27229               if (VECTOR_MODE_P (mode))
27230                 op = safe_vector_operand (op, mode);
27231
27232               gcc_assert (GET_MODE (op) == mode
27233                           || GET_MODE (op) == VOIDmode);
27234               op = copy_to_mode_reg (mode, op);
27235             }
27236         }
27237
27238       args[i].op = op;
27239       args[i].mode = mode;
27240     }
27241
27242   switch (nargs)
27243     {
27244     case 0:
27245       pat = GEN_FCN (icode) (target);
27246       break;
27247     case 1:
27248       pat = GEN_FCN (icode) (target, args[0].op);
27249       break;
27250     case 2:
27251       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
27252       break;
27253     case 3:
27254       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
27255       break;
27256     default:
27257       gcc_unreachable ();
27258     }
27259
27260   if (! pat)
27261     return 0;
27262   emit_insn (pat);
27263   return klass == store ? 0 : target;
27264 }
27265
27266 /* Return the integer constant in ARG.  Constrain it to be in the range
27267    of the subparts of VEC_TYPE; issue an error if not.  */
27268
27269 static int
27270 get_element_number (tree vec_type, tree arg)
27271 {
27272   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
27273
27274   if (!host_integerp (arg, 1)
27275       || (elt = tree_low_cst (arg, 1), elt > max))
27276     {
27277       error ("selector must be an integer constant in the range 0..%wi", max);
27278       return 0;
27279     }
27280
27281   return elt;
27282 }
27283
27284 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27285    ix86_expand_vector_init.  We DO have language-level syntax for this, in
27286    the form of  (type){ init-list }.  Except that since we can't place emms
27287    instructions from inside the compiler, we can't allow the use of MMX
27288    registers unless the user explicitly asks for it.  So we do *not* define
27289    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
27290    we have builtins invoked by mmintrin.h that gives us license to emit
27291    these sorts of instructions.  */
27292
27293 static rtx
27294 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
27295 {
27296   enum machine_mode tmode = TYPE_MODE (type);
27297   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
27298   int i, n_elt = GET_MODE_NUNITS (tmode);
27299   rtvec v = rtvec_alloc (n_elt);
27300
27301   gcc_assert (VECTOR_MODE_P (tmode));
27302   gcc_assert (call_expr_nargs (exp) == n_elt);
27303
27304   for (i = 0; i < n_elt; ++i)
27305     {
27306       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
27307       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
27308     }
27309
27310   if (!target || !register_operand (target, tmode))
27311     target = gen_reg_rtx (tmode);
27312
27313   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
27314   return target;
27315 }
27316
27317 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27318    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
27319    had a language-level syntax for referencing vector elements.  */
27320
27321 static rtx
27322 ix86_expand_vec_ext_builtin (tree exp, rtx target)
27323 {
27324   enum machine_mode tmode, mode0;
27325   tree arg0, arg1;
27326   int elt;
27327   rtx op0;
27328
27329   arg0 = CALL_EXPR_ARG (exp, 0);
27330   arg1 = CALL_EXPR_ARG (exp, 1);
27331
27332   op0 = expand_normal (arg0);
27333   elt = get_element_number (TREE_TYPE (arg0), arg1);
27334
27335   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
27336   mode0 = TYPE_MODE (TREE_TYPE (arg0));
27337   gcc_assert (VECTOR_MODE_P (mode0));
27338
27339   op0 = force_reg (mode0, op0);
27340
27341   if (optimize || !target || !register_operand (target, tmode))
27342     target = gen_reg_rtx (tmode);
27343
27344   ix86_expand_vector_extract (true, target, op0, elt);
27345
27346   return target;
27347 }
27348
27349 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
27350    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
27351    a language-level syntax for referencing vector elements.  */
27352
27353 static rtx
27354 ix86_expand_vec_set_builtin (tree exp)
27355 {
27356   enum machine_mode tmode, mode1;
27357   tree arg0, arg1, arg2;
27358   int elt;
27359   rtx op0, op1, target;
27360
27361   arg0 = CALL_EXPR_ARG (exp, 0);
27362   arg1 = CALL_EXPR_ARG (exp, 1);
27363   arg2 = CALL_EXPR_ARG (exp, 2);
27364
27365   tmode = TYPE_MODE (TREE_TYPE (arg0));
27366   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
27367   gcc_assert (VECTOR_MODE_P (tmode));
27368
27369   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
27370   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
27371   elt = get_element_number (TREE_TYPE (arg0), arg2);
27372
27373   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
27374     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
27375
27376   op0 = force_reg (tmode, op0);
27377   op1 = force_reg (mode1, op1);
27378
27379   /* OP0 is the source of these builtin functions and shouldn't be
27380      modified.  Create a copy, use it and return it as target.  */
27381   target = gen_reg_rtx (tmode);
27382   emit_move_insn (target, op0);
27383   ix86_expand_vector_set (true, target, op1, elt);
27384
27385   return target;
27386 }
27387
27388 /* Expand an expression EXP that calls a built-in function,
27389    with result going to TARGET if that's convenient
27390    (and in mode MODE if that's convenient).
27391    SUBTARGET may be used as the target for computing one of EXP's operands.
27392    IGNORE is nonzero if the value is to be ignored.  */
27393
27394 static rtx
27395 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
27396                      enum machine_mode mode ATTRIBUTE_UNUSED,
27397                      int ignore ATTRIBUTE_UNUSED)
27398 {
27399   const struct builtin_description *d;
27400   size_t i;
27401   enum insn_code icode;
27402   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
27403   tree arg0, arg1, arg2;
27404   rtx op0, op1, op2, pat;
27405   enum machine_mode mode0, mode1, mode2;
27406   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
27407
27408   /* Determine whether the builtin function is available under the current ISA.
27409      Originally the builtin was not created if it wasn't applicable to the
27410      current ISA based on the command line switches.  With function specific
27411      options, we need to check in the context of the function making the call
27412      whether it is supported.  */
27413   if (ix86_builtins_isa[fcode].isa
27414       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
27415     {
27416       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
27417                                        NULL, NULL, false);
27418
27419       if (!opts)
27420         error ("%qE needs unknown isa option", fndecl);
27421       else
27422         {
27423           gcc_assert (opts != NULL);
27424           error ("%qE needs isa option %s", fndecl, opts);
27425           free (opts);
27426         }
27427       return const0_rtx;
27428     }
27429
27430   switch (fcode)
27431     {
27432     case IX86_BUILTIN_MASKMOVQ:
27433     case IX86_BUILTIN_MASKMOVDQU:
27434       icode = (fcode == IX86_BUILTIN_MASKMOVQ
27435                ? CODE_FOR_mmx_maskmovq
27436                : CODE_FOR_sse2_maskmovdqu);
27437       /* Note the arg order is different from the operand order.  */
27438       arg1 = CALL_EXPR_ARG (exp, 0);
27439       arg2 = CALL_EXPR_ARG (exp, 1);
27440       arg0 = CALL_EXPR_ARG (exp, 2);
27441       op0 = expand_normal (arg0);
27442       op1 = expand_normal (arg1);
27443       op2 = expand_normal (arg2);
27444       mode0 = insn_data[icode].operand[0].mode;
27445       mode1 = insn_data[icode].operand[1].mode;
27446       mode2 = insn_data[icode].operand[2].mode;
27447
27448       op0 = force_reg (Pmode, op0);
27449       op0 = gen_rtx_MEM (mode1, op0);
27450
27451       if (!insn_data[icode].operand[0].predicate (op0, mode0))
27452         op0 = copy_to_mode_reg (mode0, op0);
27453       if (!insn_data[icode].operand[1].predicate (op1, mode1))
27454         op1 = copy_to_mode_reg (mode1, op1);
27455       if (!insn_data[icode].operand[2].predicate (op2, mode2))
27456         op2 = copy_to_mode_reg (mode2, op2);
27457       pat = GEN_FCN (icode) (op0, op1, op2);
27458       if (! pat)
27459         return 0;
27460       emit_insn (pat);
27461       return 0;
27462
27463     case IX86_BUILTIN_LDMXCSR:
27464       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
27465       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
27466       emit_move_insn (target, op0);
27467       emit_insn (gen_sse_ldmxcsr (target));
27468       return 0;
27469
27470     case IX86_BUILTIN_STMXCSR:
27471       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
27472       emit_insn (gen_sse_stmxcsr (target));
27473       return copy_to_mode_reg (SImode, target);
27474
27475     case IX86_BUILTIN_CLFLUSH:
27476         arg0 = CALL_EXPR_ARG (exp, 0);
27477         op0 = expand_normal (arg0);
27478         icode = CODE_FOR_sse2_clflush;
27479         if (!insn_data[icode].operand[0].predicate (op0, Pmode))
27480             op0 = copy_to_mode_reg (Pmode, op0);
27481
27482         emit_insn (gen_sse2_clflush (op0));
27483         return 0;
27484
27485     case IX86_BUILTIN_MONITOR:
27486       arg0 = CALL_EXPR_ARG (exp, 0);
27487       arg1 = CALL_EXPR_ARG (exp, 1);
27488       arg2 = CALL_EXPR_ARG (exp, 2);
27489       op0 = expand_normal (arg0);
27490       op1 = expand_normal (arg1);
27491       op2 = expand_normal (arg2);
27492       if (!REG_P (op0))
27493         op0 = copy_to_mode_reg (Pmode, op0);
27494       if (!REG_P (op1))
27495         op1 = copy_to_mode_reg (SImode, op1);
27496       if (!REG_P (op2))
27497         op2 = copy_to_mode_reg (SImode, op2);
27498       emit_insn (ix86_gen_monitor (op0, op1, op2));
27499       return 0;
27500
27501     case IX86_BUILTIN_MWAIT:
27502       arg0 = CALL_EXPR_ARG (exp, 0);
27503       arg1 = CALL_EXPR_ARG (exp, 1);
27504       op0 = expand_normal (arg0);
27505       op1 = expand_normal (arg1);
27506       if (!REG_P (op0))
27507         op0 = copy_to_mode_reg (SImode, op0);
27508       if (!REG_P (op1))
27509         op1 = copy_to_mode_reg (SImode, op1);
27510       emit_insn (gen_sse3_mwait (op0, op1));
27511       return 0;
27512
27513     case IX86_BUILTIN_VEC_INIT_V2SI:
27514     case IX86_BUILTIN_VEC_INIT_V4HI:
27515     case IX86_BUILTIN_VEC_INIT_V8QI:
27516       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
27517
27518     case IX86_BUILTIN_VEC_EXT_V2DF:
27519     case IX86_BUILTIN_VEC_EXT_V2DI:
27520     case IX86_BUILTIN_VEC_EXT_V4SF:
27521     case IX86_BUILTIN_VEC_EXT_V4SI:
27522     case IX86_BUILTIN_VEC_EXT_V8HI:
27523     case IX86_BUILTIN_VEC_EXT_V2SI:
27524     case IX86_BUILTIN_VEC_EXT_V4HI:
27525     case IX86_BUILTIN_VEC_EXT_V16QI:
27526       return ix86_expand_vec_ext_builtin (exp, target);
27527
27528     case IX86_BUILTIN_VEC_SET_V2DI:
27529     case IX86_BUILTIN_VEC_SET_V4SF:
27530     case IX86_BUILTIN_VEC_SET_V4SI:
27531     case IX86_BUILTIN_VEC_SET_V8HI:
27532     case IX86_BUILTIN_VEC_SET_V4HI:
27533     case IX86_BUILTIN_VEC_SET_V16QI:
27534       return ix86_expand_vec_set_builtin (exp);
27535
27536     case IX86_BUILTIN_VEC_PERM_V2DF:
27537     case IX86_BUILTIN_VEC_PERM_V4SF:
27538     case IX86_BUILTIN_VEC_PERM_V2DI:
27539     case IX86_BUILTIN_VEC_PERM_V4SI:
27540     case IX86_BUILTIN_VEC_PERM_V8HI:
27541     case IX86_BUILTIN_VEC_PERM_V16QI:
27542     case IX86_BUILTIN_VEC_PERM_V2DI_U:
27543     case IX86_BUILTIN_VEC_PERM_V4SI_U:
27544     case IX86_BUILTIN_VEC_PERM_V8HI_U:
27545     case IX86_BUILTIN_VEC_PERM_V16QI_U:
27546     case IX86_BUILTIN_VEC_PERM_V4DF:
27547     case IX86_BUILTIN_VEC_PERM_V8SF:
27548       return ix86_expand_vec_perm_builtin (exp);
27549
27550     case IX86_BUILTIN_INFQ:
27551     case IX86_BUILTIN_HUGE_VALQ:
27552       {
27553         REAL_VALUE_TYPE inf;
27554         rtx tmp;
27555
27556         real_inf (&inf);
27557         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
27558
27559         tmp = validize_mem (force_const_mem (mode, tmp));
27560
27561         if (target == 0)
27562           target = gen_reg_rtx (mode);
27563
27564         emit_move_insn (target, tmp);
27565         return target;
27566       }
27567
27568     case IX86_BUILTIN_LLWPCB:
27569       arg0 = CALL_EXPR_ARG (exp, 0);
27570       op0 = expand_normal (arg0);
27571       icode = CODE_FOR_lwp_llwpcb;
27572       if (!insn_data[icode].operand[0].predicate (op0, Pmode))
27573         op0 = copy_to_mode_reg (Pmode, op0);
27574       emit_insn (gen_lwp_llwpcb (op0));
27575       return 0;
27576
27577     case IX86_BUILTIN_SLWPCB:
27578       icode = CODE_FOR_lwp_slwpcb;
27579       if (!target
27580           || !insn_data[icode].operand[0].predicate (target, Pmode))
27581         target = gen_reg_rtx (Pmode);
27582       emit_insn (gen_lwp_slwpcb (target));
27583       return target;
27584
27585     case IX86_BUILTIN_BEXTRI32:
27586     case IX86_BUILTIN_BEXTRI64:
27587       arg0 = CALL_EXPR_ARG (exp, 0);
27588       arg1 = CALL_EXPR_ARG (exp, 1);
27589       op0 = expand_normal (arg0);
27590       op1 = expand_normal (arg1);
27591       icode = (fcode == IX86_BUILTIN_BEXTRI32
27592           ? CODE_FOR_tbm_bextri_si
27593           : CODE_FOR_tbm_bextri_di);
27594       if (!CONST_INT_P (op1))
27595         {
27596           error ("last argument must be an immediate");
27597           return const0_rtx;
27598         }
27599       else
27600         {
27601           unsigned char length = (INTVAL (op1) >> 8) & 0xFF;
27602           unsigned char lsb_index = INTVAL (op1) & 0xFF;
27603           op1 = GEN_INT (length);
27604           op2 = GEN_INT (lsb_index);
27605           pat = GEN_FCN (icode) (target, op0, op1, op2);
27606           if (pat)
27607             emit_insn (pat);
27608           return target;
27609         }
27610
27611     case IX86_BUILTIN_RDRAND16_STEP:
27612       icode = CODE_FOR_rdrandhi_1;
27613       mode0 = HImode;
27614       goto rdrand_step;
27615
27616     case IX86_BUILTIN_RDRAND32_STEP:
27617       icode = CODE_FOR_rdrandsi_1;
27618       mode0 = SImode;
27619       goto rdrand_step;
27620
27621     case IX86_BUILTIN_RDRAND64_STEP:
27622       icode = CODE_FOR_rdranddi_1;
27623       mode0 = DImode;
27624
27625 rdrand_step:
27626       op0 = gen_reg_rtx (mode0);
27627       emit_insn (GEN_FCN (icode) (op0));
27628
27629       op1 = gen_reg_rtx (SImode);
27630       emit_move_insn (op1, CONST1_RTX (SImode));
27631
27632       /* Emit SImode conditional move.  */
27633       if (mode0 == HImode)
27634         {
27635           op2 = gen_reg_rtx (SImode);
27636           emit_insn (gen_zero_extendhisi2 (op2, op0));
27637         }
27638       else if (mode0 == SImode)
27639         op2 = op0;
27640       else
27641         op2 = gen_rtx_SUBREG (SImode, op0, 0);
27642
27643       pat = gen_rtx_GEU (VOIDmode, gen_rtx_REG (CCCmode, FLAGS_REG),
27644                          const0_rtx);
27645       emit_insn (gen_rtx_SET (VOIDmode, op1,
27646                               gen_rtx_IF_THEN_ELSE (SImode, pat, op2, op1)));
27647       emit_move_insn (target, op1);
27648
27649       arg0 = CALL_EXPR_ARG (exp, 0);
27650       op1 = expand_normal (arg0);
27651       if (!address_operand (op1, VOIDmode))
27652         op1 = copy_addr_to_reg (op1);
27653       emit_move_insn (gen_rtx_MEM (mode0, op1), op0);
27654       return target;
27655
27656     default:
27657       break;
27658     }
27659
27660   for (i = 0, d = bdesc_special_args;
27661        i < ARRAY_SIZE (bdesc_special_args);
27662        i++, d++)
27663     if (d->code == fcode)
27664       return ix86_expand_special_args_builtin (d, exp, target);
27665
27666   for (i = 0, d = bdesc_args;
27667        i < ARRAY_SIZE (bdesc_args);
27668        i++, d++)
27669     if (d->code == fcode)
27670       switch (fcode)
27671         {
27672         case IX86_BUILTIN_FABSQ:
27673         case IX86_BUILTIN_COPYSIGNQ:
27674           if (!TARGET_SSE2)
27675             /* Emit a normal call if SSE2 isn't available.  */
27676             return expand_call (exp, target, ignore);
27677         default:
27678           return ix86_expand_args_builtin (d, exp, target);
27679         }
27680
27681   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
27682     if (d->code == fcode)
27683       return ix86_expand_sse_comi (d, exp, target);
27684
27685   for (i = 0, d = bdesc_pcmpestr;
27686        i < ARRAY_SIZE (bdesc_pcmpestr);
27687        i++, d++)
27688     if (d->code == fcode)
27689       return ix86_expand_sse_pcmpestr (d, exp, target);
27690
27691   for (i = 0, d = bdesc_pcmpistr;
27692        i < ARRAY_SIZE (bdesc_pcmpistr);
27693        i++, d++)
27694     if (d->code == fcode)
27695       return ix86_expand_sse_pcmpistr (d, exp, target);
27696
27697   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
27698     if (d->code == fcode)
27699       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
27700                                             (enum ix86_builtin_func_type)
27701                                             d->flag, d->comparison);
27702
27703   gcc_unreachable ();
27704 }
27705
27706 /* Returns a function decl for a vectorized version of the builtin function
27707    with builtin function code FN and the result vector type TYPE, or NULL_TREE
27708    if it is not available.  */
27709
27710 static tree
27711 ix86_builtin_vectorized_function (tree fndecl, tree type_out,
27712                                   tree type_in)
27713 {
27714   enum machine_mode in_mode, out_mode;
27715   int in_n, out_n;
27716   enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
27717
27718   if (TREE_CODE (type_out) != VECTOR_TYPE
27719       || TREE_CODE (type_in) != VECTOR_TYPE
27720       || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
27721     return NULL_TREE;
27722
27723   out_mode = TYPE_MODE (TREE_TYPE (type_out));
27724   out_n = TYPE_VECTOR_SUBPARTS (type_out);
27725   in_mode = TYPE_MODE (TREE_TYPE (type_in));
27726   in_n = TYPE_VECTOR_SUBPARTS (type_in);
27727
27728   switch (fn)
27729     {
27730     case BUILT_IN_SQRT:
27731       if (out_mode == DFmode && in_mode == DFmode)
27732         {
27733           if (out_n == 2 && in_n == 2)
27734             return ix86_builtins[IX86_BUILTIN_SQRTPD];
27735           else if (out_n == 4 && in_n == 4)
27736             return ix86_builtins[IX86_BUILTIN_SQRTPD256];
27737         }
27738       break;
27739
27740     case BUILT_IN_SQRTF:
27741       if (out_mode == SFmode && in_mode == SFmode)
27742         {
27743           if (out_n == 4 && in_n == 4)
27744             return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
27745           else if (out_n == 8 && in_n == 8)
27746             return ix86_builtins[IX86_BUILTIN_SQRTPS_NR256];
27747         }
27748       break;
27749
27750     case BUILT_IN_LRINT:
27751       if (out_mode == SImode && out_n == 4
27752           && in_mode == DFmode && in_n == 2)
27753         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
27754       break;
27755
27756     case BUILT_IN_LRINTF:
27757       if (out_mode == SImode && in_mode == SFmode)
27758         {
27759           if (out_n == 4 && in_n == 4)
27760             return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
27761           else if (out_n == 8 && in_n == 8)
27762             return ix86_builtins[IX86_BUILTIN_CVTPS2DQ256];
27763         }
27764       break;
27765
27766     case BUILT_IN_COPYSIGN:
27767       if (out_mode == DFmode && in_mode == DFmode)
27768         {
27769           if (out_n == 2 && in_n == 2)
27770             return ix86_builtins[IX86_BUILTIN_CPYSGNPD];
27771           else if (out_n == 4 && in_n == 4)
27772             return ix86_builtins[IX86_BUILTIN_CPYSGNPD256];
27773         }
27774       break;
27775
27776     case BUILT_IN_COPYSIGNF:
27777       if (out_mode == SFmode && in_mode == SFmode)
27778         {
27779           if (out_n == 4 && in_n == 4)
27780             return ix86_builtins[IX86_BUILTIN_CPYSGNPS];
27781           else if (out_n == 8 && in_n == 8)
27782             return ix86_builtins[IX86_BUILTIN_CPYSGNPS256];
27783         }
27784       break;
27785
27786     case BUILT_IN_FLOOR:
27787       /* The round insn does not trap on denormals.  */
27788       if (flag_trapping_math || !TARGET_ROUND)
27789         break;
27790
27791       if (out_mode == DFmode && in_mode == DFmode)
27792         {
27793           if (out_n == 2 && in_n == 2)
27794             return ix86_builtins[IX86_BUILTIN_FLOORPD];
27795           else if (out_n == 4 && in_n == 4)
27796             return ix86_builtins[IX86_BUILTIN_FLOORPD256];
27797         }
27798       break;
27799
27800     case BUILT_IN_FLOORF:
27801       /* The round insn does not trap on denormals.  */
27802       if (flag_trapping_math || !TARGET_ROUND)
27803         break;
27804
27805       if (out_mode == SFmode && in_mode == SFmode)
27806         {
27807           if (out_n == 4 && in_n == 4)
27808             return ix86_builtins[IX86_BUILTIN_FLOORPS];
27809           else if (out_n == 8 && in_n == 8)
27810             return ix86_builtins[IX86_BUILTIN_FLOORPS256];
27811         }
27812       break;
27813
27814     case BUILT_IN_CEIL:
27815       /* The round insn does not trap on denormals.  */
27816       if (flag_trapping_math || !TARGET_ROUND)
27817         break;
27818
27819       if (out_mode == DFmode && in_mode == DFmode)
27820         {
27821           if (out_n == 2 && in_n == 2)
27822             return ix86_builtins[IX86_BUILTIN_CEILPD];
27823           else if (out_n == 4 && in_n == 4)
27824             return ix86_builtins[IX86_BUILTIN_CEILPD256];
27825         }
27826       break;
27827
27828     case BUILT_IN_CEILF:
27829       /* The round insn does not trap on denormals.  */
27830       if (flag_trapping_math || !TARGET_ROUND)
27831         break;
27832
27833       if (out_mode == SFmode && in_mode == SFmode)
27834         {
27835           if (out_n == 4 && in_n == 4)
27836             return ix86_builtins[IX86_BUILTIN_CEILPS];
27837           else if (out_n == 8 && in_n == 8)
27838             return ix86_builtins[IX86_BUILTIN_CEILPS256];
27839         }
27840       break;
27841
27842     case BUILT_IN_TRUNC:
27843       /* The round insn does not trap on denormals.  */
27844       if (flag_trapping_math || !TARGET_ROUND)
27845         break;
27846
27847       if (out_mode == DFmode && in_mode == DFmode)
27848         {
27849           if (out_n == 2 && in_n == 2)
27850             return ix86_builtins[IX86_BUILTIN_TRUNCPD];
27851           else if (out_n == 4 && in_n == 4)
27852             return ix86_builtins[IX86_BUILTIN_TRUNCPD256];
27853         }
27854       break;
27855
27856     case BUILT_IN_TRUNCF:
27857       /* The round insn does not trap on denormals.  */
27858       if (flag_trapping_math || !TARGET_ROUND)
27859         break;
27860
27861       if (out_mode == SFmode && in_mode == SFmode)
27862         {
27863           if (out_n == 4 && in_n == 4)
27864             return ix86_builtins[IX86_BUILTIN_TRUNCPS];
27865           else if (out_n == 8 && in_n == 8)
27866             return ix86_builtins[IX86_BUILTIN_TRUNCPS256];
27867         }
27868       break;
27869
27870     case BUILT_IN_RINT:
27871       /* The round insn does not trap on denormals.  */
27872       if (flag_trapping_math || !TARGET_ROUND)
27873         break;
27874
27875       if (out_mode == DFmode && in_mode == DFmode)
27876         {
27877           if (out_n == 2 && in_n == 2)
27878             return ix86_builtins[IX86_BUILTIN_RINTPD];
27879           else if (out_n == 4 && in_n == 4)
27880             return ix86_builtins[IX86_BUILTIN_RINTPD256];
27881         }
27882       break;
27883
27884     case BUILT_IN_RINTF:
27885       /* The round insn does not trap on denormals.  */
27886       if (flag_trapping_math || !TARGET_ROUND)
27887         break;
27888
27889       if (out_mode == SFmode && in_mode == SFmode)
27890         {
27891           if (out_n == 4 && in_n == 4)
27892             return ix86_builtins[IX86_BUILTIN_RINTPS];
27893           else if (out_n == 8 && in_n == 8)
27894             return ix86_builtins[IX86_BUILTIN_RINTPS256];
27895         }
27896       break;
27897
27898     case BUILT_IN_FMA:
27899       if (out_mode == DFmode && in_mode == DFmode)
27900         {
27901           if (out_n == 2 && in_n == 2)
27902             return ix86_builtins[IX86_BUILTIN_VFMADDPD];
27903           if (out_n == 4 && in_n == 4)
27904             return ix86_builtins[IX86_BUILTIN_VFMADDPD256];
27905         }
27906       break;
27907
27908     case BUILT_IN_FMAF:
27909       if (out_mode == SFmode && in_mode == SFmode)
27910         {
27911           if (out_n == 4 && in_n == 4)
27912             return ix86_builtins[IX86_BUILTIN_VFMADDPS];
27913           if (out_n == 8 && in_n == 8)
27914             return ix86_builtins[IX86_BUILTIN_VFMADDPS256];
27915         }
27916       break;
27917
27918     default:
27919       break;
27920     }
27921
27922   /* Dispatch to a handler for a vectorization library.  */
27923   if (ix86_veclib_handler)
27924     return ix86_veclib_handler ((enum built_in_function) fn, type_out,
27925                                 type_in);
27926
27927   return NULL_TREE;
27928 }
27929
27930 /* Handler for an SVML-style interface to
27931    a library with vectorized intrinsics.  */
27932
27933 static tree
27934 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
27935 {
27936   char name[20];
27937   tree fntype, new_fndecl, args;
27938   unsigned arity;
27939   const char *bname;
27940   enum machine_mode el_mode, in_mode;
27941   int n, in_n;
27942
27943   /* The SVML is suitable for unsafe math only.  */
27944   if (!flag_unsafe_math_optimizations)
27945     return NULL_TREE;
27946
27947   el_mode = TYPE_MODE (TREE_TYPE (type_out));
27948   n = TYPE_VECTOR_SUBPARTS (type_out);
27949   in_mode = TYPE_MODE (TREE_TYPE (type_in));
27950   in_n = TYPE_VECTOR_SUBPARTS (type_in);
27951   if (el_mode != in_mode
27952       || n != in_n)
27953     return NULL_TREE;
27954
27955   switch (fn)
27956     {
27957     case BUILT_IN_EXP:
27958     case BUILT_IN_LOG:
27959     case BUILT_IN_LOG10:
27960     case BUILT_IN_POW:
27961     case BUILT_IN_TANH:
27962     case BUILT_IN_TAN:
27963     case BUILT_IN_ATAN:
27964     case BUILT_IN_ATAN2:
27965     case BUILT_IN_ATANH:
27966     case BUILT_IN_CBRT:
27967     case BUILT_IN_SINH:
27968     case BUILT_IN_SIN:
27969     case BUILT_IN_ASINH:
27970     case BUILT_IN_ASIN:
27971     case BUILT_IN_COSH:
27972     case BUILT_IN_COS:
27973     case BUILT_IN_ACOSH:
27974     case BUILT_IN_ACOS:
27975       if (el_mode != DFmode || n != 2)
27976         return NULL_TREE;
27977       break;
27978
27979     case BUILT_IN_EXPF:
27980     case BUILT_IN_LOGF:
27981     case BUILT_IN_LOG10F:
27982     case BUILT_IN_POWF:
27983     case BUILT_IN_TANHF:
27984     case BUILT_IN_TANF:
27985     case BUILT_IN_ATANF:
27986     case BUILT_IN_ATAN2F:
27987     case BUILT_IN_ATANHF:
27988     case BUILT_IN_CBRTF:
27989     case BUILT_IN_SINHF:
27990     case BUILT_IN_SINF:
27991     case BUILT_IN_ASINHF:
27992     case BUILT_IN_ASINF:
27993     case BUILT_IN_COSHF:
27994     case BUILT_IN_COSF:
27995     case BUILT_IN_ACOSHF:
27996     case BUILT_IN_ACOSF:
27997       if (el_mode != SFmode || n != 4)
27998         return NULL_TREE;
27999       break;
28000
28001     default:
28002       return NULL_TREE;
28003     }
28004
28005   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
28006
28007   if (fn == BUILT_IN_LOGF)
28008     strcpy (name, "vmlsLn4");
28009   else if (fn == BUILT_IN_LOG)
28010     strcpy (name, "vmldLn2");
28011   else if (n == 4)
28012     {
28013       sprintf (name, "vmls%s", bname+10);
28014       name[strlen (name)-1] = '4';
28015     }
28016   else
28017     sprintf (name, "vmld%s2", bname+10);
28018
28019   /* Convert to uppercase. */
28020   name[4] &= ~0x20;
28021
28022   arity = 0;
28023   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
28024        args = TREE_CHAIN (args))
28025     arity++;
28026
28027   if (arity == 1)
28028     fntype = build_function_type_list (type_out, type_in, NULL);
28029   else
28030     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
28031
28032   /* Build a function declaration for the vectorized function.  */
28033   new_fndecl = build_decl (BUILTINS_LOCATION,
28034                            FUNCTION_DECL, get_identifier (name), fntype);
28035   TREE_PUBLIC (new_fndecl) = 1;
28036   DECL_EXTERNAL (new_fndecl) = 1;
28037   DECL_IS_NOVOPS (new_fndecl) = 1;
28038   TREE_READONLY (new_fndecl) = 1;
28039
28040   return new_fndecl;
28041 }
28042
28043 /* Handler for an ACML-style interface to
28044    a library with vectorized intrinsics.  */
28045
28046 static tree
28047 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
28048 {
28049   char name[20] = "__vr.._";
28050   tree fntype, new_fndecl, args;
28051   unsigned arity;
28052   const char *bname;
28053   enum machine_mode el_mode, in_mode;
28054   int n, in_n;
28055
28056   /* The ACML is 64bits only and suitable for unsafe math only as
28057      it does not correctly support parts of IEEE with the required
28058      precision such as denormals.  */
28059   if (!TARGET_64BIT
28060       || !flag_unsafe_math_optimizations)
28061     return NULL_TREE;
28062
28063   el_mode = TYPE_MODE (TREE_TYPE (type_out));
28064   n = TYPE_VECTOR_SUBPARTS (type_out);
28065   in_mode = TYPE_MODE (TREE_TYPE (type_in));
28066   in_n = TYPE_VECTOR_SUBPARTS (type_in);
28067   if (el_mode != in_mode
28068       || n != in_n)
28069     return NULL_TREE;
28070
28071   switch (fn)
28072     {
28073     case BUILT_IN_SIN:
28074     case BUILT_IN_COS:
28075     case BUILT_IN_EXP:
28076     case BUILT_IN_LOG:
28077     case BUILT_IN_LOG2:
28078     case BUILT_IN_LOG10:
28079       name[4] = 'd';
28080       name[5] = '2';
28081       if (el_mode != DFmode
28082           || n != 2)
28083         return NULL_TREE;
28084       break;
28085
28086     case BUILT_IN_SINF:
28087     case BUILT_IN_COSF:
28088     case BUILT_IN_EXPF:
28089     case BUILT_IN_POWF:
28090     case BUILT_IN_LOGF:
28091     case BUILT_IN_LOG2F:
28092     case BUILT_IN_LOG10F:
28093       name[4] = 's';
28094       name[5] = '4';
28095       if (el_mode != SFmode
28096           || n != 4)
28097         return NULL_TREE;
28098       break;
28099
28100     default:
28101       return NULL_TREE;
28102     }
28103
28104   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
28105   sprintf (name + 7, "%s", bname+10);
28106
28107   arity = 0;
28108   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
28109        args = TREE_CHAIN (args))
28110     arity++;
28111
28112   if (arity == 1)
28113     fntype = build_function_type_list (type_out, type_in, NULL);
28114   else
28115     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
28116
28117   /* Build a function declaration for the vectorized function.  */
28118   new_fndecl = build_decl (BUILTINS_LOCATION,
28119                            FUNCTION_DECL, get_identifier (name), fntype);
28120   TREE_PUBLIC (new_fndecl) = 1;
28121   DECL_EXTERNAL (new_fndecl) = 1;
28122   DECL_IS_NOVOPS (new_fndecl) = 1;
28123   TREE_READONLY (new_fndecl) = 1;
28124
28125   return new_fndecl;
28126 }
28127
28128
28129 /* Returns a decl of a function that implements conversion of an integer vector
28130    into a floating-point vector, or vice-versa.  DEST_TYPE and SRC_TYPE
28131    are the types involved when converting according to CODE.
28132    Return NULL_TREE if it is not available.  */
28133
28134 static tree
28135 ix86_vectorize_builtin_conversion (unsigned int code,
28136                                    tree dest_type, tree src_type)
28137 {
28138   if (! TARGET_SSE2)
28139     return NULL_TREE;
28140
28141   switch (code)
28142     {
28143     case FLOAT_EXPR:
28144       switch (TYPE_MODE (src_type))
28145         {
28146         case V4SImode:
28147           switch (TYPE_MODE (dest_type))
28148             {
28149             case V4SFmode:
28150               return (TYPE_UNSIGNED (src_type)
28151                       ? ix86_builtins[IX86_BUILTIN_CVTUDQ2PS]
28152                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PS]);
28153             case V4DFmode:
28154               return (TYPE_UNSIGNED (src_type)
28155                       ? NULL_TREE
28156                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PD256]);
28157             default:
28158               return NULL_TREE;
28159             }
28160           break;
28161         case V8SImode:
28162           switch (TYPE_MODE (dest_type))
28163             {
28164             case V8SFmode:
28165               return (TYPE_UNSIGNED (src_type)
28166                       ? NULL_TREE
28167                       : ix86_builtins[IX86_BUILTIN_CVTDQ2PS256]);
28168             default:
28169               return NULL_TREE;
28170             }
28171           break;
28172         default:
28173           return NULL_TREE;
28174         }
28175
28176     case FIX_TRUNC_EXPR:
28177       switch (TYPE_MODE (dest_type))
28178         {
28179         case V4SImode:
28180           switch (TYPE_MODE (src_type))
28181             {
28182             case V4SFmode:
28183               return (TYPE_UNSIGNED (dest_type)
28184                       ? NULL_TREE
28185                       : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ]);
28186             case V4DFmode:
28187               return (TYPE_UNSIGNED (dest_type)
28188                       ? NULL_TREE
28189                       : ix86_builtins[IX86_BUILTIN_CVTTPD2DQ256]);
28190             default:
28191               return NULL_TREE;
28192             }
28193           break;
28194
28195         case V8SImode:
28196           switch (TYPE_MODE (src_type))
28197             {
28198             case V8SFmode:
28199               return (TYPE_UNSIGNED (dest_type)
28200                       ? NULL_TREE
28201                       : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ256]);
28202             default:
28203               return NULL_TREE;
28204             }
28205           break;
28206
28207         default:
28208           return NULL_TREE;
28209         }
28210
28211     default:
28212       return NULL_TREE;
28213     }
28214
28215   return NULL_TREE;
28216 }
28217
28218 /* Returns a code for a target-specific builtin that implements
28219    reciprocal of the function, or NULL_TREE if not available.  */
28220
28221 static tree
28222 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
28223                          bool sqrt ATTRIBUTE_UNUSED)
28224 {
28225   if (! (TARGET_SSE_MATH && !optimize_insn_for_size_p ()
28226          && flag_finite_math_only && !flag_trapping_math
28227          && flag_unsafe_math_optimizations))
28228     return NULL_TREE;
28229
28230   if (md_fn)
28231     /* Machine dependent builtins.  */
28232     switch (fn)
28233       {
28234         /* Vectorized version of sqrt to rsqrt conversion.  */
28235       case IX86_BUILTIN_SQRTPS_NR:
28236         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
28237
28238       case IX86_BUILTIN_SQRTPS_NR256:
28239         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR256];
28240
28241       default:
28242         return NULL_TREE;
28243       }
28244   else
28245     /* Normal builtins.  */
28246     switch (fn)
28247       {
28248         /* Sqrt to rsqrt conversion.  */
28249       case BUILT_IN_SQRTF:
28250         return ix86_builtins[IX86_BUILTIN_RSQRTF];
28251
28252       default:
28253         return NULL_TREE;
28254       }
28255 }
28256 \f
28257 /* Helper for avx_vpermilps256_operand et al.  This is also used by
28258    the expansion functions to turn the parallel back into a mask.
28259    The return value is 0 for no match and the imm8+1 for a match.  */
28260
28261 int
28262 avx_vpermilp_parallel (rtx par, enum machine_mode mode)
28263 {
28264   unsigned i, nelt = GET_MODE_NUNITS (mode);
28265   unsigned mask = 0;
28266   unsigned char ipar[8];
28267
28268   if (XVECLEN (par, 0) != (int) nelt)
28269     return 0;
28270
28271   /* Validate that all of the elements are constants, and not totally
28272      out of range.  Copy the data into an integral array to make the
28273      subsequent checks easier.  */
28274   for (i = 0; i < nelt; ++i)
28275     {
28276       rtx er = XVECEXP (par, 0, i);
28277       unsigned HOST_WIDE_INT ei;
28278
28279       if (!CONST_INT_P (er))
28280         return 0;
28281       ei = INTVAL (er);
28282       if (ei >= nelt)
28283         return 0;
28284       ipar[i] = ei;
28285     }
28286
28287   switch (mode)
28288     {
28289     case V4DFmode:
28290       /* In the 256-bit DFmode case, we can only move elements within
28291          a 128-bit lane.  */
28292       for (i = 0; i < 2; ++i)
28293         {
28294           if (ipar[i] >= 2)
28295             return 0;
28296           mask |= ipar[i] << i;
28297         }
28298       for (i = 2; i < 4; ++i)
28299         {
28300           if (ipar[i] < 2)
28301             return 0;
28302           mask |= (ipar[i] - 2) << i;
28303         }
28304       break;
28305
28306     case V8SFmode:
28307       /* In the 256-bit SFmode case, we have full freedom of movement
28308          within the low 128-bit lane, but the high 128-bit lane must
28309          mirror the exact same pattern.  */
28310       for (i = 0; i < 4; ++i)
28311         if (ipar[i] + 4 != ipar[i + 4])
28312           return 0;
28313       nelt = 4;
28314       /* FALLTHRU */
28315
28316     case V2DFmode:
28317     case V4SFmode:
28318       /* In the 128-bit case, we've full freedom in the placement of
28319          the elements from the source operand.  */
28320       for (i = 0; i < nelt; ++i)
28321         mask |= ipar[i] << (i * (nelt / 2));
28322       break;
28323
28324     default:
28325       gcc_unreachable ();
28326     }
28327
28328   /* Make sure success has a non-zero value by adding one.  */
28329   return mask + 1;
28330 }
28331
28332 /* Helper for avx_vperm2f128_v4df_operand et al.  This is also used by
28333    the expansion functions to turn the parallel back into a mask.
28334    The return value is 0 for no match and the imm8+1 for a match.  */
28335
28336 int
28337 avx_vperm2f128_parallel (rtx par, enum machine_mode mode)
28338 {
28339   unsigned i, nelt = GET_MODE_NUNITS (mode), nelt2 = nelt / 2;
28340   unsigned mask = 0;
28341   unsigned char ipar[8];
28342
28343   if (XVECLEN (par, 0) != (int) nelt)
28344     return 0;
28345
28346   /* Validate that all of the elements are constants, and not totally
28347      out of range.  Copy the data into an integral array to make the
28348      subsequent checks easier.  */
28349   for (i = 0; i < nelt; ++i)
28350     {
28351       rtx er = XVECEXP (par, 0, i);
28352       unsigned HOST_WIDE_INT ei;
28353
28354       if (!CONST_INT_P (er))
28355         return 0;
28356       ei = INTVAL (er);
28357       if (ei >= 2 * nelt)
28358         return 0;
28359       ipar[i] = ei;
28360     }
28361
28362   /* Validate that the halves of the permute are halves.  */
28363   for (i = 0; i < nelt2 - 1; ++i)
28364     if (ipar[i] + 1 != ipar[i + 1])
28365       return 0;
28366   for (i = nelt2; i < nelt - 1; ++i)
28367     if (ipar[i] + 1 != ipar[i + 1])
28368       return 0;
28369
28370   /* Reconstruct the mask.  */
28371   for (i = 0; i < 2; ++i)
28372     {
28373       unsigned e = ipar[i * nelt2];
28374       if (e % nelt2)
28375         return 0;
28376       e /= nelt2;
28377       mask |= e << (i * 4);
28378     }
28379
28380   /* Make sure success has a non-zero value by adding one.  */
28381   return mask + 1;
28382 }
28383 \f
28384
28385 /* Store OPERAND to the memory after reload is completed.  This means
28386    that we can't easily use assign_stack_local.  */
28387 rtx
28388 ix86_force_to_memory (enum machine_mode mode, rtx operand)
28389 {
28390   rtx result;
28391
28392   gcc_assert (reload_completed);
28393   if (ix86_using_red_zone ())
28394     {
28395       result = gen_rtx_MEM (mode,
28396                             gen_rtx_PLUS (Pmode,
28397                                           stack_pointer_rtx,
28398                                           GEN_INT (-RED_ZONE_SIZE)));
28399       emit_move_insn (result, operand);
28400     }
28401   else if (TARGET_64BIT)
28402     {
28403       switch (mode)
28404         {
28405         case HImode:
28406         case SImode:
28407           operand = gen_lowpart (DImode, operand);
28408           /* FALLTHRU */
28409         case DImode:
28410           emit_insn (
28411                       gen_rtx_SET (VOIDmode,
28412                                    gen_rtx_MEM (DImode,
28413                                                 gen_rtx_PRE_DEC (DImode,
28414                                                         stack_pointer_rtx)),
28415                                    operand));
28416           break;
28417         default:
28418           gcc_unreachable ();
28419         }
28420       result = gen_rtx_MEM (mode, stack_pointer_rtx);
28421     }
28422   else
28423     {
28424       switch (mode)
28425         {
28426         case DImode:
28427           {
28428             rtx operands[2];
28429             split_double_mode (mode, &operand, 1, operands, operands + 1);
28430             emit_insn (
28431                         gen_rtx_SET (VOIDmode,
28432                                      gen_rtx_MEM (SImode,
28433                                                   gen_rtx_PRE_DEC (Pmode,
28434                                                         stack_pointer_rtx)),
28435                                      operands[1]));
28436             emit_insn (
28437                         gen_rtx_SET (VOIDmode,
28438                                      gen_rtx_MEM (SImode,
28439                                                   gen_rtx_PRE_DEC (Pmode,
28440                                                         stack_pointer_rtx)),
28441                                      operands[0]));
28442           }
28443           break;
28444         case HImode:
28445           /* Store HImodes as SImodes.  */
28446           operand = gen_lowpart (SImode, operand);
28447           /* FALLTHRU */
28448         case SImode:
28449           emit_insn (
28450                       gen_rtx_SET (VOIDmode,
28451                                    gen_rtx_MEM (GET_MODE (operand),
28452                                                 gen_rtx_PRE_DEC (SImode,
28453                                                         stack_pointer_rtx)),
28454                                    operand));
28455           break;
28456         default:
28457           gcc_unreachable ();
28458         }
28459       result = gen_rtx_MEM (mode, stack_pointer_rtx);
28460     }
28461   return result;
28462 }
28463
28464 /* Free operand from the memory.  */
28465 void
28466 ix86_free_from_memory (enum machine_mode mode)
28467 {
28468   if (!ix86_using_red_zone ())
28469     {
28470       int size;
28471
28472       if (mode == DImode || TARGET_64BIT)
28473         size = 8;
28474       else
28475         size = 4;
28476       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
28477          to pop or add instruction if registers are available.  */
28478       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
28479                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
28480                                             GEN_INT (size))));
28481     }
28482 }
28483
28484 /* Implement TARGET_PREFERRED_RELOAD_CLASS.
28485
28486    Put float CONST_DOUBLE in the constant pool instead of fp regs.
28487    QImode must go into class Q_REGS.
28488    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
28489    movdf to do mem-to-mem moves through integer regs.  */
28490
28491 static reg_class_t
28492 ix86_preferred_reload_class (rtx x, reg_class_t regclass)
28493 {
28494   enum machine_mode mode = GET_MODE (x);
28495
28496   /* We're only allowed to return a subclass of CLASS.  Many of the
28497      following checks fail for NO_REGS, so eliminate that early.  */
28498   if (regclass == NO_REGS)
28499     return NO_REGS;
28500
28501   /* All classes can load zeros.  */
28502   if (x == CONST0_RTX (mode))
28503     return regclass;
28504
28505   /* Force constants into memory if we are loading a (nonzero) constant into
28506      an MMX or SSE register.  This is because there are no MMX/SSE instructions
28507      to load from a constant.  */
28508   if (CONSTANT_P (x)
28509       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
28510     return NO_REGS;
28511
28512   /* Prefer SSE regs only, if we can use them for math.  */
28513   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
28514     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
28515
28516   /* Floating-point constants need more complex checks.  */
28517   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
28518     {
28519       /* General regs can load everything.  */
28520       if (reg_class_subset_p (regclass, GENERAL_REGS))
28521         return regclass;
28522
28523       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
28524          zero above.  We only want to wind up preferring 80387 registers if
28525          we plan on doing computation with them.  */
28526       if (TARGET_80387
28527           && standard_80387_constant_p (x))
28528         {
28529           /* Limit class to non-sse.  */
28530           if (regclass == FLOAT_SSE_REGS)
28531             return FLOAT_REGS;
28532           if (regclass == FP_TOP_SSE_REGS)
28533             return FP_TOP_REG;
28534           if (regclass == FP_SECOND_SSE_REGS)
28535             return FP_SECOND_REG;
28536           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
28537             return regclass;
28538         }
28539
28540       return NO_REGS;
28541     }
28542
28543   /* Generally when we see PLUS here, it's the function invariant
28544      (plus soft-fp const_int).  Which can only be computed into general
28545      regs.  */
28546   if (GET_CODE (x) == PLUS)
28547     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
28548
28549   /* QImode constants are easy to load, but non-constant QImode data
28550      must go into Q_REGS.  */
28551   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
28552     {
28553       if (reg_class_subset_p (regclass, Q_REGS))
28554         return regclass;
28555       if (reg_class_subset_p (Q_REGS, regclass))
28556         return Q_REGS;
28557       return NO_REGS;
28558     }
28559
28560   return regclass;
28561 }
28562
28563 /* Discourage putting floating-point values in SSE registers unless
28564    SSE math is being used, and likewise for the 387 registers.  */
28565 static reg_class_t
28566 ix86_preferred_output_reload_class (rtx x, reg_class_t regclass)
28567 {
28568   enum machine_mode mode = GET_MODE (x);
28569
28570   /* Restrict the output reload class to the register bank that we are doing
28571      math on.  If we would like not to return a subset of CLASS, reject this
28572      alternative: if reload cannot do this, it will still use its choice.  */
28573   mode = GET_MODE (x);
28574   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
28575     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
28576
28577   if (X87_FLOAT_MODE_P (mode))
28578     {
28579       if (regclass == FP_TOP_SSE_REGS)
28580         return FP_TOP_REG;
28581       else if (regclass == FP_SECOND_SSE_REGS)
28582         return FP_SECOND_REG;
28583       else
28584         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
28585     }
28586
28587   return regclass;
28588 }
28589
28590 static reg_class_t
28591 ix86_secondary_reload (bool in_p, rtx x, reg_class_t rclass,
28592                        enum machine_mode mode,
28593                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
28594 {
28595   /* QImode spills from non-QI registers require
28596      intermediate register on 32bit targets.  */
28597   if (!TARGET_64BIT
28598       && !in_p && mode == QImode
28599       && (rclass == GENERAL_REGS
28600           || rclass == LEGACY_REGS
28601           || rclass == INDEX_REGS))
28602     {
28603       int regno;
28604
28605       if (REG_P (x))
28606         regno = REGNO (x);
28607       else
28608         regno = -1;
28609
28610       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
28611         regno = true_regnum (x);
28612
28613       /* Return Q_REGS if the operand is in memory.  */
28614       if (regno == -1)
28615         return Q_REGS;
28616     }
28617
28618   /* This condition handles corner case where an expression involving
28619      pointers gets vectorized.  We're trying to use the address of a
28620      stack slot as a vector initializer.  
28621
28622      (set (reg:V2DI 74 [ vect_cst_.2 ])
28623           (vec_duplicate:V2DI (reg/f:DI 20 frame)))
28624
28625      Eventually frame gets turned into sp+offset like this:
28626
28627      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28628           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
28629                                        (const_int 392 [0x188]))))
28630
28631      That later gets turned into:
28632
28633      (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28634           (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
28635             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))))
28636
28637      We'll have the following reload recorded:
28638
28639      Reload 0: reload_in (DI) =
28640            (plus:DI (reg/f:DI 7 sp)
28641             (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))
28642      reload_out (V2DI) = (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28643      SSE_REGS, RELOAD_OTHER (opnum = 0), can't combine
28644      reload_in_reg: (plus:DI (reg/f:DI 7 sp) (const_int 392 [0x188]))
28645      reload_out_reg: (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
28646      reload_reg_rtx: (reg:V2DI 22 xmm1)
28647
28648      Which isn't going to work since SSE instructions can't handle scalar
28649      additions.  Returning GENERAL_REGS forces the addition into integer
28650      register and reload can handle subsequent reloads without problems.  */
28651
28652   if (in_p && GET_CODE (x) == PLUS
28653       && SSE_CLASS_P (rclass)
28654       && SCALAR_INT_MODE_P (mode))
28655     return GENERAL_REGS;
28656
28657   return NO_REGS;
28658 }
28659
28660 /* Implement TARGET_CLASS_LIKELY_SPILLED_P.  */
28661
28662 static bool
28663 ix86_class_likely_spilled_p (reg_class_t rclass)
28664 {
28665   switch (rclass)
28666     {
28667       case AREG:
28668       case DREG:
28669       case CREG:
28670       case BREG:
28671       case AD_REGS:
28672       case SIREG:
28673       case DIREG:
28674       case SSE_FIRST_REG:
28675       case FP_TOP_REG:
28676       case FP_SECOND_REG:
28677         return true;
28678
28679       default:
28680         break;
28681     }
28682
28683   return false;
28684 }
28685
28686 /* If we are copying between general and FP registers, we need a memory
28687    location. The same is true for SSE and MMX registers.
28688
28689    To optimize register_move_cost performance, allow inline variant.
28690
28691    The macro can't work reliably when one of the CLASSES is class containing
28692    registers from multiple units (SSE, MMX, integer).  We avoid this by never
28693    combining those units in single alternative in the machine description.
28694    Ensure that this constraint holds to avoid unexpected surprises.
28695
28696    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
28697    enforce these sanity checks.  */
28698
28699 static inline bool
28700 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
28701                                 enum machine_mode mode, int strict)
28702 {
28703   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
28704       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
28705       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
28706       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
28707       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
28708       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
28709     {
28710       gcc_assert (!strict);
28711       return true;
28712     }
28713
28714   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
28715     return true;
28716
28717   /* ??? This is a lie.  We do have moves between mmx/general, and for
28718      mmx/sse2.  But by saying we need secondary memory we discourage the
28719      register allocator from using the mmx registers unless needed.  */
28720   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
28721     return true;
28722
28723   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
28724     {
28725       /* SSE1 doesn't have any direct moves from other classes.  */
28726       if (!TARGET_SSE2)
28727         return true;
28728
28729       /* If the target says that inter-unit moves are more expensive
28730          than moving through memory, then don't generate them.  */
28731       if (!TARGET_INTER_UNIT_MOVES)
28732         return true;
28733
28734       /* Between SSE and general, we have moves no larger than word size.  */
28735       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
28736         return true;
28737     }
28738
28739   return false;
28740 }
28741
28742 bool
28743 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
28744                               enum machine_mode mode, int strict)
28745 {
28746   return inline_secondary_memory_needed (class1, class2, mode, strict);
28747 }
28748
28749 /* Return true if the registers in CLASS cannot represent the change from
28750    modes FROM to TO.  */
28751
28752 bool
28753 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
28754                                enum reg_class regclass)
28755 {
28756   if (from == to)
28757     return false;
28758
28759   /* x87 registers can't do subreg at all, as all values are reformatted
28760      to extended precision.  */
28761   if (MAYBE_FLOAT_CLASS_P (regclass))
28762     return true;
28763
28764   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
28765     {
28766       /* Vector registers do not support QI or HImode loads.  If we don't
28767          disallow a change to these modes, reload will assume it's ok to
28768          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
28769          the vec_dupv4hi pattern.  */
28770       if (GET_MODE_SIZE (from) < 4)
28771         return true;
28772
28773       /* Vector registers do not support subreg with nonzero offsets, which
28774          are otherwise valid for integer registers.  Since we can't see
28775          whether we have a nonzero offset from here, prohibit all
28776          nonparadoxical subregs changing size.  */
28777       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
28778         return true;
28779     }
28780
28781   return false;
28782 }
28783
28784 /* Return the cost of moving data of mode M between a
28785    register and memory.  A value of 2 is the default; this cost is
28786    relative to those in `REGISTER_MOVE_COST'.
28787
28788    This function is used extensively by register_move_cost that is used to
28789    build tables at startup.  Make it inline in this case.
28790    When IN is 2, return maximum of in and out move cost.
28791
28792    If moving between registers and memory is more expensive than
28793    between two registers, you should define this macro to express the
28794    relative cost.
28795
28796    Model also increased moving costs of QImode registers in non
28797    Q_REGS classes.
28798  */
28799 static inline int
28800 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
28801                          int in)
28802 {
28803   int cost;
28804   if (FLOAT_CLASS_P (regclass))
28805     {
28806       int index;
28807       switch (mode)
28808         {
28809           case SFmode:
28810             index = 0;
28811             break;
28812           case DFmode:
28813             index = 1;
28814             break;
28815           case XFmode:
28816             index = 2;
28817             break;
28818           default:
28819             return 100;
28820         }
28821       if (in == 2)
28822         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
28823       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
28824     }
28825   if (SSE_CLASS_P (regclass))
28826     {
28827       int index;
28828       switch (GET_MODE_SIZE (mode))
28829         {
28830           case 4:
28831             index = 0;
28832             break;
28833           case 8:
28834             index = 1;
28835             break;
28836           case 16:
28837             index = 2;
28838             break;
28839           default:
28840             return 100;
28841         }
28842       if (in == 2)
28843         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
28844       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
28845     }
28846   if (MMX_CLASS_P (regclass))
28847     {
28848       int index;
28849       switch (GET_MODE_SIZE (mode))
28850         {
28851           case 4:
28852             index = 0;
28853             break;
28854           case 8:
28855             index = 1;
28856             break;
28857           default:
28858             return 100;
28859         }
28860       if (in)
28861         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
28862       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
28863     }
28864   switch (GET_MODE_SIZE (mode))
28865     {
28866       case 1:
28867         if (Q_CLASS_P (regclass) || TARGET_64BIT)
28868           {
28869             if (!in)
28870               return ix86_cost->int_store[0];
28871             if (TARGET_PARTIAL_REG_DEPENDENCY
28872                 && optimize_function_for_speed_p (cfun))
28873               cost = ix86_cost->movzbl_load;
28874             else
28875               cost = ix86_cost->int_load[0];
28876             if (in == 2)
28877               return MAX (cost, ix86_cost->int_store[0]);
28878             return cost;
28879           }
28880         else
28881           {
28882            if (in == 2)
28883              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
28884            if (in)
28885              return ix86_cost->movzbl_load;
28886            else
28887              return ix86_cost->int_store[0] + 4;
28888           }
28889         break;
28890       case 2:
28891         if (in == 2)
28892           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
28893         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
28894       default:
28895         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
28896         if (mode == TFmode)
28897           mode = XFmode;
28898         if (in == 2)
28899           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
28900         else if (in)
28901           cost = ix86_cost->int_load[2];
28902         else
28903           cost = ix86_cost->int_store[2];
28904         return (cost * (((int) GET_MODE_SIZE (mode)
28905                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
28906     }
28907 }
28908
28909 static int
28910 ix86_memory_move_cost (enum machine_mode mode, reg_class_t regclass,
28911                        bool in)
28912 {
28913   return inline_memory_move_cost (mode, (enum reg_class) regclass, in ? 1 : 0);
28914 }
28915
28916
28917 /* Return the cost of moving data from a register in class CLASS1 to
28918    one in class CLASS2.
28919
28920    It is not required that the cost always equal 2 when FROM is the same as TO;
28921    on some machines it is expensive to move between registers if they are not
28922    general registers.  */
28923
28924 static int
28925 ix86_register_move_cost (enum machine_mode mode, reg_class_t class1_i,
28926                          reg_class_t class2_i)
28927 {
28928   enum reg_class class1 = (enum reg_class) class1_i;
28929   enum reg_class class2 = (enum reg_class) class2_i;
28930
28931   /* In case we require secondary memory, compute cost of the store followed
28932      by load.  In order to avoid bad register allocation choices, we need
28933      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
28934
28935   if (inline_secondary_memory_needed (class1, class2, mode, 0))
28936     {
28937       int cost = 1;
28938
28939       cost += inline_memory_move_cost (mode, class1, 2);
28940       cost += inline_memory_move_cost (mode, class2, 2);
28941
28942       /* In case of copying from general_purpose_register we may emit multiple
28943          stores followed by single load causing memory size mismatch stall.
28944          Count this as arbitrarily high cost of 20.  */
28945       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
28946         cost += 20;
28947
28948       /* In the case of FP/MMX moves, the registers actually overlap, and we
28949          have to switch modes in order to treat them differently.  */
28950       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
28951           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
28952         cost += 20;
28953
28954       return cost;
28955     }
28956
28957   /* Moves between SSE/MMX and integer unit are expensive.  */
28958   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
28959       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
28960
28961     /* ??? By keeping returned value relatively high, we limit the number
28962        of moves between integer and MMX/SSE registers for all targets.
28963        Additionally, high value prevents problem with x86_modes_tieable_p(),
28964        where integer modes in MMX/SSE registers are not tieable
28965        because of missing QImode and HImode moves to, from or between
28966        MMX/SSE registers.  */
28967     return MAX (8, ix86_cost->mmxsse_to_integer);
28968
28969   if (MAYBE_FLOAT_CLASS_P (class1))
28970     return ix86_cost->fp_move;
28971   if (MAYBE_SSE_CLASS_P (class1))
28972     return ix86_cost->sse_move;
28973   if (MAYBE_MMX_CLASS_P (class1))
28974     return ix86_cost->mmx_move;
28975   return 2;
28976 }
28977
28978 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
28979
28980 bool
28981 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
28982 {
28983   /* Flags and only flags can only hold CCmode values.  */
28984   if (CC_REGNO_P (regno))
28985     return GET_MODE_CLASS (mode) == MODE_CC;
28986   if (GET_MODE_CLASS (mode) == MODE_CC
28987       || GET_MODE_CLASS (mode) == MODE_RANDOM
28988       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
28989     return 0;
28990   if (FP_REGNO_P (regno))
28991     return VALID_FP_MODE_P (mode);
28992   if (SSE_REGNO_P (regno))
28993     {
28994       /* We implement the move patterns for all vector modes into and
28995          out of SSE registers, even when no operation instructions
28996          are available.  OImode move is available only when AVX is
28997          enabled.  */
28998       return ((TARGET_AVX && mode == OImode)
28999               || VALID_AVX256_REG_MODE (mode)
29000               || VALID_SSE_REG_MODE (mode)
29001               || VALID_SSE2_REG_MODE (mode)
29002               || VALID_MMX_REG_MODE (mode)
29003               || VALID_MMX_REG_MODE_3DNOW (mode));
29004     }
29005   if (MMX_REGNO_P (regno))
29006     {
29007       /* We implement the move patterns for 3DNOW modes even in MMX mode,
29008          so if the register is available at all, then we can move data of
29009          the given mode into or out of it.  */
29010       return (VALID_MMX_REG_MODE (mode)
29011               || VALID_MMX_REG_MODE_3DNOW (mode));
29012     }
29013
29014   if (mode == QImode)
29015     {
29016       /* Take care for QImode values - they can be in non-QI regs,
29017          but then they do cause partial register stalls.  */
29018       if (regno <= BX_REG || TARGET_64BIT)
29019         return 1;
29020       if (!TARGET_PARTIAL_REG_STALL)
29021         return 1;
29022       return reload_in_progress || reload_completed;
29023     }
29024   /* We handle both integer and floats in the general purpose registers.  */
29025   else if (VALID_INT_MODE_P (mode))
29026     return 1;
29027   else if (VALID_FP_MODE_P (mode))
29028     return 1;
29029   else if (VALID_DFP_MODE_P (mode))
29030     return 1;
29031   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
29032      on to use that value in smaller contexts, this can easily force a
29033      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
29034      supporting DImode, allow it.  */
29035   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
29036     return 1;
29037
29038   return 0;
29039 }
29040
29041 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
29042    tieable integer mode.  */
29043
29044 static bool
29045 ix86_tieable_integer_mode_p (enum machine_mode mode)
29046 {
29047   switch (mode)
29048     {
29049     case HImode:
29050     case SImode:
29051       return true;
29052
29053     case QImode:
29054       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
29055
29056     case DImode:
29057       return TARGET_64BIT;
29058
29059     default:
29060       return false;
29061     }
29062 }
29063
29064 /* Return true if MODE1 is accessible in a register that can hold MODE2
29065    without copying.  That is, all register classes that can hold MODE2
29066    can also hold MODE1.  */
29067
29068 bool
29069 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
29070 {
29071   if (mode1 == mode2)
29072     return true;
29073
29074   if (ix86_tieable_integer_mode_p (mode1)
29075       && ix86_tieable_integer_mode_p (mode2))
29076     return true;
29077
29078   /* MODE2 being XFmode implies fp stack or general regs, which means we
29079      can tie any smaller floating point modes to it.  Note that we do not
29080      tie this with TFmode.  */
29081   if (mode2 == XFmode)
29082     return mode1 == SFmode || mode1 == DFmode;
29083
29084   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
29085      that we can tie it with SFmode.  */
29086   if (mode2 == DFmode)
29087     return mode1 == SFmode;
29088
29089   /* If MODE2 is only appropriate for an SSE register, then tie with
29090      any other mode acceptable to SSE registers.  */
29091   if (GET_MODE_SIZE (mode2) == 16
29092       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
29093     return (GET_MODE_SIZE (mode1) == 16
29094             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
29095
29096   /* If MODE2 is appropriate for an MMX register, then tie
29097      with any other mode acceptable to MMX registers.  */
29098   if (GET_MODE_SIZE (mode2) == 8
29099       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
29100     return (GET_MODE_SIZE (mode1) == 8
29101             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
29102
29103   return false;
29104 }
29105
29106 /* Compute a (partial) cost for rtx X.  Return true if the complete
29107    cost has been computed, and false if subexpressions should be
29108    scanned.  In either case, *TOTAL contains the cost result.  */
29109
29110 static bool
29111 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
29112 {
29113   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
29114   enum machine_mode mode = GET_MODE (x);
29115   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
29116
29117   switch (code)
29118     {
29119     case CONST_INT:
29120     case CONST:
29121     case LABEL_REF:
29122     case SYMBOL_REF:
29123       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
29124         *total = 3;
29125       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
29126         *total = 2;
29127       else if (flag_pic && SYMBOLIC_CONST (x)
29128                && (!TARGET_64BIT
29129                    || (!GET_CODE (x) != LABEL_REF
29130                        && (GET_CODE (x) != SYMBOL_REF
29131                            || !SYMBOL_REF_LOCAL_P (x)))))
29132         *total = 1;
29133       else
29134         *total = 0;
29135       return true;
29136
29137     case CONST_DOUBLE:
29138       if (mode == VOIDmode)
29139         *total = 0;
29140       else
29141         switch (standard_80387_constant_p (x))
29142           {
29143           case 1: /* 0.0 */
29144             *total = 1;
29145             break;
29146           default: /* Other constants */
29147             *total = 2;
29148             break;
29149           case 0:
29150           case -1:
29151             /* Start with (MEM (SYMBOL_REF)), since that's where
29152                it'll probably end up.  Add a penalty for size.  */
29153             *total = (COSTS_N_INSNS (1)
29154                       + (flag_pic != 0 && !TARGET_64BIT)
29155                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
29156             break;
29157           }
29158       return true;
29159
29160     case ZERO_EXTEND:
29161       /* The zero extensions is often completely free on x86_64, so make
29162          it as cheap as possible.  */
29163       if (TARGET_64BIT && mode == DImode
29164           && GET_MODE (XEXP (x, 0)) == SImode)
29165         *total = 1;
29166       else if (TARGET_ZERO_EXTEND_WITH_AND)
29167         *total = cost->add;
29168       else
29169         *total = cost->movzx;
29170       return false;
29171
29172     case SIGN_EXTEND:
29173       *total = cost->movsx;
29174       return false;
29175
29176     case ASHIFT:
29177       if (CONST_INT_P (XEXP (x, 1))
29178           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
29179         {
29180           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
29181           if (value == 1)
29182             {
29183               *total = cost->add;
29184               return false;
29185             }
29186           if ((value == 2 || value == 3)
29187               && cost->lea <= cost->shift_const)
29188             {
29189               *total = cost->lea;
29190               return false;
29191             }
29192         }
29193       /* FALLTHRU */
29194
29195     case ROTATE:
29196     case ASHIFTRT:
29197     case LSHIFTRT:
29198     case ROTATERT:
29199       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
29200         {
29201           if (CONST_INT_P (XEXP (x, 1)))
29202             {
29203               if (INTVAL (XEXP (x, 1)) > 32)
29204                 *total = cost->shift_const + COSTS_N_INSNS (2);
29205               else
29206                 *total = cost->shift_const * 2;
29207             }
29208           else
29209             {
29210               if (GET_CODE (XEXP (x, 1)) == AND)
29211                 *total = cost->shift_var * 2;
29212               else
29213                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
29214             }
29215         }
29216       else
29217         {
29218           if (CONST_INT_P (XEXP (x, 1)))
29219             *total = cost->shift_const;
29220           else
29221             *total = cost->shift_var;
29222         }
29223       return false;
29224
29225     case FMA:
29226       {
29227         rtx sub;
29228
29229         gcc_assert (FLOAT_MODE_P (mode));
29230         gcc_assert (TARGET_FMA || TARGET_FMA4);
29231
29232         /* ??? SSE scalar/vector cost should be used here.  */
29233         /* ??? Bald assumption that fma has the same cost as fmul.  */
29234         *total = cost->fmul;
29235         *total += rtx_cost (XEXP (x, 1), FMA, speed);
29236
29237         /* Negate in op0 or op2 is free: FMS, FNMA, FNMS.  */
29238         sub = XEXP (x, 0);
29239         if (GET_CODE (sub) == NEG)
29240           sub = XEXP (x, 0);
29241         *total += rtx_cost (sub, FMA, speed);
29242
29243         sub = XEXP (x, 2);
29244         if (GET_CODE (sub) == NEG)
29245           sub = XEXP (x, 0);
29246         *total += rtx_cost (sub, FMA, speed);
29247         return true;
29248       }
29249
29250     case MULT:
29251       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29252         {
29253           /* ??? SSE scalar cost should be used here.  */
29254           *total = cost->fmul;
29255           return false;
29256         }
29257       else if (X87_FLOAT_MODE_P (mode))
29258         {
29259           *total = cost->fmul;
29260           return false;
29261         }
29262       else if (FLOAT_MODE_P (mode))
29263         {
29264           /* ??? SSE vector cost should be used here.  */
29265           *total = cost->fmul;
29266           return false;
29267         }
29268       else
29269         {
29270           rtx op0 = XEXP (x, 0);
29271           rtx op1 = XEXP (x, 1);
29272           int nbits;
29273           if (CONST_INT_P (XEXP (x, 1)))
29274             {
29275               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
29276               for (nbits = 0; value != 0; value &= value - 1)
29277                 nbits++;
29278             }
29279           else
29280             /* This is arbitrary.  */
29281             nbits = 7;
29282
29283           /* Compute costs correctly for widening multiplication.  */
29284           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
29285               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
29286                  == GET_MODE_SIZE (mode))
29287             {
29288               int is_mulwiden = 0;
29289               enum machine_mode inner_mode = GET_MODE (op0);
29290
29291               if (GET_CODE (op0) == GET_CODE (op1))
29292                 is_mulwiden = 1, op1 = XEXP (op1, 0);
29293               else if (CONST_INT_P (op1))
29294                 {
29295                   if (GET_CODE (op0) == SIGN_EXTEND)
29296                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
29297                                   == INTVAL (op1);
29298                   else
29299                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
29300                 }
29301
29302               if (is_mulwiden)
29303                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
29304             }
29305
29306           *total = (cost->mult_init[MODE_INDEX (mode)]
29307                     + nbits * cost->mult_bit
29308                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
29309
29310           return true;
29311         }
29312
29313     case DIV:
29314     case UDIV:
29315     case MOD:
29316     case UMOD:
29317       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29318         /* ??? SSE cost should be used here.  */
29319         *total = cost->fdiv;
29320       else if (X87_FLOAT_MODE_P (mode))
29321         *total = cost->fdiv;
29322       else if (FLOAT_MODE_P (mode))
29323         /* ??? SSE vector cost should be used here.  */
29324         *total = cost->fdiv;
29325       else
29326         *total = cost->divide[MODE_INDEX (mode)];
29327       return false;
29328
29329     case PLUS:
29330       if (GET_MODE_CLASS (mode) == MODE_INT
29331                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
29332         {
29333           if (GET_CODE (XEXP (x, 0)) == PLUS
29334               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
29335               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
29336               && CONSTANT_P (XEXP (x, 1)))
29337             {
29338               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
29339               if (val == 2 || val == 4 || val == 8)
29340                 {
29341                   *total = cost->lea;
29342                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
29343                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
29344                                       outer_code, speed);
29345                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29346                   return true;
29347                 }
29348             }
29349           else if (GET_CODE (XEXP (x, 0)) == MULT
29350                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
29351             {
29352               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
29353               if (val == 2 || val == 4 || val == 8)
29354                 {
29355                   *total = cost->lea;
29356                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
29357                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29358                   return true;
29359                 }
29360             }
29361           else if (GET_CODE (XEXP (x, 0)) == PLUS)
29362             {
29363               *total = cost->lea;
29364               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
29365               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
29366               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
29367               return true;
29368             }
29369         }
29370       /* FALLTHRU */
29371
29372     case MINUS:
29373       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29374         {
29375           /* ??? SSE cost should be used here.  */
29376           *total = cost->fadd;
29377           return false;
29378         }
29379       else if (X87_FLOAT_MODE_P (mode))
29380         {
29381           *total = cost->fadd;
29382           return false;
29383         }
29384       else if (FLOAT_MODE_P (mode))
29385         {
29386           /* ??? SSE vector cost should be used here.  */
29387           *total = cost->fadd;
29388           return false;
29389         }
29390       /* FALLTHRU */
29391
29392     case AND:
29393     case IOR:
29394     case XOR:
29395       if (!TARGET_64BIT && mode == DImode)
29396         {
29397           *total = (cost->add * 2
29398                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
29399                        << (GET_MODE (XEXP (x, 0)) != DImode))
29400                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
29401                        << (GET_MODE (XEXP (x, 1)) != DImode)));
29402           return true;
29403         }
29404       /* FALLTHRU */
29405
29406     case NEG:
29407       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29408         {
29409           /* ??? SSE cost should be used here.  */
29410           *total = cost->fchs;
29411           return false;
29412         }
29413       else if (X87_FLOAT_MODE_P (mode))
29414         {
29415           *total = cost->fchs;
29416           return false;
29417         }
29418       else if (FLOAT_MODE_P (mode))
29419         {
29420           /* ??? SSE vector cost should be used here.  */
29421           *total = cost->fchs;
29422           return false;
29423         }
29424       /* FALLTHRU */
29425
29426     case NOT:
29427       if (!TARGET_64BIT && mode == DImode)
29428         *total = cost->add * 2;
29429       else
29430         *total = cost->add;
29431       return false;
29432
29433     case COMPARE:
29434       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
29435           && XEXP (XEXP (x, 0), 1) == const1_rtx
29436           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
29437           && XEXP (x, 1) == const0_rtx)
29438         {
29439           /* This kind of construct is implemented using test[bwl].
29440              Treat it as if we had an AND.  */
29441           *total = (cost->add
29442                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
29443                     + rtx_cost (const1_rtx, outer_code, speed));
29444           return true;
29445         }
29446       return false;
29447
29448     case FLOAT_EXTEND:
29449       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
29450         *total = 0;
29451       return false;
29452
29453     case ABS:
29454       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29455         /* ??? SSE cost should be used here.  */
29456         *total = cost->fabs;
29457       else if (X87_FLOAT_MODE_P (mode))
29458         *total = cost->fabs;
29459       else if (FLOAT_MODE_P (mode))
29460         /* ??? SSE vector cost should be used here.  */
29461         *total = cost->fabs;
29462       return false;
29463
29464     case SQRT:
29465       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
29466         /* ??? SSE cost should be used here.  */
29467         *total = cost->fsqrt;
29468       else if (X87_FLOAT_MODE_P (mode))
29469         *total = cost->fsqrt;
29470       else if (FLOAT_MODE_P (mode))
29471         /* ??? SSE vector cost should be used here.  */
29472         *total = cost->fsqrt;
29473       return false;
29474
29475     case UNSPEC:
29476       if (XINT (x, 1) == UNSPEC_TP)
29477         *total = 0;
29478       return false;
29479
29480     case VEC_SELECT:
29481     case VEC_CONCAT:
29482     case VEC_MERGE:
29483     case VEC_DUPLICATE:
29484       /* ??? Assume all of these vector manipulation patterns are
29485          recognizable.  In which case they all pretty much have the
29486          same cost.  */
29487      *total = COSTS_N_INSNS (1);
29488      return true;
29489
29490     default:
29491       return false;
29492     }
29493 }
29494
29495 #if TARGET_MACHO
29496
29497 static int current_machopic_label_num;
29498
29499 /* Given a symbol name and its associated stub, write out the
29500    definition of the stub.  */
29501
29502 void
29503 machopic_output_stub (FILE *file, const char *symb, const char *stub)
29504 {
29505   unsigned int length;
29506   char *binder_name, *symbol_name, lazy_ptr_name[32];
29507   int label = ++current_machopic_label_num;
29508
29509   /* For 64-bit we shouldn't get here.  */
29510   gcc_assert (!TARGET_64BIT);
29511
29512   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
29513   symb = targetm.strip_name_encoding (symb);
29514
29515   length = strlen (stub);
29516   binder_name = XALLOCAVEC (char, length + 32);
29517   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
29518
29519   length = strlen (symb);
29520   symbol_name = XALLOCAVEC (char, length + 32);
29521   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
29522
29523   sprintf (lazy_ptr_name, "L%d$lz", label);
29524
29525   if (MACHOPIC_ATT_STUB)
29526     switch_to_section (darwin_sections[machopic_picsymbol_stub3_section]);
29527   else if (MACHOPIC_PURE)
29528     {
29529       if (TARGET_DEEP_BRANCH_PREDICTION)
29530         switch_to_section (darwin_sections[machopic_picsymbol_stub2_section]);
29531       else
29532     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
29533     }
29534   else
29535     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
29536
29537   fprintf (file, "%s:\n", stub);
29538   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
29539
29540   if (MACHOPIC_ATT_STUB)
29541     {
29542       fprintf (file, "\thlt ; hlt ; hlt ; hlt ; hlt\n");
29543     }
29544   else if (MACHOPIC_PURE)
29545     {
29546       /* PIC stub.  */
29547       if (TARGET_DEEP_BRANCH_PREDICTION)
29548         {
29549           /* 25-byte PIC stub using "CALL get_pc_thunk".  */
29550           rtx tmp = gen_rtx_REG (SImode, 2 /* ECX */);
29551           output_set_got (tmp, NULL_RTX);       /* "CALL ___<cpu>.get_pc_thunk.cx".  */
29552           fprintf (file, "LPC$%d:\tmovl\t%s-LPC$%d(%%ecx),%%ecx\n", label, lazy_ptr_name, label);
29553         }
29554       else
29555         {
29556           /* 26-byte PIC stub using inline picbase: "CALL L42 ! L42: pop %eax".  */
29557           fprintf (file, "\tcall LPC$%d\nLPC$%d:\tpopl %%ecx\n", label, label);
29558           fprintf (file, "\tmovl %s-LPC$%d(%%ecx),%%ecx\n", lazy_ptr_name, label);
29559         }
29560       fprintf (file, "\tjmp\t*%%ecx\n");
29561     }
29562   else
29563     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
29564
29565   /* The AT&T-style ("self-modifying") stub is not lazily bound, thus
29566      it needs no stub-binding-helper.  */
29567   if (MACHOPIC_ATT_STUB)
29568     return;
29569
29570   fprintf (file, "%s:\n", binder_name);
29571
29572   if (MACHOPIC_PURE)
29573     {
29574       fprintf (file, "\tlea\t%s-%s(%%ecx),%%ecx\n", lazy_ptr_name, binder_name);
29575       fprintf (file, "\tpushl\t%%ecx\n");
29576     }
29577   else
29578     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
29579
29580   fputs ("\tjmp\tdyld_stub_binding_helper\n", file);
29581
29582   /* N.B. Keep the correspondence of these
29583      'symbol_ptr/symbol_ptr2/symbol_ptr3' sections consistent with the
29584      old-pic/new-pic/non-pic stubs; altering this will break
29585      compatibility with existing dylibs.  */
29586   if (MACHOPIC_PURE)
29587     {
29588       /* PIC stubs.  */
29589       if (TARGET_DEEP_BRANCH_PREDICTION)
29590         /* 25-byte PIC stub using "CALL get_pc_thunk".  */
29591         switch_to_section (darwin_sections[machopic_lazy_symbol_ptr2_section]);
29592       else
29593         /* 26-byte PIC stub using inline picbase: "CALL L42 ! L42: pop %ebx".  */
29594   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
29595     }
29596   else
29597     /* 16-byte -mdynamic-no-pic stub.  */
29598     switch_to_section(darwin_sections[machopic_lazy_symbol_ptr3_section]);
29599
29600   fprintf (file, "%s:\n", lazy_ptr_name);
29601   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
29602   fprintf (file, ASM_LONG "%s\n", binder_name);
29603 }
29604 #endif /* TARGET_MACHO */
29605
29606 /* Order the registers for register allocator.  */
29607
29608 void
29609 x86_order_regs_for_local_alloc (void)
29610 {
29611    int pos = 0;
29612    int i;
29613
29614    /* First allocate the local general purpose registers.  */
29615    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
29616      if (GENERAL_REGNO_P (i) && call_used_regs[i])
29617         reg_alloc_order [pos++] = i;
29618
29619    /* Global general purpose registers.  */
29620    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
29621      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
29622         reg_alloc_order [pos++] = i;
29623
29624    /* x87 registers come first in case we are doing FP math
29625       using them.  */
29626    if (!TARGET_SSE_MATH)
29627      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
29628        reg_alloc_order [pos++] = i;
29629
29630    /* SSE registers.  */
29631    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
29632      reg_alloc_order [pos++] = i;
29633    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
29634      reg_alloc_order [pos++] = i;
29635
29636    /* x87 registers.  */
29637    if (TARGET_SSE_MATH)
29638      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
29639        reg_alloc_order [pos++] = i;
29640
29641    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
29642      reg_alloc_order [pos++] = i;
29643
29644    /* Initialize the rest of array as we do not allocate some registers
29645       at all.  */
29646    while (pos < FIRST_PSEUDO_REGISTER)
29647      reg_alloc_order [pos++] = 0;
29648 }
29649
29650 /* Handle a "callee_pop_aggregate_return" attribute; arguments as
29651    in struct attribute_spec handler.  */
29652 static tree
29653 ix86_handle_callee_pop_aggregate_return (tree *node, tree name,
29654                                               tree args,
29655                                               int flags ATTRIBUTE_UNUSED,
29656                                               bool *no_add_attrs)
29657 {
29658   if (TREE_CODE (*node) != FUNCTION_TYPE
29659       && TREE_CODE (*node) != METHOD_TYPE
29660       && TREE_CODE (*node) != FIELD_DECL
29661       && TREE_CODE (*node) != TYPE_DECL)
29662     {
29663       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29664                name);
29665       *no_add_attrs = true;
29666       return NULL_TREE;
29667     }
29668   if (TARGET_64BIT)
29669     {
29670       warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
29671                name);
29672       *no_add_attrs = true;
29673       return NULL_TREE;
29674     }
29675   if (is_attribute_p ("callee_pop_aggregate_return", name))
29676     {
29677       tree cst;
29678
29679       cst = TREE_VALUE (args);
29680       if (TREE_CODE (cst) != INTEGER_CST)
29681         {
29682           warning (OPT_Wattributes,
29683                    "%qE attribute requires an integer constant argument",
29684                    name);
29685           *no_add_attrs = true;
29686         }
29687       else if (compare_tree_int (cst, 0) != 0
29688                && compare_tree_int (cst, 1) != 0)
29689         {
29690           warning (OPT_Wattributes,
29691                    "argument to %qE attribute is neither zero, nor one",
29692                    name);
29693           *no_add_attrs = true;
29694         }
29695
29696       return NULL_TREE;
29697     }
29698
29699   return NULL_TREE;
29700 }
29701
29702 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
29703    struct attribute_spec.handler.  */
29704 static tree
29705 ix86_handle_abi_attribute (tree *node, tree name,
29706                               tree args ATTRIBUTE_UNUSED,
29707                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29708 {
29709   if (TREE_CODE (*node) != FUNCTION_TYPE
29710       && TREE_CODE (*node) != METHOD_TYPE
29711       && TREE_CODE (*node) != FIELD_DECL
29712       && TREE_CODE (*node) != TYPE_DECL)
29713     {
29714       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29715                name);
29716       *no_add_attrs = true;
29717       return NULL_TREE;
29718     }
29719   if (!TARGET_64BIT)
29720     {
29721       warning (OPT_Wattributes, "%qE attribute only available for 64-bit",
29722                name);
29723       *no_add_attrs = true;
29724       return NULL_TREE;
29725     }
29726
29727   /* Can combine regparm with all attributes but fastcall.  */
29728   if (is_attribute_p ("ms_abi", name))
29729     {
29730       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
29731         {
29732           error ("ms_abi and sysv_abi attributes are not compatible");
29733         }
29734
29735       return NULL_TREE;
29736     }
29737   else if (is_attribute_p ("sysv_abi", name))
29738     {
29739       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
29740         {
29741           error ("ms_abi and sysv_abi attributes are not compatible");
29742         }
29743
29744       return NULL_TREE;
29745     }
29746
29747   return NULL_TREE;
29748 }
29749
29750 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
29751    struct attribute_spec.handler.  */
29752 static tree
29753 ix86_handle_struct_attribute (tree *node, tree name,
29754                               tree args ATTRIBUTE_UNUSED,
29755                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29756 {
29757   tree *type = NULL;
29758   if (DECL_P (*node))
29759     {
29760       if (TREE_CODE (*node) == TYPE_DECL)
29761         type = &TREE_TYPE (*node);
29762     }
29763   else
29764     type = node;
29765
29766   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
29767                  || TREE_CODE (*type) == UNION_TYPE)))
29768     {
29769       warning (OPT_Wattributes, "%qE attribute ignored",
29770                name);
29771       *no_add_attrs = true;
29772     }
29773
29774   else if ((is_attribute_p ("ms_struct", name)
29775             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
29776            || ((is_attribute_p ("gcc_struct", name)
29777                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
29778     {
29779       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
29780                name);
29781       *no_add_attrs = true;
29782     }
29783
29784   return NULL_TREE;
29785 }
29786
29787 static tree
29788 ix86_handle_fndecl_attribute (tree *node, tree name,
29789                               tree args ATTRIBUTE_UNUSED,
29790                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
29791 {
29792   if (TREE_CODE (*node) != FUNCTION_DECL)
29793     {
29794       warning (OPT_Wattributes, "%qE attribute only applies to functions",
29795                name);
29796       *no_add_attrs = true;
29797     }
29798   return NULL_TREE;
29799 }
29800
29801 static bool
29802 ix86_ms_bitfield_layout_p (const_tree record_type)
29803 {
29804   return ((TARGET_MS_BITFIELD_LAYOUT
29805            && !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
29806           || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type)));
29807 }
29808
29809 /* Returns an expression indicating where the this parameter is
29810    located on entry to the FUNCTION.  */
29811
29812 static rtx
29813 x86_this_parameter (tree function)
29814 {
29815   tree type = TREE_TYPE (function);
29816   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
29817   int nregs;
29818
29819   if (TARGET_64BIT)
29820     {
29821       const int *parm_regs;
29822
29823       if (ix86_function_type_abi (type) == MS_ABI)
29824         parm_regs = x86_64_ms_abi_int_parameter_registers;
29825       else
29826         parm_regs = x86_64_int_parameter_registers;
29827       return gen_rtx_REG (DImode, parm_regs[aggr]);
29828     }
29829
29830   nregs = ix86_function_regparm (type, function);
29831
29832   if (nregs > 0 && !stdarg_p (type))
29833     {
29834       int regno;
29835       unsigned int ccvt = ix86_get_callcvt (type);
29836
29837       if ((ccvt & IX86_CALLCVT_FASTCALL) != 0)
29838         regno = aggr ? DX_REG : CX_REG;
29839       else if ((ccvt & IX86_CALLCVT_THISCALL) != 0)
29840         {
29841           regno = CX_REG;
29842           if (aggr)
29843             return gen_rtx_MEM (SImode,
29844                                 plus_constant (stack_pointer_rtx, 4));
29845         }
29846       else
29847         {
29848           regno = AX_REG;
29849           if (aggr)
29850             {
29851               regno = DX_REG;
29852               if (nregs == 1)
29853                 return gen_rtx_MEM (SImode,
29854                                     plus_constant (stack_pointer_rtx, 4));
29855             }
29856         }
29857       return gen_rtx_REG (SImode, regno);
29858     }
29859
29860   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
29861 }
29862
29863 /* Determine whether x86_output_mi_thunk can succeed.  */
29864
29865 static bool
29866 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
29867                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
29868                          HOST_WIDE_INT vcall_offset, const_tree function)
29869 {
29870   /* 64-bit can handle anything.  */
29871   if (TARGET_64BIT)
29872     return true;
29873
29874   /* For 32-bit, everything's fine if we have one free register.  */
29875   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
29876     return true;
29877
29878   /* Need a free register for vcall_offset.  */
29879   if (vcall_offset)
29880     return false;
29881
29882   /* Need a free register for GOT references.  */
29883   if (flag_pic && !targetm.binds_local_p (function))
29884     return false;
29885
29886   /* Otherwise ok.  */
29887   return true;
29888 }
29889
29890 /* Output the assembler code for a thunk function.  THUNK_DECL is the
29891    declaration for the thunk function itself, FUNCTION is the decl for
29892    the target function.  DELTA is an immediate constant offset to be
29893    added to THIS.  If VCALL_OFFSET is nonzero, the word at
29894    *(*this + vcall_offset) should be added to THIS.  */
29895
29896 static void
29897 x86_output_mi_thunk (FILE *file,
29898                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
29899                      HOST_WIDE_INT vcall_offset, tree function)
29900 {
29901   rtx xops[3];
29902   rtx this_param = x86_this_parameter (function);
29903   rtx this_reg, tmp;
29904
29905   /* Make sure unwind info is emitted for the thunk if needed.  */
29906   final_start_function (emit_barrier (), file, 1);
29907
29908   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
29909      pull it in now and let DELTA benefit.  */
29910   if (REG_P (this_param))
29911     this_reg = this_param;
29912   else if (vcall_offset)
29913     {
29914       /* Put the this parameter into %eax.  */
29915       xops[0] = this_param;
29916       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
29917       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29918     }
29919   else
29920     this_reg = NULL_RTX;
29921
29922   /* Adjust the this parameter by a fixed constant.  */
29923   if (delta)
29924     {
29925       xops[0] = GEN_INT (delta);
29926       xops[1] = this_reg ? this_reg : this_param;
29927       if (TARGET_64BIT)
29928         {
29929           if (!x86_64_general_operand (xops[0], DImode))
29930             {
29931               tmp = gen_rtx_REG (DImode, R10_REG);
29932               xops[1] = tmp;
29933               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
29934               xops[0] = tmp;
29935               xops[1] = this_param;
29936             }
29937           if (x86_maybe_negate_const_int (&xops[0], DImode))
29938             output_asm_insn ("sub{q}\t{%0, %1|%1, %0}", xops);
29939           else
29940             output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
29941         }
29942       else if (x86_maybe_negate_const_int (&xops[0], SImode))
29943         output_asm_insn ("sub{l}\t{%0, %1|%1, %0}", xops);
29944       else
29945         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
29946     }
29947
29948   /* Adjust the this parameter by a value stored in the vtable.  */
29949   if (vcall_offset)
29950     {
29951       if (TARGET_64BIT)
29952         tmp = gen_rtx_REG (DImode, R10_REG);
29953       else
29954         {
29955           int tmp_regno = CX_REG;
29956           unsigned int ccvt = ix86_get_callcvt (TREE_TYPE (function));
29957           if ((ccvt & (IX86_CALLCVT_FASTCALL | IX86_CALLCVT_THISCALL)) != 0)
29958             tmp_regno = AX_REG;
29959           tmp = gen_rtx_REG (SImode, tmp_regno);
29960         }
29961
29962       xops[0] = gen_rtx_MEM (Pmode, this_reg);
29963       xops[1] = tmp;
29964       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29965
29966       /* Adjust the this parameter.  */
29967       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
29968       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
29969         {
29970           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
29971           xops[0] = GEN_INT (vcall_offset);
29972           xops[1] = tmp2;
29973           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
29974           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
29975         }
29976       xops[1] = this_reg;
29977       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
29978     }
29979
29980   /* If necessary, drop THIS back to its stack slot.  */
29981   if (this_reg && this_reg != this_param)
29982     {
29983       xops[0] = this_reg;
29984       xops[1] = this_param;
29985       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
29986     }
29987
29988   xops[0] = XEXP (DECL_RTL (function), 0);
29989   if (TARGET_64BIT)
29990     {
29991       if (!flag_pic || targetm.binds_local_p (function)
29992           || DEFAULT_ABI == MS_ABI)
29993         output_asm_insn ("jmp\t%P0", xops);
29994       /* All thunks should be in the same object as their target,
29995          and thus binds_local_p should be true.  */
29996       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
29997         gcc_unreachable ();
29998       else
29999         {
30000           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
30001           tmp = gen_rtx_CONST (Pmode, tmp);
30002           tmp = gen_rtx_MEM (QImode, tmp);
30003           xops[0] = tmp;
30004           output_asm_insn ("jmp\t%A0", xops);
30005         }
30006     }
30007   else
30008     {
30009       if (!flag_pic || targetm.binds_local_p (function))
30010         output_asm_insn ("jmp\t%P0", xops);
30011       else
30012 #if TARGET_MACHO
30013         if (TARGET_MACHO)
30014           {
30015             rtx sym_ref = XEXP (DECL_RTL (function), 0);
30016             if (TARGET_MACHO_BRANCH_ISLANDS)
30017               sym_ref = (gen_rtx_SYMBOL_REF
30018                    (Pmode,
30019                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
30020             tmp = gen_rtx_MEM (QImode, sym_ref);
30021             xops[0] = tmp;
30022             output_asm_insn ("jmp\t%0", xops);
30023           }
30024         else
30025 #endif /* TARGET_MACHO */
30026         {
30027           tmp = gen_rtx_REG (SImode, CX_REG);
30028           output_set_got (tmp, NULL_RTX);
30029
30030           xops[1] = tmp;
30031           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
30032           output_asm_insn ("jmp\t{*}%1", xops);
30033         }
30034     }
30035   final_end_function ();
30036 }
30037
30038 static void
30039 x86_file_start (void)
30040 {
30041   default_file_start ();
30042 #if TARGET_MACHO
30043   darwin_file_start ();
30044 #endif
30045   if (X86_FILE_START_VERSION_DIRECTIVE)
30046     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
30047   if (X86_FILE_START_FLTUSED)
30048     fputs ("\t.global\t__fltused\n", asm_out_file);
30049   if (ix86_asm_dialect == ASM_INTEL)
30050     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
30051 }
30052
30053 int
30054 x86_field_alignment (tree field, int computed)
30055 {
30056   enum machine_mode mode;
30057   tree type = TREE_TYPE (field);
30058
30059   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
30060     return computed;
30061   mode = TYPE_MODE (strip_array_types (type));
30062   if (mode == DFmode || mode == DCmode
30063       || GET_MODE_CLASS (mode) == MODE_INT
30064       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
30065     return MIN (32, computed);
30066   return computed;
30067 }
30068
30069 /* Output assembler code to FILE to increment profiler label # LABELNO
30070    for profiling a function entry.  */
30071 void
30072 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
30073 {
30074   const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE
30075                                          : MCOUNT_NAME);
30076
30077   if (TARGET_64BIT)
30078     {
30079 #ifndef NO_PROFILE_COUNTERS
30080       fprintf (file, "\tleaq\t%sP%d(%%rip),%%r11\n", LPREFIX, labelno);
30081 #endif
30082
30083       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
30084         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", mcount_name);
30085       else
30086         fprintf (file, "\tcall\t%s\n", mcount_name);
30087     }
30088   else if (flag_pic)
30089     {
30090 #ifndef NO_PROFILE_COUNTERS
30091       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%" PROFILE_COUNT_REGISTER "\n",
30092                LPREFIX, labelno);
30093 #endif
30094       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", mcount_name);
30095     }
30096   else
30097     {
30098 #ifndef NO_PROFILE_COUNTERS
30099       fprintf (file, "\tmovl\t$%sP%d,%%" PROFILE_COUNT_REGISTER "\n",
30100                LPREFIX, labelno);
30101 #endif
30102       fprintf (file, "\tcall\t%s\n", mcount_name);
30103     }
30104 }
30105
30106 /* We don't have exact information about the insn sizes, but we may assume
30107    quite safely that we are informed about all 1 byte insns and memory
30108    address sizes.  This is enough to eliminate unnecessary padding in
30109    99% of cases.  */
30110
30111 static int
30112 min_insn_size (rtx insn)
30113 {
30114   int l = 0, len;
30115
30116   if (!INSN_P (insn) || !active_insn_p (insn))
30117     return 0;
30118
30119   /* Discard alignments we've emit and jump instructions.  */
30120   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
30121       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
30122     return 0;
30123   if (JUMP_TABLE_DATA_P (insn))
30124     return 0;
30125
30126   /* Important case - calls are always 5 bytes.
30127      It is common to have many calls in the row.  */
30128   if (CALL_P (insn)
30129       && symbolic_reference_mentioned_p (PATTERN (insn))
30130       && !SIBLING_CALL_P (insn))
30131     return 5;
30132   len = get_attr_length (insn);
30133   if (len <= 1)
30134     return 1;
30135
30136   /* For normal instructions we rely on get_attr_length being exact,
30137      with a few exceptions.  */
30138   if (!JUMP_P (insn))
30139     {
30140       enum attr_type type = get_attr_type (insn);
30141
30142       switch (type)
30143         {
30144         case TYPE_MULTI:
30145           if (GET_CODE (PATTERN (insn)) == ASM_INPUT
30146               || asm_noperands (PATTERN (insn)) >= 0)
30147             return 0;
30148           break;
30149         case TYPE_OTHER:
30150         case TYPE_FCMP:
30151           break;
30152         default:
30153           /* Otherwise trust get_attr_length.  */
30154           return len;
30155         }
30156
30157       l = get_attr_length_address (insn);
30158       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
30159         l = 4;
30160     }
30161   if (l)
30162     return 1+l;
30163   else
30164     return 2;
30165 }
30166
30167 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
30168
30169 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
30170    window.  */
30171
30172 static void
30173 ix86_avoid_jump_mispredicts (void)
30174 {
30175   rtx insn, start = get_insns ();
30176   int nbytes = 0, njumps = 0;
30177   int isjump = 0;
30178
30179   /* Look for all minimal intervals of instructions containing 4 jumps.
30180      The intervals are bounded by START and INSN.  NBYTES is the total
30181      size of instructions in the interval including INSN and not including
30182      START.  When the NBYTES is smaller than 16 bytes, it is possible
30183      that the end of START and INSN ends up in the same 16byte page.
30184
30185      The smallest offset in the page INSN can start is the case where START
30186      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
30187      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
30188      */
30189   for (insn = start; insn; insn = NEXT_INSN (insn))
30190     {
30191       int min_size;
30192
30193       if (LABEL_P (insn))
30194         {
30195           int align = label_to_alignment (insn);
30196           int max_skip = label_to_max_skip (insn);
30197
30198           if (max_skip > 15)
30199             max_skip = 15;
30200           /* If align > 3, only up to 16 - max_skip - 1 bytes can be
30201              already in the current 16 byte page, because otherwise
30202              ASM_OUTPUT_MAX_SKIP_ALIGN could skip max_skip or fewer
30203              bytes to reach 16 byte boundary.  */
30204           if (align <= 0
30205               || (align <= 3 && max_skip != (1 << align) - 1))
30206             max_skip = 0;
30207           if (dump_file)
30208             fprintf (dump_file, "Label %i with max_skip %i\n",
30209                      INSN_UID (insn), max_skip);
30210           if (max_skip)
30211             {
30212               while (nbytes + max_skip >= 16)
30213                 {
30214                   start = NEXT_INSN (start);
30215                   if ((JUMP_P (start)
30216                        && GET_CODE (PATTERN (start)) != ADDR_VEC
30217                        && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
30218                       || CALL_P (start))
30219                     njumps--, isjump = 1;
30220                   else
30221                     isjump = 0;
30222                   nbytes -= min_insn_size (start);
30223                 }
30224             }
30225           continue;
30226         }
30227
30228       min_size = min_insn_size (insn);
30229       nbytes += min_size;
30230       if (dump_file)
30231         fprintf (dump_file, "Insn %i estimated to %i bytes\n",
30232                  INSN_UID (insn), min_size);
30233       if ((JUMP_P (insn)
30234            && GET_CODE (PATTERN (insn)) != ADDR_VEC
30235            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
30236           || CALL_P (insn))
30237         njumps++;
30238       else
30239         continue;
30240
30241       while (njumps > 3)
30242         {
30243           start = NEXT_INSN (start);
30244           if ((JUMP_P (start)
30245                && GET_CODE (PATTERN (start)) != ADDR_VEC
30246                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
30247               || CALL_P (start))
30248             njumps--, isjump = 1;
30249           else
30250             isjump = 0;
30251           nbytes -= min_insn_size (start);
30252         }
30253       gcc_assert (njumps >= 0);
30254       if (dump_file)
30255         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
30256                  INSN_UID (start), INSN_UID (insn), nbytes);
30257
30258       if (njumps == 3 && isjump && nbytes < 16)
30259         {
30260           int padsize = 15 - nbytes + min_insn_size (insn);
30261
30262           if (dump_file)
30263             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
30264                      INSN_UID (insn), padsize);
30265           emit_insn_before (gen_pad (GEN_INT (padsize)), insn);
30266         }
30267     }
30268 }
30269 #endif
30270
30271 /* AMD Athlon works faster
30272    when RET is not destination of conditional jump or directly preceded
30273    by other jump instruction.  We avoid the penalty by inserting NOP just
30274    before the RET instructions in such cases.  */
30275 static void
30276 ix86_pad_returns (void)
30277 {
30278   edge e;
30279   edge_iterator ei;
30280
30281   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
30282     {
30283       basic_block bb = e->src;
30284       rtx ret = BB_END (bb);
30285       rtx prev;
30286       bool replace = false;
30287
30288       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
30289           || optimize_bb_for_size_p (bb))
30290         continue;
30291       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
30292         if (active_insn_p (prev) || LABEL_P (prev))
30293           break;
30294       if (prev && LABEL_P (prev))
30295         {
30296           edge e;
30297           edge_iterator ei;
30298
30299           FOR_EACH_EDGE (e, ei, bb->preds)
30300             if (EDGE_FREQUENCY (e) && e->src->index >= 0
30301                 && !(e->flags & EDGE_FALLTHRU))
30302               replace = true;
30303         }
30304       if (!replace)
30305         {
30306           prev = prev_active_insn (ret);
30307           if (prev
30308               && ((JUMP_P (prev) && any_condjump_p (prev))
30309                   || CALL_P (prev)))
30310             replace = true;
30311           /* Empty functions get branch mispredict even when
30312              the jump destination is not visible to us.  */
30313           if (!prev && !optimize_function_for_size_p (cfun))
30314             replace = true;
30315         }
30316       if (replace)
30317         {
30318           emit_jump_insn_before (gen_return_internal_long (), ret);
30319           delete_insn (ret);
30320         }
30321     }
30322 }
30323
30324 /* Count the minimum number of instructions in BB.  Return 4 if the
30325    number of instructions >= 4.  */
30326
30327 static int 
30328 ix86_count_insn_bb (basic_block bb)
30329 {
30330   rtx insn;
30331   int insn_count = 0;
30332
30333   /* Count number of instructions in this block.  Return 4 if the number
30334      of instructions >= 4.  */
30335   FOR_BB_INSNS (bb, insn)
30336     {
30337       /* Only happen in exit blocks.  */
30338       if (JUMP_P (insn)
30339           && GET_CODE (PATTERN (insn)) == RETURN)
30340         break;
30341
30342       if (NONDEBUG_INSN_P (insn)
30343           && GET_CODE (PATTERN (insn)) != USE
30344           && GET_CODE (PATTERN (insn)) != CLOBBER)
30345         {
30346           insn_count++;
30347           if (insn_count >= 4)
30348             return insn_count;
30349         }
30350     }
30351
30352   return insn_count;
30353 }
30354
30355
30356 /* Count the minimum number of instructions in code path in BB.  
30357    Return 4 if the number of instructions >= 4.  */
30358
30359 static int 
30360 ix86_count_insn (basic_block bb)
30361 {
30362   edge e;
30363   edge_iterator ei;
30364   int min_prev_count;
30365
30366   /* Only bother counting instructions along paths with no
30367      more than 2 basic blocks between entry and exit.  Given
30368      that BB has an edge to exit, determine if a predecessor
30369      of BB has an edge from entry.  If so, compute the number
30370      of instructions in the predecessor block.  If there
30371      happen to be multiple such blocks, compute the minimum.  */
30372   min_prev_count = 4;
30373   FOR_EACH_EDGE (e, ei, bb->preds)
30374     {
30375       edge prev_e;
30376       edge_iterator prev_ei;
30377
30378       if (e->src == ENTRY_BLOCK_PTR)
30379         {
30380           min_prev_count = 0;
30381           break;
30382         }
30383       FOR_EACH_EDGE (prev_e, prev_ei, e->src->preds)
30384         {
30385           if (prev_e->src == ENTRY_BLOCK_PTR)
30386             {
30387               int count = ix86_count_insn_bb (e->src);
30388               if (count < min_prev_count)
30389                 min_prev_count = count;
30390               break;
30391             }
30392         }
30393     }
30394
30395   if (min_prev_count < 4)
30396     min_prev_count += ix86_count_insn_bb (bb);
30397
30398   return min_prev_count;
30399 }
30400
30401 /* Pad short funtion to 4 instructions.   */
30402
30403 static void
30404 ix86_pad_short_function (void)
30405 {
30406   edge e;
30407   edge_iterator ei;
30408
30409   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
30410     {
30411       rtx ret = BB_END (e->src);
30412       if (JUMP_P (ret) && GET_CODE (PATTERN (ret)) == RETURN)
30413         {
30414           int insn_count = ix86_count_insn (e->src);
30415
30416           /* Pad short function.  */
30417           if (insn_count < 4)
30418             {
30419               rtx insn = ret;
30420
30421               /* Find epilogue.  */
30422               while (insn
30423                      && (!NOTE_P (insn)
30424                          || NOTE_KIND (insn) != NOTE_INSN_EPILOGUE_BEG))
30425                 insn = PREV_INSN (insn);
30426
30427               if (!insn)
30428                 insn = ret;
30429
30430               /* Two NOPs count as one instruction.  */
30431               insn_count = 2 * (4 - insn_count);
30432               emit_insn_before (gen_nops (GEN_INT (insn_count)), insn);
30433             }
30434         }
30435     }
30436 }
30437
30438 /* Implement machine specific optimizations.  We implement padding of returns
30439    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
30440 static void
30441 ix86_reorg (void)
30442 {
30443   /* We are freeing block_for_insn in the toplev to keep compatibility
30444      with old MDEP_REORGS that are not CFG based.  Recompute it now.  */
30445   compute_bb_for_insn ();
30446
30447   if (optimize && optimize_function_for_speed_p (cfun))
30448     {
30449       if (TARGET_PAD_SHORT_FUNCTION)
30450         ix86_pad_short_function ();
30451       else if (TARGET_PAD_RETURNS)
30452         ix86_pad_returns ();
30453 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
30454       if (TARGET_FOUR_JUMP_LIMIT)
30455         ix86_avoid_jump_mispredicts ();
30456 #endif
30457     }
30458
30459   /* Run the vzeroupper optimization if needed.  */
30460   if (TARGET_VZEROUPPER)
30461     move_or_delete_vzeroupper ();
30462 }
30463
30464 /* Return nonzero when QImode register that must be represented via REX prefix
30465    is used.  */
30466 bool
30467 x86_extended_QIreg_mentioned_p (rtx insn)
30468 {
30469   int i;
30470   extract_insn_cached (insn);
30471   for (i = 0; i < recog_data.n_operands; i++)
30472     if (REG_P (recog_data.operand[i])
30473         && REGNO (recog_data.operand[i]) > BX_REG)
30474        return true;
30475   return false;
30476 }
30477
30478 /* Return nonzero when P points to register encoded via REX prefix.
30479    Called via for_each_rtx.  */
30480 static int
30481 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
30482 {
30483    unsigned int regno;
30484    if (!REG_P (*p))
30485      return 0;
30486    regno = REGNO (*p);
30487    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
30488 }
30489
30490 /* Return true when INSN mentions register that must be encoded using REX
30491    prefix.  */
30492 bool
30493 x86_extended_reg_mentioned_p (rtx insn)
30494 {
30495   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
30496                        extended_reg_mentioned_1, NULL);
30497 }
30498
30499 /* If profitable, negate (without causing overflow) integer constant
30500    of mode MODE at location LOC.  Return true in this case.  */
30501 bool
30502 x86_maybe_negate_const_int (rtx *loc, enum machine_mode mode)
30503 {
30504   HOST_WIDE_INT val;
30505
30506   if (!CONST_INT_P (*loc))
30507     return false;
30508
30509   switch (mode)
30510     {
30511     case DImode:
30512       /* DImode x86_64 constants must fit in 32 bits.  */
30513       gcc_assert (x86_64_immediate_operand (*loc, mode));
30514
30515       mode = SImode;
30516       break;
30517
30518     case SImode:
30519     case HImode:
30520     case QImode:
30521       break;
30522
30523     default:
30524       gcc_unreachable ();
30525     }
30526
30527   /* Avoid overflows.  */
30528   if (mode_signbit_p (mode, *loc))
30529     return false;
30530
30531   val = INTVAL (*loc);
30532
30533   /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
30534      Exceptions: -128 encodes smaller than 128, so swap sign and op.  */
30535   if ((val < 0 && val != -128)
30536       || val == 128)
30537     {
30538       *loc = GEN_INT (-val);
30539       return true;
30540     }
30541
30542   return false;
30543 }
30544
30545 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
30546    optabs would emit if we didn't have TFmode patterns.  */
30547
30548 void
30549 x86_emit_floatuns (rtx operands[2])
30550 {
30551   rtx neglab, donelab, i0, i1, f0, in, out;
30552   enum machine_mode mode, inmode;
30553
30554   inmode = GET_MODE (operands[1]);
30555   gcc_assert (inmode == SImode || inmode == DImode);
30556
30557   out = operands[0];
30558   in = force_reg (inmode, operands[1]);
30559   mode = GET_MODE (out);
30560   neglab = gen_label_rtx ();
30561   donelab = gen_label_rtx ();
30562   f0 = gen_reg_rtx (mode);
30563
30564   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
30565
30566   expand_float (out, in, 0);
30567
30568   emit_jump_insn (gen_jump (donelab));
30569   emit_barrier ();
30570
30571   emit_label (neglab);
30572
30573   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
30574                             1, OPTAB_DIRECT);
30575   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
30576                             1, OPTAB_DIRECT);
30577   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
30578
30579   expand_float (f0, i0, 0);
30580
30581   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
30582
30583   emit_label (donelab);
30584 }
30585 \f
30586 /* AVX does not support 32-byte integer vector operations,
30587    thus the longest vector we are faced with is V16QImode.  */
30588 #define MAX_VECT_LEN    16
30589
30590 struct expand_vec_perm_d
30591 {
30592   rtx target, op0, op1;
30593   unsigned char perm[MAX_VECT_LEN];
30594   enum machine_mode vmode;
30595   unsigned char nelt;
30596   bool testing_p;
30597 };
30598
30599 static bool expand_vec_perm_1 (struct expand_vec_perm_d *d);
30600 static bool expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d);
30601
30602 /* Get a vector mode of the same size as the original but with elements
30603    twice as wide.  This is only guaranteed to apply to integral vectors.  */
30604
30605 static inline enum machine_mode
30606 get_mode_wider_vector (enum machine_mode o)
30607 {
30608   /* ??? Rely on the ordering that genmodes.c gives to vectors.  */
30609   enum machine_mode n = GET_MODE_WIDER_MODE (o);
30610   gcc_assert (GET_MODE_NUNITS (o) == GET_MODE_NUNITS (n) * 2);
30611   gcc_assert (GET_MODE_SIZE (o) == GET_MODE_SIZE (n));
30612   return n;
30613 }
30614
30615 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30616    with all elements equal to VAR.  Return true if successful.  */
30617
30618 static bool
30619 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
30620                                    rtx target, rtx val)
30621 {
30622   bool ok;
30623
30624   switch (mode)
30625     {
30626     case V2SImode:
30627     case V2SFmode:
30628       if (!mmx_ok)
30629         return false;
30630       /* FALLTHRU */
30631
30632     case V4DFmode:
30633     case V4DImode:
30634     case V8SFmode:
30635     case V8SImode:
30636     case V2DFmode:
30637     case V2DImode:
30638     case V4SFmode:
30639     case V4SImode:
30640       {
30641         rtx insn, dup;
30642
30643         /* First attempt to recognize VAL as-is.  */
30644         dup = gen_rtx_VEC_DUPLICATE (mode, val);
30645         insn = emit_insn (gen_rtx_SET (VOIDmode, target, dup));
30646         if (recog_memoized (insn) < 0)
30647           {
30648             rtx seq;
30649             /* If that fails, force VAL into a register.  */
30650
30651             start_sequence ();
30652             XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val);
30653             seq = get_insns ();
30654             end_sequence ();
30655             if (seq)
30656               emit_insn_before (seq, insn);
30657
30658             ok = recog_memoized (insn) >= 0;
30659             gcc_assert (ok);
30660           }
30661       }
30662       return true;
30663
30664     case V4HImode:
30665       if (!mmx_ok)
30666         return false;
30667       if (TARGET_SSE || TARGET_3DNOW_A)
30668         {
30669           rtx x;
30670
30671           val = gen_lowpart (SImode, val);
30672           x = gen_rtx_TRUNCATE (HImode, val);
30673           x = gen_rtx_VEC_DUPLICATE (mode, x);
30674           emit_insn (gen_rtx_SET (VOIDmode, target, x));
30675           return true;
30676         }
30677       goto widen;
30678
30679     case V8QImode:
30680       if (!mmx_ok)
30681         return false;
30682       goto widen;
30683
30684     case V8HImode:
30685       if (TARGET_SSE2)
30686         {
30687           struct expand_vec_perm_d dperm;
30688           rtx tmp1, tmp2;
30689
30690         permute:
30691           memset (&dperm, 0, sizeof (dperm));
30692           dperm.target = target;
30693           dperm.vmode = mode;
30694           dperm.nelt = GET_MODE_NUNITS (mode);
30695           dperm.op0 = dperm.op1 = gen_reg_rtx (mode);
30696
30697           /* Extend to SImode using a paradoxical SUBREG.  */
30698           tmp1 = gen_reg_rtx (SImode);
30699           emit_move_insn (tmp1, gen_lowpart (SImode, val));
30700
30701           /* Insert the SImode value as low element of a V4SImode vector. */
30702           tmp2 = gen_lowpart (V4SImode, dperm.op0);
30703           emit_insn (gen_vec_setv4si_0 (tmp2, CONST0_RTX (V4SImode), tmp1));
30704
30705           ok = (expand_vec_perm_1 (&dperm)
30706                 || expand_vec_perm_broadcast_1 (&dperm));
30707           gcc_assert (ok);
30708           return ok;
30709         }
30710       goto widen;
30711
30712     case V16QImode:
30713       if (TARGET_SSE2)
30714         goto permute;
30715       goto widen;
30716
30717     widen:
30718       /* Replicate the value once into the next wider mode and recurse.  */
30719       {
30720         enum machine_mode smode, wsmode, wvmode;
30721         rtx x;
30722
30723         smode = GET_MODE_INNER (mode);
30724         wvmode = get_mode_wider_vector (mode);
30725         wsmode = GET_MODE_INNER (wvmode);
30726
30727         val = convert_modes (wsmode, smode, val, true);
30728         x = expand_simple_binop (wsmode, ASHIFT, val,
30729                                  GEN_INT (GET_MODE_BITSIZE (smode)),
30730                                  NULL_RTX, 1, OPTAB_LIB_WIDEN);
30731         val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
30732
30733         x = gen_lowpart (wvmode, target);
30734         ok = ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val);
30735         gcc_assert (ok);
30736         return ok;
30737       }
30738
30739     case V16HImode:
30740     case V32QImode:
30741       {
30742         enum machine_mode hvmode = (mode == V16HImode ? V8HImode : V16QImode);
30743         rtx x = gen_reg_rtx (hvmode);
30744
30745         ok = ix86_expand_vector_init_duplicate (false, hvmode, x, val);
30746         gcc_assert (ok);
30747
30748         x = gen_rtx_VEC_CONCAT (mode, x, x);
30749         emit_insn (gen_rtx_SET (VOIDmode, target, x));
30750       }
30751       return true;
30752
30753     default:
30754       return false;
30755     }
30756 }
30757
30758 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30759    whose ONE_VAR element is VAR, and other elements are zero.  Return true
30760    if successful.  */
30761
30762 static bool
30763 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
30764                                      rtx target, rtx var, int one_var)
30765 {
30766   enum machine_mode vsimode;
30767   rtx new_target;
30768   rtx x, tmp;
30769   bool use_vector_set = false;
30770
30771   switch (mode)
30772     {
30773     case V2DImode:
30774       /* For SSE4.1, we normally use vector set.  But if the second
30775          element is zero and inter-unit moves are OK, we use movq
30776          instead.  */
30777       use_vector_set = (TARGET_64BIT
30778                         && TARGET_SSE4_1
30779                         && !(TARGET_INTER_UNIT_MOVES
30780                              && one_var == 0));
30781       break;
30782     case V16QImode:
30783     case V4SImode:
30784     case V4SFmode:
30785       use_vector_set = TARGET_SSE4_1;
30786       break;
30787     case V8HImode:
30788       use_vector_set = TARGET_SSE2;
30789       break;
30790     case V4HImode:
30791       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
30792       break;
30793     case V32QImode:
30794     case V16HImode:
30795     case V8SImode:
30796     case V8SFmode:
30797     case V4DFmode:
30798       use_vector_set = TARGET_AVX;
30799       break;
30800     case V4DImode:
30801       /* Use ix86_expand_vector_set in 64bit mode only.  */
30802       use_vector_set = TARGET_AVX && TARGET_64BIT;
30803       break;
30804     default:
30805       break;
30806     }
30807
30808   if (use_vector_set)
30809     {
30810       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
30811       var = force_reg (GET_MODE_INNER (mode), var);
30812       ix86_expand_vector_set (mmx_ok, target, var, one_var);
30813       return true;
30814     }
30815
30816   switch (mode)
30817     {
30818     case V2SFmode:
30819     case V2SImode:
30820       if (!mmx_ok)
30821         return false;
30822       /* FALLTHRU */
30823
30824     case V2DFmode:
30825     case V2DImode:
30826       if (one_var != 0)
30827         return false;
30828       var = force_reg (GET_MODE_INNER (mode), var);
30829       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
30830       emit_insn (gen_rtx_SET (VOIDmode, target, x));
30831       return true;
30832
30833     case V4SFmode:
30834     case V4SImode:
30835       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
30836         new_target = gen_reg_rtx (mode);
30837       else
30838         new_target = target;
30839       var = force_reg (GET_MODE_INNER (mode), var);
30840       x = gen_rtx_VEC_DUPLICATE (mode, var);
30841       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
30842       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
30843       if (one_var != 0)
30844         {
30845           /* We need to shuffle the value to the correct position, so
30846              create a new pseudo to store the intermediate result.  */
30847
30848           /* With SSE2, we can use the integer shuffle insns.  */
30849           if (mode != V4SFmode && TARGET_SSE2)
30850             {
30851               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
30852                                             const1_rtx,
30853                                             GEN_INT (one_var == 1 ? 0 : 1),
30854                                             GEN_INT (one_var == 2 ? 0 : 1),
30855                                             GEN_INT (one_var == 3 ? 0 : 1)));
30856               if (target != new_target)
30857                 emit_move_insn (target, new_target);
30858               return true;
30859             }
30860
30861           /* Otherwise convert the intermediate result to V4SFmode and
30862              use the SSE1 shuffle instructions.  */
30863           if (mode != V4SFmode)
30864             {
30865               tmp = gen_reg_rtx (V4SFmode);
30866               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
30867             }
30868           else
30869             tmp = new_target;
30870
30871           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
30872                                        const1_rtx,
30873                                        GEN_INT (one_var == 1 ? 0 : 1),
30874                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
30875                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
30876
30877           if (mode != V4SFmode)
30878             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
30879           else if (tmp != target)
30880             emit_move_insn (target, tmp);
30881         }
30882       else if (target != new_target)
30883         emit_move_insn (target, new_target);
30884       return true;
30885
30886     case V8HImode:
30887     case V16QImode:
30888       vsimode = V4SImode;
30889       goto widen;
30890     case V4HImode:
30891     case V8QImode:
30892       if (!mmx_ok)
30893         return false;
30894       vsimode = V2SImode;
30895       goto widen;
30896     widen:
30897       if (one_var != 0)
30898         return false;
30899
30900       /* Zero extend the variable element to SImode and recurse.  */
30901       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
30902
30903       x = gen_reg_rtx (vsimode);
30904       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
30905                                                 var, one_var))
30906         gcc_unreachable ();
30907
30908       emit_move_insn (target, gen_lowpart (mode, x));
30909       return true;
30910
30911     default:
30912       return false;
30913     }
30914 }
30915
30916 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
30917    consisting of the values in VALS.  It is known that all elements
30918    except ONE_VAR are constants.  Return true if successful.  */
30919
30920 static bool
30921 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
30922                                  rtx target, rtx vals, int one_var)
30923 {
30924   rtx var = XVECEXP (vals, 0, one_var);
30925   enum machine_mode wmode;
30926   rtx const_vec, x;
30927
30928   const_vec = copy_rtx (vals);
30929   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
30930   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
30931
30932   switch (mode)
30933     {
30934     case V2DFmode:
30935     case V2DImode:
30936     case V2SFmode:
30937     case V2SImode:
30938       /* For the two element vectors, it's just as easy to use
30939          the general case.  */
30940       return false;
30941
30942     case V4DImode:
30943       /* Use ix86_expand_vector_set in 64bit mode only.  */
30944       if (!TARGET_64BIT)
30945         return false;
30946     case V4DFmode:
30947     case V8SFmode:
30948     case V8SImode:
30949     case V16HImode:
30950     case V32QImode:
30951     case V4SFmode:
30952     case V4SImode:
30953     case V8HImode:
30954     case V4HImode:
30955       break;
30956
30957     case V16QImode:
30958       if (TARGET_SSE4_1)
30959         break;
30960       wmode = V8HImode;
30961       goto widen;
30962     case V8QImode:
30963       wmode = V4HImode;
30964       goto widen;
30965     widen:
30966       /* There's no way to set one QImode entry easily.  Combine
30967          the variable value with its adjacent constant value, and
30968          promote to an HImode set.  */
30969       x = XVECEXP (vals, 0, one_var ^ 1);
30970       if (one_var & 1)
30971         {
30972           var = convert_modes (HImode, QImode, var, true);
30973           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
30974                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
30975           x = GEN_INT (INTVAL (x) & 0xff);
30976         }
30977       else
30978         {
30979           var = convert_modes (HImode, QImode, var, true);
30980           x = gen_int_mode (INTVAL (x) << 8, HImode);
30981         }
30982       if (x != const0_rtx)
30983         var = expand_simple_binop (HImode, IOR, var, x, var,
30984                                    1, OPTAB_LIB_WIDEN);
30985
30986       x = gen_reg_rtx (wmode);
30987       emit_move_insn (x, gen_lowpart (wmode, const_vec));
30988       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
30989
30990       emit_move_insn (target, gen_lowpart (mode, x));
30991       return true;
30992
30993     default:
30994       return false;
30995     }
30996
30997   emit_move_insn (target, const_vec);
30998   ix86_expand_vector_set (mmx_ok, target, var, one_var);
30999   return true;
31000 }
31001
31002 /* A subroutine of ix86_expand_vector_init_general.  Use vector
31003    concatenate to handle the most general case: all values variable,
31004    and none identical.  */
31005
31006 static void
31007 ix86_expand_vector_init_concat (enum machine_mode mode,
31008                                 rtx target, rtx *ops, int n)
31009 {
31010   enum machine_mode cmode, hmode = VOIDmode;
31011   rtx first[8], second[4];
31012   rtvec v;
31013   int i, j;
31014
31015   switch (n)
31016     {
31017     case 2:
31018       switch (mode)
31019         {
31020         case V8SImode:
31021           cmode = V4SImode;
31022           break;
31023         case V8SFmode:
31024           cmode = V4SFmode;
31025           break;
31026         case V4DImode:
31027           cmode = V2DImode;
31028           break;
31029         case V4DFmode:
31030           cmode = V2DFmode;
31031           break;
31032         case V4SImode:
31033           cmode = V2SImode;
31034           break;
31035         case V4SFmode:
31036           cmode = V2SFmode;
31037           break;
31038         case V2DImode:
31039           cmode = DImode;
31040           break;
31041         case V2SImode:
31042           cmode = SImode;
31043           break;
31044         case V2DFmode:
31045           cmode = DFmode;
31046           break;
31047         case V2SFmode:
31048           cmode = SFmode;
31049           break;
31050         default:
31051           gcc_unreachable ();
31052         }
31053
31054       if (!register_operand (ops[1], cmode))
31055         ops[1] = force_reg (cmode, ops[1]);
31056       if (!register_operand (ops[0], cmode))
31057         ops[0] = force_reg (cmode, ops[0]);
31058       emit_insn (gen_rtx_SET (VOIDmode, target,
31059                               gen_rtx_VEC_CONCAT (mode, ops[0],
31060                                                   ops[1])));
31061       break;
31062
31063     case 4:
31064       switch (mode)
31065         {
31066         case V4DImode:
31067           cmode = V2DImode;
31068           break;
31069         case V4DFmode:
31070           cmode = V2DFmode;
31071           break;
31072         case V4SImode:
31073           cmode = V2SImode;
31074           break;
31075         case V4SFmode:
31076           cmode = V2SFmode;
31077           break;
31078         default:
31079           gcc_unreachable ();
31080         }
31081       goto half;
31082
31083     case 8:
31084       switch (mode)
31085         {
31086         case V8SImode:
31087           cmode = V2SImode;
31088           hmode = V4SImode;
31089           break;
31090         case V8SFmode:
31091           cmode = V2SFmode;
31092           hmode = V4SFmode;
31093           break;
31094         default:
31095           gcc_unreachable ();
31096         }
31097       goto half;
31098
31099 half:
31100       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
31101       i = n - 1;
31102       j = (n >> 1) - 1;
31103       for (; i > 0; i -= 2, j--)
31104         {
31105           first[j] = gen_reg_rtx (cmode);
31106           v = gen_rtvec (2, ops[i - 1], ops[i]);
31107           ix86_expand_vector_init (false, first[j],
31108                                    gen_rtx_PARALLEL (cmode, v));
31109         }
31110
31111       n >>= 1;
31112       if (n > 2)
31113         {
31114           gcc_assert (hmode != VOIDmode);
31115           for (i = j = 0; i < n; i += 2, j++)
31116             {
31117               second[j] = gen_reg_rtx (hmode);
31118               ix86_expand_vector_init_concat (hmode, second [j],
31119                                               &first [i], 2);
31120             }
31121           n >>= 1;
31122           ix86_expand_vector_init_concat (mode, target, second, n);
31123         }
31124       else
31125         ix86_expand_vector_init_concat (mode, target, first, n);
31126       break;
31127
31128     default:
31129       gcc_unreachable ();
31130     }
31131 }
31132
31133 /* A subroutine of ix86_expand_vector_init_general.  Use vector
31134    interleave to handle the most general case: all values variable,
31135    and none identical.  */
31136
31137 static void
31138 ix86_expand_vector_init_interleave (enum machine_mode mode,
31139                                     rtx target, rtx *ops, int n)
31140 {
31141   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
31142   int i, j;
31143   rtx op0, op1;
31144   rtx (*gen_load_even) (rtx, rtx, rtx);
31145   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
31146   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
31147
31148   switch (mode)
31149     {
31150     case V8HImode:
31151       gen_load_even = gen_vec_setv8hi;
31152       gen_interleave_first_low = gen_vec_interleave_lowv4si;
31153       gen_interleave_second_low = gen_vec_interleave_lowv2di;
31154       inner_mode = HImode;
31155       first_imode = V4SImode;
31156       second_imode = V2DImode;
31157       third_imode = VOIDmode;
31158       break;
31159     case V16QImode:
31160       gen_load_even = gen_vec_setv16qi;
31161       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
31162       gen_interleave_second_low = gen_vec_interleave_lowv4si;
31163       inner_mode = QImode;
31164       first_imode = V8HImode;
31165       second_imode = V4SImode;
31166       third_imode = V2DImode;
31167       break;
31168     default:
31169       gcc_unreachable ();
31170     }
31171
31172   for (i = 0; i < n; i++)
31173     {
31174       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
31175       op0 = gen_reg_rtx (SImode);
31176       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
31177
31178       /* Insert the SImode value as low element of V4SImode vector. */
31179       op1 = gen_reg_rtx (V4SImode);
31180       op0 = gen_rtx_VEC_MERGE (V4SImode,
31181                                gen_rtx_VEC_DUPLICATE (V4SImode,
31182                                                       op0),
31183                                CONST0_RTX (V4SImode),
31184                                const1_rtx);
31185       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
31186
31187       /* Cast the V4SImode vector back to a vector in orignal mode.  */
31188       op0 = gen_reg_rtx (mode);
31189       emit_move_insn (op0, gen_lowpart (mode, op1));
31190
31191       /* Load even elements into the second positon.  */
31192       emit_insn (gen_load_even (op0,
31193                                 force_reg (inner_mode,
31194                                            ops [i + i + 1]),
31195                                 const1_rtx));
31196
31197       /* Cast vector to FIRST_IMODE vector.  */
31198       ops[i] = gen_reg_rtx (first_imode);
31199       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
31200     }
31201
31202   /* Interleave low FIRST_IMODE vectors.  */
31203   for (i = j = 0; i < n; i += 2, j++)
31204     {
31205       op0 = gen_reg_rtx (first_imode);
31206       emit_insn (gen_interleave_first_low (op0, ops[i], ops[i + 1]));
31207
31208       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
31209       ops[j] = gen_reg_rtx (second_imode);
31210       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
31211     }
31212
31213   /* Interleave low SECOND_IMODE vectors.  */
31214   switch (second_imode)
31215     {
31216     case V4SImode:
31217       for (i = j = 0; i < n / 2; i += 2, j++)
31218         {
31219           op0 = gen_reg_rtx (second_imode);
31220           emit_insn (gen_interleave_second_low (op0, ops[i],
31221                                                 ops[i + 1]));
31222
31223           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
31224              vector.  */
31225           ops[j] = gen_reg_rtx (third_imode);
31226           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
31227         }
31228       second_imode = V2DImode;
31229       gen_interleave_second_low = gen_vec_interleave_lowv2di;
31230       /* FALLTHRU */
31231
31232     case V2DImode:
31233       op0 = gen_reg_rtx (second_imode);
31234       emit_insn (gen_interleave_second_low (op0, ops[0],
31235                                             ops[1]));
31236
31237       /* Cast the SECOND_IMODE vector back to a vector on original
31238          mode.  */
31239       emit_insn (gen_rtx_SET (VOIDmode, target,
31240                               gen_lowpart (mode, op0)));
31241       break;
31242
31243     default:
31244       gcc_unreachable ();
31245     }
31246 }
31247
31248 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
31249    all values variable, and none identical.  */
31250
31251 static void
31252 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
31253                                  rtx target, rtx vals)
31254 {
31255   rtx ops[32], op0, op1;
31256   enum machine_mode half_mode = VOIDmode;
31257   int n, i;
31258
31259   switch (mode)
31260     {
31261     case V2SFmode:
31262     case V2SImode:
31263       if (!mmx_ok && !TARGET_SSE)
31264         break;
31265       /* FALLTHRU */
31266
31267     case V8SFmode:
31268     case V8SImode:
31269     case V4DFmode:
31270     case V4DImode:
31271     case V4SFmode:
31272     case V4SImode:
31273     case V2DFmode:
31274     case V2DImode:
31275       n = GET_MODE_NUNITS (mode);
31276       for (i = 0; i < n; i++)
31277         ops[i] = XVECEXP (vals, 0, i);
31278       ix86_expand_vector_init_concat (mode, target, ops, n);
31279       return;
31280
31281     case V32QImode:
31282       half_mode = V16QImode;
31283       goto half;
31284
31285     case V16HImode:
31286       half_mode = V8HImode;
31287       goto half;
31288
31289 half:
31290       n = GET_MODE_NUNITS (mode);
31291       for (i = 0; i < n; i++)
31292         ops[i] = XVECEXP (vals, 0, i);
31293       op0 = gen_reg_rtx (half_mode);
31294       op1 = gen_reg_rtx (half_mode);
31295       ix86_expand_vector_init_interleave (half_mode, op0, ops,
31296                                           n >> 2);
31297       ix86_expand_vector_init_interleave (half_mode, op1,
31298                                           &ops [n >> 1], n >> 2);
31299       emit_insn (gen_rtx_SET (VOIDmode, target,
31300                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
31301       return;
31302
31303     case V16QImode:
31304       if (!TARGET_SSE4_1)
31305         break;
31306       /* FALLTHRU */
31307
31308     case V8HImode:
31309       if (!TARGET_SSE2)
31310         break;
31311
31312       /* Don't use ix86_expand_vector_init_interleave if we can't
31313          move from GPR to SSE register directly.  */
31314       if (!TARGET_INTER_UNIT_MOVES)
31315         break;
31316
31317       n = GET_MODE_NUNITS (mode);
31318       for (i = 0; i < n; i++)
31319         ops[i] = XVECEXP (vals, 0, i);
31320       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
31321       return;
31322
31323     case V4HImode:
31324     case V8QImode:
31325       break;
31326
31327     default:
31328       gcc_unreachable ();
31329     }
31330
31331     {
31332       int i, j, n_elts, n_words, n_elt_per_word;
31333       enum machine_mode inner_mode;
31334       rtx words[4], shift;
31335
31336       inner_mode = GET_MODE_INNER (mode);
31337       n_elts = GET_MODE_NUNITS (mode);
31338       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
31339       n_elt_per_word = n_elts / n_words;
31340       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
31341
31342       for (i = 0; i < n_words; ++i)
31343         {
31344           rtx word = NULL_RTX;
31345
31346           for (j = 0; j < n_elt_per_word; ++j)
31347             {
31348               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
31349               elt = convert_modes (word_mode, inner_mode, elt, true);
31350
31351               if (j == 0)
31352                 word = elt;
31353               else
31354                 {
31355                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
31356                                               word, 1, OPTAB_LIB_WIDEN);
31357                   word = expand_simple_binop (word_mode, IOR, word, elt,
31358                                               word, 1, OPTAB_LIB_WIDEN);
31359                 }
31360             }
31361
31362           words[i] = word;
31363         }
31364
31365       if (n_words == 1)
31366         emit_move_insn (target, gen_lowpart (mode, words[0]));
31367       else if (n_words == 2)
31368         {
31369           rtx tmp = gen_reg_rtx (mode);
31370           emit_clobber (tmp);
31371           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
31372           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
31373           emit_move_insn (target, tmp);
31374         }
31375       else if (n_words == 4)
31376         {
31377           rtx tmp = gen_reg_rtx (V4SImode);
31378           gcc_assert (word_mode == SImode);
31379           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
31380           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
31381           emit_move_insn (target, gen_lowpart (mode, tmp));
31382         }
31383       else
31384         gcc_unreachable ();
31385     }
31386 }
31387
31388 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
31389    instructions unless MMX_OK is true.  */
31390
31391 void
31392 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
31393 {
31394   enum machine_mode mode = GET_MODE (target);
31395   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31396   int n_elts = GET_MODE_NUNITS (mode);
31397   int n_var = 0, one_var = -1;
31398   bool all_same = true, all_const_zero = true;
31399   int i;
31400   rtx x;
31401
31402   for (i = 0; i < n_elts; ++i)
31403     {
31404       x = XVECEXP (vals, 0, i);
31405       if (!(CONST_INT_P (x)
31406             || GET_CODE (x) == CONST_DOUBLE
31407             || GET_CODE (x) == CONST_FIXED))
31408         n_var++, one_var = i;
31409       else if (x != CONST0_RTX (inner_mode))
31410         all_const_zero = false;
31411       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
31412         all_same = false;
31413     }
31414
31415   /* Constants are best loaded from the constant pool.  */
31416   if (n_var == 0)
31417     {
31418       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
31419       return;
31420     }
31421
31422   /* If all values are identical, broadcast the value.  */
31423   if (all_same
31424       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
31425                                             XVECEXP (vals, 0, 0)))
31426     return;
31427
31428   /* Values where only one field is non-constant are best loaded from
31429      the pool and overwritten via move later.  */
31430   if (n_var == 1)
31431     {
31432       if (all_const_zero
31433           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
31434                                                   XVECEXP (vals, 0, one_var),
31435                                                   one_var))
31436         return;
31437
31438       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
31439         return;
31440     }
31441
31442   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
31443 }
31444
31445 void
31446 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
31447 {
31448   enum machine_mode mode = GET_MODE (target);
31449   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31450   enum machine_mode half_mode;
31451   bool use_vec_merge = false;
31452   rtx tmp;
31453   static rtx (*gen_extract[6][2]) (rtx, rtx)
31454     = {
31455         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
31456         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
31457         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
31458         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
31459         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
31460         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
31461       };
31462   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
31463     = {
31464         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
31465         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
31466         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
31467         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
31468         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
31469         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
31470       };
31471   int i, j, n;
31472
31473   switch (mode)
31474     {
31475     case V2SFmode:
31476     case V2SImode:
31477       if (mmx_ok)
31478         {
31479           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
31480           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
31481           if (elt == 0)
31482             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
31483           else
31484             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
31485           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31486           return;
31487         }
31488       break;
31489
31490     case V2DImode:
31491       use_vec_merge = TARGET_SSE4_1 && TARGET_64BIT;
31492       if (use_vec_merge)
31493         break;
31494
31495       tmp = gen_reg_rtx (GET_MODE_INNER (mode));
31496       ix86_expand_vector_extract (false, tmp, target, 1 - elt);
31497       if (elt == 0)
31498         tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
31499       else
31500         tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
31501       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31502       return;
31503
31504     case V2DFmode:
31505       {
31506         rtx op0, op1;
31507
31508         /* For the two element vectors, we implement a VEC_CONCAT with
31509            the extraction of the other element.  */
31510
31511         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
31512         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
31513
31514         if (elt == 0)
31515           op0 = val, op1 = tmp;
31516         else
31517           op0 = tmp, op1 = val;
31518
31519         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
31520         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31521       }
31522       return;
31523
31524     case V4SFmode:
31525       use_vec_merge = TARGET_SSE4_1;
31526       if (use_vec_merge)
31527         break;
31528
31529       switch (elt)
31530         {
31531         case 0:
31532           use_vec_merge = true;
31533           break;
31534
31535         case 1:
31536           /* tmp = target = A B C D */
31537           tmp = copy_to_reg (target);
31538           /* target = A A B B */
31539           emit_insn (gen_vec_interleave_lowv4sf (target, target, target));
31540           /* target = X A B B */
31541           ix86_expand_vector_set (false, target, val, 0);
31542           /* target = A X C D  */
31543           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31544                                           const1_rtx, const0_rtx,
31545                                           GEN_INT (2+4), GEN_INT (3+4)));
31546           return;
31547
31548         case 2:
31549           /* tmp = target = A B C D */
31550           tmp = copy_to_reg (target);
31551           /* tmp = X B C D */
31552           ix86_expand_vector_set (false, tmp, val, 0);
31553           /* target = A B X D */
31554           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31555                                           const0_rtx, const1_rtx,
31556                                           GEN_INT (0+4), GEN_INT (3+4)));
31557           return;
31558
31559         case 3:
31560           /* tmp = target = A B C D */
31561           tmp = copy_to_reg (target);
31562           /* tmp = X B C D */
31563           ix86_expand_vector_set (false, tmp, val, 0);
31564           /* target = A B X D */
31565           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
31566                                           const0_rtx, const1_rtx,
31567                                           GEN_INT (2+4), GEN_INT (0+4)));
31568           return;
31569
31570         default:
31571           gcc_unreachable ();
31572         }
31573       break;
31574
31575     case V4SImode:
31576       use_vec_merge = TARGET_SSE4_1;
31577       if (use_vec_merge)
31578         break;
31579
31580       /* Element 0 handled by vec_merge below.  */
31581       if (elt == 0)
31582         {
31583           use_vec_merge = true;
31584           break;
31585         }
31586
31587       if (TARGET_SSE2)
31588         {
31589           /* With SSE2, use integer shuffles to swap element 0 and ELT,
31590              store into element 0, then shuffle them back.  */
31591
31592           rtx order[4];
31593
31594           order[0] = GEN_INT (elt);
31595           order[1] = const1_rtx;
31596           order[2] = const2_rtx;
31597           order[3] = GEN_INT (3);
31598           order[elt] = const0_rtx;
31599
31600           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
31601                                         order[1], order[2], order[3]));
31602
31603           ix86_expand_vector_set (false, target, val, 0);
31604
31605           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
31606                                         order[1], order[2], order[3]));
31607         }
31608       else
31609         {
31610           /* For SSE1, we have to reuse the V4SF code.  */
31611           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
31612                                   gen_lowpart (SFmode, val), elt);
31613         }
31614       return;
31615
31616     case V8HImode:
31617       use_vec_merge = TARGET_SSE2;
31618       break;
31619     case V4HImode:
31620       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
31621       break;
31622
31623     case V16QImode:
31624       use_vec_merge = TARGET_SSE4_1;
31625       break;
31626
31627     case V8QImode:
31628       break;
31629
31630     case V32QImode:
31631       half_mode = V16QImode;
31632       j = 0;
31633       n = 16;
31634       goto half;
31635
31636     case V16HImode:
31637       half_mode = V8HImode;
31638       j = 1;
31639       n = 8;
31640       goto half;
31641
31642     case V8SImode:
31643       half_mode = V4SImode;
31644       j = 2;
31645       n = 4;
31646       goto half;
31647
31648     case V4DImode:
31649       half_mode = V2DImode;
31650       j = 3;
31651       n = 2;
31652       goto half;
31653
31654     case V8SFmode:
31655       half_mode = V4SFmode;
31656       j = 4;
31657       n = 4;
31658       goto half;
31659
31660     case V4DFmode:
31661       half_mode = V2DFmode;
31662       j = 5;
31663       n = 2;
31664       goto half;
31665
31666 half:
31667       /* Compute offset.  */
31668       i = elt / n;
31669       elt %= n;
31670
31671       gcc_assert (i <= 1);
31672
31673       /* Extract the half.  */
31674       tmp = gen_reg_rtx (half_mode);
31675       emit_insn (gen_extract[j][i] (tmp, target));
31676
31677       /* Put val in tmp at elt.  */
31678       ix86_expand_vector_set (false, tmp, val, elt);
31679
31680       /* Put it back.  */
31681       emit_insn (gen_insert[j][i] (target, target, tmp));
31682       return;
31683
31684     default:
31685       break;
31686     }
31687
31688   if (use_vec_merge)
31689     {
31690       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
31691       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
31692       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31693     }
31694   else
31695     {
31696       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
31697
31698       emit_move_insn (mem, target);
31699
31700       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
31701       emit_move_insn (tmp, val);
31702
31703       emit_move_insn (target, mem);
31704     }
31705 }
31706
31707 void
31708 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
31709 {
31710   enum machine_mode mode = GET_MODE (vec);
31711   enum machine_mode inner_mode = GET_MODE_INNER (mode);
31712   bool use_vec_extr = false;
31713   rtx tmp;
31714
31715   switch (mode)
31716     {
31717     case V2SImode:
31718     case V2SFmode:
31719       if (!mmx_ok)
31720         break;
31721       /* FALLTHRU */
31722
31723     case V2DFmode:
31724     case V2DImode:
31725       use_vec_extr = true;
31726       break;
31727
31728     case V4SFmode:
31729       use_vec_extr = TARGET_SSE4_1;
31730       if (use_vec_extr)
31731         break;
31732
31733       switch (elt)
31734         {
31735         case 0:
31736           tmp = vec;
31737           break;
31738
31739         case 1:
31740         case 3:
31741           tmp = gen_reg_rtx (mode);
31742           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
31743                                        GEN_INT (elt), GEN_INT (elt),
31744                                        GEN_INT (elt+4), GEN_INT (elt+4)));
31745           break;
31746
31747         case 2:
31748           tmp = gen_reg_rtx (mode);
31749           emit_insn (gen_vec_interleave_highv4sf (tmp, vec, vec));
31750           break;
31751
31752         default:
31753           gcc_unreachable ();
31754         }
31755       vec = tmp;
31756       use_vec_extr = true;
31757       elt = 0;
31758       break;
31759
31760     case V4SImode:
31761       use_vec_extr = TARGET_SSE4_1;
31762       if (use_vec_extr)
31763         break;
31764
31765       if (TARGET_SSE2)
31766         {
31767           switch (elt)
31768             {
31769             case 0:
31770               tmp = vec;
31771               break;
31772
31773             case 1:
31774             case 3:
31775               tmp = gen_reg_rtx (mode);
31776               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
31777                                             GEN_INT (elt), GEN_INT (elt),
31778                                             GEN_INT (elt), GEN_INT (elt)));
31779               break;
31780
31781             case 2:
31782               tmp = gen_reg_rtx (mode);
31783               emit_insn (gen_vec_interleave_highv4si (tmp, vec, vec));
31784               break;
31785
31786             default:
31787               gcc_unreachable ();
31788             }
31789           vec = tmp;
31790           use_vec_extr = true;
31791           elt = 0;
31792         }
31793       else
31794         {
31795           /* For SSE1, we have to reuse the V4SF code.  */
31796           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
31797                                       gen_lowpart (V4SFmode, vec), elt);
31798           return;
31799         }
31800       break;
31801
31802     case V8HImode:
31803       use_vec_extr = TARGET_SSE2;
31804       break;
31805     case V4HImode:
31806       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
31807       break;
31808
31809     case V16QImode:
31810       use_vec_extr = TARGET_SSE4_1;
31811       break;
31812
31813     case V8QImode:
31814       /* ??? Could extract the appropriate HImode element and shift.  */
31815     default:
31816       break;
31817     }
31818
31819   if (use_vec_extr)
31820     {
31821       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
31822       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
31823
31824       /* Let the rtl optimizers know about the zero extension performed.  */
31825       if (inner_mode == QImode || inner_mode == HImode)
31826         {
31827           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
31828           target = gen_lowpart (SImode, target);
31829         }
31830
31831       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
31832     }
31833   else
31834     {
31835       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
31836
31837       emit_move_insn (mem, vec);
31838
31839       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
31840       emit_move_insn (target, tmp);
31841     }
31842 }
31843
31844 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
31845    pattern to reduce; DEST is the destination; IN is the input vector.  */
31846
31847 void
31848 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
31849 {
31850   rtx tmp1, tmp2, tmp3;
31851
31852   tmp1 = gen_reg_rtx (V4SFmode);
31853   tmp2 = gen_reg_rtx (V4SFmode);
31854   tmp3 = gen_reg_rtx (V4SFmode);
31855
31856   emit_insn (gen_sse_movhlps (tmp1, in, in));
31857   emit_insn (fn (tmp2, tmp1, in));
31858
31859   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
31860                                   const1_rtx, const1_rtx,
31861                                   GEN_INT (1+4), GEN_INT (1+4)));
31862   emit_insn (fn (dest, tmp2, tmp3));
31863 }
31864 \f
31865 /* Target hook for scalar_mode_supported_p.  */
31866 static bool
31867 ix86_scalar_mode_supported_p (enum machine_mode mode)
31868 {
31869   if (DECIMAL_FLOAT_MODE_P (mode))
31870     return default_decimal_float_supported_p ();
31871   else if (mode == TFmode)
31872     return true;
31873   else
31874     return default_scalar_mode_supported_p (mode);
31875 }
31876
31877 /* Implements target hook vector_mode_supported_p.  */
31878 static bool
31879 ix86_vector_mode_supported_p (enum machine_mode mode)
31880 {
31881   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
31882     return true;
31883   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
31884     return true;
31885   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
31886     return true;
31887   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
31888     return true;
31889   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
31890     return true;
31891   return false;
31892 }
31893
31894 /* Target hook for c_mode_for_suffix.  */
31895 static enum machine_mode
31896 ix86_c_mode_for_suffix (char suffix)
31897 {
31898   if (suffix == 'q')
31899     return TFmode;
31900   if (suffix == 'w')
31901     return XFmode;
31902
31903   return VOIDmode;
31904 }
31905
31906 /* Worker function for TARGET_MD_ASM_CLOBBERS.
31907
31908    We do this in the new i386 backend to maintain source compatibility
31909    with the old cc0-based compiler.  */
31910
31911 static tree
31912 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
31913                       tree inputs ATTRIBUTE_UNUSED,
31914                       tree clobbers)
31915 {
31916   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
31917                         clobbers);
31918   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
31919                         clobbers);
31920   return clobbers;
31921 }
31922
31923 /* Implements target vector targetm.asm.encode_section_info.  This
31924    is not used by netware.  */
31925
31926 static void ATTRIBUTE_UNUSED
31927 ix86_encode_section_info (tree decl, rtx rtl, int first)
31928 {
31929   default_encode_section_info (decl, rtl, first);
31930
31931   if (TREE_CODE (decl) == VAR_DECL
31932       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
31933       && ix86_in_large_data_p (decl))
31934     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
31935 }
31936
31937 /* Worker function for REVERSE_CONDITION.  */
31938
31939 enum rtx_code
31940 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
31941 {
31942   return (mode != CCFPmode && mode != CCFPUmode
31943           ? reverse_condition (code)
31944           : reverse_condition_maybe_unordered (code));
31945 }
31946
31947 /* Output code to perform an x87 FP register move, from OPERANDS[1]
31948    to OPERANDS[0].  */
31949
31950 const char *
31951 output_387_reg_move (rtx insn, rtx *operands)
31952 {
31953   if (REG_P (operands[0]))
31954     {
31955       if (REG_P (operands[1])
31956           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
31957         {
31958           if (REGNO (operands[0]) == FIRST_STACK_REG)
31959             return output_387_ffreep (operands, 0);
31960           return "fstp\t%y0";
31961         }
31962       if (STACK_TOP_P (operands[0]))
31963         return "fld%Z1\t%y1";
31964       return "fst\t%y0";
31965     }
31966   else if (MEM_P (operands[0]))
31967     {
31968       gcc_assert (REG_P (operands[1]));
31969       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
31970         return "fstp%Z0\t%y0";
31971       else
31972         {
31973           /* There is no non-popping store to memory for XFmode.
31974              So if we need one, follow the store with a load.  */
31975           if (GET_MODE (operands[0]) == XFmode)
31976             return "fstp%Z0\t%y0\n\tfld%Z0\t%y0";
31977           else
31978             return "fst%Z0\t%y0";
31979         }
31980     }
31981   else
31982     gcc_unreachable();
31983 }
31984
31985 /* Output code to perform a conditional jump to LABEL, if C2 flag in
31986    FP status register is set.  */
31987
31988 void
31989 ix86_emit_fp_unordered_jump (rtx label)
31990 {
31991   rtx reg = gen_reg_rtx (HImode);
31992   rtx temp;
31993
31994   emit_insn (gen_x86_fnstsw_1 (reg));
31995
31996   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
31997     {
31998       emit_insn (gen_x86_sahf_1 (reg));
31999
32000       temp = gen_rtx_REG (CCmode, FLAGS_REG);
32001       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
32002     }
32003   else
32004     {
32005       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
32006
32007       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
32008       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
32009     }
32010
32011   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
32012                               gen_rtx_LABEL_REF (VOIDmode, label),
32013                               pc_rtx);
32014   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
32015
32016   emit_jump_insn (temp);
32017   predict_jump (REG_BR_PROB_BASE * 10 / 100);
32018 }
32019
32020 /* Output code to perform a log1p XFmode calculation.  */
32021
32022 void ix86_emit_i387_log1p (rtx op0, rtx op1)
32023 {
32024   rtx label1 = gen_label_rtx ();
32025   rtx label2 = gen_label_rtx ();
32026
32027   rtx tmp = gen_reg_rtx (XFmode);
32028   rtx tmp2 = gen_reg_rtx (XFmode);
32029   rtx test;
32030
32031   emit_insn (gen_absxf2 (tmp, op1));
32032   test = gen_rtx_GE (VOIDmode, tmp,
32033     CONST_DOUBLE_FROM_REAL_VALUE (
32034        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
32035        XFmode));
32036   emit_jump_insn (gen_cbranchxf4 (test, XEXP (test, 0), XEXP (test, 1), label1));
32037
32038   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
32039   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
32040   emit_jump (label2);
32041
32042   emit_label (label1);
32043   emit_move_insn (tmp, CONST1_RTX (XFmode));
32044   emit_insn (gen_addxf3 (tmp, op1, tmp));
32045   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
32046   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
32047
32048   emit_label (label2);
32049 }
32050
32051 /* Output code to perform a Newton-Rhapson approximation of a single precision
32052    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
32053
32054 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
32055 {
32056   rtx x0, x1, e0, e1;
32057
32058   x0 = gen_reg_rtx (mode);
32059   e0 = gen_reg_rtx (mode);
32060   e1 = gen_reg_rtx (mode);
32061   x1 = gen_reg_rtx (mode);
32062
32063   /* a / b = a * ((rcp(b) + rcp(b)) - (b * rcp(b) * rcp (b))) */
32064
32065   /* x0 = rcp(b) estimate */
32066   emit_insn (gen_rtx_SET (VOIDmode, x0,
32067                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
32068                                           UNSPEC_RCP)));
32069   /* e0 = x0 * b */
32070   emit_insn (gen_rtx_SET (VOIDmode, e0,
32071                           gen_rtx_MULT (mode, x0, b)));
32072
32073   /* e0 = x0 * e0 */
32074   emit_insn (gen_rtx_SET (VOIDmode, e0,
32075                           gen_rtx_MULT (mode, x0, e0)));
32076
32077   /* e1 = x0 + x0 */
32078   emit_insn (gen_rtx_SET (VOIDmode, e1,
32079                           gen_rtx_PLUS (mode, x0, x0)));
32080
32081   /* x1 = e1 - e0 */
32082   emit_insn (gen_rtx_SET (VOIDmode, x1,
32083                           gen_rtx_MINUS (mode, e1, e0)));
32084
32085   /* res = a * x1 */
32086   emit_insn (gen_rtx_SET (VOIDmode, res,
32087                           gen_rtx_MULT (mode, a, x1)));
32088 }
32089
32090 /* Output code to perform a Newton-Rhapson approximation of a
32091    single precision floating point [reciprocal] square root.  */
32092
32093 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
32094                          bool recip)
32095 {
32096   rtx x0, e0, e1, e2, e3, mthree, mhalf;
32097   REAL_VALUE_TYPE r;
32098
32099   x0 = gen_reg_rtx (mode);
32100   e0 = gen_reg_rtx (mode);
32101   e1 = gen_reg_rtx (mode);
32102   e2 = gen_reg_rtx (mode);
32103   e3 = gen_reg_rtx (mode);
32104
32105   real_from_integer (&r, VOIDmode, -3, -1, 0);
32106   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
32107
32108   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
32109   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
32110
32111   if (VECTOR_MODE_P (mode))
32112     {
32113       mthree = ix86_build_const_vector (mode, true, mthree);
32114       mhalf = ix86_build_const_vector (mode, true, mhalf);
32115     }
32116
32117   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
32118      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
32119
32120   /* x0 = rsqrt(a) estimate */
32121   emit_insn (gen_rtx_SET (VOIDmode, x0,
32122                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
32123                                           UNSPEC_RSQRT)));
32124
32125   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
32126   if (!recip)
32127     {
32128       rtx zero, mask;
32129
32130       zero = gen_reg_rtx (mode);
32131       mask = gen_reg_rtx (mode);
32132
32133       zero = force_reg (mode, CONST0_RTX(mode));
32134       emit_insn (gen_rtx_SET (VOIDmode, mask,
32135                               gen_rtx_NE (mode, zero, a)));
32136
32137       emit_insn (gen_rtx_SET (VOIDmode, x0,
32138                               gen_rtx_AND (mode, x0, mask)));
32139     }
32140
32141   /* e0 = x0 * a */
32142   emit_insn (gen_rtx_SET (VOIDmode, e0,
32143                           gen_rtx_MULT (mode, x0, a)));
32144   /* e1 = e0 * x0 */
32145   emit_insn (gen_rtx_SET (VOIDmode, e1,
32146                           gen_rtx_MULT (mode, e0, x0)));
32147
32148   /* e2 = e1 - 3. */
32149   mthree = force_reg (mode, mthree);
32150   emit_insn (gen_rtx_SET (VOIDmode, e2,
32151                           gen_rtx_PLUS (mode, e1, mthree)));
32152
32153   mhalf = force_reg (mode, mhalf);
32154   if (recip)
32155     /* e3 = -.5 * x0 */
32156     emit_insn (gen_rtx_SET (VOIDmode, e3,
32157                             gen_rtx_MULT (mode, x0, mhalf)));
32158   else
32159     /* e3 = -.5 * e0 */
32160     emit_insn (gen_rtx_SET (VOIDmode, e3,
32161                             gen_rtx_MULT (mode, e0, mhalf)));
32162   /* ret = e2 * e3 */
32163   emit_insn (gen_rtx_SET (VOIDmode, res,
32164                           gen_rtx_MULT (mode, e2, e3)));
32165 }
32166
32167 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
32168
32169 static void ATTRIBUTE_UNUSED
32170 i386_solaris_elf_named_section (const char *name, unsigned int flags,
32171                                 tree decl)
32172 {
32173   /* With Binutils 2.15, the "@unwind" marker must be specified on
32174      every occurrence of the ".eh_frame" section, not just the first
32175      one.  */
32176   if (TARGET_64BIT
32177       && strcmp (name, ".eh_frame") == 0)
32178     {
32179       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
32180                flags & SECTION_WRITE ? "aw" : "a");
32181       return;
32182     }
32183   default_elf_asm_named_section (name, flags, decl);
32184 }
32185
32186 /* Return the mangling of TYPE if it is an extended fundamental type.  */
32187
32188 static const char *
32189 ix86_mangle_type (const_tree type)
32190 {
32191   type = TYPE_MAIN_VARIANT (type);
32192
32193   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
32194       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
32195     return NULL;
32196
32197   switch (TYPE_MODE (type))
32198     {
32199     case TFmode:
32200       /* __float128 is "g".  */
32201       return "g";
32202     case XFmode:
32203       /* "long double" or __float80 is "e".  */
32204       return "e";
32205     default:
32206       return NULL;
32207     }
32208 }
32209
32210 /* For 32-bit code we can save PIC register setup by using
32211    __stack_chk_fail_local hidden function instead of calling
32212    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
32213    register, so it is better to call __stack_chk_fail directly.  */
32214
32215 static tree
32216 ix86_stack_protect_fail (void)
32217 {
32218   return TARGET_64BIT
32219          ? default_external_stack_protect_fail ()
32220          : default_hidden_stack_protect_fail ();
32221 }
32222
32223 /* Select a format to encode pointers in exception handling data.  CODE
32224    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
32225    true if the symbol may be affected by dynamic relocations.
32226
32227    ??? All x86 object file formats are capable of representing this.
32228    After all, the relocation needed is the same as for the call insn.
32229    Whether or not a particular assembler allows us to enter such, I
32230    guess we'll have to see.  */
32231 int
32232 asm_preferred_eh_data_format (int code, int global)
32233 {
32234   if (flag_pic)
32235     {
32236       int type = DW_EH_PE_sdata8;
32237       if (!TARGET_64BIT
32238           || ix86_cmodel == CM_SMALL_PIC
32239           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
32240         type = DW_EH_PE_sdata4;
32241       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
32242     }
32243   if (ix86_cmodel == CM_SMALL
32244       || (ix86_cmodel == CM_MEDIUM && code))
32245     return DW_EH_PE_udata4;
32246   return DW_EH_PE_absptr;
32247 }
32248 \f
32249 /* Expand copysign from SIGN to the positive value ABS_VALUE
32250    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
32251    the sign-bit.  */
32252 static void
32253 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
32254 {
32255   enum machine_mode mode = GET_MODE (sign);
32256   rtx sgn = gen_reg_rtx (mode);
32257   if (mask == NULL_RTX)
32258     {
32259       enum machine_mode vmode;
32260
32261       if (mode == SFmode)
32262         vmode = V4SFmode;
32263       else if (mode == DFmode)
32264         vmode = V2DFmode;
32265       else
32266         vmode = mode;
32267
32268       mask = ix86_build_signbit_mask (vmode, VECTOR_MODE_P (mode), false);
32269       if (!VECTOR_MODE_P (mode))
32270         {
32271           /* We need to generate a scalar mode mask in this case.  */
32272           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
32273           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
32274           mask = gen_reg_rtx (mode);
32275           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
32276         }
32277     }
32278   else
32279     mask = gen_rtx_NOT (mode, mask);
32280   emit_insn (gen_rtx_SET (VOIDmode, sgn,
32281                           gen_rtx_AND (mode, mask, sign)));
32282   emit_insn (gen_rtx_SET (VOIDmode, result,
32283                           gen_rtx_IOR (mode, abs_value, sgn)));
32284 }
32285
32286 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
32287    mask for masking out the sign-bit is stored in *SMASK, if that is
32288    non-null.  */
32289 static rtx
32290 ix86_expand_sse_fabs (rtx op0, rtx *smask)
32291 {
32292   enum machine_mode vmode, mode = GET_MODE (op0);
32293   rtx xa, mask;
32294
32295   xa = gen_reg_rtx (mode);
32296   if (mode == SFmode)
32297     vmode = V4SFmode;
32298   else if (mode == DFmode)
32299     vmode = V2DFmode;
32300   else
32301     vmode = mode;
32302   mask = ix86_build_signbit_mask (vmode, VECTOR_MODE_P (mode), true);
32303   if (!VECTOR_MODE_P (mode))
32304     {
32305       /* We need to generate a scalar mode mask in this case.  */
32306       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
32307       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
32308       mask = gen_reg_rtx (mode);
32309       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
32310     }
32311   emit_insn (gen_rtx_SET (VOIDmode, xa,
32312                           gen_rtx_AND (mode, op0, mask)));
32313
32314   if (smask)
32315     *smask = mask;
32316
32317   return xa;
32318 }
32319
32320 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
32321    swapping the operands if SWAP_OPERANDS is true.  The expanded
32322    code is a forward jump to a newly created label in case the
32323    comparison is true.  The generated label rtx is returned.  */
32324 static rtx
32325 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
32326                                   bool swap_operands)
32327 {
32328   rtx label, tmp;
32329
32330   if (swap_operands)
32331     {
32332       tmp = op0;
32333       op0 = op1;
32334       op1 = tmp;
32335     }
32336
32337   label = gen_label_rtx ();
32338   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
32339   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32340                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
32341   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
32342   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
32343                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
32344   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
32345   JUMP_LABEL (tmp) = label;
32346
32347   return label;
32348 }
32349
32350 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
32351    using comparison code CODE.  Operands are swapped for the comparison if
32352    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
32353 static rtx
32354 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
32355                               bool swap_operands)
32356 {
32357   rtx (*insn)(rtx, rtx, rtx, rtx);
32358   enum machine_mode mode = GET_MODE (op0);
32359   rtx mask = gen_reg_rtx (mode);
32360
32361   if (swap_operands)
32362     {
32363       rtx tmp = op0;
32364       op0 = op1;
32365       op1 = tmp;
32366     }
32367
32368   insn = mode == DFmode ? gen_setcc_df_sse : gen_setcc_sf_sse;
32369
32370   emit_insn (insn (mask, op0, op1,
32371                    gen_rtx_fmt_ee (code, mode, op0, op1)));
32372   return mask;
32373 }
32374
32375 /* Generate and return a rtx of mode MODE for 2**n where n is the number
32376    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
32377 static rtx
32378 ix86_gen_TWO52 (enum machine_mode mode)
32379 {
32380   REAL_VALUE_TYPE TWO52r;
32381   rtx TWO52;
32382
32383   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
32384   TWO52 = const_double_from_real_value (TWO52r, mode);
32385   TWO52 = force_reg (mode, TWO52);
32386
32387   return TWO52;
32388 }
32389
32390 /* Expand SSE sequence for computing lround from OP1 storing
32391    into OP0.  */
32392 void
32393 ix86_expand_lround (rtx op0, rtx op1)
32394 {
32395   /* C code for the stuff we're doing below:
32396        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
32397        return (long)tmp;
32398    */
32399   enum machine_mode mode = GET_MODE (op1);
32400   const struct real_format *fmt;
32401   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
32402   rtx adj;
32403
32404   /* load nextafter (0.5, 0.0) */
32405   fmt = REAL_MODE_FORMAT (mode);
32406   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
32407   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
32408
32409   /* adj = copysign (0.5, op1) */
32410   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
32411   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
32412
32413   /* adj = op1 + adj */
32414   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
32415
32416   /* op0 = (imode)adj */
32417   expand_fix (op0, adj, 0);
32418 }
32419
32420 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
32421    into OPERAND0.  */
32422 void
32423 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
32424 {
32425   /* C code for the stuff we're doing below (for do_floor):
32426         xi = (long)op1;
32427         xi -= (double)xi > op1 ? 1 : 0;
32428         return xi;
32429    */
32430   enum machine_mode fmode = GET_MODE (op1);
32431   enum machine_mode imode = GET_MODE (op0);
32432   rtx ireg, freg, label, tmp;
32433
32434   /* reg = (long)op1 */
32435   ireg = gen_reg_rtx (imode);
32436   expand_fix (ireg, op1, 0);
32437
32438   /* freg = (double)reg */
32439   freg = gen_reg_rtx (fmode);
32440   expand_float (freg, ireg, 0);
32441
32442   /* ireg = (freg > op1) ? ireg - 1 : ireg */
32443   label = ix86_expand_sse_compare_and_jump (UNLE,
32444                                             freg, op1, !do_floor);
32445   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
32446                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
32447   emit_move_insn (ireg, tmp);
32448
32449   emit_label (label);
32450   LABEL_NUSES (label) = 1;
32451
32452   emit_move_insn (op0, ireg);
32453 }
32454
32455 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
32456    result in OPERAND0.  */
32457 void
32458 ix86_expand_rint (rtx operand0, rtx operand1)
32459 {
32460   /* C code for the stuff we're doing below:
32461         xa = fabs (operand1);
32462         if (!isless (xa, 2**52))
32463           return operand1;
32464         xa = xa + 2**52 - 2**52;
32465         return copysign (xa, operand1);
32466    */
32467   enum machine_mode mode = GET_MODE (operand0);
32468   rtx res, xa, label, TWO52, mask;
32469
32470   res = gen_reg_rtx (mode);
32471   emit_move_insn (res, operand1);
32472
32473   /* xa = abs (operand1) */
32474   xa = ix86_expand_sse_fabs (res, &mask);
32475
32476   /* if (!isless (xa, TWO52)) goto label; */
32477   TWO52 = ix86_gen_TWO52 (mode);
32478   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32479
32480   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32481   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
32482
32483   ix86_sse_copysign_to_positive (res, xa, res, mask);
32484
32485   emit_label (label);
32486   LABEL_NUSES (label) = 1;
32487
32488   emit_move_insn (operand0, res);
32489 }
32490
32491 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
32492    into OPERAND0.  */
32493 void
32494 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
32495 {
32496   /* C code for the stuff we expand below.
32497         double xa = fabs (x), x2;
32498         if (!isless (xa, TWO52))
32499           return x;
32500         xa = xa + TWO52 - TWO52;
32501         x2 = copysign (xa, x);
32502      Compensate.  Floor:
32503         if (x2 > x)
32504           x2 -= 1;
32505      Compensate.  Ceil:
32506         if (x2 < x)
32507           x2 -= -1;
32508         return x2;
32509    */
32510   enum machine_mode mode = GET_MODE (operand0);
32511   rtx xa, TWO52, tmp, label, one, res, mask;
32512
32513   TWO52 = ix86_gen_TWO52 (mode);
32514
32515   /* Temporary for holding the result, initialized to the input
32516      operand to ease control flow.  */
32517   res = gen_reg_rtx (mode);
32518   emit_move_insn (res, operand1);
32519
32520   /* xa = abs (operand1) */
32521   xa = ix86_expand_sse_fabs (res, &mask);
32522
32523   /* if (!isless (xa, TWO52)) goto label; */
32524   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32525
32526   /* xa = xa + TWO52 - TWO52; */
32527   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32528   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
32529
32530   /* xa = copysign (xa, operand1) */
32531   ix86_sse_copysign_to_positive (xa, xa, res, mask);
32532
32533   /* generate 1.0 or -1.0 */
32534   one = force_reg (mode,
32535                    const_double_from_real_value (do_floor
32536                                                  ? dconst1 : dconstm1, mode));
32537
32538   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
32539   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
32540   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32541                           gen_rtx_AND (mode, one, tmp)));
32542   /* We always need to subtract here to preserve signed zero.  */
32543   tmp = expand_simple_binop (mode, MINUS,
32544                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32545   emit_move_insn (res, tmp);
32546
32547   emit_label (label);
32548   LABEL_NUSES (label) = 1;
32549
32550   emit_move_insn (operand0, res);
32551 }
32552
32553 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
32554    into OPERAND0.  */
32555 void
32556 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
32557 {
32558   /* C code for the stuff we expand below.
32559         double xa = fabs (x), x2;
32560         if (!isless (xa, TWO52))
32561           return x;
32562         x2 = (double)(long)x;
32563      Compensate.  Floor:
32564         if (x2 > x)
32565           x2 -= 1;
32566      Compensate.  Ceil:
32567         if (x2 < x)
32568           x2 += 1;
32569         if (HONOR_SIGNED_ZEROS (mode))
32570           return copysign (x2, x);
32571         return x2;
32572    */
32573   enum machine_mode mode = GET_MODE (operand0);
32574   rtx xa, xi, TWO52, tmp, label, one, res, mask;
32575
32576   TWO52 = ix86_gen_TWO52 (mode);
32577
32578   /* Temporary for holding the result, initialized to the input
32579      operand to ease control flow.  */
32580   res = gen_reg_rtx (mode);
32581   emit_move_insn (res, operand1);
32582
32583   /* xa = abs (operand1) */
32584   xa = ix86_expand_sse_fabs (res, &mask);
32585
32586   /* if (!isless (xa, TWO52)) goto label; */
32587   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32588
32589   /* xa = (double)(long)x */
32590   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32591   expand_fix (xi, res, 0);
32592   expand_float (xa, xi, 0);
32593
32594   /* generate 1.0 */
32595   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
32596
32597   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
32598   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
32599   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32600                           gen_rtx_AND (mode, one, tmp)));
32601   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
32602                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32603   emit_move_insn (res, tmp);
32604
32605   if (HONOR_SIGNED_ZEROS (mode))
32606     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
32607
32608   emit_label (label);
32609   LABEL_NUSES (label) = 1;
32610
32611   emit_move_insn (operand0, res);
32612 }
32613
32614 /* Expand SSE sequence for computing round from OPERAND1 storing
32615    into OPERAND0.  Sequence that works without relying on DImode truncation
32616    via cvttsd2siq that is only available on 64bit targets.  */
32617 void
32618 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
32619 {
32620   /* C code for the stuff we expand below.
32621         double xa = fabs (x), xa2, x2;
32622         if (!isless (xa, TWO52))
32623           return x;
32624      Using the absolute value and copying back sign makes
32625      -0.0 -> -0.0 correct.
32626         xa2 = xa + TWO52 - TWO52;
32627      Compensate.
32628         dxa = xa2 - xa;
32629         if (dxa <= -0.5)
32630           xa2 += 1;
32631         else if (dxa > 0.5)
32632           xa2 -= 1;
32633         x2 = copysign (xa2, x);
32634         return x2;
32635    */
32636   enum machine_mode mode = GET_MODE (operand0);
32637   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
32638
32639   TWO52 = ix86_gen_TWO52 (mode);
32640
32641   /* Temporary for holding the result, initialized to the input
32642      operand to ease control flow.  */
32643   res = gen_reg_rtx (mode);
32644   emit_move_insn (res, operand1);
32645
32646   /* xa = abs (operand1) */
32647   xa = ix86_expand_sse_fabs (res, &mask);
32648
32649   /* if (!isless (xa, TWO52)) goto label; */
32650   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32651
32652   /* xa2 = xa + TWO52 - TWO52; */
32653   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32654   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
32655
32656   /* dxa = xa2 - xa; */
32657   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
32658
32659   /* generate 0.5, 1.0 and -0.5 */
32660   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
32661   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
32662   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
32663                                0, OPTAB_DIRECT);
32664
32665   /* Compensate.  */
32666   tmp = gen_reg_rtx (mode);
32667   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
32668   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
32669   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32670                           gen_rtx_AND (mode, one, tmp)));
32671   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32672   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
32673   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
32674   emit_insn (gen_rtx_SET (VOIDmode, tmp,
32675                           gen_rtx_AND (mode, one, tmp)));
32676   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
32677
32678   /* res = copysign (xa2, operand1) */
32679   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
32680
32681   emit_label (label);
32682   LABEL_NUSES (label) = 1;
32683
32684   emit_move_insn (operand0, res);
32685 }
32686
32687 /* Expand SSE sequence for computing trunc from OPERAND1 storing
32688    into OPERAND0.  */
32689 void
32690 ix86_expand_trunc (rtx operand0, rtx operand1)
32691 {
32692   /* C code for SSE variant we expand below.
32693         double xa = fabs (x), x2;
32694         if (!isless (xa, TWO52))
32695           return x;
32696         x2 = (double)(long)x;
32697         if (HONOR_SIGNED_ZEROS (mode))
32698           return copysign (x2, x);
32699         return x2;
32700    */
32701   enum machine_mode mode = GET_MODE (operand0);
32702   rtx xa, xi, TWO52, label, res, mask;
32703
32704   TWO52 = ix86_gen_TWO52 (mode);
32705
32706   /* Temporary for holding the result, initialized to the input
32707      operand to ease control flow.  */
32708   res = gen_reg_rtx (mode);
32709   emit_move_insn (res, operand1);
32710
32711   /* xa = abs (operand1) */
32712   xa = ix86_expand_sse_fabs (res, &mask);
32713
32714   /* if (!isless (xa, TWO52)) goto label; */
32715   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32716
32717   /* x = (double)(long)x */
32718   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32719   expand_fix (xi, res, 0);
32720   expand_float (res, xi, 0);
32721
32722   if (HONOR_SIGNED_ZEROS (mode))
32723     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
32724
32725   emit_label (label);
32726   LABEL_NUSES (label) = 1;
32727
32728   emit_move_insn (operand0, res);
32729 }
32730
32731 /* Expand SSE sequence for computing trunc from OPERAND1 storing
32732    into OPERAND0.  */
32733 void
32734 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
32735 {
32736   enum machine_mode mode = GET_MODE (operand0);
32737   rtx xa, mask, TWO52, label, one, res, smask, tmp;
32738
32739   /* C code for SSE variant we expand below.
32740         double xa = fabs (x), x2;
32741         if (!isless (xa, TWO52))
32742           return x;
32743         xa2 = xa + TWO52 - TWO52;
32744      Compensate:
32745         if (xa2 > xa)
32746           xa2 -= 1.0;
32747         x2 = copysign (xa2, x);
32748         return x2;
32749    */
32750
32751   TWO52 = ix86_gen_TWO52 (mode);
32752
32753   /* Temporary for holding the result, initialized to the input
32754      operand to ease control flow.  */
32755   res = gen_reg_rtx (mode);
32756   emit_move_insn (res, operand1);
32757
32758   /* xa = abs (operand1) */
32759   xa = ix86_expand_sse_fabs (res, &smask);
32760
32761   /* if (!isless (xa, TWO52)) goto label; */
32762   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32763
32764   /* res = xa + TWO52 - TWO52; */
32765   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
32766   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
32767   emit_move_insn (res, tmp);
32768
32769   /* generate 1.0 */
32770   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
32771
32772   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
32773   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
32774   emit_insn (gen_rtx_SET (VOIDmode, mask,
32775                           gen_rtx_AND (mode, mask, one)));
32776   tmp = expand_simple_binop (mode, MINUS,
32777                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
32778   emit_move_insn (res, tmp);
32779
32780   /* res = copysign (res, operand1) */
32781   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
32782
32783   emit_label (label);
32784   LABEL_NUSES (label) = 1;
32785
32786   emit_move_insn (operand0, res);
32787 }
32788
32789 /* Expand SSE sequence for computing round from OPERAND1 storing
32790    into OPERAND0.  */
32791 void
32792 ix86_expand_round (rtx operand0, rtx operand1)
32793 {
32794   /* C code for the stuff we're doing below:
32795         double xa = fabs (x);
32796         if (!isless (xa, TWO52))
32797           return x;
32798         xa = (double)(long)(xa + nextafter (0.5, 0.0));
32799         return copysign (xa, x);
32800    */
32801   enum machine_mode mode = GET_MODE (operand0);
32802   rtx res, TWO52, xa, label, xi, half, mask;
32803   const struct real_format *fmt;
32804   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
32805
32806   /* Temporary for holding the result, initialized to the input
32807      operand to ease control flow.  */
32808   res = gen_reg_rtx (mode);
32809   emit_move_insn (res, operand1);
32810
32811   TWO52 = ix86_gen_TWO52 (mode);
32812   xa = ix86_expand_sse_fabs (res, &mask);
32813   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
32814
32815   /* load nextafter (0.5, 0.0) */
32816   fmt = REAL_MODE_FORMAT (mode);
32817   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
32818   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
32819
32820   /* xa = xa + 0.5 */
32821   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
32822   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
32823
32824   /* xa = (double)(int64_t)xa */
32825   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
32826   expand_fix (xi, xa, 0);
32827   expand_float (xa, xi, 0);
32828
32829   /* res = copysign (xa, operand1) */
32830   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
32831
32832   emit_label (label);
32833   LABEL_NUSES (label) = 1;
32834
32835   emit_move_insn (operand0, res);
32836 }
32837 \f
32838
32839 /* Table of valid machine attributes.  */
32840 static const struct attribute_spec ix86_attribute_table[] =
32841 {
32842   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
32843        affects_type_identity } */
32844   /* Stdcall attribute says callee is responsible for popping arguments
32845      if they are not variable.  */
32846   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32847     true },
32848   /* Fastcall attribute says callee is responsible for popping arguments
32849      if they are not variable.  */
32850   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32851     true },
32852   /* Thiscall attribute says callee is responsible for popping arguments
32853      if they are not variable.  */
32854   { "thiscall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32855     true },
32856   /* Cdecl attribute says the callee is a normal C declaration */
32857   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute,
32858     true },
32859   /* Regparm attribute specifies how many integer arguments are to be
32860      passed in registers.  */
32861   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute,
32862     true },
32863   /* Sseregparm attribute says we are using x86_64 calling conventions
32864      for FP arguments.  */
32865   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute,
32866     true },
32867   /* force_align_arg_pointer says this function realigns the stack at entry.  */
32868   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
32869     false, true,  true, ix86_handle_cconv_attribute, false },
32870 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
32871   { "dllimport", 0, 0, false, false, false, handle_dll_attribute, false },
32872   { "dllexport", 0, 0, false, false, false, handle_dll_attribute, false },
32873   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute,
32874     false },
32875 #endif
32876   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
32877     false },
32878   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
32879     false },
32880 #ifdef SUBTARGET_ATTRIBUTE_TABLE
32881   SUBTARGET_ATTRIBUTE_TABLE,
32882 #endif
32883   /* ms_abi and sysv_abi calling convention function attributes.  */
32884   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
32885   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
32886   { "ms_hook_prologue", 0, 0, true, false, false, ix86_handle_fndecl_attribute,
32887     false },
32888   { "callee_pop_aggregate_return", 1, 1, false, true, true,
32889     ix86_handle_callee_pop_aggregate_return, true },
32890   /* End element.  */
32891   { NULL,        0, 0, false, false, false, NULL, false }
32892 };
32893
32894 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
32895 static int
32896 ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
32897                                  tree vectype ATTRIBUTE_UNUSED,
32898                                  int misalign ATTRIBUTE_UNUSED)
32899 {
32900   switch (type_of_cost)
32901     {
32902       case scalar_stmt:
32903         return ix86_cost->scalar_stmt_cost;
32904
32905       case scalar_load:
32906         return ix86_cost->scalar_load_cost;
32907
32908       case scalar_store:
32909         return ix86_cost->scalar_store_cost;
32910
32911       case vector_stmt:
32912         return ix86_cost->vec_stmt_cost;
32913
32914       case vector_load:
32915         return ix86_cost->vec_align_load_cost;
32916
32917       case vector_store:
32918         return ix86_cost->vec_store_cost;
32919
32920       case vec_to_scalar:
32921         return ix86_cost->vec_to_scalar_cost;
32922
32923       case scalar_to_vec:
32924         return ix86_cost->scalar_to_vec_cost;
32925
32926       case unaligned_load:
32927       case unaligned_store:
32928         return ix86_cost->vec_unalign_load_cost;
32929
32930       case cond_branch_taken:
32931         return ix86_cost->cond_taken_branch_cost;
32932
32933       case cond_branch_not_taken:
32934         return ix86_cost->cond_not_taken_branch_cost;
32935
32936       case vec_perm:
32937         return 1;
32938
32939       default:
32940         gcc_unreachable ();
32941     }
32942 }
32943
32944
32945 /* Implement targetm.vectorize.builtin_vec_perm.  */
32946
32947 static tree
32948 ix86_vectorize_builtin_vec_perm (tree vec_type, tree *mask_type)
32949 {
32950   tree itype = TREE_TYPE (vec_type);
32951   bool u = TYPE_UNSIGNED (itype);
32952   enum machine_mode vmode = TYPE_MODE (vec_type);
32953   enum ix86_builtins fcode;
32954   bool ok = TARGET_SSE2;
32955
32956   switch (vmode)
32957     {
32958     case V4DFmode:
32959       ok = TARGET_AVX;
32960       fcode = IX86_BUILTIN_VEC_PERM_V4DF;
32961       goto get_di;
32962     case V2DFmode:
32963       fcode = IX86_BUILTIN_VEC_PERM_V2DF;
32964     get_di:
32965       itype = ix86_get_builtin_type (IX86_BT_DI);
32966       break;
32967
32968     case V8SFmode:
32969       ok = TARGET_AVX;
32970       fcode = IX86_BUILTIN_VEC_PERM_V8SF;
32971       goto get_si;
32972     case V4SFmode:
32973       ok = TARGET_SSE;
32974       fcode = IX86_BUILTIN_VEC_PERM_V4SF;
32975     get_si:
32976       itype = ix86_get_builtin_type (IX86_BT_SI);
32977       break;
32978
32979     case V2DImode:
32980       fcode = u ? IX86_BUILTIN_VEC_PERM_V2DI_U : IX86_BUILTIN_VEC_PERM_V2DI;
32981       break;
32982     case V4SImode:
32983       fcode = u ? IX86_BUILTIN_VEC_PERM_V4SI_U : IX86_BUILTIN_VEC_PERM_V4SI;
32984       break;
32985     case V8HImode:
32986       fcode = u ? IX86_BUILTIN_VEC_PERM_V8HI_U : IX86_BUILTIN_VEC_PERM_V8HI;
32987       break;
32988     case V16QImode:
32989       fcode = u ? IX86_BUILTIN_VEC_PERM_V16QI_U : IX86_BUILTIN_VEC_PERM_V16QI;
32990       break;
32991     default:
32992       ok = false;
32993       break;
32994     }
32995
32996   if (!ok)
32997     return NULL_TREE;
32998
32999   *mask_type = itype;
33000   return ix86_builtins[(int) fcode];
33001 }
33002
33003 /* Return a vector mode with twice as many elements as VMODE.  */
33004 /* ??? Consider moving this to a table generated by genmodes.c.  */
33005
33006 static enum machine_mode
33007 doublesize_vector_mode (enum machine_mode vmode)
33008 {
33009   switch (vmode)
33010     {
33011     case V2SFmode:      return V4SFmode;
33012     case V1DImode:      return V2DImode;
33013     case V2SImode:      return V4SImode;
33014     case V4HImode:      return V8HImode;
33015     case V8QImode:      return V16QImode;
33016
33017     case V2DFmode:      return V4DFmode;
33018     case V4SFmode:      return V8SFmode;
33019     case V2DImode:      return V4DImode;
33020     case V4SImode:      return V8SImode;
33021     case V8HImode:      return V16HImode;
33022     case V16QImode:     return V32QImode;
33023
33024     case V4DFmode:      return V8DFmode;
33025     case V8SFmode:      return V16SFmode;
33026     case V4DImode:      return V8DImode;
33027     case V8SImode:      return V16SImode;
33028     case V16HImode:     return V32HImode;
33029     case V32QImode:     return V64QImode;
33030
33031     default:
33032       gcc_unreachable ();
33033     }
33034 }
33035
33036 /* Construct (set target (vec_select op0 (parallel perm))) and
33037    return true if that's a valid instruction in the active ISA.  */
33038
33039 static bool
33040 expand_vselect (rtx target, rtx op0, const unsigned char *perm, unsigned nelt)
33041 {
33042   rtx rperm[MAX_VECT_LEN], x;
33043   unsigned i;
33044
33045   for (i = 0; i < nelt; ++i)
33046     rperm[i] = GEN_INT (perm[i]);
33047
33048   x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
33049   x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
33050   x = gen_rtx_SET (VOIDmode, target, x);
33051
33052   x = emit_insn (x);
33053   if (recog_memoized (x) < 0)
33054     {
33055       remove_insn (x);
33056       return false;
33057     }
33058   return true;
33059 }
33060
33061 /* Similar, but generate a vec_concat from op0 and op1 as well.  */
33062
33063 static bool
33064 expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
33065                         const unsigned char *perm, unsigned nelt)
33066 {
33067   enum machine_mode v2mode;
33068   rtx x;
33069
33070   v2mode = doublesize_vector_mode (GET_MODE (op0));
33071   x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
33072   return expand_vselect (target, x, perm, nelt);
33073 }
33074
33075 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33076    in terms of blendp[sd] / pblendw / pblendvb.  */
33077
33078 static bool
33079 expand_vec_perm_blend (struct expand_vec_perm_d *d)
33080 {
33081   enum machine_mode vmode = d->vmode;
33082   unsigned i, mask, nelt = d->nelt;
33083   rtx target, op0, op1, x;
33084
33085   if (!TARGET_SSE4_1 || d->op0 == d->op1)
33086     return false;
33087   if (!(GET_MODE_SIZE (vmode) == 16 || vmode == V4DFmode || vmode == V8SFmode))
33088     return false;
33089
33090   /* This is a blend, not a permute.  Elements must stay in their
33091      respective lanes.  */
33092   for (i = 0; i < nelt; ++i)
33093     {
33094       unsigned e = d->perm[i];
33095       if (!(e == i || e == i + nelt))
33096         return false;
33097     }
33098
33099   if (d->testing_p)
33100     return true;
33101
33102   /* ??? Without SSE4.1, we could implement this with and/andn/or.  This
33103      decision should be extracted elsewhere, so that we only try that
33104      sequence once all budget==3 options have been tried.  */
33105
33106   /* For bytes, see if bytes move in pairs so we can use pblendw with
33107      an immediate argument, rather than pblendvb with a vector argument.  */
33108   if (vmode == V16QImode)
33109     {
33110       bool pblendw_ok = true;
33111       for (i = 0; i < 16 && pblendw_ok; i += 2)
33112         pblendw_ok = (d->perm[i] + 1 == d->perm[i + 1]);
33113
33114       if (!pblendw_ok)
33115         {
33116           rtx rperm[16], vperm;
33117
33118           for (i = 0; i < nelt; ++i)
33119             rperm[i] = (d->perm[i] < nelt ? const0_rtx : constm1_rtx);
33120
33121           vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
33122           vperm = force_reg (V16QImode, vperm);
33123
33124           emit_insn (gen_sse4_1_pblendvb (d->target, d->op0, d->op1, vperm));
33125           return true;
33126         }
33127     }
33128
33129   target = d->target;
33130   op0 = d->op0;
33131   op1 = d->op1;
33132   mask = 0;
33133
33134   switch (vmode)
33135     {
33136     case V4DFmode:
33137     case V8SFmode:
33138     case V2DFmode:
33139     case V4SFmode:
33140     case V8HImode:
33141       for (i = 0; i < nelt; ++i)
33142         mask |= (d->perm[i] >= nelt) << i;
33143       break;
33144
33145     case V2DImode:
33146       for (i = 0; i < 2; ++i)
33147         mask |= (d->perm[i] >= 2 ? 15 : 0) << (i * 4);
33148       goto do_subreg;
33149
33150     case V4SImode:
33151       for (i = 0; i < 4; ++i)
33152         mask |= (d->perm[i] >= 4 ? 3 : 0) << (i * 2);
33153       goto do_subreg;
33154
33155     case V16QImode:
33156       for (i = 0; i < 8; ++i)
33157         mask |= (d->perm[i * 2] >= 16) << i;
33158
33159     do_subreg:
33160       vmode = V8HImode;
33161       target = gen_lowpart (vmode, target);
33162       op0 = gen_lowpart (vmode, op0);
33163       op1 = gen_lowpart (vmode, op1);
33164       break;
33165
33166     default:
33167       gcc_unreachable ();
33168     }
33169
33170   /* This matches five different patterns with the different modes.  */
33171   x = gen_rtx_VEC_MERGE (vmode, op1, op0, GEN_INT (mask));
33172   x = gen_rtx_SET (VOIDmode, target, x);
33173   emit_insn (x);
33174
33175   return true;
33176 }
33177
33178 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33179    in terms of the variable form of vpermilps.
33180
33181    Note that we will have already failed the immediate input vpermilps,
33182    which requires that the high and low part shuffle be identical; the
33183    variable form doesn't require that.  */
33184
33185 static bool
33186 expand_vec_perm_vpermil (struct expand_vec_perm_d *d)
33187 {
33188   rtx rperm[8], vperm;
33189   unsigned i;
33190
33191   if (!TARGET_AVX || d->vmode != V8SFmode || d->op0 != d->op1)
33192     return false;
33193
33194   /* We can only permute within the 128-bit lane.  */
33195   for (i = 0; i < 8; ++i)
33196     {
33197       unsigned e = d->perm[i];
33198       if (i < 4 ? e >= 4 : e < 4)
33199         return false;
33200     }
33201
33202   if (d->testing_p)
33203     return true;
33204
33205   for (i = 0; i < 8; ++i)
33206     {
33207       unsigned e = d->perm[i];
33208
33209       /* Within each 128-bit lane, the elements of op0 are numbered
33210          from 0 and the elements of op1 are numbered from 4.  */
33211       if (e >= 8 + 4)
33212         e -= 8;
33213       else if (e >= 4)
33214         e -= 4;
33215
33216       rperm[i] = GEN_INT (e);
33217     }
33218
33219   vperm = gen_rtx_CONST_VECTOR (V8SImode, gen_rtvec_v (8, rperm));
33220   vperm = force_reg (V8SImode, vperm);
33221   emit_insn (gen_avx_vpermilvarv8sf3 (d->target, d->op0, vperm));
33222
33223   return true;
33224 }
33225
33226 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33227    in terms of pshufb or vpperm.  */
33228
33229 static bool
33230 expand_vec_perm_pshufb (struct expand_vec_perm_d *d)
33231 {
33232   unsigned i, nelt, eltsz;
33233   rtx rperm[16], vperm, target, op0, op1;
33234
33235   if (!(d->op0 == d->op1 ? TARGET_SSSE3 : TARGET_XOP))
33236     return false;
33237   if (GET_MODE_SIZE (d->vmode) != 16)
33238     return false;
33239
33240   if (d->testing_p)
33241     return true;
33242
33243   nelt = d->nelt;
33244   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
33245
33246   for (i = 0; i < nelt; ++i)
33247     {
33248       unsigned j, e = d->perm[i];
33249       for (j = 0; j < eltsz; ++j)
33250         rperm[i * eltsz + j] = GEN_INT (e * eltsz + j);
33251     }
33252
33253   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
33254   vperm = force_reg (V16QImode, vperm);
33255
33256   target = gen_lowpart (V16QImode, d->target);
33257   op0 = gen_lowpart (V16QImode, d->op0);
33258   if (d->op0 == d->op1)
33259     emit_insn (gen_ssse3_pshufbv16qi3 (target, op0, vperm));
33260   else
33261     {
33262       op1 = gen_lowpart (V16QImode, d->op1);
33263       emit_insn (gen_xop_pperm (target, op0, op1, vperm));
33264     }
33265
33266   return true;
33267 }
33268
33269 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to instantiate D
33270    in a single instruction.  */
33271
33272 static bool
33273 expand_vec_perm_1 (struct expand_vec_perm_d *d)
33274 {
33275   unsigned i, nelt = d->nelt;
33276   unsigned char perm2[MAX_VECT_LEN];
33277
33278   /* Check plain VEC_SELECT first, because AVX has instructions that could
33279      match both SEL and SEL+CONCAT, but the plain SEL will allow a memory
33280      input where SEL+CONCAT may not.  */
33281   if (d->op0 == d->op1)
33282     {
33283       int mask = nelt - 1;
33284
33285       for (i = 0; i < nelt; i++)
33286         perm2[i] = d->perm[i] & mask;
33287
33288       if (expand_vselect (d->target, d->op0, perm2, nelt))
33289         return true;
33290
33291       /* There are plenty of patterns in sse.md that are written for
33292          SEL+CONCAT and are not replicated for a single op.  Perhaps
33293          that should be changed, to avoid the nastiness here.  */
33294
33295       /* Recognize interleave style patterns, which means incrementing
33296          every other permutation operand.  */
33297       for (i = 0; i < nelt; i += 2)
33298         {
33299           perm2[i] = d->perm[i] & mask;
33300           perm2[i + 1] = (d->perm[i + 1] & mask) + nelt;
33301         }
33302       if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
33303         return true;
33304
33305       /* Recognize shufps, which means adding {0, 0, nelt, nelt}.  */
33306       if (nelt >= 4)
33307         {
33308           for (i = 0; i < nelt; i += 4)
33309             {
33310               perm2[i + 0] = d->perm[i + 0] & mask;
33311               perm2[i + 1] = d->perm[i + 1] & mask;
33312               perm2[i + 2] = (d->perm[i + 2] & mask) + nelt;
33313               perm2[i + 3] = (d->perm[i + 3] & mask) + nelt;
33314             }
33315
33316           if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
33317             return true;
33318         }
33319     }
33320
33321   /* Finally, try the fully general two operand permute.  */
33322   if (expand_vselect_vconcat (d->target, d->op0, d->op1, d->perm, nelt))
33323     return true;
33324
33325   /* Recognize interleave style patterns with reversed operands.  */
33326   if (d->op0 != d->op1)
33327     {
33328       for (i = 0; i < nelt; ++i)
33329         {
33330           unsigned e = d->perm[i];
33331           if (e >= nelt)
33332             e -= nelt;
33333           else
33334             e += nelt;
33335           perm2[i] = e;
33336         }
33337
33338       if (expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
33339         return true;
33340     }
33341
33342   /* Try the SSE4.1 blend variable merge instructions.  */
33343   if (expand_vec_perm_blend (d))
33344     return true;
33345
33346   /* Try one of the AVX vpermil variable permutations.  */
33347   if (expand_vec_perm_vpermil (d))
33348     return true;
33349
33350   /* Try the SSSE3 pshufb or XOP vpperm variable permutation.  */
33351   if (expand_vec_perm_pshufb (d))
33352     return true;
33353
33354   return false;
33355 }
33356
33357 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
33358    in terms of a pair of pshuflw + pshufhw instructions.  */
33359
33360 static bool
33361 expand_vec_perm_pshuflw_pshufhw (struct expand_vec_perm_d *d)
33362 {
33363   unsigned char perm2[MAX_VECT_LEN];
33364   unsigned i;
33365   bool ok;
33366
33367   if (d->vmode != V8HImode || d->op0 != d->op1)
33368     return false;
33369
33370   /* The two permutations only operate in 64-bit lanes.  */
33371   for (i = 0; i < 4; ++i)
33372     if (d->perm[i] >= 4)
33373       return false;
33374   for (i = 4; i < 8; ++i)
33375     if (d->perm[i] < 4)
33376       return false;
33377
33378   if (d->testing_p)
33379     return true;
33380
33381   /* Emit the pshuflw.  */
33382   memcpy (perm2, d->perm, 4);
33383   for (i = 4; i < 8; ++i)
33384     perm2[i] = i;
33385   ok = expand_vselect (d->target, d->op0, perm2, 8);
33386   gcc_assert (ok);
33387
33388   /* Emit the pshufhw.  */
33389   memcpy (perm2 + 4, d->perm + 4, 4);
33390   for (i = 0; i < 4; ++i)
33391     perm2[i] = i;
33392   ok = expand_vselect (d->target, d->target, perm2, 8);
33393   gcc_assert (ok);
33394
33395   return true;
33396 }
33397
33398 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
33399    the permutation using the SSSE3 palignr instruction.  This succeeds
33400    when all of the elements in PERM fit within one vector and we merely
33401    need to shift them down so that a single vector permutation has a
33402    chance to succeed.  */
33403
33404 static bool
33405 expand_vec_perm_palignr (struct expand_vec_perm_d *d)
33406 {
33407   unsigned i, nelt = d->nelt;
33408   unsigned min, max;
33409   bool in_order, ok;
33410   rtx shift;
33411
33412   /* Even with AVX, palignr only operates on 128-bit vectors.  */
33413   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
33414     return false;
33415
33416   min = nelt, max = 0;
33417   for (i = 0; i < nelt; ++i)
33418     {
33419       unsigned e = d->perm[i];
33420       if (e < min)
33421         min = e;
33422       if (e > max)
33423         max = e;
33424     }
33425   if (min == 0 || max - min >= nelt)
33426     return false;
33427
33428   /* Given that we have SSSE3, we know we'll be able to implement the
33429      single operand permutation after the palignr with pshufb.  */
33430   if (d->testing_p)
33431     return true;
33432
33433   shift = GEN_INT (min * GET_MODE_BITSIZE (GET_MODE_INNER (d->vmode)));
33434   emit_insn (gen_ssse3_palignrti (gen_lowpart (TImode, d->target),
33435                                   gen_lowpart (TImode, d->op1),
33436                                   gen_lowpart (TImode, d->op0), shift));
33437
33438   d->op0 = d->op1 = d->target;
33439
33440   in_order = true;
33441   for (i = 0; i < nelt; ++i)
33442     {
33443       unsigned e = d->perm[i] - min;
33444       if (e != i)
33445         in_order = false;
33446       d->perm[i] = e;
33447     }
33448
33449   /* Test for the degenerate case where the alignment by itself
33450      produces the desired permutation.  */
33451   if (in_order)
33452     return true;
33453
33454   ok = expand_vec_perm_1 (d);
33455   gcc_assert (ok);
33456
33457   return ok;
33458 }
33459
33460 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
33461    a two vector permutation into a single vector permutation by using
33462    an interleave operation to merge the vectors.  */
33463
33464 static bool
33465 expand_vec_perm_interleave2 (struct expand_vec_perm_d *d)
33466 {
33467   struct expand_vec_perm_d dremap, dfinal;
33468   unsigned i, nelt = d->nelt, nelt2 = nelt / 2;
33469   unsigned contents, h1, h2, h3, h4;
33470   unsigned char remap[2 * MAX_VECT_LEN];
33471   rtx seq;
33472   bool ok;
33473
33474   if (d->op0 == d->op1)
33475     return false;
33476
33477   /* The 256-bit unpck[lh]p[sd] instructions only operate within the 128-bit
33478      lanes.  We can use similar techniques with the vperm2f128 instruction,
33479      but it requires slightly different logic.  */
33480   if (GET_MODE_SIZE (d->vmode) != 16)
33481     return false;
33482
33483   /* Examine from whence the elements come.  */
33484   contents = 0;
33485   for (i = 0; i < nelt; ++i)
33486     contents |= 1u << d->perm[i];
33487
33488   /* Split the two input vectors into 4 halves.  */
33489   h1 = (1u << nelt2) - 1;
33490   h2 = h1 << nelt2;
33491   h3 = h2 << nelt2;
33492   h4 = h3 << nelt2;
33493
33494   memset (remap, 0xff, sizeof (remap));
33495   dremap = *d;
33496
33497   /* If the elements from the low halves use interleave low, and similarly
33498      for interleave high.  If the elements are from mis-matched halves, we
33499      can use shufps for V4SF/V4SI or do a DImode shuffle.  */
33500   if ((contents & (h1 | h3)) == contents)
33501     {
33502       for (i = 0; i < nelt2; ++i)
33503         {
33504           remap[i] = i * 2;
33505           remap[i + nelt] = i * 2 + 1;
33506           dremap.perm[i * 2] = i;
33507           dremap.perm[i * 2 + 1] = i + nelt;
33508         }
33509     }
33510   else if ((contents & (h2 | h4)) == contents)
33511     {
33512       for (i = 0; i < nelt2; ++i)
33513         {
33514           remap[i + nelt2] = i * 2;
33515           remap[i + nelt + nelt2] = i * 2 + 1;
33516           dremap.perm[i * 2] = i + nelt2;
33517           dremap.perm[i * 2 + 1] = i + nelt + nelt2;
33518         }
33519     }
33520   else if ((contents & (h1 | h4)) == contents)
33521     {
33522       for (i = 0; i < nelt2; ++i)
33523         {
33524           remap[i] = i;
33525           remap[i + nelt + nelt2] = i + nelt2;
33526           dremap.perm[i] = i;
33527           dremap.perm[i + nelt2] = i + nelt + nelt2;
33528         }
33529       if (nelt != 4)
33530         {
33531           dremap.vmode = V2DImode;
33532           dremap.nelt = 2;
33533           dremap.perm[0] = 0;
33534           dremap.perm[1] = 3;
33535         }
33536     }
33537   else if ((contents & (h2 | h3)) == contents)
33538     {
33539       for (i = 0; i < nelt2; ++i)
33540         {
33541           remap[i + nelt2] = i;
33542           remap[i + nelt] = i + nelt2;
33543           dremap.perm[i] = i + nelt2;
33544           dremap.perm[i + nelt2] = i + nelt;
33545         }
33546       if (nelt != 4)
33547         {
33548           dremap.vmode = V2DImode;
33549           dremap.nelt = 2;
33550           dremap.perm[0] = 1;
33551           dremap.perm[1] = 2;
33552         }
33553     }
33554   else
33555     return false;
33556
33557   /* Use the remapping array set up above to move the elements from their
33558      swizzled locations into their final destinations.  */
33559   dfinal = *d;
33560   for (i = 0; i < nelt; ++i)
33561     {
33562       unsigned e = remap[d->perm[i]];
33563       gcc_assert (e < nelt);
33564       dfinal.perm[i] = e;
33565     }
33566   dfinal.op0 = gen_reg_rtx (dfinal.vmode);
33567   dfinal.op1 = dfinal.op0;
33568   dremap.target = dfinal.op0;
33569
33570   /* Test if the final remap can be done with a single insn.  For V4SFmode or
33571      V4SImode this *will* succeed.  For V8HImode or V16QImode it may not.  */
33572   start_sequence ();
33573   ok = expand_vec_perm_1 (&dfinal);
33574   seq = get_insns ();
33575   end_sequence ();
33576
33577   if (!ok)
33578     return false;
33579
33580   if (dremap.vmode != dfinal.vmode)
33581     {
33582       dremap.target = gen_lowpart (dremap.vmode, dremap.target);
33583       dremap.op0 = gen_lowpart (dremap.vmode, dremap.op0);
33584       dremap.op1 = gen_lowpart (dremap.vmode, dremap.op1);
33585     }
33586
33587   ok = expand_vec_perm_1 (&dremap);
33588   gcc_assert (ok);
33589
33590   emit_insn (seq);
33591   return true;
33592 }
33593
33594 /* A subroutine of expand_vec_perm_even_odd_1.  Implement the double-word
33595    permutation with two pshufb insns and an ior.  We should have already
33596    failed all two instruction sequences.  */
33597
33598 static bool
33599 expand_vec_perm_pshufb2 (struct expand_vec_perm_d *d)
33600 {
33601   rtx rperm[2][16], vperm, l, h, op, m128;
33602   unsigned int i, nelt, eltsz;
33603
33604   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
33605     return false;
33606   gcc_assert (d->op0 != d->op1);
33607
33608   nelt = d->nelt;
33609   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
33610
33611   /* Generate two permutation masks.  If the required element is within
33612      the given vector it is shuffled into the proper lane.  If the required
33613      element is in the other vector, force a zero into the lane by setting
33614      bit 7 in the permutation mask.  */
33615   m128 = GEN_INT (-128);
33616   for (i = 0; i < nelt; ++i)
33617     {
33618       unsigned j, e = d->perm[i];
33619       unsigned which = (e >= nelt);
33620       if (e >= nelt)
33621         e -= nelt;
33622
33623       for (j = 0; j < eltsz; ++j)
33624         {
33625           rperm[which][i*eltsz + j] = GEN_INT (e*eltsz + j);
33626           rperm[1-which][i*eltsz + j] = m128;
33627         }
33628     }
33629
33630   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[0]));
33631   vperm = force_reg (V16QImode, vperm);
33632
33633   l = gen_reg_rtx (V16QImode);
33634   op = gen_lowpart (V16QImode, d->op0);
33635   emit_insn (gen_ssse3_pshufbv16qi3 (l, op, vperm));
33636
33637   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[1]));
33638   vperm = force_reg (V16QImode, vperm);
33639
33640   h = gen_reg_rtx (V16QImode);
33641   op = gen_lowpart (V16QImode, d->op1);
33642   emit_insn (gen_ssse3_pshufbv16qi3 (h, op, vperm));
33643
33644   op = gen_lowpart (V16QImode, d->target);
33645   emit_insn (gen_iorv16qi3 (op, l, h));
33646
33647   return true;
33648 }
33649
33650 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement extract-even
33651    and extract-odd permutations.  */
33652
33653 static bool
33654 expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
33655 {
33656   rtx t1, t2, t3;
33657
33658   switch (d->vmode)
33659     {
33660     case V4DFmode:
33661       t1 = gen_reg_rtx (V4DFmode);
33662       t2 = gen_reg_rtx (V4DFmode);
33663
33664       /* Shuffle the lanes around into { 0 1 4 5 } and { 2 3 6 7 }.  */
33665       emit_insn (gen_avx_vperm2f128v4df3 (t1, d->op0, d->op1, GEN_INT (0x20)));
33666       emit_insn (gen_avx_vperm2f128v4df3 (t2, d->op0, d->op1, GEN_INT (0x31)));
33667
33668       /* Now an unpck[lh]pd will produce the result required.  */
33669       if (odd)
33670         t3 = gen_avx_unpckhpd256 (d->target, t1, t2);
33671       else
33672         t3 = gen_avx_unpcklpd256 (d->target, t1, t2);
33673       emit_insn (t3);
33674       break;
33675
33676     case V8SFmode:
33677       {
33678         int mask = odd ? 0xdd : 0x88;
33679
33680         t1 = gen_reg_rtx (V8SFmode);
33681         t2 = gen_reg_rtx (V8SFmode);
33682         t3 = gen_reg_rtx (V8SFmode);
33683
33684         /* Shuffle within the 128-bit lanes to produce:
33685            { 0 2 8 a 4 6 c e } | { 1 3 9 b 5 7 d f }.  */
33686         emit_insn (gen_avx_shufps256 (t1, d->op0, d->op1,
33687                                       GEN_INT (mask)));
33688
33689         /* Shuffle the lanes around to produce:
33690            { 4 6 c e 0 2 8 a } and { 5 7 d f 1 3 9 b }.  */
33691         emit_insn (gen_avx_vperm2f128v8sf3 (t2, t1, t1,
33692                                             GEN_INT (0x3)));
33693
33694         /* Shuffle within the 128-bit lanes to produce:
33695            { 0 2 4 6 4 6 0 2 } | { 1 3 5 7 5 7 1 3 }.  */
33696         emit_insn (gen_avx_shufps256 (t3, t1, t2, GEN_INT (0x44)));
33697
33698         /* Shuffle within the 128-bit lanes to produce:
33699            { 8 a c e c e 8 a } | { 9 b d f d f 9 b }.  */
33700         emit_insn (gen_avx_shufps256 (t2, t1, t2, GEN_INT (0xee)));
33701
33702         /* Shuffle the lanes around to produce:
33703            { 0 2 4 6 8 a c e } | { 1 3 5 7 9 b d f }.  */
33704         emit_insn (gen_avx_vperm2f128v8sf3 (d->target, t3, t2,
33705                                             GEN_INT (0x20)));
33706       }
33707       break;
33708
33709     case V2DFmode:
33710     case V4SFmode:
33711     case V2DImode:
33712     case V4SImode:
33713       /* These are always directly implementable by expand_vec_perm_1.  */
33714       gcc_unreachable ();
33715
33716     case V8HImode:
33717       if (TARGET_SSSE3)
33718         return expand_vec_perm_pshufb2 (d);
33719       else
33720         {
33721           /* We need 2*log2(N)-1 operations to achieve odd/even
33722              with interleave. */
33723           t1 = gen_reg_rtx (V8HImode);
33724           t2 = gen_reg_rtx (V8HImode);
33725           emit_insn (gen_vec_interleave_highv8hi (t1, d->op0, d->op1));
33726           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->op0, d->op1));
33727           emit_insn (gen_vec_interleave_highv8hi (t2, d->target, t1));
33728           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->target, t1));
33729           if (odd)
33730             t3 = gen_vec_interleave_highv8hi (d->target, d->target, t2);
33731           else
33732             t3 = gen_vec_interleave_lowv8hi (d->target, d->target, t2);
33733           emit_insn (t3);
33734         }
33735       break;
33736
33737     case V16QImode:
33738       if (TARGET_SSSE3)
33739         return expand_vec_perm_pshufb2 (d);
33740       else
33741         {
33742           t1 = gen_reg_rtx (V16QImode);
33743           t2 = gen_reg_rtx (V16QImode);
33744           t3 = gen_reg_rtx (V16QImode);
33745           emit_insn (gen_vec_interleave_highv16qi (t1, d->op0, d->op1));
33746           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->op0, d->op1));
33747           emit_insn (gen_vec_interleave_highv16qi (t2, d->target, t1));
33748           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t1));
33749           emit_insn (gen_vec_interleave_highv16qi (t3, d->target, t2));
33750           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t2));
33751           if (odd)
33752             t3 = gen_vec_interleave_highv16qi (d->target, d->target, t3);
33753           else
33754             t3 = gen_vec_interleave_lowv16qi (d->target, d->target, t3);
33755           emit_insn (t3);
33756         }
33757       break;
33758
33759     default:
33760       gcc_unreachable ();
33761     }
33762
33763   return true;
33764 }
33765
33766 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
33767    extract-even and extract-odd permutations.  */
33768
33769 static bool
33770 expand_vec_perm_even_odd (struct expand_vec_perm_d *d)
33771 {
33772   unsigned i, odd, nelt = d->nelt;
33773
33774   odd = d->perm[0];
33775   if (odd != 0 && odd != 1)
33776     return false;
33777
33778   for (i = 1; i < nelt; ++i)
33779     if (d->perm[i] != 2 * i + odd)
33780       return false;
33781
33782   return expand_vec_perm_even_odd_1 (d, odd);
33783 }
33784
33785 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement broadcast
33786    permutations.  We assume that expand_vec_perm_1 has already failed.  */
33787
33788 static bool
33789 expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d)
33790 {
33791   unsigned elt = d->perm[0], nelt2 = d->nelt / 2;
33792   enum machine_mode vmode = d->vmode;
33793   unsigned char perm2[4];
33794   rtx op0 = d->op0;
33795   bool ok;
33796
33797   switch (vmode)
33798     {
33799     case V4DFmode:
33800     case V8SFmode:
33801       /* These are special-cased in sse.md so that we can optionally
33802          use the vbroadcast instruction.  They expand to two insns
33803          if the input happens to be in a register.  */
33804       gcc_unreachable ();
33805
33806     case V2DFmode:
33807     case V2DImode:
33808     case V4SFmode:
33809     case V4SImode:
33810       /* These are always implementable using standard shuffle patterns.  */
33811       gcc_unreachable ();
33812
33813     case V8HImode:
33814     case V16QImode:
33815       /* These can be implemented via interleave.  We save one insn by
33816          stopping once we have promoted to V4SImode and then use pshufd.  */
33817       do
33818         {
33819           optab otab = vec_interleave_low_optab;
33820
33821           if (elt >= nelt2)
33822             {
33823               otab = vec_interleave_high_optab;
33824               elt -= nelt2;
33825             }
33826           nelt2 /= 2;
33827
33828           op0 = expand_binop (vmode, otab, op0, op0, NULL, 0, OPTAB_DIRECT);
33829           vmode = get_mode_wider_vector (vmode);
33830           op0 = gen_lowpart (vmode, op0);
33831         }
33832       while (vmode != V4SImode);
33833
33834       memset (perm2, elt, 4);
33835       ok = expand_vselect (gen_lowpart (V4SImode, d->target), op0, perm2, 4);
33836       gcc_assert (ok);
33837       return true;
33838
33839     default:
33840       gcc_unreachable ();
33841     }
33842 }
33843
33844 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
33845    broadcast permutations.  */
33846
33847 static bool
33848 expand_vec_perm_broadcast (struct expand_vec_perm_d *d)
33849 {
33850   unsigned i, elt, nelt = d->nelt;
33851
33852   if (d->op0 != d->op1)
33853     return false;
33854
33855   elt = d->perm[0];
33856   for (i = 1; i < nelt; ++i)
33857     if (d->perm[i] != elt)
33858       return false;
33859
33860   return expand_vec_perm_broadcast_1 (d);
33861 }
33862
33863 /* The guts of ix86_expand_vec_perm_builtin, also used by the ok hook.
33864    With all of the interface bits taken care of, perform the expansion
33865    in D and return true on success.  */
33866
33867 static bool
33868 ix86_expand_vec_perm_builtin_1 (struct expand_vec_perm_d *d)
33869 {
33870   /* Try a single instruction expansion.  */
33871   if (expand_vec_perm_1 (d))
33872     return true;
33873
33874   /* Try sequences of two instructions.  */
33875
33876   if (expand_vec_perm_pshuflw_pshufhw (d))
33877     return true;
33878
33879   if (expand_vec_perm_palignr (d))
33880     return true;
33881
33882   if (expand_vec_perm_interleave2 (d))
33883     return true;
33884
33885   if (expand_vec_perm_broadcast (d))
33886     return true;
33887
33888   /* Try sequences of three instructions.  */
33889
33890   if (expand_vec_perm_pshufb2 (d))
33891     return true;
33892
33893   /* ??? Look for narrow permutations whose element orderings would
33894      allow the promotion to a wider mode.  */
33895
33896   /* ??? Look for sequences of interleave or a wider permute that place
33897      the data into the correct lanes for a half-vector shuffle like
33898      pshuf[lh]w or vpermilps.  */
33899
33900   /* ??? Look for sequences of interleave that produce the desired results.
33901      The combinatorics of punpck[lh] get pretty ugly... */
33902
33903   if (expand_vec_perm_even_odd (d))
33904     return true;
33905
33906   return false;
33907 }
33908
33909 /* Extract the values from the vector CST into the permutation array in D.
33910    Return 0 on error, 1 if all values from the permutation come from the
33911    first vector, 2 if all values from the second vector, and 3 otherwise.  */
33912
33913 static int
33914 extract_vec_perm_cst (struct expand_vec_perm_d *d, tree cst)
33915 {
33916   tree list = TREE_VECTOR_CST_ELTS (cst);
33917   unsigned i, nelt = d->nelt;
33918   int ret = 0;
33919
33920   for (i = 0; i < nelt; ++i, list = TREE_CHAIN (list))
33921     {
33922       unsigned HOST_WIDE_INT e;
33923
33924       if (!host_integerp (TREE_VALUE (list), 1))
33925         return 0;
33926       e = tree_low_cst (TREE_VALUE (list), 1);
33927       if (e >= 2 * nelt)
33928         return 0;
33929
33930       ret |= (e < nelt ? 1 : 2);
33931       d->perm[i] = e;
33932     }
33933   gcc_assert (list == NULL);
33934
33935   /* For all elements from second vector, fold the elements to first.  */
33936   if (ret == 2)
33937     for (i = 0; i < nelt; ++i)
33938       d->perm[i] -= nelt;
33939
33940   return ret;
33941 }
33942
33943 static rtx
33944 ix86_expand_vec_perm_builtin (tree exp)
33945 {
33946   struct expand_vec_perm_d d;
33947   tree arg0, arg1, arg2;
33948
33949   arg0 = CALL_EXPR_ARG (exp, 0);
33950   arg1 = CALL_EXPR_ARG (exp, 1);
33951   arg2 = CALL_EXPR_ARG (exp, 2);
33952
33953   d.vmode = TYPE_MODE (TREE_TYPE (arg0));
33954   d.nelt = GET_MODE_NUNITS (d.vmode);
33955   d.testing_p = false;
33956   gcc_assert (VECTOR_MODE_P (d.vmode));
33957
33958   if (TREE_CODE (arg2) != VECTOR_CST)
33959     {
33960       error_at (EXPR_LOCATION (exp),
33961                 "vector permutation requires vector constant");
33962       goto exit_error;
33963     }
33964
33965   switch (extract_vec_perm_cst (&d, arg2))
33966     {
33967     default:
33968       gcc_unreachable();
33969
33970     case 0:
33971       error_at (EXPR_LOCATION (exp), "invalid vector permutation constant");
33972       goto exit_error;
33973
33974     case 3:
33975       if (!operand_equal_p (arg0, arg1, 0))
33976         {
33977           d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
33978           d.op0 = force_reg (d.vmode, d.op0);
33979           d.op1 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
33980           d.op1 = force_reg (d.vmode, d.op1);
33981           break;
33982         }
33983
33984       /* The elements of PERM do not suggest that only the first operand
33985          is used, but both operands are identical.  Allow easier matching
33986          of the permutation by folding the permutation into the single
33987          input vector.  */
33988       {
33989         unsigned i, nelt = d.nelt;
33990         for (i = 0; i < nelt; ++i)
33991           if (d.perm[i] >= nelt)
33992             d.perm[i] -= nelt;
33993       }
33994       /* FALLTHRU */
33995
33996     case 1:
33997       d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
33998       d.op0 = force_reg (d.vmode, d.op0);
33999       d.op1 = d.op0;
34000       break;
34001
34002     case 2:
34003       d.op0 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
34004       d.op0 = force_reg (d.vmode, d.op0);
34005       d.op1 = d.op0;
34006       break;
34007     }
34008
34009   d.target = gen_reg_rtx (d.vmode);
34010   if (ix86_expand_vec_perm_builtin_1 (&d))
34011     return d.target;
34012
34013   /* For compiler generated permutations, we should never got here, because
34014      the compiler should also be checking the ok hook.  But since this is a
34015      builtin the user has access too, so don't abort.  */
34016   switch (d.nelt)
34017     {
34018     case 2:
34019       sorry ("vector permutation (%d %d)", d.perm[0], d.perm[1]);
34020       break;
34021     case 4:
34022       sorry ("vector permutation (%d %d %d %d)",
34023              d.perm[0], d.perm[1], d.perm[2], d.perm[3]);
34024       break;
34025     case 8:
34026       sorry ("vector permutation (%d %d %d %d %d %d %d %d)",
34027              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
34028              d.perm[4], d.perm[5], d.perm[6], d.perm[7]);
34029       break;
34030     case 16:
34031       sorry ("vector permutation "
34032              "(%d %d %d %d %d %d %d %d %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              d.perm[8], d.perm[9], d.perm[10], d.perm[11],
34036              d.perm[12], d.perm[13], d.perm[14], d.perm[15]);
34037       break;
34038     default:
34039       gcc_unreachable ();
34040     }
34041  exit_error:
34042   return CONST0_RTX (d.vmode);
34043 }
34044
34045 /* Implement targetm.vectorize.builtin_vec_perm_ok.  */
34046
34047 static bool
34048 ix86_vectorize_builtin_vec_perm_ok (tree vec_type, tree mask)
34049 {
34050   struct expand_vec_perm_d d;
34051   int vec_mask;
34052   bool ret, one_vec;
34053
34054   d.vmode = TYPE_MODE (vec_type);
34055   d.nelt = GET_MODE_NUNITS (d.vmode);
34056   d.testing_p = true;
34057
34058   /* Given sufficient ISA support we can just return true here
34059      for selected vector modes.  */
34060   if (GET_MODE_SIZE (d.vmode) == 16)
34061     {
34062       /* All implementable with a single vpperm insn.  */
34063       if (TARGET_XOP)
34064         return true;
34065       /* All implementable with 2 pshufb + 1 ior.  */
34066       if (TARGET_SSSE3)
34067         return true;
34068       /* All implementable with shufpd or unpck[lh]pd.  */
34069       if (d.nelt == 2)
34070         return true;
34071     }
34072
34073   vec_mask = extract_vec_perm_cst (&d, mask);
34074
34075   /* This hook is cannot be called in response to something that the
34076      user does (unlike the builtin expander) so we shouldn't ever see
34077      an error generated from the extract.  */
34078   gcc_assert (vec_mask > 0 && vec_mask <= 3);
34079   one_vec = (vec_mask != 3);
34080
34081   /* Implementable with shufps or pshufd.  */
34082   if (one_vec && (d.vmode == V4SFmode || d.vmode == V4SImode))
34083     return true;
34084
34085   /* Otherwise we have to go through the motions and see if we can
34086      figure out how to generate the requested permutation.  */
34087   d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
34088   d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
34089   if (!one_vec)
34090     d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
34091
34092   start_sequence ();
34093   ret = ix86_expand_vec_perm_builtin_1 (&d);
34094   end_sequence ();
34095
34096   return ret;
34097 }
34098
34099 void
34100 ix86_expand_vec_extract_even_odd (rtx targ, rtx op0, rtx op1, unsigned odd)
34101 {
34102   struct expand_vec_perm_d d;
34103   unsigned i, nelt;
34104
34105   d.target = targ;
34106   d.op0 = op0;
34107   d.op1 = op1;
34108   d.vmode = GET_MODE (targ);
34109   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
34110   d.testing_p = false;
34111
34112   for (i = 0; i < nelt; ++i)
34113     d.perm[i] = i * 2 + odd;
34114
34115   /* We'll either be able to implement the permutation directly...  */
34116   if (expand_vec_perm_1 (&d))
34117     return;
34118
34119   /* ... or we use the special-case patterns.  */
34120   expand_vec_perm_even_odd_1 (&d, odd);
34121 }
34122
34123 /* Expand an insert into a vector register through pinsr insn.
34124    Return true if successful.  */
34125
34126 bool
34127 ix86_expand_pinsr (rtx *operands)
34128 {
34129   rtx dst = operands[0];
34130   rtx src = operands[3];
34131
34132   unsigned int size = INTVAL (operands[1]);
34133   unsigned int pos = INTVAL (operands[2]);
34134
34135   if (GET_CODE (dst) == SUBREG)
34136     {
34137       pos += SUBREG_BYTE (dst) * BITS_PER_UNIT;
34138       dst = SUBREG_REG (dst);
34139     }
34140
34141   if (GET_CODE (src) == SUBREG)
34142     src = SUBREG_REG (src);
34143
34144   switch (GET_MODE (dst))
34145     {
34146     case V16QImode:
34147     case V8HImode:
34148     case V4SImode:
34149     case V2DImode:
34150       {
34151         enum machine_mode srcmode, dstmode;
34152         rtx (*pinsr)(rtx, rtx, rtx, rtx);
34153
34154         srcmode = mode_for_size (size, MODE_INT, 0);
34155
34156         switch (srcmode)
34157           {
34158           case QImode:
34159             if (!TARGET_SSE4_1)
34160               return false;
34161             dstmode = V16QImode;
34162             pinsr = gen_sse4_1_pinsrb;
34163             break;
34164
34165           case HImode:
34166             if (!TARGET_SSE2)
34167               return false;
34168             dstmode = V8HImode;
34169             pinsr = gen_sse2_pinsrw;
34170             break;
34171
34172           case SImode:
34173             if (!TARGET_SSE4_1)
34174               return false;
34175             dstmode = V4SImode;
34176             pinsr = gen_sse4_1_pinsrd;
34177             break;
34178
34179           case DImode:
34180             gcc_assert (TARGET_64BIT);
34181             if (!TARGET_SSE4_1)
34182               return false;
34183             dstmode = V2DImode;
34184             pinsr = gen_sse4_1_pinsrq;
34185             break;
34186
34187           default:
34188             return false;
34189           }
34190
34191         dst = gen_lowpart (dstmode, dst);
34192         src = gen_lowpart (srcmode, src);
34193
34194         pos /= size;
34195
34196         emit_insn (pinsr (dst, dst, src, GEN_INT (1 << pos)));
34197         return true;
34198       }
34199
34200     default:
34201       return false;
34202     }
34203 }
34204 \f
34205 /* This function returns the calling abi specific va_list type node.
34206    It returns  the FNDECL specific va_list type.  */
34207
34208 static tree
34209 ix86_fn_abi_va_list (tree fndecl)
34210 {
34211   if (!TARGET_64BIT)
34212     return va_list_type_node;
34213   gcc_assert (fndecl != NULL_TREE);
34214
34215   if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
34216     return ms_va_list_type_node;
34217   else
34218     return sysv_va_list_type_node;
34219 }
34220
34221 /* Returns the canonical va_list type specified by TYPE. If there
34222    is no valid TYPE provided, it return NULL_TREE.  */
34223
34224 static tree
34225 ix86_canonical_va_list_type (tree type)
34226 {
34227   tree wtype, htype;
34228
34229   /* Resolve references and pointers to va_list type.  */
34230   if (TREE_CODE (type) == MEM_REF)
34231     type = TREE_TYPE (type);
34232   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
34233     type = TREE_TYPE (type);
34234   else if (POINTER_TYPE_P (type) && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
34235     type = TREE_TYPE (type);
34236
34237   if (TARGET_64BIT && va_list_type_node != NULL_TREE)
34238     {
34239       wtype = va_list_type_node;
34240           gcc_assert (wtype != NULL_TREE);
34241       htype = type;
34242       if (TREE_CODE (wtype) == ARRAY_TYPE)
34243         {
34244           /* If va_list is an array type, the argument may have decayed
34245              to a pointer type, e.g. by being passed to another function.
34246              In that case, unwrap both types so that we can compare the
34247              underlying records.  */
34248           if (TREE_CODE (htype) == ARRAY_TYPE
34249               || POINTER_TYPE_P (htype))
34250             {
34251               wtype = TREE_TYPE (wtype);
34252               htype = TREE_TYPE (htype);
34253             }
34254         }
34255       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34256         return va_list_type_node;
34257       wtype = sysv_va_list_type_node;
34258           gcc_assert (wtype != NULL_TREE);
34259       htype = type;
34260       if (TREE_CODE (wtype) == ARRAY_TYPE)
34261         {
34262           /* If va_list is an array type, the argument may have decayed
34263              to a pointer type, e.g. by being passed to another function.
34264              In that case, unwrap both types so that we can compare the
34265              underlying records.  */
34266           if (TREE_CODE (htype) == ARRAY_TYPE
34267               || POINTER_TYPE_P (htype))
34268             {
34269               wtype = TREE_TYPE (wtype);
34270               htype = TREE_TYPE (htype);
34271             }
34272         }
34273       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34274         return sysv_va_list_type_node;
34275       wtype = ms_va_list_type_node;
34276           gcc_assert (wtype != NULL_TREE);
34277       htype = type;
34278       if (TREE_CODE (wtype) == ARRAY_TYPE)
34279         {
34280           /* If va_list is an array type, the argument may have decayed
34281              to a pointer type, e.g. by being passed to another function.
34282              In that case, unwrap both types so that we can compare the
34283              underlying records.  */
34284           if (TREE_CODE (htype) == ARRAY_TYPE
34285               || POINTER_TYPE_P (htype))
34286             {
34287               wtype = TREE_TYPE (wtype);
34288               htype = TREE_TYPE (htype);
34289             }
34290         }
34291       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
34292         return ms_va_list_type_node;
34293       return NULL_TREE;
34294     }
34295   return std_canonical_va_list_type (type);
34296 }
34297
34298 /* Iterate through the target-specific builtin types for va_list.
34299    IDX denotes the iterator, *PTREE is set to the result type of
34300    the va_list builtin, and *PNAME to its internal type.
34301    Returns zero if there is no element for this index, otherwise
34302    IDX should be increased upon the next call.
34303    Note, do not iterate a base builtin's name like __builtin_va_list.
34304    Used from c_common_nodes_and_builtins.  */
34305
34306 static int
34307 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
34308 {
34309   if (TARGET_64BIT)
34310     {
34311       switch (idx)
34312         {
34313         default:
34314           break;
34315
34316         case 0:
34317           *ptree = ms_va_list_type_node;
34318           *pname = "__builtin_ms_va_list";
34319           return 1;
34320
34321         case 1:
34322           *ptree = sysv_va_list_type_node;
34323           *pname = "__builtin_sysv_va_list";
34324           return 1;
34325         }
34326     }
34327
34328   return 0;
34329 }
34330
34331 #undef TARGET_SCHED_DISPATCH
34332 #define TARGET_SCHED_DISPATCH has_dispatch
34333 #undef TARGET_SCHED_DISPATCH_DO
34334 #define TARGET_SCHED_DISPATCH_DO do_dispatch
34335
34336 /* The size of the dispatch window is the total number of bytes of
34337    object code allowed in a window.  */
34338 #define DISPATCH_WINDOW_SIZE 16
34339
34340 /* Number of dispatch windows considered for scheduling.  */
34341 #define MAX_DISPATCH_WINDOWS 3
34342
34343 /* Maximum number of instructions in a window.  */
34344 #define MAX_INSN 4
34345
34346 /* Maximum number of immediate operands in a window.  */
34347 #define MAX_IMM 4
34348
34349 /* Maximum number of immediate bits allowed in a window.  */
34350 #define MAX_IMM_SIZE 128
34351
34352 /* Maximum number of 32 bit immediates allowed in a window.  */
34353 #define MAX_IMM_32 4
34354
34355 /* Maximum number of 64 bit immediates allowed in a window.  */
34356 #define MAX_IMM_64 2
34357
34358 /* Maximum total of loads or prefetches allowed in a window.  */
34359 #define MAX_LOAD 2
34360
34361 /* Maximum total of stores allowed in a window.  */
34362 #define MAX_STORE 1
34363
34364 #undef BIG
34365 #define BIG 100
34366
34367
34368 /* Dispatch groups.  Istructions that affect the mix in a dispatch window.  */
34369 enum dispatch_group {
34370   disp_no_group = 0,
34371   disp_load,
34372   disp_store,
34373   disp_load_store,
34374   disp_prefetch,
34375   disp_imm,
34376   disp_imm_32,
34377   disp_imm_64,
34378   disp_branch,
34379   disp_cmp,
34380   disp_jcc,
34381   disp_last
34382 };
34383
34384 /* Number of allowable groups in a dispatch window.  It is an array
34385    indexed by dispatch_group enum.  100 is used as a big number,
34386    because the number of these kind of operations does not have any
34387    effect in dispatch window, but we need them for other reasons in
34388    the table.  */
34389 static unsigned int num_allowable_groups[disp_last] = {
34390   0, 2, 1, 1, 2, 4, 4, 2, 1, BIG, BIG
34391 };
34392
34393 char group_name[disp_last + 1][16] = {
34394   "disp_no_group", "disp_load", "disp_store", "disp_load_store",
34395   "disp_prefetch", "disp_imm", "disp_imm_32", "disp_imm_64",
34396   "disp_branch", "disp_cmp", "disp_jcc", "disp_last"
34397 };
34398
34399 /* Instruction path.  */
34400 enum insn_path {
34401   no_path = 0,
34402   path_single, /* Single micro op.  */
34403   path_double, /* Double micro op.  */
34404   path_multi,  /* Instructions with more than 2 micro op..  */
34405   last_path
34406 };
34407
34408 /* sched_insn_info defines a window to the instructions scheduled in
34409    the basic block.  It contains a pointer to the insn_info table and
34410    the instruction scheduled.
34411
34412    Windows are allocated for each basic block and are linked
34413    together.  */
34414 typedef struct sched_insn_info_s {
34415   rtx insn;
34416   enum dispatch_group group;
34417   enum insn_path path;
34418   int byte_len;
34419   int imm_bytes;
34420 } sched_insn_info;
34421
34422 /* Linked list of dispatch windows.  This is a two way list of
34423    dispatch windows of a basic block.  It contains information about
34424    the number of uops in the window and the total number of
34425    instructions and of bytes in the object code for this dispatch
34426    window.  */
34427 typedef struct dispatch_windows_s {
34428   int num_insn;            /* Number of insn in the window.  */
34429   int num_uops;            /* Number of uops in the window.  */
34430   int window_size;         /* Number of bytes in the window.  */
34431   int window_num;          /* Window number between 0 or 1.  */
34432   int num_imm;             /* Number of immediates in an insn.  */
34433   int num_imm_32;          /* Number of 32 bit immediates in an insn.  */
34434   int num_imm_64;          /* Number of 64 bit immediates in an insn.  */
34435   int imm_size;            /* Total immediates in the window.  */
34436   int num_loads;           /* Total memory loads in the window.  */
34437   int num_stores;          /* Total memory stores in the window.  */
34438   int violation;          /* Violation exists in window.  */
34439   sched_insn_info *window; /* Pointer to the window.  */
34440   struct dispatch_windows_s *next;
34441   struct dispatch_windows_s *prev;
34442 } dispatch_windows;
34443
34444 /* Immediate valuse used in an insn.  */
34445 typedef struct imm_info_s
34446   {
34447     int imm;
34448     int imm32;
34449     int imm64;
34450   } imm_info;
34451
34452 static dispatch_windows *dispatch_window_list;
34453 static dispatch_windows *dispatch_window_list1;
34454
34455 /* Get dispatch group of insn.  */
34456
34457 static enum dispatch_group
34458 get_mem_group (rtx insn)
34459 {
34460   enum attr_memory memory;
34461
34462   if (INSN_CODE (insn) < 0)
34463     return disp_no_group;
34464   memory = get_attr_memory (insn);
34465   if (memory == MEMORY_STORE)
34466     return disp_store;
34467
34468   if (memory == MEMORY_LOAD)
34469     return disp_load;
34470
34471   if (memory == MEMORY_BOTH)
34472     return disp_load_store;
34473
34474   return disp_no_group;
34475 }
34476
34477 /* Return true if insn is a compare instruction.  */
34478
34479 static bool
34480 is_cmp (rtx insn)
34481 {
34482   enum attr_type type;
34483
34484   type = get_attr_type (insn);
34485   return (type == TYPE_TEST
34486           || type == TYPE_ICMP
34487           || type == TYPE_FCMP
34488           || GET_CODE (PATTERN (insn)) == COMPARE);
34489 }
34490
34491 /* Return true if a dispatch violation encountered.  */
34492
34493 static bool
34494 dispatch_violation (void)
34495 {
34496   if (dispatch_window_list->next)
34497     return dispatch_window_list->next->violation;
34498   return dispatch_window_list->violation;
34499 }
34500
34501 /* Return true if insn is a branch instruction.  */
34502
34503 static bool
34504 is_branch (rtx insn)
34505 {
34506   return (CALL_P (insn) || JUMP_P (insn));
34507 }
34508
34509 /* Return true if insn is a prefetch instruction.  */
34510
34511 static bool
34512 is_prefetch (rtx insn)
34513 {
34514   return NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == PREFETCH;
34515 }
34516
34517 /* This function initializes a dispatch window and the list container holding a
34518    pointer to the window.  */
34519
34520 static void
34521 init_window (int window_num)
34522 {
34523   int i;
34524   dispatch_windows *new_list;
34525
34526   if (window_num == 0)
34527     new_list = dispatch_window_list;
34528   else
34529     new_list = dispatch_window_list1;
34530
34531   new_list->num_insn = 0;
34532   new_list->num_uops = 0;
34533   new_list->window_size = 0;
34534   new_list->next = NULL;
34535   new_list->prev = NULL;
34536   new_list->window_num = window_num;
34537   new_list->num_imm = 0;
34538   new_list->num_imm_32 = 0;
34539   new_list->num_imm_64 = 0;
34540   new_list->imm_size = 0;
34541   new_list->num_loads = 0;
34542   new_list->num_stores = 0;
34543   new_list->violation = false;
34544
34545   for (i = 0; i < MAX_INSN; i++)
34546     {
34547       new_list->window[i].insn = NULL;
34548       new_list->window[i].group = disp_no_group;
34549       new_list->window[i].path = no_path;
34550       new_list->window[i].byte_len = 0;
34551       new_list->window[i].imm_bytes = 0;
34552     }
34553   return;
34554 }
34555
34556 /* This function allocates and initializes a dispatch window and the
34557    list container holding a pointer to the window.  */
34558
34559 static dispatch_windows *
34560 allocate_window (void)
34561 {
34562   dispatch_windows *new_list = XNEW (struct dispatch_windows_s);
34563   new_list->window = XNEWVEC (struct sched_insn_info_s, MAX_INSN + 1);
34564
34565   return new_list;
34566 }
34567
34568 /* This routine initializes the dispatch scheduling information.  It
34569    initiates building dispatch scheduler tables and constructs the
34570    first dispatch window.  */
34571
34572 static void
34573 init_dispatch_sched (void)
34574 {
34575   /* Allocate a dispatch list and a window.  */
34576   dispatch_window_list = allocate_window ();
34577   dispatch_window_list1 = allocate_window ();
34578   init_window (0);
34579   init_window (1);
34580 }
34581
34582 /* This function returns true if a branch is detected.  End of a basic block
34583    does not have to be a branch, but here we assume only branches end a
34584    window.  */
34585
34586 static bool
34587 is_end_basic_block (enum dispatch_group group)
34588 {
34589   return group == disp_branch;
34590 }
34591
34592 /* This function is called when the end of a window processing is reached.  */
34593
34594 static void
34595 process_end_window (void)
34596 {
34597   gcc_assert (dispatch_window_list->num_insn <= MAX_INSN);
34598   if (dispatch_window_list->next)
34599     {
34600       gcc_assert (dispatch_window_list1->num_insn <= MAX_INSN);
34601       gcc_assert (dispatch_window_list->window_size
34602                   + dispatch_window_list1->window_size <= 48);
34603       init_window (1);
34604     }
34605   init_window (0);
34606 }
34607
34608 /* Allocates a new dispatch window and adds it to WINDOW_LIST.
34609    WINDOW_NUM is either 0 or 1.  A maximum of two windows are generated
34610    for 48 bytes of instructions.  Note that these windows are not dispatch
34611    windows that their sizes are DISPATCH_WINDOW_SIZE.  */
34612
34613 static dispatch_windows *
34614 allocate_next_window (int window_num)
34615 {
34616   if (window_num == 0)
34617     {
34618       if (dispatch_window_list->next)
34619           init_window (1);
34620       init_window (0);
34621       return dispatch_window_list;
34622     }
34623
34624   dispatch_window_list->next = dispatch_window_list1;
34625   dispatch_window_list1->prev = dispatch_window_list;
34626
34627   return dispatch_window_list1;
34628 }
34629
34630 /* Increment the number of immediate operands of an instruction.  */
34631
34632 static int
34633 find_constant_1 (rtx *in_rtx, imm_info *imm_values)
34634 {
34635   if (*in_rtx == 0)
34636     return 0;
34637
34638     switch ( GET_CODE (*in_rtx))
34639     {
34640     case CONST:
34641     case SYMBOL_REF:
34642     case CONST_INT:
34643       (imm_values->imm)++;
34644       if (x86_64_immediate_operand (*in_rtx, SImode))
34645         (imm_values->imm32)++;
34646       else
34647         (imm_values->imm64)++;
34648       break;
34649
34650     case CONST_DOUBLE:
34651       (imm_values->imm)++;
34652       (imm_values->imm64)++;
34653       break;
34654
34655     case CODE_LABEL:
34656       if (LABEL_KIND (*in_rtx) == LABEL_NORMAL)
34657         {
34658           (imm_values->imm)++;
34659           (imm_values->imm32)++;
34660         }
34661       break;
34662
34663     default:
34664       break;
34665     }
34666
34667   return 0;
34668 }
34669
34670 /* Compute number of immediate operands of an instruction.  */
34671
34672 static void
34673 find_constant (rtx in_rtx, imm_info *imm_values)
34674 {
34675   for_each_rtx (INSN_P (in_rtx) ? &PATTERN (in_rtx) : &in_rtx,
34676                 (rtx_function) find_constant_1, (void *) imm_values);
34677 }
34678
34679 /* Return total size of immediate operands of an instruction along with number
34680    of corresponding immediate-operands.  It initializes its parameters to zero
34681    befor calling FIND_CONSTANT.
34682    INSN is the input instruction.  IMM is the total of immediates.
34683    IMM32 is the number of 32 bit immediates.  IMM64 is the number of 64
34684    bit immediates.  */
34685
34686 static int
34687 get_num_immediates (rtx insn, int *imm, int *imm32, int *imm64)
34688 {
34689   imm_info imm_values = {0, 0, 0};
34690
34691   find_constant (insn, &imm_values);
34692   *imm = imm_values.imm;
34693   *imm32 = imm_values.imm32;
34694   *imm64 = imm_values.imm64;
34695   return imm_values.imm32 * 4 + imm_values.imm64 * 8;
34696 }
34697
34698 /* This function indicates if an operand of an instruction is an
34699    immediate.  */
34700
34701 static bool
34702 has_immediate (rtx insn)
34703 {
34704   int num_imm_operand;
34705   int num_imm32_operand;
34706   int num_imm64_operand;
34707
34708   if (insn)
34709     return get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34710                                &num_imm64_operand);
34711   return false;
34712 }
34713
34714 /* Return single or double path for instructions.  */
34715
34716 static enum insn_path
34717 get_insn_path (rtx insn)
34718 {
34719   enum attr_amdfam10_decode path = get_attr_amdfam10_decode (insn);
34720
34721   if ((int)path == 0)
34722     return path_single;
34723
34724   if ((int)path == 1)
34725     return path_double;
34726
34727   return path_multi;
34728 }
34729
34730 /* Return insn dispatch group.  */
34731
34732 static enum dispatch_group
34733 get_insn_group (rtx insn)
34734 {
34735   enum dispatch_group group = get_mem_group (insn);
34736   if (group)
34737     return group;
34738
34739   if (is_branch (insn))
34740     return disp_branch;
34741
34742   if (is_cmp (insn))
34743     return disp_cmp;
34744
34745   if (has_immediate (insn))
34746     return disp_imm;
34747
34748   if (is_prefetch (insn))
34749     return disp_prefetch;
34750
34751   return disp_no_group;
34752 }
34753
34754 /* Count number of GROUP restricted instructions in a dispatch
34755    window WINDOW_LIST.  */
34756
34757 static int
34758 count_num_restricted (rtx insn, dispatch_windows *window_list)
34759 {
34760   enum dispatch_group group = get_insn_group (insn);
34761   int imm_size;
34762   int num_imm_operand;
34763   int num_imm32_operand;
34764   int num_imm64_operand;
34765
34766   if (group == disp_no_group)
34767     return 0;
34768
34769   if (group == disp_imm)
34770     {
34771       imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34772                               &num_imm64_operand);
34773       if (window_list->imm_size + imm_size > MAX_IMM_SIZE
34774           || num_imm_operand + window_list->num_imm > MAX_IMM
34775           || (num_imm32_operand > 0
34776               && (window_list->num_imm_32 + num_imm32_operand > MAX_IMM_32
34777                   || window_list->num_imm_64 * 2 + num_imm32_operand > MAX_IMM_32))
34778           || (num_imm64_operand > 0
34779               && (window_list->num_imm_64 + num_imm64_operand > MAX_IMM_64
34780                   || window_list->num_imm_32 + num_imm64_operand * 2 > MAX_IMM_32))
34781           || (window_list->imm_size + imm_size == MAX_IMM_SIZE
34782               && num_imm64_operand > 0
34783               && ((window_list->num_imm_64 > 0
34784                    && window_list->num_insn >= 2)
34785                   || window_list->num_insn >= 3)))
34786         return BIG;
34787
34788       return 1;
34789     }
34790
34791   if ((group == disp_load_store
34792        && (window_list->num_loads >= MAX_LOAD
34793            || window_list->num_stores >= MAX_STORE))
34794       || ((group == disp_load
34795            || group == disp_prefetch)
34796           && window_list->num_loads >= MAX_LOAD)
34797       || (group == disp_store
34798           && window_list->num_stores >= MAX_STORE))
34799     return BIG;
34800
34801   return 1;
34802 }
34803
34804 /* This function returns true if insn satisfies dispatch rules on the
34805    last window scheduled.  */
34806
34807 static bool
34808 fits_dispatch_window (rtx insn)
34809 {
34810   dispatch_windows *window_list = dispatch_window_list;
34811   dispatch_windows *window_list_next = dispatch_window_list->next;
34812   unsigned int num_restrict;
34813   enum dispatch_group group = get_insn_group (insn);
34814   enum insn_path path = get_insn_path (insn);
34815   int sum;
34816
34817   /* Make disp_cmp and disp_jcc get scheduled at the latest.  These
34818      instructions should be given the lowest priority in the
34819      scheduling process in Haifa scheduler to make sure they will be
34820      scheduled in the same dispatch window as the refrence to them.  */
34821   if (group == disp_jcc || group == disp_cmp)
34822     return false;
34823
34824   /* Check nonrestricted.  */
34825   if (group == disp_no_group || group == disp_branch)
34826     return true;
34827
34828   /* Get last dispatch window.  */
34829   if (window_list_next)
34830     window_list = window_list_next;
34831
34832   if (window_list->window_num == 1)
34833     {
34834       sum = window_list->prev->window_size + window_list->window_size;
34835
34836       if (sum == 32
34837           || (min_insn_size (insn) + sum) >= 48)
34838         /* Window 1 is full.  Go for next window.  */
34839         return true;
34840     }
34841
34842   num_restrict = count_num_restricted (insn, window_list);
34843
34844   if (num_restrict > num_allowable_groups[group])
34845     return false;
34846
34847   /* See if it fits in the first window.  */
34848   if (window_list->window_num == 0)
34849     {
34850       /* The first widow should have only single and double path
34851          uops.  */
34852       if (path == path_double
34853           && (window_list->num_uops + 2) > MAX_INSN)
34854         return false;
34855       else if (path != path_single)
34856         return false;
34857     }
34858   return true;
34859 }
34860
34861 /* Add an instruction INSN with NUM_UOPS micro-operations to the
34862    dispatch window WINDOW_LIST.  */
34863
34864 static void
34865 add_insn_window (rtx insn, dispatch_windows *window_list, int num_uops)
34866 {
34867   int byte_len = min_insn_size (insn);
34868   int num_insn = window_list->num_insn;
34869   int imm_size;
34870   sched_insn_info *window = window_list->window;
34871   enum dispatch_group group = get_insn_group (insn);
34872   enum insn_path path = get_insn_path (insn);
34873   int num_imm_operand;
34874   int num_imm32_operand;
34875   int num_imm64_operand;
34876
34877   if (!window_list->violation && group != disp_cmp
34878       && !fits_dispatch_window (insn))
34879     window_list->violation = true;
34880
34881   imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
34882                                  &num_imm64_operand);
34883
34884   /* Initialize window with new instruction.  */
34885   window[num_insn].insn = insn;
34886   window[num_insn].byte_len = byte_len;
34887   window[num_insn].group = group;
34888   window[num_insn].path = path;
34889   window[num_insn].imm_bytes = imm_size;
34890
34891   window_list->window_size += byte_len;
34892   window_list->num_insn = num_insn + 1;
34893   window_list->num_uops = window_list->num_uops + num_uops;
34894   window_list->imm_size += imm_size;
34895   window_list->num_imm += num_imm_operand;
34896   window_list->num_imm_32 += num_imm32_operand;
34897   window_list->num_imm_64 += num_imm64_operand;
34898
34899   if (group == disp_store)
34900     window_list->num_stores += 1;
34901   else if (group == disp_load
34902            || group == disp_prefetch)
34903     window_list->num_loads += 1;
34904   else if (group == disp_load_store)
34905     {
34906       window_list->num_stores += 1;
34907       window_list->num_loads += 1;
34908     }
34909 }
34910
34911 /* Adds a scheduled instruction, INSN, to the current dispatch window.
34912    If the total bytes of instructions or the number of instructions in
34913    the window exceed allowable, it allocates a new window.  */
34914
34915 static void
34916 add_to_dispatch_window (rtx insn)
34917 {
34918   int byte_len;
34919   dispatch_windows *window_list;
34920   dispatch_windows *next_list;
34921   dispatch_windows *window0_list;
34922   enum insn_path path;
34923   enum dispatch_group insn_group;
34924   bool insn_fits;
34925   int num_insn;
34926   int num_uops;
34927   int window_num;
34928   int insn_num_uops;
34929   int sum;
34930
34931   if (INSN_CODE (insn) < 0)
34932     return;
34933
34934   byte_len = min_insn_size (insn);
34935   window_list = dispatch_window_list;
34936   next_list = window_list->next;
34937   path = get_insn_path (insn);
34938   insn_group = get_insn_group (insn);
34939
34940   /* Get the last dispatch window.  */
34941   if (next_list)
34942       window_list = dispatch_window_list->next;
34943
34944   if (path == path_single)
34945     insn_num_uops = 1;
34946   else if (path == path_double)
34947     insn_num_uops = 2;
34948   else
34949     insn_num_uops = (int) path;
34950
34951   /* If current window is full, get a new window.
34952      Window number zero is full, if MAX_INSN uops are scheduled in it.
34953      Window number one is full, if window zero's bytes plus window
34954      one's bytes is 32, or if the bytes of the new instruction added
34955      to the total makes it greater than 48, or it has already MAX_INSN
34956      instructions in it.  */
34957   num_insn = window_list->num_insn;
34958   num_uops = window_list->num_uops;
34959   window_num = window_list->window_num;
34960   insn_fits = fits_dispatch_window (insn);
34961
34962   if (num_insn >= MAX_INSN
34963       || num_uops + insn_num_uops > MAX_INSN
34964       || !(insn_fits))
34965     {
34966       window_num = ~window_num & 1;
34967       window_list = allocate_next_window (window_num);
34968     }
34969
34970   if (window_num == 0)
34971     {
34972       add_insn_window (insn, window_list, insn_num_uops);
34973       if (window_list->num_insn >= MAX_INSN
34974           && insn_group == disp_branch)
34975         {
34976           process_end_window ();
34977           return;
34978         }
34979     }
34980   else if (window_num == 1)
34981     {
34982       window0_list = window_list->prev;
34983       sum = window0_list->window_size + window_list->window_size;
34984       if (sum == 32
34985           || (byte_len + sum) >= 48)
34986         {
34987           process_end_window ();
34988           window_list = dispatch_window_list;
34989         }
34990
34991       add_insn_window (insn, window_list, insn_num_uops);
34992     }
34993   else
34994     gcc_unreachable ();
34995
34996   if (is_end_basic_block (insn_group))
34997     {
34998       /* End of basic block is reached do end-basic-block process.  */
34999       process_end_window ();
35000       return;
35001     }
35002 }
35003
35004 /* Print the dispatch window, WINDOW_NUM, to FILE.  */
35005
35006 DEBUG_FUNCTION static void
35007 debug_dispatch_window_file (FILE *file, int window_num)
35008 {
35009   dispatch_windows *list;
35010   int i;
35011
35012   if (window_num == 0)
35013     list = dispatch_window_list;
35014   else
35015     list = dispatch_window_list1;
35016
35017   fprintf (file, "Window #%d:\n", list->window_num);
35018   fprintf (file, "  num_insn = %d, num_uops = %d, window_size = %d\n",
35019           list->num_insn, list->num_uops, list->window_size);
35020   fprintf (file, "  num_imm = %d, num_imm_32 = %d, num_imm_64 = %d, imm_size = %d\n",
35021            list->num_imm, list->num_imm_32, list->num_imm_64, list->imm_size);
35022
35023   fprintf (file, "  num_loads = %d, num_stores = %d\n", list->num_loads,
35024           list->num_stores);
35025   fprintf (file, " insn info:\n");
35026
35027   for (i = 0; i < MAX_INSN; i++)
35028     {
35029       if (!list->window[i].insn)
35030         break;
35031       fprintf (file, "    group[%d] = %s, insn[%d] = %p, path[%d] = %d byte_len[%d] = %d, imm_bytes[%d] = %d\n",
35032               i, group_name[list->window[i].group],
35033               i, (void *)list->window[i].insn,
35034               i, list->window[i].path,
35035               i, list->window[i].byte_len,
35036               i, list->window[i].imm_bytes);
35037     }
35038 }
35039
35040 /* Print to stdout a dispatch window.  */
35041
35042 DEBUG_FUNCTION void
35043 debug_dispatch_window (int window_num)
35044 {
35045   debug_dispatch_window_file (stdout, window_num);
35046 }
35047
35048 /* Print INSN dispatch information to FILE.  */
35049
35050 DEBUG_FUNCTION static void
35051 debug_insn_dispatch_info_file (FILE *file, rtx insn)
35052 {
35053   int byte_len;
35054   enum insn_path path;
35055   enum dispatch_group group;
35056   int imm_size;
35057   int num_imm_operand;
35058   int num_imm32_operand;
35059   int num_imm64_operand;
35060
35061   if (INSN_CODE (insn) < 0)
35062     return;
35063
35064   byte_len = min_insn_size (insn);
35065   path = get_insn_path (insn);
35066   group = get_insn_group (insn);
35067   imm_size = get_num_immediates (insn, &num_imm_operand, &num_imm32_operand,
35068                                  &num_imm64_operand);
35069
35070   fprintf (file, " insn info:\n");
35071   fprintf (file, "  group = %s, path = %d, byte_len = %d\n",
35072            group_name[group], path, byte_len);
35073   fprintf (file, "  num_imm = %d, num_imm_32 = %d, num_imm_64 = %d, imm_size = %d\n",
35074            num_imm_operand, num_imm32_operand, num_imm64_operand, imm_size);
35075 }
35076
35077 /* Print to STDERR the status of the ready list with respect to
35078    dispatch windows.  */
35079
35080 DEBUG_FUNCTION void
35081 debug_ready_dispatch (void)
35082 {
35083   int i;
35084   int no_ready = number_in_ready ();
35085
35086   fprintf (stdout, "Number of ready: %d\n", no_ready);
35087
35088   for (i = 0; i < no_ready; i++)
35089     debug_insn_dispatch_info_file (stdout, get_ready_element (i));
35090 }
35091
35092 /* This routine is the driver of the dispatch scheduler.  */
35093
35094 static void
35095 do_dispatch (rtx insn, int mode)
35096 {
35097   if (mode == DISPATCH_INIT)
35098     init_dispatch_sched ();
35099   else if (mode == ADD_TO_DISPATCH_WINDOW)
35100     add_to_dispatch_window (insn);
35101 }
35102
35103 /* Return TRUE if Dispatch Scheduling is supported.  */
35104
35105 static bool
35106 has_dispatch (rtx insn, int action)
35107 {
35108   if (ix86_tune == PROCESSOR_BDVER1 && flag_dispatch_scheduler)
35109     switch (action)
35110       {
35111       default:
35112         return false;
35113
35114       case IS_DISPATCH_ON:
35115         return true;
35116         break;
35117
35118       case IS_CMP:
35119         return is_cmp (insn);
35120
35121       case DISPATCH_VIOLATION:
35122         return dispatch_violation ();
35123
35124       case FITS_DISPATCH_WINDOW:
35125         return fits_dispatch_window (insn);
35126       }
35127
35128   return false;
35129 }
35130
35131 /* ??? No autovectorization into MMX or 3DNOW until we can reliably
35132    place emms and femms instructions.  */
35133
35134 static enum machine_mode
35135 ix86_preferred_simd_mode (enum machine_mode mode)
35136 {
35137   /* Disable double precision vectorizer if needed.  */
35138   if (mode == DFmode && !TARGET_VECTORIZE_DOUBLE)
35139     return word_mode;
35140
35141   if (!TARGET_AVX && !TARGET_SSE)
35142     return word_mode;
35143
35144   switch (mode)
35145     {
35146     case SFmode:
35147       return (TARGET_AVX && !flag_prefer_avx128) ? V8SFmode : V4SFmode;
35148     case DFmode:
35149       return (TARGET_AVX && !flag_prefer_avx128) ? V4DFmode : V2DFmode;
35150     case DImode:
35151       return V2DImode;
35152     case SImode:
35153       return V4SImode;
35154     case HImode:
35155       return V8HImode;
35156     case QImode:
35157       return V16QImode;
35158
35159     default:;
35160     }
35161
35162   return word_mode;
35163 }
35164
35165 /* If AVX is enabled then try vectorizing with both 256bit and 128bit
35166    vectors.  */
35167
35168 static unsigned int
35169 ix86_autovectorize_vector_sizes (void)
35170 {
35171   return TARGET_AVX ? 32 | 16 : 0;
35172 }
35173
35174 /* Initialize the GCC target structure.  */
35175 #undef TARGET_RETURN_IN_MEMORY
35176 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
35177
35178 #undef TARGET_LEGITIMIZE_ADDRESS
35179 #define TARGET_LEGITIMIZE_ADDRESS ix86_legitimize_address
35180
35181 #undef TARGET_ATTRIBUTE_TABLE
35182 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
35183 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
35184 #  undef TARGET_MERGE_DECL_ATTRIBUTES
35185 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
35186 #endif
35187
35188 #undef TARGET_COMP_TYPE_ATTRIBUTES
35189 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
35190
35191 #undef TARGET_INIT_BUILTINS
35192 #define TARGET_INIT_BUILTINS ix86_init_builtins
35193 #undef TARGET_BUILTIN_DECL
35194 #define TARGET_BUILTIN_DECL ix86_builtin_decl
35195 #undef TARGET_EXPAND_BUILTIN
35196 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
35197
35198 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
35199 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
35200   ix86_builtin_vectorized_function
35201
35202 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
35203 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
35204
35205 #undef TARGET_BUILTIN_RECIPROCAL
35206 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
35207
35208 #undef TARGET_ASM_FUNCTION_EPILOGUE
35209 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
35210
35211 #undef TARGET_ENCODE_SECTION_INFO
35212 #ifndef SUBTARGET_ENCODE_SECTION_INFO
35213 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
35214 #else
35215 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
35216 #endif
35217
35218 #undef TARGET_ASM_OPEN_PAREN
35219 #define TARGET_ASM_OPEN_PAREN ""
35220 #undef TARGET_ASM_CLOSE_PAREN
35221 #define TARGET_ASM_CLOSE_PAREN ""
35222
35223 #undef TARGET_ASM_BYTE_OP
35224 #define TARGET_ASM_BYTE_OP ASM_BYTE
35225
35226 #undef TARGET_ASM_ALIGNED_HI_OP
35227 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
35228 #undef TARGET_ASM_ALIGNED_SI_OP
35229 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
35230 #ifdef ASM_QUAD
35231 #undef TARGET_ASM_ALIGNED_DI_OP
35232 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
35233 #endif
35234
35235 #undef TARGET_PROFILE_BEFORE_PROLOGUE
35236 #define TARGET_PROFILE_BEFORE_PROLOGUE ix86_profile_before_prologue
35237
35238 #undef TARGET_ASM_UNALIGNED_HI_OP
35239 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
35240 #undef TARGET_ASM_UNALIGNED_SI_OP
35241 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
35242 #undef TARGET_ASM_UNALIGNED_DI_OP
35243 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
35244
35245 #undef TARGET_PRINT_OPERAND
35246 #define TARGET_PRINT_OPERAND ix86_print_operand
35247 #undef TARGET_PRINT_OPERAND_ADDRESS
35248 #define TARGET_PRINT_OPERAND_ADDRESS ix86_print_operand_address
35249 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
35250 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P ix86_print_operand_punct_valid_p
35251 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
35252 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA i386_asm_output_addr_const_extra 
35253
35254 #undef TARGET_SCHED_INIT_GLOBAL
35255 #define TARGET_SCHED_INIT_GLOBAL ix86_sched_init_global
35256 #undef TARGET_SCHED_ADJUST_COST
35257 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
35258 #undef TARGET_SCHED_ISSUE_RATE
35259 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
35260 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
35261 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
35262   ia32_multipass_dfa_lookahead
35263
35264 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
35265 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
35266
35267 #ifdef HAVE_AS_TLS
35268 #undef TARGET_HAVE_TLS
35269 #define TARGET_HAVE_TLS true
35270 #endif
35271 #undef TARGET_CANNOT_FORCE_CONST_MEM
35272 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
35273 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
35274 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
35275
35276 #undef TARGET_DELEGITIMIZE_ADDRESS
35277 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
35278
35279 #undef TARGET_MS_BITFIELD_LAYOUT_P
35280 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
35281
35282 #if TARGET_MACHO
35283 #undef TARGET_BINDS_LOCAL_P
35284 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
35285 #endif
35286 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
35287 #undef TARGET_BINDS_LOCAL_P
35288 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
35289 #endif
35290
35291 #undef TARGET_ASM_OUTPUT_MI_THUNK
35292 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
35293 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
35294 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
35295
35296 #undef TARGET_ASM_FILE_START
35297 #define TARGET_ASM_FILE_START x86_file_start
35298
35299 #undef TARGET_DEFAULT_TARGET_FLAGS
35300 #define TARGET_DEFAULT_TARGET_FLAGS     \
35301   (TARGET_DEFAULT                       \
35302    | TARGET_SUBTARGET_DEFAULT           \
35303    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
35304
35305 #undef TARGET_HANDLE_OPTION
35306 #define TARGET_HANDLE_OPTION ix86_handle_option
35307
35308 #undef TARGET_OPTION_OVERRIDE
35309 #define TARGET_OPTION_OVERRIDE ix86_option_override
35310 #undef TARGET_OPTION_OPTIMIZATION_TABLE
35311 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
35312 #undef TARGET_OPTION_INIT_STRUCT
35313 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
35314
35315 #undef TARGET_REGISTER_MOVE_COST
35316 #define TARGET_REGISTER_MOVE_COST ix86_register_move_cost
35317 #undef TARGET_MEMORY_MOVE_COST
35318 #define TARGET_MEMORY_MOVE_COST ix86_memory_move_cost
35319 #undef TARGET_RTX_COSTS
35320 #define TARGET_RTX_COSTS ix86_rtx_costs
35321 #undef TARGET_ADDRESS_COST
35322 #define TARGET_ADDRESS_COST ix86_address_cost
35323
35324 #undef TARGET_FIXED_CONDITION_CODE_REGS
35325 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
35326 #undef TARGET_CC_MODES_COMPATIBLE
35327 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
35328
35329 #undef TARGET_MACHINE_DEPENDENT_REORG
35330 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
35331
35332 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
35333 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
35334
35335 #undef TARGET_BUILD_BUILTIN_VA_LIST
35336 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
35337
35338 #undef TARGET_ENUM_VA_LIST_P
35339 #define TARGET_ENUM_VA_LIST_P ix86_enum_va_list
35340
35341 #undef TARGET_FN_ABI_VA_LIST
35342 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
35343
35344 #undef TARGET_CANONICAL_VA_LIST_TYPE
35345 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
35346
35347 #undef TARGET_EXPAND_BUILTIN_VA_START
35348 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
35349
35350 #undef TARGET_MD_ASM_CLOBBERS
35351 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
35352
35353 #undef TARGET_PROMOTE_PROTOTYPES
35354 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
35355 #undef TARGET_STRUCT_VALUE_RTX
35356 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
35357 #undef TARGET_SETUP_INCOMING_VARARGS
35358 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
35359 #undef TARGET_MUST_PASS_IN_STACK
35360 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
35361 #undef TARGET_FUNCTION_ARG_ADVANCE
35362 #define TARGET_FUNCTION_ARG_ADVANCE ix86_function_arg_advance
35363 #undef TARGET_FUNCTION_ARG
35364 #define TARGET_FUNCTION_ARG ix86_function_arg
35365 #undef TARGET_FUNCTION_ARG_BOUNDARY
35366 #define TARGET_FUNCTION_ARG_BOUNDARY ix86_function_arg_boundary
35367 #undef TARGET_PASS_BY_REFERENCE
35368 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
35369 #undef TARGET_INTERNAL_ARG_POINTER
35370 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
35371 #undef TARGET_UPDATE_STACK_BOUNDARY
35372 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
35373 #undef TARGET_GET_DRAP_RTX
35374 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
35375 #undef TARGET_STRICT_ARGUMENT_NAMING
35376 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
35377 #undef TARGET_STATIC_CHAIN
35378 #define TARGET_STATIC_CHAIN ix86_static_chain
35379 #undef TARGET_TRAMPOLINE_INIT
35380 #define TARGET_TRAMPOLINE_INIT ix86_trampoline_init
35381 #undef TARGET_RETURN_POPS_ARGS
35382 #define TARGET_RETURN_POPS_ARGS ix86_return_pops_args
35383
35384 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
35385 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
35386
35387 #undef TARGET_SCALAR_MODE_SUPPORTED_P
35388 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
35389
35390 #undef TARGET_VECTOR_MODE_SUPPORTED_P
35391 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
35392
35393 #undef TARGET_C_MODE_FOR_SUFFIX
35394 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
35395
35396 #ifdef HAVE_AS_TLS
35397 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
35398 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
35399 #endif
35400
35401 #ifdef SUBTARGET_INSERT_ATTRIBUTES
35402 #undef TARGET_INSERT_ATTRIBUTES
35403 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
35404 #endif
35405
35406 #undef TARGET_MANGLE_TYPE
35407 #define TARGET_MANGLE_TYPE ix86_mangle_type
35408
35409 #undef TARGET_STACK_PROTECT_FAIL
35410 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
35411
35412 #undef TARGET_SUPPORTS_SPLIT_STACK
35413 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
35414
35415 #undef TARGET_FUNCTION_VALUE
35416 #define TARGET_FUNCTION_VALUE ix86_function_value
35417
35418 #undef TARGET_FUNCTION_VALUE_REGNO_P
35419 #define TARGET_FUNCTION_VALUE_REGNO_P ix86_function_value_regno_p
35420
35421 #undef TARGET_SECONDARY_RELOAD
35422 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
35423
35424 #undef TARGET_PREFERRED_RELOAD_CLASS
35425 #define TARGET_PREFERRED_RELOAD_CLASS ix86_preferred_reload_class
35426 #undef TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
35427 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS ix86_preferred_output_reload_class
35428 #undef TARGET_CLASS_LIKELY_SPILLED_P
35429 #define TARGET_CLASS_LIKELY_SPILLED_P ix86_class_likely_spilled_p
35430
35431 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
35432 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
35433   ix86_builtin_vectorization_cost
35434 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
35435 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM \
35436   ix86_vectorize_builtin_vec_perm
35437 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK
35438 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK \
35439   ix86_vectorize_builtin_vec_perm_ok
35440 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
35441 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
35442   ix86_preferred_simd_mode
35443 #undef TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES
35444 #define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES \
35445   ix86_autovectorize_vector_sizes
35446
35447 #undef TARGET_SET_CURRENT_FUNCTION
35448 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
35449
35450 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
35451 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
35452
35453 #undef TARGET_OPTION_SAVE
35454 #define TARGET_OPTION_SAVE ix86_function_specific_save
35455
35456 #undef TARGET_OPTION_RESTORE
35457 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
35458
35459 #undef TARGET_OPTION_PRINT
35460 #define TARGET_OPTION_PRINT ix86_function_specific_print
35461
35462 #undef TARGET_CAN_INLINE_P
35463 #define TARGET_CAN_INLINE_P ix86_can_inline_p
35464
35465 #undef TARGET_EXPAND_TO_RTL_HOOK
35466 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
35467
35468 #undef TARGET_LEGITIMATE_ADDRESS_P
35469 #define TARGET_LEGITIMATE_ADDRESS_P ix86_legitimate_address_p
35470
35471 #undef TARGET_LEGITIMATE_CONSTANT_P
35472 #define TARGET_LEGITIMATE_CONSTANT_P ix86_legitimate_constant_p
35473
35474 #undef TARGET_FRAME_POINTER_REQUIRED
35475 #define TARGET_FRAME_POINTER_REQUIRED ix86_frame_pointer_required
35476
35477 #undef TARGET_CAN_ELIMINATE
35478 #define TARGET_CAN_ELIMINATE ix86_can_eliminate
35479
35480 #undef TARGET_EXTRA_LIVE_ON_ENTRY
35481 #define TARGET_EXTRA_LIVE_ON_ENTRY ix86_live_on_entry
35482
35483 #undef TARGET_ASM_CODE_END
35484 #define TARGET_ASM_CODE_END ix86_code_end
35485
35486 #undef TARGET_CONDITIONAL_REGISTER_USAGE
35487 #define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage
35488
35489 #if TARGET_MACHO
35490 #undef TARGET_INIT_LIBFUNCS
35491 #define TARGET_INIT_LIBFUNCS darwin_rename_builtins
35492 #endif
35493
35494 struct gcc_target targetm = TARGET_INITIALIZER;
35495 \f
35496 #include "gt-i386.h"