OSDN Git Service

2011-07-19 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / rs6000.c
1 /* Subroutines used for code generation on IBM RS/6000.
2    Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6
7    This file is part of GCC.
8
9    GCC is free software; you can redistribute it and/or modify it
10    under the terms of the GNU General Public License as published
11    by the Free Software Foundation; either version 3, or (at your
12    option) any later version.
13
14    GCC is distributed in the hope that it will be useful, but WITHOUT
15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17    License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with GCC; see the file COPYING3.  If not see
21    <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "recog.h"
35 #include "obstack.h"
36 #include "tree.h"
37 #include "expr.h"
38 #include "optabs.h"
39 #include "except.h"
40 #include "function.h"
41 #include "output.h"
42 #include "basic-block.h"
43 #include "integrate.h"
44 #include "diagnostic-core.h"
45 #include "toplev.h"
46 #include "ggc.h"
47 #include "hashtab.h"
48 #include "tm_p.h"
49 #include "target.h"
50 #include "target-def.h"
51 #include "common/common-target.h"
52 #include "langhooks.h"
53 #include "reload.h"
54 #include "cfglayout.h"
55 #include "cfgloop.h"
56 #include "sched-int.h"
57 #include "gimple.h"
58 #include "tree-flow.h"
59 #include "intl.h"
60 #include "params.h"
61 #include "tm-constrs.h"
62 #include "opts.h"
63 #if TARGET_XCOFF
64 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
65 #endif
66 #if TARGET_MACHO
67 #include "gstab.h"  /* for N_SLINE */
68 #endif
69
70 #ifndef TARGET_NO_PROTOTYPE
71 #define TARGET_NO_PROTOTYPE 0
72 #endif
73
74 #define min(A,B)        ((A) < (B) ? (A) : (B))
75 #define max(A,B)        ((A) > (B) ? (A) : (B))
76
77 /* Structure used to define the rs6000 stack */
78 typedef struct rs6000_stack {
79   int reload_completed;         /* stack info won't change from here on */
80   int first_gp_reg_save;        /* first callee saved GP register used */
81   int first_fp_reg_save;        /* first callee saved FP register used */
82   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
83   int lr_save_p;                /* true if the link reg needs to be saved */
84   int cr_save_p;                /* true if the CR reg needs to be saved */
85   unsigned int vrsave_mask;     /* mask of vec registers to save */
86   int push_p;                   /* true if we need to allocate stack space */
87   int calls_p;                  /* true if the function makes any calls */
88   int world_save_p;             /* true if we're saving *everything*:
89                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
90   enum rs6000_abi abi;          /* which ABI to use */
91   int gp_save_offset;           /* offset to save GP regs from initial SP */
92   int fp_save_offset;           /* offset to save FP regs from initial SP */
93   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
94   int lr_save_offset;           /* offset to save LR from initial SP */
95   int cr_save_offset;           /* offset to save CR from initial SP */
96   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
97   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
98   int varargs_save_offset;      /* offset to save the varargs registers */
99   int ehrd_offset;              /* offset to EH return data */
100   int reg_size;                 /* register size (4 or 8) */
101   HOST_WIDE_INT vars_size;      /* variable save area size */
102   int parm_size;                /* outgoing parameter size */
103   int save_size;                /* save area size */
104   int fixed_size;               /* fixed size of stack frame */
105   int gp_size;                  /* size of saved GP registers */
106   int fp_size;                  /* size of saved FP registers */
107   int altivec_size;             /* size of saved AltiVec registers */
108   int cr_size;                  /* size to hold CR if not in save_size */
109   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
110   int altivec_padding_size;     /* size of altivec alignment padding if
111                                    not in save_size */
112   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
113   int spe_padding_size;
114   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
115   int spe_64bit_regs_used;
116   int savres_strategy;
117 } rs6000_stack_t;
118
119 /* A C structure for machine-specific, per-function data.
120    This is added to the cfun structure.  */
121 typedef struct GTY(()) machine_function
122 {
123   /* Some local-dynamic symbol.  */
124   const char *some_ld_name;
125   /* Whether the instruction chain has been scanned already.  */
126   int insn_chain_scanned_p;
127   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
128   int ra_needs_full_frame;
129   /* Flags if __builtin_return_address (0) was used.  */
130   int ra_need_lr;
131   /* Cache lr_save_p after expansion of builtin_eh_return.  */
132   int lr_save_state;
133   /* Whether we need to save the TOC to the reserved stack location in the
134      function prologue.  */
135   bool save_toc_in_prologue;
136   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
137      varargs save area.  */
138   HOST_WIDE_INT varargs_save_offset;
139   /* Temporary stack slot to use for SDmode copies.  This slot is
140      64-bits wide and is allocated early enough so that the offset
141      does not overflow the 16-bit load/store offset field.  */
142   rtx sdmode_stack_slot;
143 } machine_function;
144
145 /* Support targetm.vectorize.builtin_mask_for_load.  */
146 static GTY(()) tree altivec_builtin_mask_for_load;
147
148 /* Set to nonzero once AIX common-mode calls have been defined.  */
149 static GTY(()) int common_mode_defined;
150
151 /* Label number of label created for -mrelocatable, to call to so we can
152    get the address of the GOT section */
153 static int rs6000_pic_labelno;
154
155 #ifdef USING_ELFOS_H
156 /* Counter for labels which are to be placed in .fixup.  */
157 int fixuplabelno = 0;
158 #endif
159
160 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
161 int dot_symbols;
162
163 /* Specify the machine mode that pointers have.  After generation of rtl, the
164    compiler makes no further distinction between pointers and any other objects
165    of this machine mode.  The type is unsigned since not all things that
166    include rs6000.h also include machmode.h.  */
167 unsigned rs6000_pmode;
168
169 /* Width in bits of a pointer.  */
170 unsigned rs6000_pointer_size;
171
172 #ifdef HAVE_AS_GNU_ATTRIBUTE
173 /* Flag whether floating point values have been passed/returned.  */
174 static bool rs6000_passes_float;
175 /* Flag whether vector values have been passed/returned.  */
176 static bool rs6000_passes_vector;
177 /* Flag whether small (<= 8 byte) structures have been returned.  */
178 static bool rs6000_returns_struct;
179 #endif
180
181 /* Value is TRUE if register/mode pair is acceptable.  */
182 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
183
184 /* Maximum number of registers needed for a given register class and mode.  */
185 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
186
187 /* How many registers are needed for a given register and mode.  */
188 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
189
190 /* Map register number to register class.  */
191 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
192
193 /* Reload functions based on the type and the vector unit.  */
194 static enum insn_code rs6000_vector_reload[NUM_MACHINE_MODES][2];
195
196 static int dbg_cost_ctrl;
197
198 /* Built in types.  */
199 tree rs6000_builtin_types[RS6000_BTI_MAX];
200 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
201
202 /* Flag to say the TOC is initialized */
203 int toc_initialized;
204 char toc_label_name[10];
205
206 /* Cached value of rs6000_variable_issue. This is cached in
207    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
208 static short cached_can_issue_more;
209
210 static GTY(()) section *read_only_data_section;
211 static GTY(()) section *private_data_section;
212 static GTY(()) section *read_only_private_data_section;
213 static GTY(()) section *sdata2_section;
214 static GTY(()) section *toc_section;
215
216 struct builtin_description
217 {
218   /* mask is not const because we're going to alter it below.  This
219      nonsense will go away when we rewrite the -march infrastructure
220      to give us more target flag bits.  */
221   unsigned int mask;
222   const enum insn_code icode;
223   const char *const name;
224   const enum rs6000_builtins code;
225 };
226
227 /* Describe the vector unit used for modes.  */
228 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
229 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
230
231 /* Register classes for various constraints that are based on the target
232    switches.  */
233 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
234
235 /* Describe the alignment of a vector.  */
236 int rs6000_vector_align[NUM_MACHINE_MODES];
237
238 /* Map selected modes to types for builtins.  */
239 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
240
241 /* What modes to automatically generate reciprocal divide estimate (fre) and
242    reciprocal sqrt (frsqrte) for.  */
243 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
244
245 /* Masks to determine which reciprocal esitmate instructions to generate
246    automatically.  */
247 enum rs6000_recip_mask {
248   RECIP_SF_DIV          = 0x001,        /* Use divide estimate */
249   RECIP_DF_DIV          = 0x002,
250   RECIP_V4SF_DIV        = 0x004,
251   RECIP_V2DF_DIV        = 0x008,
252
253   RECIP_SF_RSQRT        = 0x010,        /* Use reciprocal sqrt estimate.  */
254   RECIP_DF_RSQRT        = 0x020,
255   RECIP_V4SF_RSQRT      = 0x040,
256   RECIP_V2DF_RSQRT      = 0x080,
257
258   /* Various combination of flags for -mrecip=xxx.  */
259   RECIP_NONE            = 0,
260   RECIP_ALL             = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
261                            | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
262                            | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
263
264   RECIP_HIGH_PRECISION  = RECIP_ALL,
265
266   /* On low precision machines like the power5, don't enable double precision
267      reciprocal square root estimate, since it isn't accurate enough.  */
268   RECIP_LOW_PRECISION   = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
269 };
270
271 /* -mrecip options.  */
272 static struct
273 {
274   const char *string;           /* option name */
275   unsigned int mask;            /* mask bits to set */
276 } recip_options[] = {
277   { "all",       RECIP_ALL },
278   { "none",      RECIP_NONE },
279   { "div",       (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
280                   | RECIP_V2DF_DIV) },
281   { "divf",      (RECIP_SF_DIV | RECIP_V4SF_DIV) },
282   { "divd",      (RECIP_DF_DIV | RECIP_V2DF_DIV) },
283   { "rsqrt",     (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
284                   | RECIP_V2DF_RSQRT) },
285   { "rsqrtf",    (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
286   { "rsqrtd",    (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
287 };
288
289 /* 2 argument gen function typedef.  */
290 typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
291
292 \f
293 /* Target cpu costs.  */
294
295 struct processor_costs {
296   const int mulsi;        /* cost of SImode multiplication.  */
297   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
298   const int mulsi_const9; /* cost of SImode mult by short constant.  */
299   const int muldi;        /* cost of DImode multiplication.  */
300   const int divsi;        /* cost of SImode division.  */
301   const int divdi;        /* cost of DImode division.  */
302   const int fp;           /* cost of simple SFmode and DFmode insns.  */
303   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
304   const int sdiv;         /* cost of SFmode division (fdivs).  */
305   const int ddiv;         /* cost of DFmode division (fdiv).  */
306   const int cache_line_size;    /* cache line size in bytes. */
307   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
308   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
309   const int simultaneous_prefetches; /* number of parallel prefetch
310                                         operations.  */
311 };
312
313 const struct processor_costs *rs6000_cost;
314
315 /* Processor costs (relative to an add) */
316
317 /* Instruction size costs on 32bit processors.  */
318 static const
319 struct processor_costs size32_cost = {
320   COSTS_N_INSNS (1),    /* mulsi */
321   COSTS_N_INSNS (1),    /* mulsi_const */
322   COSTS_N_INSNS (1),    /* mulsi_const9 */
323   COSTS_N_INSNS (1),    /* muldi */
324   COSTS_N_INSNS (1),    /* divsi */
325   COSTS_N_INSNS (1),    /* divdi */
326   COSTS_N_INSNS (1),    /* fp */
327   COSTS_N_INSNS (1),    /* dmul */
328   COSTS_N_INSNS (1),    /* sdiv */
329   COSTS_N_INSNS (1),    /* ddiv */
330   32,
331   0,
332   0,
333   0,
334 };
335
336 /* Instruction size costs on 64bit processors.  */
337 static const
338 struct processor_costs size64_cost = {
339   COSTS_N_INSNS (1),    /* mulsi */
340   COSTS_N_INSNS (1),    /* mulsi_const */
341   COSTS_N_INSNS (1),    /* mulsi_const9 */
342   COSTS_N_INSNS (1),    /* muldi */
343   COSTS_N_INSNS (1),    /* divsi */
344   COSTS_N_INSNS (1),    /* divdi */
345   COSTS_N_INSNS (1),    /* fp */
346   COSTS_N_INSNS (1),    /* dmul */
347   COSTS_N_INSNS (1),    /* sdiv */
348   COSTS_N_INSNS (1),    /* ddiv */
349   128,
350   0,
351   0,
352   0,
353 };
354
355 /* Instruction costs on RIOS1 processors.  */
356 static const
357 struct processor_costs rios1_cost = {
358   COSTS_N_INSNS (5),    /* mulsi */
359   COSTS_N_INSNS (4),    /* mulsi_const */
360   COSTS_N_INSNS (3),    /* mulsi_const9 */
361   COSTS_N_INSNS (5),    /* muldi */
362   COSTS_N_INSNS (19),   /* divsi */
363   COSTS_N_INSNS (19),   /* divdi */
364   COSTS_N_INSNS (2),    /* fp */
365   COSTS_N_INSNS (2),    /* dmul */
366   COSTS_N_INSNS (19),   /* sdiv */
367   COSTS_N_INSNS (19),   /* ddiv */
368   128,                  /* cache line size */
369   64,                   /* l1 cache */
370   512,                  /* l2 cache */
371   0,                    /* streams */
372 };
373
374 /* Instruction costs on RIOS2 processors.  */
375 static const
376 struct processor_costs rios2_cost = {
377   COSTS_N_INSNS (2),    /* mulsi */
378   COSTS_N_INSNS (2),    /* mulsi_const */
379   COSTS_N_INSNS (2),    /* mulsi_const9 */
380   COSTS_N_INSNS (2),    /* muldi */
381   COSTS_N_INSNS (13),   /* divsi */
382   COSTS_N_INSNS (13),   /* divdi */
383   COSTS_N_INSNS (2),    /* fp */
384   COSTS_N_INSNS (2),    /* dmul */
385   COSTS_N_INSNS (17),   /* sdiv */
386   COSTS_N_INSNS (17),   /* ddiv */
387   256,                  /* cache line size */
388   256,                  /* l1 cache */
389   1024,                 /* l2 cache */
390   0,                    /* streams */
391 };
392
393 /* Instruction costs on RS64A processors.  */
394 static const
395 struct processor_costs rs64a_cost = {
396   COSTS_N_INSNS (20),   /* mulsi */
397   COSTS_N_INSNS (12),   /* mulsi_const */
398   COSTS_N_INSNS (8),    /* mulsi_const9 */
399   COSTS_N_INSNS (34),   /* muldi */
400   COSTS_N_INSNS (65),   /* divsi */
401   COSTS_N_INSNS (67),   /* divdi */
402   COSTS_N_INSNS (4),    /* fp */
403   COSTS_N_INSNS (4),    /* dmul */
404   COSTS_N_INSNS (31),   /* sdiv */
405   COSTS_N_INSNS (31),   /* ddiv */
406   128,                  /* cache line size */
407   128,                  /* l1 cache */
408   2048,                 /* l2 cache */
409   1,                    /* streams */
410 };
411
412 /* Instruction costs on MPCCORE processors.  */
413 static const
414 struct processor_costs mpccore_cost = {
415   COSTS_N_INSNS (2),    /* mulsi */
416   COSTS_N_INSNS (2),    /* mulsi_const */
417   COSTS_N_INSNS (2),    /* mulsi_const9 */
418   COSTS_N_INSNS (2),    /* muldi */
419   COSTS_N_INSNS (6),    /* divsi */
420   COSTS_N_INSNS (6),    /* divdi */
421   COSTS_N_INSNS (4),    /* fp */
422   COSTS_N_INSNS (5),    /* dmul */
423   COSTS_N_INSNS (10),   /* sdiv */
424   COSTS_N_INSNS (17),   /* ddiv */
425   32,                   /* cache line size */
426   4,                    /* l1 cache */
427   16,                   /* l2 cache */
428   1,                    /* streams */
429 };
430
431 /* Instruction costs on PPC403 processors.  */
432 static const
433 struct processor_costs ppc403_cost = {
434   COSTS_N_INSNS (4),    /* mulsi */
435   COSTS_N_INSNS (4),    /* mulsi_const */
436   COSTS_N_INSNS (4),    /* mulsi_const9 */
437   COSTS_N_INSNS (4),    /* muldi */
438   COSTS_N_INSNS (33),   /* divsi */
439   COSTS_N_INSNS (33),   /* divdi */
440   COSTS_N_INSNS (11),   /* fp */
441   COSTS_N_INSNS (11),   /* dmul */
442   COSTS_N_INSNS (11),   /* sdiv */
443   COSTS_N_INSNS (11),   /* ddiv */
444   32,                   /* cache line size */
445   4,                    /* l1 cache */
446   16,                   /* l2 cache */
447   1,                    /* streams */
448 };
449
450 /* Instruction costs on PPC405 processors.  */
451 static const
452 struct processor_costs ppc405_cost = {
453   COSTS_N_INSNS (5),    /* mulsi */
454   COSTS_N_INSNS (4),    /* mulsi_const */
455   COSTS_N_INSNS (3),    /* mulsi_const9 */
456   COSTS_N_INSNS (5),    /* muldi */
457   COSTS_N_INSNS (35),   /* divsi */
458   COSTS_N_INSNS (35),   /* divdi */
459   COSTS_N_INSNS (11),   /* fp */
460   COSTS_N_INSNS (11),   /* dmul */
461   COSTS_N_INSNS (11),   /* sdiv */
462   COSTS_N_INSNS (11),   /* ddiv */
463   32,                   /* cache line size */
464   16,                   /* l1 cache */
465   128,                  /* l2 cache */
466   1,                    /* streams */
467 };
468
469 /* Instruction costs on PPC440 processors.  */
470 static const
471 struct processor_costs ppc440_cost = {
472   COSTS_N_INSNS (3),    /* mulsi */
473   COSTS_N_INSNS (2),    /* mulsi_const */
474   COSTS_N_INSNS (2),    /* mulsi_const9 */
475   COSTS_N_INSNS (3),    /* muldi */
476   COSTS_N_INSNS (34),   /* divsi */
477   COSTS_N_INSNS (34),   /* divdi */
478   COSTS_N_INSNS (5),    /* fp */
479   COSTS_N_INSNS (5),    /* dmul */
480   COSTS_N_INSNS (19),   /* sdiv */
481   COSTS_N_INSNS (33),   /* ddiv */
482   32,                   /* cache line size */
483   32,                   /* l1 cache */
484   256,                  /* l2 cache */
485   1,                    /* streams */
486 };
487
488 /* Instruction costs on PPC476 processors.  */
489 static const
490 struct processor_costs ppc476_cost = {
491   COSTS_N_INSNS (4),    /* mulsi */
492   COSTS_N_INSNS (4),    /* mulsi_const */
493   COSTS_N_INSNS (4),    /* mulsi_const9 */
494   COSTS_N_INSNS (4),    /* muldi */
495   COSTS_N_INSNS (11),   /* divsi */
496   COSTS_N_INSNS (11),   /* divdi */
497   COSTS_N_INSNS (6),    /* fp */
498   COSTS_N_INSNS (6),    /* dmul */
499   COSTS_N_INSNS (19),   /* sdiv */
500   COSTS_N_INSNS (33),   /* ddiv */
501   32,                   /* l1 cache line size */
502   32,                   /* l1 cache */
503   512,                  /* l2 cache */
504   1,                    /* streams */
505 };
506
507 /* Instruction costs on PPC601 processors.  */
508 static const
509 struct processor_costs ppc601_cost = {
510   COSTS_N_INSNS (5),    /* mulsi */
511   COSTS_N_INSNS (5),    /* mulsi_const */
512   COSTS_N_INSNS (5),    /* mulsi_const9 */
513   COSTS_N_INSNS (5),    /* muldi */
514   COSTS_N_INSNS (36),   /* divsi */
515   COSTS_N_INSNS (36),   /* divdi */
516   COSTS_N_INSNS (4),    /* fp */
517   COSTS_N_INSNS (5),    /* dmul */
518   COSTS_N_INSNS (17),   /* sdiv */
519   COSTS_N_INSNS (31),   /* ddiv */
520   32,                   /* cache line size */
521   32,                   /* l1 cache */
522   256,                  /* l2 cache */
523   1,                    /* streams */
524 };
525
526 /* Instruction costs on PPC603 processors.  */
527 static const
528 struct processor_costs ppc603_cost = {
529   COSTS_N_INSNS (5),    /* mulsi */
530   COSTS_N_INSNS (3),    /* mulsi_const */
531   COSTS_N_INSNS (2),    /* mulsi_const9 */
532   COSTS_N_INSNS (5),    /* muldi */
533   COSTS_N_INSNS (37),   /* divsi */
534   COSTS_N_INSNS (37),   /* divdi */
535   COSTS_N_INSNS (3),    /* fp */
536   COSTS_N_INSNS (4),    /* dmul */
537   COSTS_N_INSNS (18),   /* sdiv */
538   COSTS_N_INSNS (33),   /* ddiv */
539   32,                   /* cache line size */
540   8,                    /* l1 cache */
541   64,                   /* l2 cache */
542   1,                    /* streams */
543 };
544
545 /* Instruction costs on PPC604 processors.  */
546 static const
547 struct processor_costs ppc604_cost = {
548   COSTS_N_INSNS (4),    /* mulsi */
549   COSTS_N_INSNS (4),    /* mulsi_const */
550   COSTS_N_INSNS (4),    /* mulsi_const9 */
551   COSTS_N_INSNS (4),    /* muldi */
552   COSTS_N_INSNS (20),   /* divsi */
553   COSTS_N_INSNS (20),   /* divdi */
554   COSTS_N_INSNS (3),    /* fp */
555   COSTS_N_INSNS (3),    /* dmul */
556   COSTS_N_INSNS (18),   /* sdiv */
557   COSTS_N_INSNS (32),   /* ddiv */
558   32,                   /* cache line size */
559   16,                   /* l1 cache */
560   512,                  /* l2 cache */
561   1,                    /* streams */
562 };
563
564 /* Instruction costs on PPC604e processors.  */
565 static const
566 struct processor_costs ppc604e_cost = {
567   COSTS_N_INSNS (2),    /* mulsi */
568   COSTS_N_INSNS (2),    /* mulsi_const */
569   COSTS_N_INSNS (2),    /* mulsi_const9 */
570   COSTS_N_INSNS (2),    /* muldi */
571   COSTS_N_INSNS (20),   /* divsi */
572   COSTS_N_INSNS (20),   /* divdi */
573   COSTS_N_INSNS (3),    /* fp */
574   COSTS_N_INSNS (3),    /* dmul */
575   COSTS_N_INSNS (18),   /* sdiv */
576   COSTS_N_INSNS (32),   /* ddiv */
577   32,                   /* cache line size */
578   32,                   /* l1 cache */
579   1024,                 /* l2 cache */
580   1,                    /* streams */
581 };
582
583 /* Instruction costs on PPC620 processors.  */
584 static const
585 struct processor_costs ppc620_cost = {
586   COSTS_N_INSNS (5),    /* mulsi */
587   COSTS_N_INSNS (4),    /* mulsi_const */
588   COSTS_N_INSNS (3),    /* mulsi_const9 */
589   COSTS_N_INSNS (7),    /* muldi */
590   COSTS_N_INSNS (21),   /* divsi */
591   COSTS_N_INSNS (37),   /* divdi */
592   COSTS_N_INSNS (3),    /* fp */
593   COSTS_N_INSNS (3),    /* dmul */
594   COSTS_N_INSNS (18),   /* sdiv */
595   COSTS_N_INSNS (32),   /* ddiv */
596   128,                  /* cache line size */
597   32,                   /* l1 cache */
598   1024,                 /* l2 cache */
599   1,                    /* streams */
600 };
601
602 /* Instruction costs on PPC630 processors.  */
603 static const
604 struct processor_costs ppc630_cost = {
605   COSTS_N_INSNS (5),    /* mulsi */
606   COSTS_N_INSNS (4),    /* mulsi_const */
607   COSTS_N_INSNS (3),    /* mulsi_const9 */
608   COSTS_N_INSNS (7),    /* muldi */
609   COSTS_N_INSNS (21),   /* divsi */
610   COSTS_N_INSNS (37),   /* divdi */
611   COSTS_N_INSNS (3),    /* fp */
612   COSTS_N_INSNS (3),    /* dmul */
613   COSTS_N_INSNS (17),   /* sdiv */
614   COSTS_N_INSNS (21),   /* ddiv */
615   128,                  /* cache line size */
616   64,                   /* l1 cache */
617   1024,                 /* l2 cache */
618   1,                    /* streams */
619 };
620
621 /* Instruction costs on Cell processor.  */
622 /* COSTS_N_INSNS (1) ~ one add.  */
623 static const
624 struct processor_costs ppccell_cost = {
625   COSTS_N_INSNS (9/2)+2,    /* mulsi */
626   COSTS_N_INSNS (6/2),    /* mulsi_const */
627   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
628   COSTS_N_INSNS (15/2)+2,   /* muldi */
629   COSTS_N_INSNS (38/2),   /* divsi */
630   COSTS_N_INSNS (70/2),   /* divdi */
631   COSTS_N_INSNS (10/2),   /* fp */
632   COSTS_N_INSNS (10/2),   /* dmul */
633   COSTS_N_INSNS (74/2),   /* sdiv */
634   COSTS_N_INSNS (74/2),   /* ddiv */
635   128,                  /* cache line size */
636   32,                   /* l1 cache */
637   512,                  /* l2 cache */
638   6,                    /* streams */
639 };
640
641 /* Instruction costs on PPC750 and PPC7400 processors.  */
642 static const
643 struct processor_costs ppc750_cost = {
644   COSTS_N_INSNS (5),    /* mulsi */
645   COSTS_N_INSNS (3),    /* mulsi_const */
646   COSTS_N_INSNS (2),    /* mulsi_const9 */
647   COSTS_N_INSNS (5),    /* muldi */
648   COSTS_N_INSNS (17),   /* divsi */
649   COSTS_N_INSNS (17),   /* divdi */
650   COSTS_N_INSNS (3),    /* fp */
651   COSTS_N_INSNS (3),    /* dmul */
652   COSTS_N_INSNS (17),   /* sdiv */
653   COSTS_N_INSNS (31),   /* ddiv */
654   32,                   /* cache line size */
655   32,                   /* l1 cache */
656   512,                  /* l2 cache */
657   1,                    /* streams */
658 };
659
660 /* Instruction costs on PPC7450 processors.  */
661 static const
662 struct processor_costs ppc7450_cost = {
663   COSTS_N_INSNS (4),    /* mulsi */
664   COSTS_N_INSNS (3),    /* mulsi_const */
665   COSTS_N_INSNS (3),    /* mulsi_const9 */
666   COSTS_N_INSNS (4),    /* muldi */
667   COSTS_N_INSNS (23),   /* divsi */
668   COSTS_N_INSNS (23),   /* divdi */
669   COSTS_N_INSNS (5),    /* fp */
670   COSTS_N_INSNS (5),    /* dmul */
671   COSTS_N_INSNS (21),   /* sdiv */
672   COSTS_N_INSNS (35),   /* ddiv */
673   32,                   /* cache line size */
674   32,                   /* l1 cache */
675   1024,                 /* l2 cache */
676   1,                    /* streams */
677 };
678
679 /* Instruction costs on PPC8540 processors.  */
680 static const
681 struct processor_costs ppc8540_cost = {
682   COSTS_N_INSNS (4),    /* mulsi */
683   COSTS_N_INSNS (4),    /* mulsi_const */
684   COSTS_N_INSNS (4),    /* mulsi_const9 */
685   COSTS_N_INSNS (4),    /* muldi */
686   COSTS_N_INSNS (19),   /* divsi */
687   COSTS_N_INSNS (19),   /* divdi */
688   COSTS_N_INSNS (4),    /* fp */
689   COSTS_N_INSNS (4),    /* dmul */
690   COSTS_N_INSNS (29),   /* sdiv */
691   COSTS_N_INSNS (29),   /* ddiv */
692   32,                   /* cache line size */
693   32,                   /* l1 cache */
694   256,                  /* l2 cache */
695   1,                    /* prefetch streams /*/
696 };
697
698 /* Instruction costs on E300C2 and E300C3 cores.  */
699 static const
700 struct processor_costs ppce300c2c3_cost = {
701   COSTS_N_INSNS (4),    /* mulsi */
702   COSTS_N_INSNS (4),    /* mulsi_const */
703   COSTS_N_INSNS (4),    /* mulsi_const9 */
704   COSTS_N_INSNS (4),    /* muldi */
705   COSTS_N_INSNS (19),   /* divsi */
706   COSTS_N_INSNS (19),   /* divdi */
707   COSTS_N_INSNS (3),    /* fp */
708   COSTS_N_INSNS (4),    /* dmul */
709   COSTS_N_INSNS (18),   /* sdiv */
710   COSTS_N_INSNS (33),   /* ddiv */
711   32,
712   16,                   /* l1 cache */
713   16,                   /* l2 cache */
714   1,                    /* prefetch streams /*/
715 };
716
717 /* Instruction costs on PPCE500MC processors.  */
718 static const
719 struct processor_costs ppce500mc_cost = {
720   COSTS_N_INSNS (4),    /* mulsi */
721   COSTS_N_INSNS (4),    /* mulsi_const */
722   COSTS_N_INSNS (4),    /* mulsi_const9 */
723   COSTS_N_INSNS (4),    /* muldi */
724   COSTS_N_INSNS (14),   /* divsi */
725   COSTS_N_INSNS (14),   /* divdi */
726   COSTS_N_INSNS (8),    /* fp */
727   COSTS_N_INSNS (10),   /* dmul */
728   COSTS_N_INSNS (36),   /* sdiv */
729   COSTS_N_INSNS (66),   /* ddiv */
730   64,                   /* cache line size */
731   32,                   /* l1 cache */
732   128,                  /* l2 cache */
733   1,                    /* prefetch streams /*/
734 };
735
736 /* Instruction costs on PPCE500MC64 processors.  */
737 static const
738 struct processor_costs ppce500mc64_cost = {
739   COSTS_N_INSNS (4),    /* mulsi */
740   COSTS_N_INSNS (4),    /* mulsi_const */
741   COSTS_N_INSNS (4),    /* mulsi_const9 */
742   COSTS_N_INSNS (4),    /* muldi */
743   COSTS_N_INSNS (14),   /* divsi */
744   COSTS_N_INSNS (14),   /* divdi */
745   COSTS_N_INSNS (4),    /* fp */
746   COSTS_N_INSNS (10),   /* dmul */
747   COSTS_N_INSNS (36),   /* sdiv */
748   COSTS_N_INSNS (66),   /* ddiv */
749   64,                   /* cache line size */
750   32,                   /* l1 cache */
751   128,                  /* l2 cache */
752   1,                    /* prefetch streams /*/
753 };
754
755 /* Instruction costs on AppliedMicro Titan processors.  */
756 static const
757 struct processor_costs titan_cost = {
758   COSTS_N_INSNS (5),    /* mulsi */
759   COSTS_N_INSNS (5),    /* mulsi_const */
760   COSTS_N_INSNS (5),    /* mulsi_const9 */
761   COSTS_N_INSNS (5),    /* muldi */
762   COSTS_N_INSNS (18),   /* divsi */
763   COSTS_N_INSNS (18),   /* divdi */
764   COSTS_N_INSNS (10),   /* fp */
765   COSTS_N_INSNS (10),   /* dmul */
766   COSTS_N_INSNS (46),   /* sdiv */
767   COSTS_N_INSNS (72),   /* ddiv */
768   32,                   /* cache line size */
769   32,                   /* l1 cache */
770   512,                  /* l2 cache */
771   1,                    /* prefetch streams /*/
772 };
773
774 /* Instruction costs on POWER4 and POWER5 processors.  */
775 static const
776 struct processor_costs power4_cost = {
777   COSTS_N_INSNS (3),    /* mulsi */
778   COSTS_N_INSNS (2),    /* mulsi_const */
779   COSTS_N_INSNS (2),    /* mulsi_const9 */
780   COSTS_N_INSNS (4),    /* muldi */
781   COSTS_N_INSNS (18),   /* divsi */
782   COSTS_N_INSNS (34),   /* divdi */
783   COSTS_N_INSNS (3),    /* fp */
784   COSTS_N_INSNS (3),    /* dmul */
785   COSTS_N_INSNS (17),   /* sdiv */
786   COSTS_N_INSNS (17),   /* ddiv */
787   128,                  /* cache line size */
788   32,                   /* l1 cache */
789   1024,                 /* l2 cache */
790   8,                    /* prefetch streams /*/
791 };
792
793 /* Instruction costs on POWER6 processors.  */
794 static const
795 struct processor_costs power6_cost = {
796   COSTS_N_INSNS (8),    /* mulsi */
797   COSTS_N_INSNS (8),    /* mulsi_const */
798   COSTS_N_INSNS (8),    /* mulsi_const9 */
799   COSTS_N_INSNS (8),    /* muldi */
800   COSTS_N_INSNS (22),   /* divsi */
801   COSTS_N_INSNS (28),   /* divdi */
802   COSTS_N_INSNS (3),    /* fp */
803   COSTS_N_INSNS (3),    /* dmul */
804   COSTS_N_INSNS (13),   /* sdiv */
805   COSTS_N_INSNS (16),   /* ddiv */
806   128,                  /* cache line size */
807   64,                   /* l1 cache */
808   2048,                 /* l2 cache */
809   16,                   /* prefetch streams */
810 };
811
812 /* Instruction costs on POWER7 processors.  */
813 static const
814 struct processor_costs power7_cost = {
815   COSTS_N_INSNS (2),    /* mulsi */
816   COSTS_N_INSNS (2),    /* mulsi_const */
817   COSTS_N_INSNS (2),    /* mulsi_const9 */
818   COSTS_N_INSNS (2),    /* muldi */
819   COSTS_N_INSNS (18),   /* divsi */
820   COSTS_N_INSNS (34),   /* divdi */
821   COSTS_N_INSNS (3),    /* fp */
822   COSTS_N_INSNS (3),    /* dmul */
823   COSTS_N_INSNS (13),   /* sdiv */
824   COSTS_N_INSNS (16),   /* ddiv */
825   128,                  /* cache line size */
826   32,                   /* l1 cache */
827   256,                  /* l2 cache */
828   12,                   /* prefetch streams */
829 };
830
831 /* Instruction costs on POWER A2 processors.  */
832 static const
833 struct processor_costs ppca2_cost = {
834   COSTS_N_INSNS (16),    /* mulsi */
835   COSTS_N_INSNS (16),    /* mulsi_const */
836   COSTS_N_INSNS (16),    /* mulsi_const9 */
837   COSTS_N_INSNS (16),   /* muldi */
838   COSTS_N_INSNS (22),   /* divsi */
839   COSTS_N_INSNS (28),   /* divdi */
840   COSTS_N_INSNS (3),    /* fp */
841   COSTS_N_INSNS (3),    /* dmul */
842   COSTS_N_INSNS (59),   /* sdiv */
843   COSTS_N_INSNS (72),   /* ddiv */
844   64,
845   16,                   /* l1 cache */
846   2048,                 /* l2 cache */
847   16,                   /* prefetch streams */
848 };
849
850 \f
851 /* Table that classifies rs6000 builtin functions (pure, const, etc.).  */
852 #undef RS6000_BUILTIN
853 #undef RS6000_BUILTIN_EQUATE
854 #define RS6000_BUILTIN(NAME, TYPE) TYPE,
855 #define RS6000_BUILTIN_EQUATE(NAME, VALUE)
856
857 static const enum rs6000_btc builtin_classify[(int)RS6000_BUILTIN_COUNT] =
858 {
859 #include "rs6000-builtin.def"
860 };
861
862 #undef RS6000_BUILTIN
863 #undef RS6000_BUILTIN_EQUATE
864
865 /* Support for -mveclibabi=<xxx> to control which vector library to use.  */
866 static tree (*rs6000_veclib_handler) (tree, tree, tree);
867
868 \f
869 static bool rs6000_function_ok_for_sibcall (tree, tree);
870 static const char *rs6000_invalid_within_doloop (const_rtx);
871 static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
872 static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
873 static rtx rs6000_generate_compare (rtx, enum machine_mode);
874 static void rs6000_emit_stack_tie (void);
875 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
876 static bool spe_func_has_64bit_regs_p (void);
877 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
878                              int, HOST_WIDE_INT);
879 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
880 static unsigned rs6000_hash_constant (rtx);
881 static unsigned toc_hash_function (const void *);
882 static int toc_hash_eq (const void *, const void *);
883 static bool reg_offset_addressing_ok_p (enum machine_mode);
884 static bool virtual_stack_registers_memory_p (rtx);
885 static bool constant_pool_expr_p (rtx);
886 static bool legitimate_small_data_p (enum machine_mode, rtx);
887 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
888 static struct machine_function * rs6000_init_machine_status (void);
889 static bool rs6000_assemble_integer (rtx, unsigned int, int);
890 static bool no_global_regs_above (int, bool);
891 #if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
892 static void rs6000_assemble_visibility (tree, int);
893 #endif
894 static int rs6000_ra_ever_killed (void);
895 static bool rs6000_attribute_takes_identifier_p (const_tree);
896 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
897 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
898 static bool rs6000_ms_bitfield_layout_p (const_tree);
899 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
900 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
901 static const char *rs6000_mangle_type (const_tree);
902 static void rs6000_set_default_type_attributes (tree);
903 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
904 static rtx rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
905 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
906                                    enum machine_mode, bool, bool, bool);
907 static bool rs6000_reg_live_or_pic_offset_p (int);
908 static tree rs6000_builtin_vectorized_libmass (tree, tree, tree);
909 static tree rs6000_builtin_vectorized_function (tree, tree, tree);
910 static void rs6000_restore_saved_cr (rtx, int);
911 static bool rs6000_output_addr_const_extra (FILE *, rtx);
912 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
913 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
914 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
915                                     tree);
916 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
917 static bool rs6000_return_in_memory (const_tree, const_tree);
918 static rtx rs6000_function_value (const_tree, const_tree, bool);
919 static void rs6000_file_start (void);
920 #if TARGET_ELF
921 static int rs6000_elf_reloc_rw_mask (void);
922 static void rs6000_elf_asm_out_constructor (rtx, int) ATTRIBUTE_UNUSED;
923 static void rs6000_elf_asm_out_destructor (rtx, int) ATTRIBUTE_UNUSED;
924 static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
925 static void rs6000_elf_asm_init_sections (void);
926 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
927                                                unsigned HOST_WIDE_INT);
928 static void rs6000_elf_encode_section_info (tree, rtx, int)
929      ATTRIBUTE_UNUSED;
930 #endif
931 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
932 static void rs6000_alloc_sdmode_stack_slot (void);
933 static void rs6000_instantiate_decls (void);
934 #if TARGET_XCOFF
935 static void rs6000_xcoff_asm_output_anchor (rtx);
936 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
937 static void rs6000_xcoff_asm_init_sections (void);
938 static int rs6000_xcoff_reloc_rw_mask (void);
939 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
940 static section *rs6000_xcoff_select_section (tree, int,
941                                              unsigned HOST_WIDE_INT);
942 static void rs6000_xcoff_unique_section (tree, int);
943 static section *rs6000_xcoff_select_rtx_section
944   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
945 static const char * rs6000_xcoff_strip_name_encoding (const char *);
946 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
947 static void rs6000_xcoff_file_start (void);
948 static void rs6000_xcoff_file_end (void);
949 #endif
950 static int rs6000_variable_issue (FILE *, int, rtx, int);
951 static int rs6000_register_move_cost (enum machine_mode,
952                                       reg_class_t, reg_class_t);
953 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
954 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
955 static bool rs6000_debug_rtx_costs (rtx, int, int, int *, bool);
956 static int rs6000_debug_address_cost (rtx, bool);
957 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
958 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
959 static void rs6000_sched_init (FILE *, int, int);
960 static bool is_microcoded_insn (rtx);
961 static bool is_nonpipeline_insn (rtx);
962 static bool is_cracked_insn (rtx);
963 static bool is_branch_slot_insn (rtx);
964 static bool is_load_insn (rtx);
965 static rtx get_store_dest (rtx pat);
966 static bool is_store_insn (rtx);
967 static bool set_to_load_agen (rtx,rtx);
968 static bool adjacent_mem_locations (rtx,rtx);
969 static int rs6000_adjust_priority (rtx, int);
970 static int rs6000_issue_rate (void);
971 static bool rs6000_is_costly_dependence (dep_t, int, int);
972 static rtx get_next_active_insn (rtx, rtx);
973 static bool insn_terminates_group_p (rtx , enum group_termination);
974 static bool insn_must_be_first_in_group (rtx);
975 static bool insn_must_be_last_in_group (rtx);
976 static bool is_costly_group (rtx *, rtx);
977 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
978 static int redefine_groups (FILE *, int, rtx, rtx);
979 static int pad_groups (FILE *, int, rtx, rtx);
980 static void rs6000_sched_finish (FILE *, int);
981 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
982 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
983 static int rs6000_use_sched_lookahead (void);
984 static int rs6000_use_sched_lookahead_guard (rtx);
985 static void * rs6000_alloc_sched_context (void);
986 static void rs6000_init_sched_context (void *, bool);
987 static void rs6000_set_sched_context (void *);
988 static void rs6000_free_sched_context (void *);
989 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
990 static tree rs6000_builtin_mask_for_load (void);
991 static tree rs6000_builtin_mul_widen_even (tree);
992 static tree rs6000_builtin_mul_widen_odd (tree);
993 static tree rs6000_builtin_conversion (unsigned int, tree, tree);
994 static tree rs6000_builtin_vec_perm (tree, tree *);
995 static bool rs6000_builtin_support_vector_misalignment (enum
996                                                         machine_mode,
997                                                         const_tree,
998                                                         int, bool);
999 static int rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt,
1000                                               tree, int);
1001 static enum machine_mode rs6000_preferred_simd_mode (enum machine_mode);
1002
1003 static void def_builtin (int, const char *, tree, int);
1004 static bool rs6000_vector_alignment_reachable (const_tree, bool);
1005 static void rs6000_init_builtins (void);
1006 static tree rs6000_builtin_decl (unsigned, bool);
1007
1008 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
1009 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
1010 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
1011 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1012 static void altivec_init_builtins (void);
1013 static unsigned builtin_hash_function (const void *);
1014 static int builtin_hash_eq (const void *, const void *);
1015 static tree builtin_function_type (enum machine_mode, enum machine_mode,
1016                                    enum machine_mode, enum machine_mode,
1017                                    enum rs6000_builtins, const char *name);
1018 static void rs6000_common_init_builtins (void);
1019 static void rs6000_init_libfuncs (void);
1020
1021 static void paired_init_builtins (void);
1022 static rtx paired_expand_builtin (tree, rtx, bool *);
1023 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
1024 static rtx paired_expand_stv_builtin (enum insn_code, tree);
1025 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
1026
1027 static void enable_mask_for_builtins (struct builtin_description *, int,
1028                                       enum rs6000_builtins,
1029                                       enum rs6000_builtins);
1030 static void spe_init_builtins (void);
1031 static rtx spe_expand_builtin (tree, rtx, bool *);
1032 static rtx spe_expand_stv_builtin (enum insn_code, tree);
1033 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
1034 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
1035 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
1036 static rs6000_stack_t *rs6000_stack_info (void);
1037 static void debug_stack_info (rs6000_stack_t *);
1038
1039 static rtx altivec_expand_builtin (tree, rtx, bool *);
1040 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
1041 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
1042 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
1043 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
1044 static rtx altivec_expand_predicate_builtin (enum insn_code, tree, rtx);
1045 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
1046 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
1047 static rtx altivec_expand_vec_set_builtin (tree);
1048 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
1049 static int get_element_number (tree, tree);
1050 static void rs6000_option_override (void);
1051 static int rs6000_loop_align_max_skip (rtx);
1052 static int first_altivec_reg_to_save (void);
1053 static unsigned int compute_vrsave_mask (void);
1054 static void compute_save_world_info (rs6000_stack_t *info_ptr);
1055 static void is_altivec_return_reg (rtx, void *);
1056 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
1057 int easy_vector_constant (rtx, enum machine_mode);
1058 static rtx rs6000_dwarf_register_span (rtx);
1059 static void rs6000_init_dwarf_reg_sizes_extra (tree);
1060 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
1061 static rtx rs6000_debug_legitimize_address (rtx, rtx, enum machine_mode);
1062 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1063 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
1064 static rtx rs6000_delegitimize_address (rtx);
1065 static rtx rs6000_tls_get_addr (void);
1066 static rtx rs6000_got_sym (void);
1067 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
1068 static const char *rs6000_get_some_local_dynamic_name (void);
1069 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
1070 static rtx rs6000_complex_function_value (enum machine_mode);
1071 static rtx rs6000_spe_function_arg (const CUMULATIVE_ARGS *,
1072                                     enum machine_mode, const_tree);
1073 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
1074                                                       HOST_WIDE_INT, int);
1075 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
1076                                                         const_tree,
1077                                                         HOST_WIDE_INT);
1078 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
1079                                               HOST_WIDE_INT,
1080                                               rtx[], int *);
1081 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
1082                                                 const_tree, HOST_WIDE_INT,
1083                                                 rtx[], int *);
1084 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, bool, bool);
1085 static rtx rs6000_mixed_function_arg (enum machine_mode, const_tree, int);
1086 static void rs6000_function_arg_advance (cumulative_args_t, enum machine_mode,
1087                                          const_tree, bool);
1088 static rtx rs6000_function_arg (cumulative_args_t, enum machine_mode,
1089                                 const_tree, bool);
1090 static unsigned int rs6000_function_arg_boundary (enum machine_mode,
1091                                                   const_tree);
1092 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
1093 static void setup_incoming_varargs (cumulative_args_t,
1094                                     enum machine_mode, tree,
1095                                     int *, int);
1096 static bool rs6000_pass_by_reference (cumulative_args_t, enum machine_mode,
1097                                       const_tree, bool);
1098 static int rs6000_arg_partial_bytes (cumulative_args_t, enum machine_mode,
1099                                      tree, bool);
1100 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
1101 #if TARGET_MACHO
1102 static void macho_branch_islands (void);
1103 static int no_previous_def (tree function_name);
1104 static tree get_prev_label (tree function_name);
1105 static void rs6000_darwin_file_start (void);
1106 #endif
1107
1108 static tree rs6000_build_builtin_va_list (void);
1109 static void rs6000_va_start (tree, rtx);
1110 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
1111 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
1112 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
1113 static bool rs6000_vector_mode_supported_p (enum machine_mode);
1114 static rtx rs6000_emit_vector_compare_inner (enum rtx_code, rtx, rtx);
1115 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
1116                                        enum machine_mode);
1117 static tree rs6000_stack_protect_fail (void);
1118
1119 static rtx rs6000_legitimize_reload_address (rtx, enum machine_mode, int, int,
1120                                              int, int *);
1121
1122 static rtx rs6000_debug_legitimize_reload_address (rtx, enum machine_mode, int,
1123                                                    int, int, int *);
1124
1125 rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode, int, int,
1126                                              int, int *)
1127   = rs6000_legitimize_reload_address;
1128
1129 static bool rs6000_mode_dependent_address_p (const_rtx);
1130 static bool rs6000_mode_dependent_address (const_rtx);
1131 static bool rs6000_debug_mode_dependent_address (const_rtx);
1132 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1133   = rs6000_mode_dependent_address;
1134
1135 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1136                                                      enum machine_mode, rtx);
1137 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1138                                                            enum machine_mode,
1139                                                            rtx);
1140 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1141                                                      enum machine_mode, rtx)
1142   = rs6000_secondary_reload_class;
1143
1144 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1145 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1146                                                            enum reg_class);
1147 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1148   = rs6000_preferred_reload_class;
1149
1150 static bool rs6000_secondary_memory_needed (enum reg_class, enum reg_class,
1151                                             enum machine_mode);
1152
1153 static bool rs6000_debug_secondary_memory_needed (enum reg_class,
1154                                                   enum reg_class,
1155                                                   enum machine_mode);
1156
1157 bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class, enum reg_class,
1158                                             enum machine_mode)
1159   = rs6000_secondary_memory_needed;
1160
1161 static bool rs6000_cannot_change_mode_class (enum machine_mode,
1162                                              enum machine_mode,
1163                                              enum reg_class);
1164 static bool rs6000_debug_cannot_change_mode_class (enum machine_mode,
1165                                                    enum machine_mode,
1166                                                    enum reg_class);
1167
1168 bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
1169                                              enum machine_mode,
1170                                              enum reg_class)
1171   = rs6000_cannot_change_mode_class;
1172
1173 static reg_class_t rs6000_secondary_reload (bool, rtx, reg_class_t,
1174                                             enum machine_mode,
1175                                             struct secondary_reload_info *);
1176
1177 const int INSN_NOT_AVAILABLE = -1;
1178 static enum machine_mode rs6000_eh_return_filter_mode (void);
1179 static bool rs6000_can_eliminate (const int, const int);
1180 static void rs6000_conditional_register_usage (void);
1181 static void rs6000_trampoline_init (rtx, tree, rtx);
1182 static bool rs6000_cannot_force_const_mem (enum machine_mode, rtx);
1183 static bool rs6000_legitimate_constant_p (enum machine_mode, rtx);
1184
1185 /* Hash table stuff for keeping track of TOC entries.  */
1186
1187 struct GTY(()) toc_hash_struct
1188 {
1189   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1190      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
1191   rtx key;
1192   enum machine_mode key_mode;
1193   int labelno;
1194 };
1195
1196 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
1197
1198 /* Hash table to keep track of the argument types for builtin functions.  */
1199
1200 struct GTY(()) builtin_hash_struct
1201 {
1202   tree type;
1203   enum machine_mode mode[4];    /* return value + 3 arguments.  */
1204   unsigned char uns_p[4];       /* and whether the types are unsigned.  */
1205 };
1206
1207 static GTY ((param_is (struct builtin_hash_struct))) htab_t builtin_hash_table;
1208
1209 static bool rs6000_valid_attribute_p (tree, tree, tree, int);
1210 static void rs6000_function_specific_save (struct cl_target_option *);
1211 static void rs6000_function_specific_restore (struct cl_target_option *);
1212 static void rs6000_function_specific_print (FILE *, int,
1213                                             struct cl_target_option *);
1214 static bool rs6000_can_inline_p (tree, tree);
1215 static void rs6000_set_current_function (tree);
1216
1217 \f
1218 /* Default register names.  */
1219 char rs6000_reg_names[][8] =
1220 {
1221       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1222       "8",  "9", "10", "11", "12", "13", "14", "15",
1223      "16", "17", "18", "19", "20", "21", "22", "23",
1224      "24", "25", "26", "27", "28", "29", "30", "31",
1225       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1226       "8",  "9", "10", "11", "12", "13", "14", "15",
1227      "16", "17", "18", "19", "20", "21", "22", "23",
1228      "24", "25", "26", "27", "28", "29", "30", "31",
1229      "mq", "lr", "ctr","ap",
1230       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1231       "ca",
1232       /* AltiVec registers.  */
1233       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
1234       "8",  "9",  "10", "11", "12", "13", "14", "15",
1235       "16", "17", "18", "19", "20", "21", "22", "23",
1236       "24", "25", "26", "27", "28", "29", "30", "31",
1237       "vrsave", "vscr",
1238       /* SPE registers.  */
1239       "spe_acc", "spefscr",
1240       /* Soft frame pointer.  */
1241       "sfp"
1242 };
1243
1244 #ifdef TARGET_REGNAMES
1245 static const char alt_reg_names[][8] =
1246 {
1247    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1248    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1249   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1250   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1251    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1252    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1253   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1254   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1255     "mq",    "lr",  "ctr",   "ap",
1256   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1257    "ca",
1258   /* AltiVec registers.  */
1259    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1260    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1261   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1262   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1263   "vrsave", "vscr",
1264   /* SPE registers.  */
1265   "spe_acc", "spefscr",
1266   /* Soft frame pointer.  */
1267   "sfp"
1268 };
1269 #endif
1270
1271 /* Table of valid machine attributes.  */
1272
1273 static const struct attribute_spec rs6000_attribute_table[] =
1274 {
1275   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
1276        affects_type_identity } */
1277   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
1278     false },
1279   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
1280     false },
1281   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
1282     false },
1283   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1284     false },
1285   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1286     false },
1287 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1288   SUBTARGET_ATTRIBUTE_TABLE,
1289 #endif
1290   { NULL,        0, 0, false, false, false, NULL, false }
1291 };
1292 \f
1293 #ifndef MASK_STRICT_ALIGN
1294 #define MASK_STRICT_ALIGN 0
1295 #endif
1296 #ifndef TARGET_PROFILE_KERNEL
1297 #define TARGET_PROFILE_KERNEL 0
1298 #endif
1299
1300 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1301 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1302 \f
1303 /* Initialize the GCC target structure.  */
1304 #undef TARGET_ATTRIBUTE_TABLE
1305 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1306 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1307 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1308 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1309 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1310
1311 #undef TARGET_ASM_ALIGNED_DI_OP
1312 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1313
1314 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1315    for non-ELF systems.  */
1316 #ifndef OBJECT_FORMAT_ELF
1317 #if TARGET_XCOFF
1318 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1319    64-bit targets.  */
1320 #undef TARGET_ASM_UNALIGNED_HI_OP
1321 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1322 #undef TARGET_ASM_UNALIGNED_SI_OP
1323 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1324 #undef TARGET_ASM_UNALIGNED_DI_OP
1325 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1326 #else
1327 /* For Darwin.  */
1328 #undef TARGET_ASM_UNALIGNED_HI_OP
1329 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1330 #undef TARGET_ASM_UNALIGNED_SI_OP
1331 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1332 #undef TARGET_ASM_UNALIGNED_DI_OP
1333 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1334 #undef TARGET_ASM_ALIGNED_DI_OP
1335 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1336 #endif
1337 #endif
1338
1339 /* This hook deals with fixups for relocatable code and DI-mode objects
1340    in 64-bit code.  */
1341 #undef TARGET_ASM_INTEGER
1342 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1343
1344 #if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
1345 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1346 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1347 #endif
1348
1349 #undef TARGET_HAVE_TLS
1350 #define TARGET_HAVE_TLS HAVE_AS_TLS
1351
1352 #undef TARGET_CANNOT_FORCE_CONST_MEM
1353 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_cannot_force_const_mem
1354
1355 #undef TARGET_DELEGITIMIZE_ADDRESS
1356 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1357
1358 #undef TARGET_ASM_FUNCTION_PROLOGUE
1359 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1360 #undef TARGET_ASM_FUNCTION_EPILOGUE
1361 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1362
1363 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
1364 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA rs6000_output_addr_const_extra
1365
1366 #undef TARGET_LEGITIMIZE_ADDRESS
1367 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1368
1369 #undef  TARGET_SCHED_VARIABLE_ISSUE
1370 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1371
1372 #undef TARGET_SCHED_ISSUE_RATE
1373 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1374 #undef TARGET_SCHED_ADJUST_COST
1375 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1376 #undef TARGET_SCHED_ADJUST_PRIORITY
1377 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1378 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1379 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1380 #undef TARGET_SCHED_INIT
1381 #define TARGET_SCHED_INIT rs6000_sched_init
1382 #undef TARGET_SCHED_FINISH
1383 #define TARGET_SCHED_FINISH rs6000_sched_finish
1384 #undef TARGET_SCHED_REORDER
1385 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1386 #undef TARGET_SCHED_REORDER2
1387 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1388
1389 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1390 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1391
1392 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1393 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1394
1395 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1396 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1397 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1398 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1399 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1400 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1401 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1402 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1403
1404 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1405 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1406 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1407 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1408 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1409 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1410 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1411 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1412 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1413 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1414 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1415 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT            \
1416   rs6000_builtin_support_vector_misalignment
1417 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1418 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1419 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1420 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1421   rs6000_builtin_vectorization_cost
1422 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
1423 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
1424   rs6000_preferred_simd_mode
1425
1426 #undef TARGET_INIT_BUILTINS
1427 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1428 #undef TARGET_BUILTIN_DECL
1429 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1430
1431 #undef TARGET_EXPAND_BUILTIN
1432 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1433
1434 #undef TARGET_MANGLE_TYPE
1435 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1436
1437 #undef TARGET_INIT_LIBFUNCS
1438 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1439
1440 #if TARGET_MACHO
1441 #undef TARGET_BINDS_LOCAL_P
1442 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1443 #endif
1444
1445 #undef TARGET_MS_BITFIELD_LAYOUT_P
1446 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1447
1448 #undef TARGET_ASM_OUTPUT_MI_THUNK
1449 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1450
1451 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1452 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1453
1454 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1455 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1456
1457 #undef TARGET_INVALID_WITHIN_DOLOOP
1458 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1459
1460 #undef TARGET_REGISTER_MOVE_COST
1461 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1462 #undef TARGET_MEMORY_MOVE_COST
1463 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1464 #undef TARGET_RTX_COSTS
1465 #define TARGET_RTX_COSTS rs6000_rtx_costs
1466 #undef TARGET_ADDRESS_COST
1467 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1468
1469 #undef TARGET_DWARF_REGISTER_SPAN
1470 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1471
1472 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1473 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1474
1475 /* On rs6000, function arguments are promoted, as are function return
1476    values.  */
1477 #undef TARGET_PROMOTE_FUNCTION_MODE
1478 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
1479
1480 #undef TARGET_RETURN_IN_MEMORY
1481 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1482
1483 #undef TARGET_SETUP_INCOMING_VARARGS
1484 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1485
1486 /* Always strict argument naming on rs6000.  */
1487 #undef TARGET_STRICT_ARGUMENT_NAMING
1488 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1489 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1490 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1491 #undef TARGET_SPLIT_COMPLEX_ARG
1492 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1493 #undef TARGET_MUST_PASS_IN_STACK
1494 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1495 #undef TARGET_PASS_BY_REFERENCE
1496 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1497 #undef TARGET_ARG_PARTIAL_BYTES
1498 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1499 #undef TARGET_FUNCTION_ARG_ADVANCE
1500 #define TARGET_FUNCTION_ARG_ADVANCE rs6000_function_arg_advance
1501 #undef TARGET_FUNCTION_ARG
1502 #define TARGET_FUNCTION_ARG rs6000_function_arg
1503 #undef TARGET_FUNCTION_ARG_BOUNDARY
1504 #define TARGET_FUNCTION_ARG_BOUNDARY rs6000_function_arg_boundary
1505
1506 #undef TARGET_BUILD_BUILTIN_VA_LIST
1507 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1508
1509 #undef TARGET_EXPAND_BUILTIN_VA_START
1510 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1511
1512 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1513 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1514
1515 #undef TARGET_EH_RETURN_FILTER_MODE
1516 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1517
1518 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1519 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1520
1521 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1522 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1523
1524 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1525 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1526
1527 #undef TARGET_ASM_LOOP_ALIGN_MAX_SKIP
1528 #define TARGET_ASM_LOOP_ALIGN_MAX_SKIP rs6000_loop_align_max_skip
1529
1530 #undef TARGET_OPTION_OVERRIDE
1531 #define TARGET_OPTION_OVERRIDE rs6000_option_override
1532
1533 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1534 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1535   rs6000_builtin_vectorized_function
1536
1537 #ifndef TARGET_MACHO
1538 #undef TARGET_STACK_PROTECT_FAIL
1539 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1540 #endif
1541
1542 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1543    The PowerPC architecture requires only weak consistency among
1544    processors--that is, memory accesses between processors need not be
1545    sequentially consistent and memory accesses among processors can occur
1546    in any order. The ability to order memory accesses weakly provides
1547    opportunities for more efficient use of the system bus. Unless a
1548    dependency exists, the 604e allows read operations to precede store
1549    operations.  */
1550 #undef TARGET_RELAXED_ORDERING
1551 #define TARGET_RELAXED_ORDERING true
1552
1553 #ifdef HAVE_AS_TLS
1554 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1555 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1556 #endif
1557
1558 /* Use a 32-bit anchor range.  This leads to sequences like:
1559
1560         addis   tmp,anchor,high
1561         add     dest,tmp,low
1562
1563    where tmp itself acts as an anchor, and can be shared between
1564    accesses to the same 64k page.  */
1565 #undef TARGET_MIN_ANCHOR_OFFSET
1566 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1567 #undef TARGET_MAX_ANCHOR_OFFSET
1568 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1569 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1570 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1571
1572 #undef TARGET_BUILTIN_RECIPROCAL
1573 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1574
1575 #undef TARGET_EXPAND_TO_RTL_HOOK
1576 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1577
1578 #undef TARGET_INSTANTIATE_DECLS
1579 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1580
1581 #undef TARGET_SECONDARY_RELOAD
1582 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1583
1584 #undef TARGET_LEGITIMATE_ADDRESS_P
1585 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1586
1587 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1588 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1589
1590 #undef TARGET_CAN_ELIMINATE
1591 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1592
1593 #undef TARGET_CONDITIONAL_REGISTER_USAGE
1594 #define TARGET_CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage
1595
1596 #undef TARGET_TRAMPOLINE_INIT
1597 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1598
1599 #undef TARGET_FUNCTION_VALUE
1600 #define TARGET_FUNCTION_VALUE rs6000_function_value
1601
1602 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
1603 #define TARGET_OPTION_VALID_ATTRIBUTE_P rs6000_valid_attribute_p
1604
1605 #undef TARGET_OPTION_SAVE
1606 #define TARGET_OPTION_SAVE rs6000_function_specific_save
1607
1608 #undef TARGET_OPTION_RESTORE
1609 #define TARGET_OPTION_RESTORE rs6000_function_specific_restore
1610
1611 #undef TARGET_OPTION_PRINT
1612 #define TARGET_OPTION_PRINT rs6000_function_specific_print
1613
1614 #undef TARGET_CAN_INLINE_P
1615 #define TARGET_CAN_INLINE_P rs6000_can_inline_p
1616
1617 #undef TARGET_SET_CURRENT_FUNCTION
1618 #define TARGET_SET_CURRENT_FUNCTION rs6000_set_current_function
1619
1620 #undef TARGET_LEGITIMATE_CONSTANT_P
1621 #define TARGET_LEGITIMATE_CONSTANT_P rs6000_legitimate_constant_p
1622
1623 struct gcc_target targetm = TARGET_INITIALIZER;
1624 \f
1625
1626 /* Simplifications for entries below.  */
1627
1628 enum {
1629   POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1630   POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1631 };
1632
1633 /* Some OSs don't support saving the high part of 64-bit registers on context
1634    switch.  Other OSs don't support saving Altivec registers.  On those OSs, we
1635    don't touch the MASK_POWERPC64 or MASK_ALTIVEC settings; if the user wants
1636    either, the user must explicitly specify them and we won't interfere with
1637    the user's specification.  */
1638
1639 enum {
1640   POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1641   POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1642                    | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1643                    | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1644                    | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP
1645                    | MASK_POPCNTD | MASK_VSX | MASK_ISEL | MASK_NO_UPDATE
1646                    | MASK_RECIP_PRECISION)
1647 };
1648
1649 /* Masks for instructions set at various powerpc ISAs.  */
1650 enum {
1651   ISA_2_1_MASKS = MASK_MFCRF,
1652   ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB),
1653   ISA_2_4_MASKS = (ISA_2_2_MASKS | MASK_FPRND),
1654
1655   /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and don't add
1656      ALTIVEC, since in general it isn't a win on power6.  In ISA 2.04, fsel,
1657      fre, fsqrt, etc. were no longer documented as optional.  Group masks by
1658      server and embedded. */
1659   ISA_2_5_MASKS_EMBEDDED = (ISA_2_2_MASKS | MASK_CMPB | MASK_RECIP_PRECISION
1660                             | MASK_PPC_GFXOPT | MASK_PPC_GPOPT),
1661   ISA_2_5_MASKS_SERVER = (ISA_2_5_MASKS_EMBEDDED | MASK_DFP),
1662
1663   /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but
1664      altivec is a win so enable it.  */
1665   ISA_2_6_MASKS_EMBEDDED = (ISA_2_5_MASKS_EMBEDDED | MASK_POPCNTD),
1666   ISA_2_6_MASKS_SERVER = (ISA_2_5_MASKS_SERVER | MASK_POPCNTD | MASK_ALTIVEC
1667                           | MASK_VSX)
1668 };
1669
1670 struct rs6000_ptt
1671 {
1672   const char *const name;               /* Canonical processor name.  */
1673   const enum processor_type processor;  /* Processor type enum value.  */
1674   const int target_enable;              /* Target flags to enable.  */
1675 };
1676
1677 static struct rs6000_ptt const processor_target_table[] =
1678 {
1679 #define RS6000_CPU(NAME, CPU, FLAGS) { NAME, CPU, FLAGS },
1680 #include "rs6000-cpus.def"
1681 #undef RS6000_CPU
1682 };
1683
1684 /* Look up a processor name for -mcpu=xxx and -mtune=xxx.  Return -1 if the
1685    name is invalid.  */
1686
1687 static int
1688 rs6000_cpu_name_lookup (const char *name)
1689 {
1690   size_t i;
1691
1692   if (name != NULL)
1693     {
1694       for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
1695         if (! strcmp (name, processor_target_table[i].name))
1696           return (int)i;
1697     }
1698
1699   return -1;
1700 }
1701
1702 \f
1703 /* Return number of consecutive hard regs needed starting at reg REGNO
1704    to hold something of mode MODE.
1705    This is ordinarily the length in words of a value of mode MODE
1706    but can be less for certain modes in special long registers.
1707
1708    For the SPE, GPRs are 64 bits but only 32 bits are visible in
1709    scalar instructions.  The upper 32 bits are only available to the
1710    SIMD instructions.
1711
1712    POWER and PowerPC GPRs hold 32 bits worth;
1713    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
1714
1715 static int
1716 rs6000_hard_regno_nregs_internal (int regno, enum machine_mode mode)
1717 {
1718   unsigned HOST_WIDE_INT reg_size;
1719
1720   if (FP_REGNO_P (regno))
1721     reg_size = (VECTOR_MEM_VSX_P (mode)
1722                 ? UNITS_PER_VSX_WORD
1723                 : UNITS_PER_FP_WORD);
1724
1725   else if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1726     reg_size = UNITS_PER_SPE_WORD;
1727
1728   else if (ALTIVEC_REGNO_P (regno))
1729     reg_size = UNITS_PER_ALTIVEC_WORD;
1730
1731   /* The value returned for SCmode in the E500 double case is 2 for
1732      ABI compatibility; storing an SCmode value in a single register
1733      would require function_arg and rs6000_spe_function_arg to handle
1734      SCmode so as to pass the value correctly in a pair of
1735      registers.  */
1736   else if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
1737            && !DECIMAL_FLOAT_MODE_P (mode))
1738     reg_size = UNITS_PER_FP_WORD;
1739
1740   else
1741     reg_size = UNITS_PER_WORD;
1742
1743   return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
1744 }
1745
1746 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1747    MODE.  */
1748 static int
1749 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1750 {
1751   int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
1752
1753   /* VSX registers that overlap the FPR registers are larger than for non-VSX
1754      implementations.  Don't allow an item to be split between a FP register
1755      and an Altivec register.  */
1756   if (VECTOR_MEM_VSX_P (mode))
1757     {
1758       if (FP_REGNO_P (regno))
1759         return FP_REGNO_P (last_regno);
1760
1761       if (ALTIVEC_REGNO_P (regno))
1762         return ALTIVEC_REGNO_P (last_regno);
1763     }
1764
1765   /* The GPRs can hold any mode, but values bigger than one register
1766      cannot go past R31.  */
1767   if (INT_REGNO_P (regno))
1768     return INT_REGNO_P (last_regno);
1769
1770   /* The float registers (except for VSX vector modes) can only hold floating
1771      modes and DImode.  This excludes the 32-bit decimal float mode for
1772      now.  */
1773   if (FP_REGNO_P (regno))
1774     {
1775       if (SCALAR_FLOAT_MODE_P (mode)
1776           && (mode != TDmode || (regno % 2) == 0)
1777           && FP_REGNO_P (last_regno))
1778         return 1;
1779
1780       if (GET_MODE_CLASS (mode) == MODE_INT
1781           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1782         return 1;
1783
1784       if (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1785           && PAIRED_VECTOR_MODE (mode))
1786         return 1;
1787
1788       return 0;
1789     }
1790
1791   /* The CR register can only hold CC modes.  */
1792   if (CR_REGNO_P (regno))
1793     return GET_MODE_CLASS (mode) == MODE_CC;
1794
1795   if (CA_REGNO_P (regno))
1796     return mode == BImode;
1797
1798   /* AltiVec only in AldyVec registers.  */
1799   if (ALTIVEC_REGNO_P (regno))
1800     return VECTOR_MEM_ALTIVEC_OR_VSX_P (mode);
1801
1802   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1803   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1804     return 1;
1805
1806   /* We cannot put TImode anywhere except general register and it must be able
1807      to fit within the register set.  In the future, allow TImode in the
1808      Altivec or VSX registers.  */
1809
1810   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1811 }
1812
1813 /* Print interesting facts about registers.  */
1814 static void
1815 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
1816 {
1817   int r, m;
1818
1819   for (r = first_regno; r <= last_regno; ++r)
1820     {
1821       const char *comma = "";
1822       int len;
1823
1824       if (first_regno == last_regno)
1825         fprintf (stderr, "%s:\t", reg_name);
1826       else
1827         fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
1828
1829       len = 8;
1830       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1831         if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
1832           {
1833             if (len > 70)
1834               {
1835                 fprintf (stderr, ",\n\t");
1836                 len = 8;
1837                 comma = "";
1838               }
1839
1840             if (rs6000_hard_regno_nregs[m][r] > 1)
1841               len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
1842                              rs6000_hard_regno_nregs[m][r]);
1843             else
1844               len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
1845
1846             comma = ", ";
1847           }
1848
1849       if (call_used_regs[r])
1850         {
1851           if (len > 70)
1852             {
1853               fprintf (stderr, ",\n\t");
1854               len = 8;
1855               comma = "";
1856             }
1857
1858           len += fprintf (stderr, "%s%s", comma, "call-used");
1859           comma = ", ";
1860         }
1861
1862       if (fixed_regs[r])
1863         {
1864           if (len > 70)
1865             {
1866               fprintf (stderr, ",\n\t");
1867               len = 8;
1868               comma = "";
1869             }
1870
1871           len += fprintf (stderr, "%s%s", comma, "fixed");
1872           comma = ", ";
1873         }
1874
1875       if (len > 70)
1876         {
1877           fprintf (stderr, ",\n\t");
1878           comma = "";
1879         }
1880
1881       fprintf (stderr, "%sregno = %d\n", comma, r);
1882     }
1883 }
1884
1885 #define DEBUG_FMT_D "%-32s= %d\n"
1886 #define DEBUG_FMT_S "%-32s= %s\n"
1887
1888 /* Print various interesting information with -mdebug=reg.  */
1889 static void
1890 rs6000_debug_reg_global (void)
1891 {
1892   static const char *const tf[2] = { "false", "true" };
1893   const char *nl = (const char *)0;
1894   int m;
1895   char costly_num[20];
1896   char nop_num[20];
1897   const char *costly_str;
1898   const char *nop_str;
1899   const char *trace_str;
1900   const char *abi_str;
1901   const char *cmodel_str;
1902
1903   /* Map enum rs6000_vector to string.  */
1904   static const char *rs6000_debug_vector_unit[] = {
1905     "none",
1906     "altivec",
1907     "vsx",
1908     "paired",
1909     "spe",
1910     "other"
1911   };
1912
1913   fprintf (stderr, "Register information: (last virtual reg = %d)\n",
1914            LAST_VIRTUAL_REGISTER);
1915   rs6000_debug_reg_print (0, 31, "gr");
1916   rs6000_debug_reg_print (32, 63, "fp");
1917   rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
1918                           LAST_ALTIVEC_REGNO,
1919                           "vs");
1920   rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
1921   rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
1922   rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
1923   rs6000_debug_reg_print (MQ_REGNO, MQ_REGNO, "mq");
1924   rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
1925   rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
1926   rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
1927   rs6000_debug_reg_print (SPE_ACC_REGNO, SPE_ACC_REGNO, "spe_a");
1928   rs6000_debug_reg_print (SPEFSCR_REGNO, SPEFSCR_REGNO, "spe_f");
1929
1930   fprintf (stderr,
1931            "\n"
1932            "d  reg_class = %s\n"
1933            "f  reg_class = %s\n"
1934            "v  reg_class = %s\n"
1935            "wa reg_class = %s\n"
1936            "wd reg_class = %s\n"
1937            "wf reg_class = %s\n"
1938            "ws reg_class = %s\n\n",
1939            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
1940            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
1941            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
1942            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
1943            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
1944            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
1945            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]]);
1946
1947   for (m = 0; m < NUM_MACHINE_MODES; ++m)
1948     if (rs6000_vector_unit[m] || rs6000_vector_mem[m])
1949       {
1950         nl = "\n";
1951         fprintf (stderr, "Vector mode: %-5s arithmetic: %-8s move: %-8s\n",
1952                  GET_MODE_NAME (m),
1953                  rs6000_debug_vector_unit[ rs6000_vector_unit[m] ],
1954                  rs6000_debug_vector_unit[ rs6000_vector_mem[m] ]);
1955       }
1956
1957   if (nl)
1958     fputs (nl, stderr);
1959
1960   if (rs6000_recip_control)
1961     {
1962       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
1963
1964       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1965         if (rs6000_recip_bits[m])
1966           {
1967             fprintf (stderr,
1968                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
1969                      GET_MODE_NAME (m),
1970                      (RS6000_RECIP_AUTO_RE_P (m)
1971                       ? "auto"
1972                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
1973                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
1974                       ? "auto"
1975                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
1976           }
1977
1978       fputs ("\n", stderr);
1979     }
1980
1981   if (rs6000_cpu_index >= 0)
1982     fprintf (stderr, DEBUG_FMT_S, "cpu",
1983              processor_target_table[rs6000_cpu_index].name);
1984
1985   if (rs6000_tune_index >= 0)
1986     fprintf (stderr, DEBUG_FMT_S, "tune",
1987              processor_target_table[rs6000_tune_index].name);
1988
1989   switch (rs6000_sched_costly_dep)
1990     {
1991     case max_dep_latency:
1992       costly_str = "max_dep_latency";
1993       break;
1994
1995     case no_dep_costly:
1996       costly_str = "no_dep_costly";
1997       break;
1998
1999     case all_deps_costly:
2000       costly_str = "all_deps_costly";
2001       break;
2002
2003     case true_store_to_load_dep_costly:
2004       costly_str = "true_store_to_load_dep_costly";
2005       break;
2006
2007     case store_to_load_dep_costly:
2008       costly_str = "store_to_load_dep_costly";
2009       break;
2010
2011     default:
2012       costly_str = costly_num;
2013       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
2014       break;
2015     }
2016
2017   fprintf (stderr, DEBUG_FMT_S, "sched_costly_dep", costly_str);
2018
2019   switch (rs6000_sched_insert_nops)
2020     {
2021     case sched_finish_regroup_exact:
2022       nop_str = "sched_finish_regroup_exact";
2023       break;
2024
2025     case sched_finish_pad_groups:
2026       nop_str = "sched_finish_pad_groups";
2027       break;
2028
2029     case sched_finish_none:
2030       nop_str = "sched_finish_none";
2031       break;
2032
2033     default:
2034       nop_str = nop_num;
2035       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2036       break;
2037     }
2038
2039   fprintf (stderr, DEBUG_FMT_S, "sched_insert_nops", nop_str);
2040
2041   switch (rs6000_sdata)
2042     {
2043     default:
2044     case SDATA_NONE:
2045       break;
2046
2047     case SDATA_DATA:
2048       fprintf (stderr, DEBUG_FMT_S, "sdata", "data");
2049       break;
2050
2051     case SDATA_SYSV:
2052       fprintf (stderr, DEBUG_FMT_S, "sdata", "sysv");
2053       break;
2054
2055     case SDATA_EABI:
2056       fprintf (stderr, DEBUG_FMT_S, "sdata", "eabi");
2057       break;
2058
2059     }
2060
2061   switch (rs6000_traceback)
2062     {
2063     case traceback_default:     trace_str = "default";  break;
2064     case traceback_none:        trace_str = "none";     break;
2065     case traceback_part:        trace_str = "part";     break;
2066     case traceback_full:        trace_str = "full";     break;
2067     default:                    trace_str = "unknown";  break;
2068     }
2069
2070   fprintf (stderr, DEBUG_FMT_S, "traceback", trace_str);
2071
2072   switch (rs6000_current_cmodel)
2073     {
2074     case CMODEL_SMALL:  cmodel_str = "small";   break;
2075     case CMODEL_MEDIUM: cmodel_str = "medium";  break;
2076     case CMODEL_LARGE:  cmodel_str = "large";   break;
2077     default:            cmodel_str = "unknown"; break;
2078     }
2079
2080   fprintf (stderr, DEBUG_FMT_S, "cmodel", cmodel_str);
2081
2082   switch (rs6000_current_abi)
2083     {
2084     case ABI_NONE:      abi_str = "none";       break;
2085     case ABI_AIX:       abi_str = "aix";        break;
2086     case ABI_V4:        abi_str = "V4";         break;
2087     case ABI_DARWIN:    abi_str = "darwin";     break;
2088     default:            abi_str = "unknown";    break;
2089     }
2090
2091   fprintf (stderr, DEBUG_FMT_S, "abi", abi_str);
2092
2093   if (rs6000_altivec_abi)
2094     fprintf (stderr, DEBUG_FMT_S, "altivec_abi", "true");
2095
2096   if (rs6000_spe_abi)
2097     fprintf (stderr, DEBUG_FMT_S, "spe_abi", "true");
2098
2099   if (rs6000_darwin64_abi)
2100     fprintf (stderr, DEBUG_FMT_S, "darwin64_abi", "true");
2101
2102   if (rs6000_float_gprs)
2103     fprintf (stderr, DEBUG_FMT_S, "float_gprs", "true");
2104
2105   fprintf (stderr, DEBUG_FMT_S, "always_hint", tf[!!rs6000_always_hint]);
2106   fprintf (stderr, DEBUG_FMT_S, "align_branch",
2107            tf[!!rs6000_align_branch_targets]);
2108   fprintf (stderr, DEBUG_FMT_D, "tls_size", rs6000_tls_size);
2109   fprintf (stderr, DEBUG_FMT_D, "long_double_size",
2110            rs6000_long_double_type_size);
2111   fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
2112            (int)rs6000_sched_restricted_insns_priority);
2113 }
2114
2115 /* Initialize the various global tables that are based on register size.  */
2116 static void
2117 rs6000_init_hard_regno_mode_ok (bool global_init_p)
2118 {
2119   int r, m, c;
2120   int align64;
2121   int align32;
2122
2123   /* Precalculate REGNO_REG_CLASS.  */
2124   rs6000_regno_regclass[0] = GENERAL_REGS;
2125   for (r = 1; r < 32; ++r)
2126     rs6000_regno_regclass[r] = BASE_REGS;
2127
2128   for (r = 32; r < 64; ++r)
2129     rs6000_regno_regclass[r] = FLOAT_REGS;
2130
2131   for (r = 64; r < FIRST_PSEUDO_REGISTER; ++r)
2132     rs6000_regno_regclass[r] = NO_REGS;
2133
2134   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2135     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2136
2137   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2138   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2139     rs6000_regno_regclass[r] = CR_REGS;
2140
2141   rs6000_regno_regclass[MQ_REGNO] = MQ_REGS;
2142   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2143   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2144   rs6000_regno_regclass[CA_REGNO] = CA_REGS;
2145   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2146   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2147   rs6000_regno_regclass[SPE_ACC_REGNO] = SPE_ACC_REGS;
2148   rs6000_regno_regclass[SPEFSCR_REGNO] = SPEFSCR_REGS;
2149   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2150   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2151
2152   /* Precalculate vector information, this must be set up before the
2153      rs6000_hard_regno_nregs_internal below.  */
2154   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2155     {
2156       rs6000_vector_unit[m] = rs6000_vector_mem[m] = VECTOR_NONE;
2157       rs6000_vector_reload[m][0] = CODE_FOR_nothing;
2158       rs6000_vector_reload[m][1] = CODE_FOR_nothing;
2159     }
2160
2161   for (c = 0; c < (int)(int)RS6000_CONSTRAINT_MAX; c++)
2162     rs6000_constraints[c] = NO_REGS;
2163
2164   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
2165      believes it can use native alignment or still uses 128-bit alignment.  */
2166   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
2167     {
2168       align64 = 64;
2169       align32 = 32;
2170     }
2171   else
2172     {
2173       align64 = 128;
2174       align32 = 128;
2175     }
2176
2177   /* V2DF mode, VSX only.  */
2178   if (TARGET_VSX)
2179     {
2180       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
2181       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
2182       rs6000_vector_align[V2DFmode] = align64;
2183     }
2184
2185   /* V4SF mode, either VSX or Altivec.  */
2186   if (TARGET_VSX)
2187     {
2188       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
2189       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
2190       rs6000_vector_align[V4SFmode] = align32;
2191     }
2192   else if (TARGET_ALTIVEC)
2193     {
2194       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
2195       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
2196       rs6000_vector_align[V4SFmode] = align32;
2197     }
2198
2199   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
2200      and stores. */
2201   if (TARGET_ALTIVEC)
2202     {
2203       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
2204       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
2205       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
2206       rs6000_vector_align[V4SImode] = align32;
2207       rs6000_vector_align[V8HImode] = align32;
2208       rs6000_vector_align[V16QImode] = align32;
2209
2210       if (TARGET_VSX)
2211         {
2212           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
2213           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
2214           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
2215         }
2216       else
2217         {
2218           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
2219           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
2220           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
2221         }
2222     }
2223
2224   /* V2DImode, only allow under VSX, which can do V2DI insert/splat/extract.
2225      Altivec doesn't have 64-bit support.  */
2226   if (TARGET_VSX)
2227     {
2228       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
2229       rs6000_vector_unit[V2DImode] = VECTOR_NONE;
2230       rs6000_vector_align[V2DImode] = align64;
2231     }
2232
2233   /* DFmode, see if we want to use the VSX unit.  */
2234   if (TARGET_VSX && TARGET_VSX_SCALAR_DOUBLE)
2235     {
2236       rs6000_vector_unit[DFmode] = VECTOR_VSX;
2237       rs6000_vector_mem[DFmode]
2238         = (TARGET_VSX_SCALAR_MEMORY ? VECTOR_VSX : VECTOR_NONE);
2239       rs6000_vector_align[DFmode] = align64;
2240     }
2241
2242   /* TODO add SPE and paired floating point vector support.  */
2243
2244   /* Register class constaints for the constraints that depend on compile
2245      switches.  */
2246   if (TARGET_HARD_FLOAT && TARGET_FPRS)
2247     rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
2248
2249   if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
2250     rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
2251
2252   if (TARGET_VSX)
2253     {
2254       /* At present, we just use VSX_REGS, but we have different constraints
2255          based on the use, in case we want to fine tune the default register
2256          class used.  wa = any VSX register, wf = register class to use for
2257          V4SF, wd = register class to use for V2DF, and ws = register classs to
2258          use for DF scalars.  */
2259       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
2260       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
2261       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
2262       rs6000_constraints[RS6000_CONSTRAINT_ws] = (TARGET_VSX_SCALAR_MEMORY
2263                                                   ? VSX_REGS
2264                                                   : FLOAT_REGS);
2265     }
2266
2267   if (TARGET_ALTIVEC)
2268     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
2269
2270   /* Set up the reload helper functions.  */
2271   if (TARGET_VSX || TARGET_ALTIVEC)
2272     {
2273       if (TARGET_64BIT)
2274         {
2275           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_di_store;
2276           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_di_load;
2277           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_di_store;
2278           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_di_load;
2279           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_di_store;
2280           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_di_load;
2281           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_di_store;
2282           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_di_load;
2283           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_di_store;
2284           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_di_load;
2285           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_di_store;
2286           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_di_load;
2287         }
2288       else
2289         {
2290           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_si_store;
2291           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_si_load;
2292           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_si_store;
2293           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_si_load;
2294           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_si_store;
2295           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_si_load;
2296           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_si_store;
2297           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_si_load;
2298           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_si_store;
2299           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_si_load;
2300           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_si_store;
2301           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_si_load;
2302         }
2303     }
2304
2305   /* Precalculate HARD_REGNO_NREGS.  */
2306   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2307     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2308       rs6000_hard_regno_nregs[m][r]
2309         = rs6000_hard_regno_nregs_internal (r, (enum machine_mode)m);
2310
2311   /* Precalculate HARD_REGNO_MODE_OK.  */
2312   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2313     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2314       if (rs6000_hard_regno_mode_ok (r, (enum machine_mode)m))
2315         rs6000_hard_regno_mode_ok_p[m][r] = true;
2316
2317   /* Precalculate CLASS_MAX_NREGS sizes.  */
2318   for (c = 0; c < LIM_REG_CLASSES; ++c)
2319     {
2320       int reg_size;
2321
2322       if (TARGET_VSX && VSX_REG_CLASS_P (c))
2323         reg_size = UNITS_PER_VSX_WORD;
2324
2325       else if (c == ALTIVEC_REGS)
2326         reg_size = UNITS_PER_ALTIVEC_WORD;
2327
2328       else if (c == FLOAT_REGS)
2329         reg_size = UNITS_PER_FP_WORD;
2330
2331       else
2332         reg_size = UNITS_PER_WORD;
2333
2334       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2335         rs6000_class_max_nregs[m][c]
2336           = (GET_MODE_SIZE (m) + reg_size - 1) / reg_size;
2337     }
2338
2339   if (TARGET_E500_DOUBLE)
2340     rs6000_class_max_nregs[DFmode][GENERAL_REGS] = 1;
2341
2342   /* Calculate which modes to automatically generate code to use a the
2343      reciprocal divide and square root instructions.  In the future, possibly
2344      automatically generate the instructions even if the user did not specify
2345      -mrecip.  The older machines double precision reciprocal sqrt estimate is
2346      not accurate enough.  */
2347   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
2348   if (TARGET_FRES)
2349     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2350   if (TARGET_FRE)
2351     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2352   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2353     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2354   if (VECTOR_UNIT_VSX_P (V2DFmode))
2355     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2356
2357   if (TARGET_FRSQRTES)
2358     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2359   if (TARGET_FRSQRTE)
2360     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2361   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2362     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2363   if (VECTOR_UNIT_VSX_P (V2DFmode))
2364     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2365
2366   if (rs6000_recip_control)
2367     {
2368       if (!flag_finite_math_only)
2369         warning (0, "-mrecip requires -ffinite-math or -ffast-math");
2370       if (flag_trapping_math)
2371         warning (0, "-mrecip requires -fno-trapping-math or -ffast-math");
2372       if (!flag_reciprocal_math)
2373         warning (0, "-mrecip requires -freciprocal-math or -ffast-math");
2374       if (flag_finite_math_only && !flag_trapping_math && flag_reciprocal_math)
2375         {
2376           if (RS6000_RECIP_HAVE_RE_P (SFmode)
2377               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
2378             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2379
2380           if (RS6000_RECIP_HAVE_RE_P (DFmode)
2381               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
2382             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2383
2384           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
2385               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
2386             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2387
2388           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
2389               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
2390             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2391
2392           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
2393               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
2394             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2395
2396           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
2397               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
2398             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2399
2400           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
2401               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
2402             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2403
2404           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
2405               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
2406             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2407         }
2408     }
2409
2410   if (global_init_p || TARGET_DEBUG_TARGET)
2411     {
2412       if (TARGET_DEBUG_REG)
2413         rs6000_debug_reg_global ();
2414
2415       if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
2416         fprintf (stderr,
2417                  "SImode variable mult cost       = %d\n"
2418                  "SImode constant mult cost       = %d\n"
2419                  "SImode short constant mult cost = %d\n"
2420                  "DImode multipliciation cost     = %d\n"
2421                  "SImode division cost            = %d\n"
2422                  "DImode division cost            = %d\n"
2423                  "Simple fp operation cost        = %d\n"
2424                  "DFmode multiplication cost      = %d\n"
2425                  "SFmode division cost            = %d\n"
2426                  "DFmode division cost            = %d\n"
2427                  "cache line size                 = %d\n"
2428                  "l1 cache size                   = %d\n"
2429                  "l2 cache size                   = %d\n"
2430                  "simultaneous prefetches         = %d\n"
2431                  "\n",
2432                  rs6000_cost->mulsi,
2433                  rs6000_cost->mulsi_const,
2434                  rs6000_cost->mulsi_const9,
2435                  rs6000_cost->muldi,
2436                  rs6000_cost->divsi,
2437                  rs6000_cost->divdi,
2438                  rs6000_cost->fp,
2439                  rs6000_cost->dmul,
2440                  rs6000_cost->sdiv,
2441                  rs6000_cost->ddiv,
2442                  rs6000_cost->cache_line_size,
2443                  rs6000_cost->l1_cache_size,
2444                  rs6000_cost->l2_cache_size,
2445                  rs6000_cost->simultaneous_prefetches);
2446     }
2447 }
2448
2449 #if TARGET_MACHO
2450 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
2451
2452 static void
2453 darwin_rs6000_override_options (void)
2454 {
2455   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
2456      off.  */
2457   rs6000_altivec_abi = 1;
2458   TARGET_ALTIVEC_VRSAVE = 1;
2459
2460   if (DEFAULT_ABI == ABI_DARWIN
2461       && TARGET_64BIT)
2462       darwin_one_byte_bool = 1;
2463
2464   if (TARGET_64BIT && ! TARGET_POWERPC64)
2465     {
2466       target_flags |= MASK_POWERPC64;
2467       warning (0, "-m64 requires PowerPC64 architecture, enabling");
2468     }
2469   if (flag_mkernel)
2470     {
2471       rs6000_default_long_calls = 1;
2472       target_flags |= MASK_SOFT_FLOAT;
2473     }
2474
2475   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
2476      Altivec.  */
2477   if (!flag_mkernel && !flag_apple_kext
2478       && TARGET_64BIT
2479       && ! (target_flags_explicit & MASK_ALTIVEC))
2480     target_flags |= MASK_ALTIVEC;
2481
2482   /* Unless the user (not the configurer) has explicitly overridden
2483      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
2484      G4 unless targetting the kernel.  */
2485   if (!flag_mkernel
2486       && !flag_apple_kext
2487       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
2488       && ! (target_flags_explicit & MASK_ALTIVEC)
2489       && ! global_options_set.x_rs6000_cpu_index)
2490     {
2491       target_flags |= MASK_ALTIVEC;
2492     }
2493 }
2494 #endif
2495
2496 /* If not otherwise specified by a target, make 'long double' equivalent to
2497    'double'.  */
2498
2499 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
2500 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
2501 #endif
2502
2503 /* Override command line options.  Mostly we process the processor type and
2504    sometimes adjust other TARGET_ options.  */
2505
2506 static bool
2507 rs6000_option_override_internal (bool global_init_p)
2508 {
2509   bool ret = true;
2510   const char *default_cpu = OPTION_TARGET_CPU_DEFAULT;
2511   int set_masks;
2512   int cpu_index;
2513   int tune_index;
2514   struct cl_target_option *main_target_opt
2515     = ((global_init_p || target_option_default_node == NULL)
2516        ? NULL : TREE_TARGET_OPTION (target_option_default_node));
2517
2518   /* On 64-bit Darwin, power alignment is ABI-incompatible with some C
2519      library functions, so warn about it. The flag may be useful for
2520      performance studies from time to time though, so don't disable it
2521      entirely.  */
2522   if (global_options_set.x_rs6000_alignment_flags
2523       && rs6000_alignment_flags == MASK_ALIGN_POWER
2524       && DEFAULT_ABI == ABI_DARWIN
2525       && TARGET_64BIT)
2526     warning (0, "-malign-power is not supported for 64-bit Darwin;"
2527              " it is incompatible with the installed C and C++ libraries");
2528
2529   if (global_options_set.x_rs6000_spe_abi
2530       && rs6000_spe_abi
2531       && !TARGET_SPE_ABI)
2532     error ("not configured for SPE ABI");
2533
2534   /* Numerous experiment shows that IRA based loop pressure
2535      calculation works better for RTL loop invariant motion on targets
2536      with enough (>= 32) registers.  It is an expensive optimization.
2537      So it is on only for peak performance.  */
2538   if (optimize >= 3 && global_init_p)
2539     flag_ira_loop_pressure = 1;
2540
2541   /* Set the pointer size.  */
2542   if (TARGET_64BIT)
2543     {
2544       rs6000_pmode = (int)DImode;
2545       rs6000_pointer_size = 64;
2546     }
2547   else
2548     {
2549       rs6000_pmode = (int)SImode;
2550       rs6000_pointer_size = 32;
2551     }
2552
2553   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
2554 #ifdef OS_MISSING_POWERPC64
2555   if (OS_MISSING_POWERPC64)
2556     set_masks &= ~MASK_POWERPC64;
2557 #endif
2558 #ifdef OS_MISSING_ALTIVEC
2559   if (OS_MISSING_ALTIVEC)
2560     set_masks &= ~MASK_ALTIVEC;
2561 #endif
2562
2563   /* Don't override by the processor default if given explicitly.  */
2564   set_masks &= ~target_flags_explicit;
2565
2566   /* Identify the processor type.  */
2567   if (!default_cpu)
2568     {
2569       if (TARGET_POWERPC64)
2570         default_cpu = "powerpc64";
2571       else if (TARGET_POWERPC)
2572         default_cpu = "powerpc";
2573     }
2574
2575   /* Process the -mcpu=<xxx> and -mtune=<xxx> argument.  If the user changed
2576      the cpu in a target attribute or pragma, but did not specify a tuning
2577      option, use the cpu for the tuning option rather than the option specified
2578      with -mtune on the command line.  */
2579   if (rs6000_cpu_index > 0)
2580     cpu_index = rs6000_cpu_index;
2581   else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index > 0)
2582     rs6000_cpu_index = cpu_index = main_target_opt->x_rs6000_cpu_index;
2583   else
2584     rs6000_cpu_index = cpu_index = rs6000_cpu_name_lookup (default_cpu);
2585
2586   if (rs6000_tune_index > 0)
2587     tune_index = rs6000_tune_index;
2588   else
2589     rs6000_tune_index = tune_index = cpu_index;
2590
2591   if (cpu_index >= 0)
2592     {
2593       target_flags &= ~set_masks;
2594       target_flags |= (processor_target_table[cpu_index].target_enable
2595                        & set_masks);
2596     }
2597
2598   rs6000_cpu = ((tune_index >= 0)
2599                 ? processor_target_table[tune_index].processor
2600                 : (TARGET_POWERPC64
2601                    ? PROCESSOR_DEFAULT64
2602                    : PROCESSOR_DEFAULT));
2603
2604   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
2605       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64)
2606     {
2607       if (TARGET_ALTIVEC)
2608         error ("AltiVec not supported in this target");
2609       if (TARGET_SPE)
2610         error ("SPE not supported in this target");
2611     }
2612
2613   /* Disable Cell microcode if we are optimizing for the Cell
2614      and not optimizing for size.  */
2615   if (rs6000_gen_cell_microcode == -1)
2616     rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
2617                                   && !optimize_size);
2618
2619   /* If we are optimizing big endian systems for space and it's OK to
2620      use instructions that would be microcoded on the Cell, use the
2621      load/store multiple and string instructions.  */
2622   if (BYTES_BIG_ENDIAN && optimize_size && rs6000_gen_cell_microcode)
2623     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
2624
2625   /* Don't allow -mmultiple or -mstring on little endian systems
2626      unless the cpu is a 750, because the hardware doesn't support the
2627      instructions used in little endian mode, and causes an alignment
2628      trap.  The 750 does not cause an alignment trap (except when the
2629      target is unaligned).  */
2630
2631   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
2632     {
2633       if (TARGET_MULTIPLE)
2634         {
2635           target_flags &= ~MASK_MULTIPLE;
2636           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
2637             warning (0, "-mmultiple is not supported on little endian systems");
2638         }
2639
2640       if (TARGET_STRING)
2641         {
2642           target_flags &= ~MASK_STRING;
2643           if ((target_flags_explicit & MASK_STRING) != 0)
2644             warning (0, "-mstring is not supported on little endian systems");
2645         }
2646     }
2647
2648   /* Add some warnings for VSX.  */
2649   if (TARGET_VSX)
2650     {
2651       const char *msg = NULL;
2652       if (!TARGET_HARD_FLOAT || !TARGET_FPRS
2653           || !TARGET_SINGLE_FLOAT || !TARGET_DOUBLE_FLOAT)
2654         {
2655           if (target_flags_explicit & MASK_VSX)
2656             msg = N_("-mvsx requires hardware floating point");
2657           else
2658             target_flags &= ~ MASK_VSX;
2659         }
2660       else if (TARGET_PAIRED_FLOAT)
2661         msg = N_("-mvsx and -mpaired are incompatible");
2662       /* The hardware will allow VSX and little endian, but until we make sure
2663          things like vector select, etc. work don't allow VSX on little endian
2664          systems at this point.  */
2665       else if (!BYTES_BIG_ENDIAN)
2666         msg = N_("-mvsx used with little endian code");
2667       else if (TARGET_AVOID_XFORM > 0)
2668         msg = N_("-mvsx needs indexed addressing");
2669       else if (!TARGET_ALTIVEC && (target_flags_explicit & MASK_ALTIVEC))
2670         {
2671           if (target_flags_explicit & MASK_VSX)
2672             msg = N_("-mvsx and -mno-altivec are incompatible");
2673           else
2674             msg = N_("-mno-altivec disables vsx");
2675         }
2676
2677       if (msg)
2678         {
2679           warning (0, msg);
2680           target_flags &= ~ MASK_VSX;
2681           target_flags_explicit |= MASK_VSX;
2682         }
2683     }
2684
2685   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
2686      unless the user explicitly used the -mno-<option> to disable the code.  */
2687   if (TARGET_VSX)
2688     target_flags |= (ISA_2_6_MASKS_SERVER & ~target_flags_explicit);
2689   else if (TARGET_POPCNTD)
2690     target_flags |= (ISA_2_6_MASKS_EMBEDDED & ~target_flags_explicit);
2691   else if (TARGET_DFP)
2692     target_flags |= (ISA_2_5_MASKS_SERVER & ~target_flags_explicit);
2693   else if (TARGET_CMPB)
2694     target_flags |= (ISA_2_5_MASKS_EMBEDDED & ~target_flags_explicit);
2695   else if (TARGET_FPRND)
2696     target_flags |= (ISA_2_4_MASKS & ~target_flags_explicit);
2697   else if (TARGET_POPCNTB)
2698     target_flags |= (ISA_2_2_MASKS & ~target_flags_explicit);
2699   else if (TARGET_ALTIVEC)
2700     target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
2701
2702   /* E500mc does "better" if we inline more aggressively.  Respect the
2703      user's opinion, though.  */
2704   if (rs6000_block_move_inline_limit == 0
2705       && (rs6000_cpu == PROCESSOR_PPCE500MC
2706           || rs6000_cpu == PROCESSOR_PPCE500MC64))
2707     rs6000_block_move_inline_limit = 128;
2708
2709   /* store_one_arg depends on expand_block_move to handle at least the
2710      size of reg_parm_stack_space.  */
2711   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
2712     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
2713
2714   if (global_init_p)
2715     {
2716       /* If the appropriate debug option is enabled, replace the target hooks
2717          with debug versions that call the real version and then prints
2718          debugging information.  */
2719       if (TARGET_DEBUG_COST)
2720         {
2721           targetm.rtx_costs = rs6000_debug_rtx_costs;
2722           targetm.address_cost = rs6000_debug_address_cost;
2723           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
2724         }
2725
2726       if (TARGET_DEBUG_ADDR)
2727         {
2728           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
2729           targetm.legitimize_address = rs6000_debug_legitimize_address;
2730           rs6000_secondary_reload_class_ptr
2731             = rs6000_debug_secondary_reload_class;
2732           rs6000_secondary_memory_needed_ptr
2733             = rs6000_debug_secondary_memory_needed;
2734           rs6000_cannot_change_mode_class_ptr
2735             = rs6000_debug_cannot_change_mode_class;
2736           rs6000_preferred_reload_class_ptr
2737             = rs6000_debug_preferred_reload_class;
2738           rs6000_legitimize_reload_address_ptr
2739             = rs6000_debug_legitimize_reload_address;
2740           rs6000_mode_dependent_address_ptr
2741             = rs6000_debug_mode_dependent_address;
2742         }
2743
2744       if (rs6000_veclibabi_name)
2745         {
2746           if (strcmp (rs6000_veclibabi_name, "mass") == 0)
2747             rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
2748           else
2749             {
2750               error ("unknown vectorization library ABI type (%s) for "
2751                      "-mveclibabi= switch", rs6000_veclibabi_name);
2752               ret = false;
2753             }
2754         }
2755     }
2756
2757   if (!global_options_set.x_rs6000_long_double_type_size)
2758     {
2759       if (main_target_opt != NULL
2760           && (main_target_opt->x_rs6000_long_double_type_size
2761               != RS6000_DEFAULT_LONG_DOUBLE_SIZE))
2762         error ("target attribute or pragma changes long double size");
2763       else
2764         rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2765     }
2766
2767 #ifndef POWERPC_LINUX
2768   if (!global_options_set.x_rs6000_ieeequad)
2769     rs6000_ieeequad = 1;
2770 #endif
2771
2772   /* Disable VSX and Altivec silently if the user switched cpus to power7 in a
2773      target attribute or pragma which automatically enables both options,
2774      unless the altivec ABI was set.  This is set by default for 64-bit, but
2775      not for 32-bit.  */
2776   if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2777     target_flags &= ~((MASK_VSX | MASK_ALTIVEC) & ~target_flags_explicit);
2778
2779   /* Enable Altivec ABI for AIX -maltivec.  */
2780   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
2781     {
2782       if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2783         error ("target attribute or pragma changes AltiVec ABI");
2784       else
2785         rs6000_altivec_abi = 1;
2786     }
2787
2788   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
2789      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
2790      be explicitly overridden in either case.  */
2791   if (TARGET_ELF)
2792     {
2793       if (!global_options_set.x_rs6000_altivec_abi
2794           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
2795         {
2796           if (main_target_opt != NULL &&
2797               !main_target_opt->x_rs6000_altivec_abi)
2798             error ("target attribute or pragma changes AltiVec ABI");
2799           else
2800             rs6000_altivec_abi = 1;
2801         }
2802
2803       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
2804       if (!global_options_set.x_TARGET_ALTIVEC_VRSAVE)
2805         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
2806     }
2807
2808   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
2809      So far, the only darwin64 targets are also MACH-O.  */
2810   if (TARGET_MACHO
2811       && DEFAULT_ABI == ABI_DARWIN 
2812       && TARGET_64BIT)
2813     {
2814       if (main_target_opt != NULL && !main_target_opt->x_rs6000_darwin64_abi)
2815         error ("target attribute or pragma changes darwin64 ABI");
2816       else
2817         {
2818           rs6000_darwin64_abi = 1;
2819           /* Default to natural alignment, for better performance.  */
2820           rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2821         }
2822     }
2823
2824   /* Place FP constants in the constant pool instead of TOC
2825      if section anchors enabled.  */
2826   if (flag_section_anchors)
2827     TARGET_NO_FP_IN_TOC = 1;
2828
2829 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2830   SUBTARGET_OVERRIDE_OPTIONS;
2831 #endif
2832 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2833   SUBSUBTARGET_OVERRIDE_OPTIONS;
2834 #endif
2835 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
2836   SUB3TARGET_OVERRIDE_OPTIONS;
2837 #endif
2838
2839   if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC
2840       || rs6000_cpu == PROCESSOR_PPCE500MC64)
2841     {
2842       /* The e500 and e500mc do not have string instructions, and we set
2843          MASK_STRING above when optimizing for size.  */
2844       if ((target_flags & MASK_STRING) != 0)
2845         target_flags = target_flags & ~MASK_STRING;
2846     }
2847   else if (global_options_set.x_rs6000_cpu_index)
2848     {
2849       /* For the powerpc-eabispe configuration, we set all these by
2850          default, so let's unset them if we manually set another
2851          CPU that is not the E500.  */
2852       if (main_target_opt != NULL
2853           && ((main_target_opt->x_rs6000_spe_abi != rs6000_spe_abi)
2854               || (main_target_opt->x_rs6000_spe != rs6000_spe)
2855               || (main_target_opt->x_rs6000_float_gprs != rs6000_float_gprs)))
2856         error ("target attribute or pragma changes SPE ABI");
2857       else
2858         {
2859           if (!global_options_set.x_rs6000_spe_abi)
2860             rs6000_spe_abi = 0;
2861           if (!global_options_set.x_rs6000_spe)
2862             rs6000_spe = 0;
2863           if (!global_options_set.x_rs6000_float_gprs)
2864             rs6000_float_gprs = 0;
2865         }
2866       if (!(target_flags_explicit & MASK_ISEL))
2867         target_flags &= ~MASK_ISEL;
2868     }
2869
2870   /* Detect invalid option combinations with E500.  */
2871   CHECK_E500_OPTIONS;
2872
2873   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
2874                         && rs6000_cpu != PROCESSOR_POWER5
2875                         && rs6000_cpu != PROCESSOR_POWER6
2876                         && rs6000_cpu != PROCESSOR_POWER7
2877                         && rs6000_cpu != PROCESSOR_PPCA2
2878                         && rs6000_cpu != PROCESSOR_CELL);
2879   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
2880                          || rs6000_cpu == PROCESSOR_POWER5
2881                          || rs6000_cpu == PROCESSOR_POWER7);
2882   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
2883                                  || rs6000_cpu == PROCESSOR_POWER5
2884                                  || rs6000_cpu == PROCESSOR_POWER6
2885                                  || rs6000_cpu == PROCESSOR_POWER7
2886                                  || rs6000_cpu == PROCESSOR_PPCE500MC
2887                                  || rs6000_cpu == PROCESSOR_PPCE500MC64);
2888
2889   /* Allow debug switches to override the above settings.  These are set to -1
2890      in rs6000.opt to indicate the user hasn't directly set the switch.  */
2891   if (TARGET_ALWAYS_HINT >= 0)
2892     rs6000_always_hint = TARGET_ALWAYS_HINT;
2893
2894   if (TARGET_SCHED_GROUPS >= 0)
2895     rs6000_sched_groups = TARGET_SCHED_GROUPS;
2896
2897   if (TARGET_ALIGN_BRANCH_TARGETS >= 0)
2898     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
2899
2900   rs6000_sched_restricted_insns_priority
2901     = (rs6000_sched_groups ? 1 : 0);
2902
2903   /* Handle -msched-costly-dep option.  */
2904   rs6000_sched_costly_dep
2905     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
2906
2907   if (rs6000_sched_costly_dep_str)
2908     {
2909       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
2910         rs6000_sched_costly_dep = no_dep_costly;
2911       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
2912         rs6000_sched_costly_dep = all_deps_costly;
2913       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
2914         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
2915       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
2916         rs6000_sched_costly_dep = store_to_load_dep_costly;
2917       else
2918         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
2919                                    atoi (rs6000_sched_costly_dep_str));
2920     }
2921
2922   /* Handle -minsert-sched-nops option.  */
2923   rs6000_sched_insert_nops
2924     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
2925
2926   if (rs6000_sched_insert_nops_str)
2927     {
2928       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
2929         rs6000_sched_insert_nops = sched_finish_none;
2930       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
2931         rs6000_sched_insert_nops = sched_finish_pad_groups;
2932       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
2933         rs6000_sched_insert_nops = sched_finish_regroup_exact;
2934       else
2935         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
2936                                     atoi (rs6000_sched_insert_nops_str));
2937     }
2938
2939   if (global_init_p)
2940     {
2941 #ifdef TARGET_REGNAMES
2942       /* If the user desires alternate register names, copy in the
2943          alternate names now.  */
2944       if (TARGET_REGNAMES)
2945         memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
2946 #endif
2947
2948       /* Set aix_struct_return last, after the ABI is determined.
2949          If -maix-struct-return or -msvr4-struct-return was explicitly
2950          used, don't override with the ABI default.  */
2951       if (!global_options_set.x_aix_struct_return)
2952         aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
2953
2954 #if 0
2955       /* IBM XL compiler defaults to unsigned bitfields.  */
2956       if (TARGET_XL_COMPAT)
2957         flag_signed_bitfields = 0;
2958 #endif
2959
2960       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
2961         REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
2962
2963       if (TARGET_TOC)
2964         ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
2965
2966       /* We can only guarantee the availability of DI pseudo-ops when
2967          assembling for 64-bit targets.  */
2968       if (!TARGET_64BIT)
2969         {
2970           targetm.asm_out.aligned_op.di = NULL;
2971           targetm.asm_out.unaligned_op.di = NULL;
2972         }
2973
2974
2975       /* Set branch target alignment, if not optimizing for size.  */
2976       if (!optimize_size)
2977         {
2978           /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
2979              aligned 8byte to avoid misprediction by the branch predictor.  */
2980           if (rs6000_cpu == PROCESSOR_TITAN
2981               || rs6000_cpu == PROCESSOR_CELL)
2982             {
2983               if (align_functions <= 0)
2984                 align_functions = 8;
2985               if (align_jumps <= 0)
2986                 align_jumps = 8;
2987               if (align_loops <= 0)
2988                 align_loops = 8;
2989             }
2990           if (rs6000_align_branch_targets)
2991             {
2992               if (align_functions <= 0)
2993                 align_functions = 16;
2994               if (align_jumps <= 0)
2995                 align_jumps = 16;
2996               if (align_loops <= 0)
2997                 {
2998                   can_override_loop_align = 1;
2999                   align_loops = 16;
3000                 }
3001             }
3002           if (align_jumps_max_skip <= 0)
3003             align_jumps_max_skip = 15;
3004           if (align_loops_max_skip <= 0)
3005             align_loops_max_skip = 15;
3006         }
3007
3008       /* Arrange to save and restore machine status around nested functions.  */
3009       init_machine_status = rs6000_init_machine_status;
3010
3011       /* We should always be splitting complex arguments, but we can't break
3012          Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
3013       if (DEFAULT_ABI != ABI_AIX)
3014         targetm.calls.split_complex_arg = NULL;
3015     }
3016
3017   /* Initialize rs6000_cost with the appropriate target costs.  */
3018   if (optimize_size)
3019     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
3020   else
3021     switch (rs6000_cpu)
3022       {
3023       case PROCESSOR_RIOS1:
3024         rs6000_cost = &rios1_cost;
3025         break;
3026
3027       case PROCESSOR_RIOS2:
3028         rs6000_cost = &rios2_cost;
3029         break;
3030
3031       case PROCESSOR_RS64A:
3032         rs6000_cost = &rs64a_cost;
3033         break;
3034
3035       case PROCESSOR_MPCCORE:
3036         rs6000_cost = &mpccore_cost;
3037         break;
3038
3039       case PROCESSOR_PPC403:
3040         rs6000_cost = &ppc403_cost;
3041         break;
3042
3043       case PROCESSOR_PPC405:
3044         rs6000_cost = &ppc405_cost;
3045         break;
3046
3047       case PROCESSOR_PPC440:
3048         rs6000_cost = &ppc440_cost;
3049         break;
3050
3051       case PROCESSOR_PPC476:
3052         rs6000_cost = &ppc476_cost;
3053         break;
3054
3055       case PROCESSOR_PPC601:
3056         rs6000_cost = &ppc601_cost;
3057         break;
3058
3059       case PROCESSOR_PPC603:
3060         rs6000_cost = &ppc603_cost;
3061         break;
3062
3063       case PROCESSOR_PPC604:
3064         rs6000_cost = &ppc604_cost;
3065         break;
3066
3067       case PROCESSOR_PPC604e:
3068         rs6000_cost = &ppc604e_cost;
3069         break;
3070
3071       case PROCESSOR_PPC620:
3072         rs6000_cost = &ppc620_cost;
3073         break;
3074
3075       case PROCESSOR_PPC630:
3076         rs6000_cost = &ppc630_cost;
3077         break;
3078
3079       case PROCESSOR_CELL:
3080         rs6000_cost = &ppccell_cost;
3081         break;
3082
3083       case PROCESSOR_PPC750:
3084       case PROCESSOR_PPC7400:
3085         rs6000_cost = &ppc750_cost;
3086         break;
3087
3088       case PROCESSOR_PPC7450:
3089         rs6000_cost = &ppc7450_cost;
3090         break;
3091
3092       case PROCESSOR_PPC8540:
3093         rs6000_cost = &ppc8540_cost;
3094         break;
3095
3096       case PROCESSOR_PPCE300C2:
3097       case PROCESSOR_PPCE300C3:
3098         rs6000_cost = &ppce300c2c3_cost;
3099         break;
3100
3101       case PROCESSOR_PPCE500MC:
3102         rs6000_cost = &ppce500mc_cost;
3103         break;
3104
3105       case PROCESSOR_PPCE500MC64:
3106         rs6000_cost = &ppce500mc64_cost;
3107         break;
3108
3109       case PROCESSOR_TITAN:
3110         rs6000_cost = &titan_cost;
3111         break;
3112
3113       case PROCESSOR_POWER4:
3114       case PROCESSOR_POWER5:
3115         rs6000_cost = &power4_cost;
3116         break;
3117
3118       case PROCESSOR_POWER6:
3119         rs6000_cost = &power6_cost;
3120         break;
3121
3122       case PROCESSOR_POWER7:
3123         rs6000_cost = &power7_cost;
3124         break;
3125
3126       case PROCESSOR_PPCA2:
3127         rs6000_cost = &ppca2_cost;
3128         break;
3129
3130       default:
3131         gcc_unreachable ();
3132       }
3133
3134   if (global_init_p)
3135     {
3136       maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
3137                              rs6000_cost->simultaneous_prefetches,
3138                              global_options.x_param_values,
3139                              global_options_set.x_param_values);
3140       maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
3141                              global_options.x_param_values,
3142                              global_options_set.x_param_values);
3143       maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
3144                              rs6000_cost->cache_line_size,
3145                              global_options.x_param_values,
3146                              global_options_set.x_param_values);
3147       maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
3148                              global_options.x_param_values,
3149                              global_options_set.x_param_values);
3150
3151       /* If using typedef char *va_list, signal that
3152          __builtin_va_start (&ap, 0) can be optimized to
3153          ap = __builtin_next_arg (0).  */
3154       if (DEFAULT_ABI != ABI_V4)
3155         targetm.expand_builtin_va_start = NULL;
3156     }
3157
3158   /* Set up single/double float flags.  
3159      If TARGET_HARD_FLOAT is set, but neither single or double is set, 
3160      then set both flags. */
3161   if (TARGET_HARD_FLOAT && TARGET_FPRS 
3162       && rs6000_single_float == 0 && rs6000_double_float == 0)
3163     rs6000_single_float = rs6000_double_float = 1;
3164
3165   /* Reset single and double FP flags if target is E500. */
3166   if (TARGET_E500) 
3167   {
3168     rs6000_single_float = rs6000_double_float = 0;
3169     if (TARGET_E500_SINGLE)
3170       rs6000_single_float = 1; 
3171     if (TARGET_E500_DOUBLE)
3172       rs6000_single_float = rs6000_double_float = 1;
3173   }
3174
3175   if (main_target_opt)
3176     {
3177       if (main_target_opt->x_rs6000_single_float != rs6000_single_float)
3178         error ("target attribute or pragma changes single precision floating "
3179                "point");
3180       if (main_target_opt->x_rs6000_double_float != rs6000_double_float)
3181         error ("target attribute or pragma changes double precision floating "
3182                "point");
3183     }
3184
3185   /* If not explicitly specified via option, decide whether to generate indexed
3186      load/store instructions.  */
3187   if (TARGET_AVOID_XFORM == -1)
3188     /* Avoid indexed addressing when targeting Power6 in order to avoid the
3189      DERAT mispredict penalty.  However the LVE and STVE altivec instructions
3190      need indexed accesses and the type used is the scalar type of the element
3191      being loaded or stored.  */
3192     TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB
3193                           && !TARGET_ALTIVEC);
3194
3195   /* Set the -mrecip options.  */
3196   if (rs6000_recip_name)
3197     {
3198       char *p = ASTRDUP (rs6000_recip_name);
3199       char *q;
3200       unsigned int mask, i;
3201       bool invert;
3202
3203       while ((q = strtok (p, ",")) != NULL)
3204         {
3205           p = NULL;
3206           if (*q == '!')
3207             {
3208               invert = true;
3209               q++;
3210             }
3211           else
3212             invert = false;
3213
3214           if (!strcmp (q, "default"))
3215             mask = ((TARGET_RECIP_PRECISION)
3216                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
3217           else
3218             {
3219               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
3220                 if (!strcmp (q, recip_options[i].string))
3221                   {
3222                     mask = recip_options[i].mask;
3223                     break;
3224                   }
3225
3226               if (i == ARRAY_SIZE (recip_options))
3227                 {
3228                   error ("unknown option for -mrecip=%s", q);
3229                   invert = false;
3230                   mask = 0;
3231                   ret = false;
3232                 }
3233             }
3234
3235           if (invert)
3236             rs6000_recip_control &= ~mask;
3237           else
3238             rs6000_recip_control |= mask;
3239         }
3240     }
3241
3242   rs6000_init_hard_regno_mode_ok (global_init_p);
3243
3244   /* Save the initial options in case the user does function specific options */
3245   if (global_init_p)
3246     target_option_default_node = target_option_current_node
3247       = build_target_option_node ();
3248
3249   return ret;
3250 }
3251
3252 /* Implement TARGET_OPTION_OVERRIDE.  On the RS/6000 this is used to
3253    define the target cpu type.  */
3254
3255 static void
3256 rs6000_option_override (void)
3257 {
3258   (void) rs6000_option_override_internal (true);
3259 }
3260
3261 \f
3262 /* Implement targetm.vectorize.builtin_mask_for_load.  */
3263 static tree
3264 rs6000_builtin_mask_for_load (void)
3265 {
3266   if (TARGET_ALTIVEC || TARGET_VSX)
3267     return altivec_builtin_mask_for_load;
3268   else
3269     return 0;
3270 }
3271
3272 /* Implement LOOP_ALIGN. */
3273 int
3274 rs6000_loop_align (rtx label)
3275 {
3276   basic_block bb;
3277   int ninsns;
3278
3279   /* Don't override loop alignment if -falign-loops was specified. */
3280   if (!can_override_loop_align)
3281     return align_loops_log;
3282
3283   bb = BLOCK_FOR_INSN (label);
3284   ninsns = num_loop_insns(bb->loop_father);
3285
3286   /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
3287   if (ninsns > 4 && ninsns <= 8
3288       && (rs6000_cpu == PROCESSOR_POWER4
3289           || rs6000_cpu == PROCESSOR_POWER5
3290           || rs6000_cpu == PROCESSOR_POWER6
3291           || rs6000_cpu == PROCESSOR_POWER7))
3292     return 5;
3293   else
3294     return align_loops_log;
3295 }
3296
3297 /* Implement TARGET_LOOP_ALIGN_MAX_SKIP. */
3298 static int
3299 rs6000_loop_align_max_skip (rtx label)
3300 {
3301   return (1 << rs6000_loop_align (label)) - 1;
3302 }
3303
3304 /* Implement targetm.vectorize.builtin_conversion.
3305    Returns a decl of a function that implements conversion of an integer vector
3306    into a floating-point vector, or vice-versa.  DEST_TYPE is the
3307    destination type and SRC_TYPE the source type of the conversion.
3308    Return NULL_TREE if it is not available.  */
3309 static tree
3310 rs6000_builtin_conversion (unsigned int tcode, tree dest_type, tree src_type)
3311 {
3312   enum tree_code code = (enum tree_code) tcode;
3313
3314   switch (code)
3315     {
3316     case FIX_TRUNC_EXPR:
3317       switch (TYPE_MODE (dest_type))
3318         {
3319         case V2DImode:
3320           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3321             return NULL_TREE;
3322
3323           return TYPE_UNSIGNED (dest_type)
3324             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVDPUXDS_UNS]
3325             : rs6000_builtin_decls[VSX_BUILTIN_XVCVDPSXDS];
3326
3327         case V4SImode:
3328           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3329             return NULL_TREE;
3330
3331           return TYPE_UNSIGNED (dest_type)
3332             ? rs6000_builtin_decls[VECTOR_BUILTIN_FIXUNS_V4SF_V4SI]
3333             : rs6000_builtin_decls[VECTOR_BUILTIN_FIX_V4SF_V4SI];
3334
3335         default:
3336           return NULL_TREE;
3337         }
3338
3339     case FLOAT_EXPR:
3340       switch (TYPE_MODE (src_type))
3341         {
3342         case V2DImode:
3343           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3344             return NULL_TREE;
3345
3346           return TYPE_UNSIGNED (src_type)
3347             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVUXDDP]
3348             : rs6000_builtin_decls[VSX_BUILTIN_XVCVSXDDP];
3349
3350         case V4SImode:
3351           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3352             return NULL_TREE;
3353
3354           return TYPE_UNSIGNED (src_type)
3355             ? rs6000_builtin_decls[VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF]
3356             : rs6000_builtin_decls[VECTOR_BUILTIN_FLOAT_V4SI_V4SF];
3357
3358         default:
3359           return NULL_TREE;
3360         }
3361
3362     default:
3363       return NULL_TREE;
3364     }
3365 }
3366
3367 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
3368 static tree
3369 rs6000_builtin_mul_widen_even (tree type)
3370 {
3371   if (!TARGET_ALTIVEC)
3372     return NULL_TREE;
3373
3374   switch (TYPE_MODE (type))
3375     {
3376     case V8HImode:
3377       return TYPE_UNSIGNED (type)
3378             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH_UNS]
3379             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
3380
3381     case V16QImode:
3382       return TYPE_UNSIGNED (type)
3383             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB_UNS]
3384             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
3385     default:
3386       return NULL_TREE;
3387     }
3388 }
3389
3390 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
3391 static tree
3392 rs6000_builtin_mul_widen_odd (tree type)
3393 {
3394   if (!TARGET_ALTIVEC)
3395     return NULL_TREE;
3396
3397   switch (TYPE_MODE (type))
3398     {
3399     case V8HImode:
3400       return TYPE_UNSIGNED (type)
3401             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH_UNS]
3402             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
3403
3404     case V16QImode:
3405       return TYPE_UNSIGNED (type)
3406             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB_UNS]
3407             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
3408     default:
3409       return NULL_TREE;
3410     }
3411 }
3412
3413
3414 /* Return true iff, data reference of TYPE can reach vector alignment (16)
3415    after applying N number of iterations.  This routine does not determine
3416    how may iterations are required to reach desired alignment.  */
3417
3418 static bool
3419 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
3420 {
3421   if (is_packed)
3422     return false;
3423
3424   if (TARGET_32BIT)
3425     {
3426       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
3427         return true;
3428
3429       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
3430         return true;
3431
3432       return false;
3433     }
3434   else
3435     {
3436       if (TARGET_MACHO)
3437         return false;
3438
3439       /* Assuming that all other types are naturally aligned. CHECKME!  */
3440       return true;
3441     }
3442 }
3443
3444 /* Return true if the vector misalignment factor is supported by the
3445    target.  */ 
3446 bool
3447 rs6000_builtin_support_vector_misalignment (enum machine_mode mode,
3448                                             const_tree type,
3449                                             int misalignment,
3450                                             bool is_packed)
3451 {
3452   if (TARGET_VSX)
3453     {
3454       /* Return if movmisalign pattern is not supported for this mode.  */
3455       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
3456         return false;
3457
3458       if (misalignment == -1)
3459         {
3460           /* Misalignment factor is unknown at compile time but we know
3461              it's word aligned.  */
3462           if (rs6000_vector_alignment_reachable (type, is_packed))
3463             {
3464               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
3465
3466               if (element_size == 64 || element_size == 32)
3467                return true;
3468             }
3469
3470           return false;
3471         }
3472
3473       /* VSX supports word-aligned vector.  */
3474       if (misalignment % 4 == 0)
3475         return true;
3476     }
3477   return false;
3478 }
3479
3480 /* Implement targetm.vectorize.builtin_vec_perm.  */
3481 tree
3482 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
3483 {
3484   tree inner_type = TREE_TYPE (type);
3485   bool uns_p = TYPE_UNSIGNED (inner_type);
3486   tree d;
3487
3488   *mask_element_type = unsigned_char_type_node;
3489
3490   switch (TYPE_MODE (type))
3491     {
3492     case V16QImode:
3493       d = (uns_p
3494            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI_UNS]
3495            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI]);
3496       break;
3497
3498     case V8HImode:
3499       d = (uns_p
3500            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI_UNS]
3501            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI]);
3502       break;
3503
3504     case V4SImode:
3505       d = (uns_p
3506            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI_UNS]
3507            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI]);
3508       break;
3509
3510     case V4SFmode:
3511       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
3512       break;
3513
3514     case V2DFmode:
3515       if (!TARGET_ALLOW_DF_PERMUTE)
3516         return NULL_TREE;
3517
3518       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DF];
3519       break;
3520
3521     case V2DImode:
3522       if (!TARGET_ALLOW_DF_PERMUTE)
3523         return NULL_TREE;
3524
3525       d = (uns_p
3526            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI_UNS]
3527            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI]);
3528       break;
3529
3530     default:
3531       return NULL_TREE;
3532     }
3533
3534   gcc_assert (d);
3535   return d;
3536 }
3537
3538
3539 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
3540 static int
3541 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
3542                                    tree vectype, int misalign)
3543 {
3544   unsigned elements;
3545
3546   switch (type_of_cost)
3547     {
3548       case scalar_stmt:
3549       case scalar_load:
3550       case scalar_store:
3551       case vector_stmt:
3552       case vector_load:
3553       case vector_store:
3554       case vec_to_scalar:
3555       case scalar_to_vec:
3556       case cond_branch_not_taken:
3557       case vec_perm:
3558         return 1;
3559
3560       case cond_branch_taken:
3561         return 3;
3562
3563       case unaligned_load:
3564         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3565           {
3566             elements = TYPE_VECTOR_SUBPARTS (vectype);
3567             if (elements == 2)
3568               /* Double word aligned.  */
3569               return 2;
3570
3571             if (elements == 4)
3572               {
3573                 switch (misalign)
3574                   {
3575                     case 8:
3576                       /* Double word aligned.  */
3577                       return 2;
3578
3579                     case -1:
3580                       /* Unknown misalignment.  */
3581                     case 4:
3582                     case 12:
3583                       /* Word aligned.  */
3584                       return 22;
3585
3586                     default:
3587                       gcc_unreachable ();
3588                   }
3589               }
3590           }
3591
3592         if (TARGET_ALTIVEC)
3593           /* Misaligned loads are not supported.  */
3594           gcc_unreachable ();
3595
3596         return 2;
3597
3598       case unaligned_store:
3599         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3600           {
3601             elements = TYPE_VECTOR_SUBPARTS (vectype);
3602             if (elements == 2)
3603               /* Double word aligned.  */
3604               return 2;
3605
3606             if (elements == 4)
3607               {
3608                 switch (misalign)
3609                   {
3610                     case 8:
3611                       /* Double word aligned.  */
3612                       return 2;
3613
3614                     case -1:
3615                       /* Unknown misalignment.  */
3616                     case 4:
3617                     case 12:
3618                       /* Word aligned.  */
3619                       return 23;
3620
3621                     default:
3622                       gcc_unreachable ();
3623                   }
3624               }
3625           }
3626
3627         if (TARGET_ALTIVEC)
3628           /* Misaligned stores are not supported.  */
3629           gcc_unreachable ();
3630
3631         return 2;
3632
3633       default:
3634         gcc_unreachable ();
3635     }
3636 }
3637
3638 /* Implement targetm.vectorize.preferred_simd_mode.  */
3639
3640 static enum machine_mode
3641 rs6000_preferred_simd_mode (enum machine_mode mode)
3642 {
3643   if (TARGET_VSX)
3644     switch (mode)
3645       {
3646       case DFmode:
3647         return V2DFmode;
3648       default:;
3649       }
3650   if (TARGET_ALTIVEC || TARGET_VSX)
3651     switch (mode)
3652       {
3653       case SFmode:
3654         return V4SFmode;
3655       case DImode:
3656         return V2DImode;
3657       case SImode:
3658         return V4SImode;
3659       case HImode:
3660         return V8HImode;
3661       case QImode:
3662         return V16QImode;
3663       default:;
3664       }
3665   if (TARGET_SPE)
3666     switch (mode)
3667       {
3668       case SFmode:
3669         return V2SFmode;
3670       case SImode:
3671         return V2SImode;
3672       default:;
3673       }
3674   if (TARGET_PAIRED_FLOAT
3675       && mode == SFmode)
3676     return V2SFmode;
3677   return word_mode;
3678 }
3679
3680 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
3681    library with vectorized intrinsics.  */
3682
3683 static tree
3684 rs6000_builtin_vectorized_libmass (tree fndecl, tree type_out, tree type_in)
3685 {
3686   char name[32];
3687   const char *suffix = NULL;
3688   tree fntype, new_fndecl, bdecl = NULL_TREE;
3689   int n_args = 1;
3690   const char *bname;
3691   enum machine_mode el_mode, in_mode;
3692   int n, in_n;
3693
3694   /* Libmass is suitable for unsafe math only as it does not correctly support
3695      parts of IEEE with the required precision such as denormals.  Only support
3696      it if we have VSX to use the simd d2 or f4 functions.
3697      XXX: Add variable length support.  */
3698   if (!flag_unsafe_math_optimizations || !TARGET_VSX)
3699     return NULL_TREE;
3700
3701   el_mode = TYPE_MODE (TREE_TYPE (type_out));
3702   n = TYPE_VECTOR_SUBPARTS (type_out);
3703   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3704   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3705   if (el_mode != in_mode
3706       || n != in_n)
3707     return NULL_TREE;
3708
3709   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3710     {
3711       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3712       switch (fn)
3713         {
3714         case BUILT_IN_ATAN2:
3715         case BUILT_IN_HYPOT:
3716         case BUILT_IN_POW:
3717           n_args = 2;
3718           /* fall through */
3719
3720         case BUILT_IN_ACOS:
3721         case BUILT_IN_ACOSH:
3722         case BUILT_IN_ASIN:
3723         case BUILT_IN_ASINH:
3724         case BUILT_IN_ATAN:
3725         case BUILT_IN_ATANH:
3726         case BUILT_IN_CBRT:
3727         case BUILT_IN_COS:
3728         case BUILT_IN_COSH:
3729         case BUILT_IN_ERF:
3730         case BUILT_IN_ERFC:
3731         case BUILT_IN_EXP2:
3732         case BUILT_IN_EXP:
3733         case BUILT_IN_EXPM1:
3734         case BUILT_IN_LGAMMA:
3735         case BUILT_IN_LOG10:
3736         case BUILT_IN_LOG1P:
3737         case BUILT_IN_LOG2:
3738         case BUILT_IN_LOG:
3739         case BUILT_IN_SIN:
3740         case BUILT_IN_SINH:
3741         case BUILT_IN_SQRT:
3742         case BUILT_IN_TAN:
3743         case BUILT_IN_TANH:
3744           bdecl = implicit_built_in_decls[fn];
3745           suffix = "d2";                                /* pow -> powd2 */
3746           if (el_mode != DFmode
3747               || n != 2)
3748             return NULL_TREE;
3749           break;
3750
3751         case BUILT_IN_ATAN2F:
3752         case BUILT_IN_HYPOTF:
3753         case BUILT_IN_POWF:
3754           n_args = 2;
3755           /* fall through */
3756
3757         case BUILT_IN_ACOSF:
3758         case BUILT_IN_ACOSHF:
3759         case BUILT_IN_ASINF:
3760         case BUILT_IN_ASINHF:
3761         case BUILT_IN_ATANF:
3762         case BUILT_IN_ATANHF:
3763         case BUILT_IN_CBRTF:
3764         case BUILT_IN_COSF:
3765         case BUILT_IN_COSHF:
3766         case BUILT_IN_ERFF:
3767         case BUILT_IN_ERFCF:
3768         case BUILT_IN_EXP2F:
3769         case BUILT_IN_EXPF:
3770         case BUILT_IN_EXPM1F:
3771         case BUILT_IN_LGAMMAF:
3772         case BUILT_IN_LOG10F:
3773         case BUILT_IN_LOG1PF:
3774         case BUILT_IN_LOG2F:
3775         case BUILT_IN_LOGF:
3776         case BUILT_IN_SINF:
3777         case BUILT_IN_SINHF:
3778         case BUILT_IN_SQRTF:
3779         case BUILT_IN_TANF:
3780         case BUILT_IN_TANHF:
3781           bdecl = implicit_built_in_decls[fn];
3782           suffix = "4";                                 /* powf -> powf4 */
3783           if (el_mode != SFmode
3784               || n != 4)
3785             return NULL_TREE;
3786           break;
3787
3788         default:
3789           return NULL_TREE;
3790         }
3791     }
3792   else
3793     return NULL_TREE;
3794
3795   gcc_assert (suffix != NULL);
3796   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
3797   strcpy (name, bname + sizeof ("__builtin_") - 1);
3798   strcat (name, suffix);
3799
3800   if (n_args == 1)
3801     fntype = build_function_type_list (type_out, type_in, NULL);
3802   else if (n_args == 2)
3803     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
3804   else
3805     gcc_unreachable ();
3806
3807   /* Build a function declaration for the vectorized function.  */
3808   new_fndecl = build_decl (BUILTINS_LOCATION,
3809                            FUNCTION_DECL, get_identifier (name), fntype);
3810   TREE_PUBLIC (new_fndecl) = 1;
3811   DECL_EXTERNAL (new_fndecl) = 1;
3812   DECL_IS_NOVOPS (new_fndecl) = 1;
3813   TREE_READONLY (new_fndecl) = 1;
3814
3815   return new_fndecl;
3816 }
3817
3818 /* Returns a function decl for a vectorized version of the builtin function
3819    with builtin function code FN and the result vector type TYPE, or NULL_TREE
3820    if it is not available.  */
3821
3822 static tree
3823 rs6000_builtin_vectorized_function (tree fndecl, tree type_out,
3824                                     tree type_in)
3825 {
3826   enum machine_mode in_mode, out_mode;
3827   int in_n, out_n;
3828
3829   if (TREE_CODE (type_out) != VECTOR_TYPE
3830       || TREE_CODE (type_in) != VECTOR_TYPE
3831       || !TARGET_VECTORIZE_BUILTINS)
3832     return NULL_TREE;
3833
3834   out_mode = TYPE_MODE (TREE_TYPE (type_out));
3835   out_n = TYPE_VECTOR_SUBPARTS (type_out);
3836   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3837   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3838
3839   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3840     {
3841       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3842       switch (fn)
3843         {
3844         case BUILT_IN_COPYSIGN:
3845           if (VECTOR_UNIT_VSX_P (V2DFmode)
3846               && out_mode == DFmode && out_n == 2
3847               && in_mode == DFmode && in_n == 2)
3848             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
3849           break;
3850         case BUILT_IN_COPYSIGNF:
3851           if (out_mode != SFmode || out_n != 4
3852               || in_mode != SFmode || in_n != 4)
3853             break;
3854           if (VECTOR_UNIT_VSX_P (V4SFmode))
3855             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
3856           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3857             return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
3858           break;
3859         case BUILT_IN_SQRT:
3860           if (VECTOR_UNIT_VSX_P (V2DFmode)
3861               && out_mode == DFmode && out_n == 2
3862               && in_mode == DFmode && in_n == 2)
3863             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTDP];
3864           break;
3865         case BUILT_IN_SQRTF:
3866           if (VECTOR_UNIT_VSX_P (V4SFmode)
3867               && out_mode == SFmode && out_n == 4
3868               && in_mode == SFmode && in_n == 4)
3869             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTSP];
3870           break;
3871         case BUILT_IN_CEIL:
3872           if (VECTOR_UNIT_VSX_P (V2DFmode)
3873               && out_mode == DFmode && out_n == 2
3874               && in_mode == DFmode && in_n == 2)
3875             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
3876           break;
3877         case BUILT_IN_CEILF:
3878           if (out_mode != SFmode || out_n != 4
3879               || in_mode != SFmode || in_n != 4)
3880             break;
3881           if (VECTOR_UNIT_VSX_P (V4SFmode))
3882             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
3883           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3884             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
3885           break;
3886         case BUILT_IN_FLOOR:
3887           if (VECTOR_UNIT_VSX_P (V2DFmode)
3888               && out_mode == DFmode && out_n == 2
3889               && in_mode == DFmode && in_n == 2)
3890             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
3891           break;
3892         case BUILT_IN_FLOORF:
3893           if (out_mode != SFmode || out_n != 4
3894               || in_mode != SFmode || in_n != 4)
3895             break;
3896           if (VECTOR_UNIT_VSX_P (V4SFmode))
3897             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
3898           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3899             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
3900           break;
3901         case BUILT_IN_FMA:
3902           if (VECTOR_UNIT_VSX_P (V2DFmode)
3903               && out_mode == DFmode && out_n == 2
3904               && in_mode == DFmode && in_n == 2)
3905             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
3906           break;
3907         case BUILT_IN_FMAF:
3908           if (VECTOR_UNIT_VSX_P (V4SFmode)
3909               && out_mode == SFmode && out_n == 4
3910               && in_mode == SFmode && in_n == 4)
3911             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
3912           else if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
3913               && out_mode == SFmode && out_n == 4
3914               && in_mode == SFmode && in_n == 4)
3915             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
3916           break;
3917         case BUILT_IN_TRUNC:
3918           if (VECTOR_UNIT_VSX_P (V2DFmode)
3919               && out_mode == DFmode && out_n == 2
3920               && in_mode == DFmode && in_n == 2)
3921             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
3922           break;
3923         case BUILT_IN_TRUNCF:
3924           if (out_mode != SFmode || out_n != 4
3925               || in_mode != SFmode || in_n != 4)
3926             break;
3927           if (VECTOR_UNIT_VSX_P (V4SFmode))
3928             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
3929           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3930             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
3931           break;
3932         case BUILT_IN_NEARBYINT:
3933           if (VECTOR_UNIT_VSX_P (V2DFmode)
3934               && flag_unsafe_math_optimizations
3935               && out_mode == DFmode && out_n == 2
3936               && in_mode == DFmode && in_n == 2)
3937             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
3938           break;
3939         case BUILT_IN_NEARBYINTF:
3940           if (VECTOR_UNIT_VSX_P (V4SFmode)
3941               && flag_unsafe_math_optimizations
3942               && out_mode == SFmode && out_n == 4
3943               && in_mode == SFmode && in_n == 4)
3944             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
3945           break;
3946         case BUILT_IN_RINT:
3947           if (VECTOR_UNIT_VSX_P (V2DFmode)
3948               && !flag_trapping_math
3949               && out_mode == DFmode && out_n == 2
3950               && in_mode == DFmode && in_n == 2)
3951             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
3952           break;
3953         case BUILT_IN_RINTF:
3954           if (VECTOR_UNIT_VSX_P (V4SFmode)
3955               && !flag_trapping_math
3956               && out_mode == SFmode && out_n == 4
3957               && in_mode == SFmode && in_n == 4)
3958             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
3959           break;
3960         default:
3961           break;
3962         }
3963     }
3964
3965   else if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
3966     {
3967       enum rs6000_builtins fn
3968         = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
3969       switch (fn)
3970         {
3971         case RS6000_BUILTIN_RSQRTF:
3972           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
3973               && out_mode == SFmode && out_n == 4
3974               && in_mode == SFmode && in_n == 4)
3975             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
3976           break;
3977         case RS6000_BUILTIN_RSQRT:
3978           if (VECTOR_UNIT_VSX_P (V2DFmode)
3979               && out_mode == DFmode && out_n == 2
3980               && in_mode == DFmode && in_n == 2)
3981             return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
3982           break;
3983         case RS6000_BUILTIN_RECIPF:
3984           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
3985               && out_mode == SFmode && out_n == 4
3986               && in_mode == SFmode && in_n == 4)
3987             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
3988           break;
3989         case RS6000_BUILTIN_RECIP:
3990           if (VECTOR_UNIT_VSX_P (V2DFmode)
3991               && out_mode == DFmode && out_n == 2
3992               && in_mode == DFmode && in_n == 2)
3993             return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
3994           break;
3995         default:
3996           break;
3997         }
3998     }
3999
4000   /* Generate calls to libmass if appropriate.  */
4001   if (rs6000_veclib_handler)
4002     return rs6000_veclib_handler (fndecl, type_out, type_in);
4003
4004   return NULL_TREE;
4005 }
4006 \f
4007 /* Default CPU string for rs6000*_file_start functions.  */
4008 static const char *rs6000_default_cpu;
4009
4010 /* Do anything needed at the start of the asm file.  */
4011
4012 static void
4013 rs6000_file_start (void)
4014 {
4015   char buffer[80];
4016   const char *start = buffer;
4017   FILE *file = asm_out_file;
4018
4019   rs6000_default_cpu = TARGET_CPU_DEFAULT;
4020
4021   default_file_start ();
4022
4023 #ifdef TARGET_BI_ARCH
4024   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
4025     rs6000_default_cpu = 0;
4026 #endif
4027
4028   if (flag_verbose_asm)
4029     {
4030       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
4031
4032       if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
4033         {
4034           fprintf (file, "%s --with-cpu=%s", start, rs6000_default_cpu);
4035           start = "";
4036         }
4037
4038       if (global_options_set.x_rs6000_cpu_index)
4039         {
4040           fprintf (file, "%s -mcpu=%s", start,
4041                    processor_target_table[rs6000_cpu_index].name);
4042           start = "";
4043         }
4044
4045       if (global_options_set.x_rs6000_tune_index)
4046         {
4047           fprintf (file, "%s -mtune=%s", start,
4048                    processor_target_table[rs6000_tune_index].name);
4049           start = "";
4050         }
4051
4052       if (PPC405_ERRATUM77)
4053         {
4054           fprintf (file, "%s PPC405CR_ERRATUM77", start);
4055           start = "";
4056         }
4057
4058 #ifdef USING_ELFOS_H
4059       switch (rs6000_sdata)
4060         {
4061         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
4062         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
4063         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
4064         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
4065         }
4066
4067       if (rs6000_sdata && g_switch_value)
4068         {
4069           fprintf (file, "%s -G %d", start,
4070                    g_switch_value);
4071           start = "";
4072         }
4073 #endif
4074
4075       if (*start == '\0')
4076         putc ('\n', file);
4077     }
4078
4079   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
4080     {
4081       switch_to_section (toc_section);
4082       switch_to_section (text_section);
4083     }
4084 }
4085
4086 \f
4087 /* Return nonzero if this function is known to have a null epilogue.  */
4088
4089 int
4090 direct_return (void)
4091 {
4092   if (reload_completed)
4093     {
4094       rs6000_stack_t *info = rs6000_stack_info ();
4095
4096       if (info->first_gp_reg_save == 32
4097           && info->first_fp_reg_save == 64
4098           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
4099           && ! info->lr_save_p
4100           && ! info->cr_save_p
4101           && info->vrsave_mask == 0
4102           && ! info->push_p)
4103         return 1;
4104     }
4105
4106   return 0;
4107 }
4108
4109 /* Return the number of instructions it takes to form a constant in an
4110    integer register.  */
4111
4112 int
4113 num_insns_constant_wide (HOST_WIDE_INT value)
4114 {
4115   /* signed constant loadable with {cal|addi} */
4116   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
4117     return 1;
4118
4119   /* constant loadable with {cau|addis} */
4120   else if ((value & 0xffff) == 0
4121            && (value >> 31 == -1 || value >> 31 == 0))
4122     return 1;
4123
4124 #if HOST_BITS_PER_WIDE_INT == 64
4125   else if (TARGET_POWERPC64)
4126     {
4127       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
4128       HOST_WIDE_INT high = value >> 31;
4129
4130       if (high == 0 || high == -1)
4131         return 2;
4132
4133       high >>= 1;
4134
4135       if (low == 0)
4136         return num_insns_constant_wide (high) + 1;
4137       else if (high == 0)
4138         return num_insns_constant_wide (low) + 1;
4139       else
4140         return (num_insns_constant_wide (high)
4141                 + num_insns_constant_wide (low) + 1);
4142     }
4143 #endif
4144
4145   else
4146     return 2;
4147 }
4148
4149 int
4150 num_insns_constant (rtx op, enum machine_mode mode)
4151 {
4152   HOST_WIDE_INT low, high;
4153
4154   switch (GET_CODE (op))
4155     {
4156     case CONST_INT:
4157 #if HOST_BITS_PER_WIDE_INT == 64
4158       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4159           && mask64_operand (op, mode))
4160         return 2;
4161       else
4162 #endif
4163         return num_insns_constant_wide (INTVAL (op));
4164
4165       case CONST_DOUBLE:
4166         if (mode == SFmode || mode == SDmode)
4167           {
4168             long l;
4169             REAL_VALUE_TYPE rv;
4170
4171             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4172             if (DECIMAL_FLOAT_MODE_P (mode))
4173               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
4174             else
4175               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4176             return num_insns_constant_wide ((HOST_WIDE_INT) l);
4177           }
4178
4179         if (mode == VOIDmode || mode == DImode)
4180           {
4181             high = CONST_DOUBLE_HIGH (op);
4182             low  = CONST_DOUBLE_LOW (op);
4183           }
4184         else
4185           {
4186             long l[2];
4187             REAL_VALUE_TYPE rv;
4188
4189             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4190             if (DECIMAL_FLOAT_MODE_P (mode))
4191               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
4192             else
4193               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
4194             high = l[WORDS_BIG_ENDIAN == 0];
4195             low  = l[WORDS_BIG_ENDIAN != 0];
4196           }
4197
4198         if (TARGET_32BIT)
4199           return (num_insns_constant_wide (low)
4200                   + num_insns_constant_wide (high));
4201         else
4202           {
4203             if ((high == 0 && low >= 0)
4204                 || (high == -1 && low < 0))
4205               return num_insns_constant_wide (low);
4206
4207             else if (mask64_operand (op, mode))
4208               return 2;
4209
4210             else if (low == 0)
4211               return num_insns_constant_wide (high) + 1;
4212
4213             else
4214               return (num_insns_constant_wide (high)
4215                       + num_insns_constant_wide (low) + 1);
4216           }
4217
4218     default:
4219       gcc_unreachable ();
4220     }
4221 }
4222
4223 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
4224    If the mode of OP is MODE_VECTOR_INT, this simply returns the
4225    corresponding element of the vector, but for V4SFmode and V2SFmode,
4226    the corresponding "float" is interpreted as an SImode integer.  */
4227
4228 HOST_WIDE_INT
4229 const_vector_elt_as_int (rtx op, unsigned int elt)
4230 {
4231   rtx tmp;
4232
4233   /* We can't handle V2DImode and V2DFmode vector constants here yet.  */
4234   gcc_assert (GET_MODE (op) != V2DImode
4235               && GET_MODE (op) != V2DFmode);
4236
4237   tmp = CONST_VECTOR_ELT (op, elt);
4238   if (GET_MODE (op) == V4SFmode
4239       || GET_MODE (op) == V2SFmode)
4240     tmp = gen_lowpart (SImode, tmp);
4241   return INTVAL (tmp);
4242 }
4243
4244 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
4245    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
4246    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
4247    all items are set to the same value and contain COPIES replicas of the
4248    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
4249    operand and the others are set to the value of the operand's msb.  */
4250
4251 static bool
4252 vspltis_constant (rtx op, unsigned step, unsigned copies)
4253 {
4254   enum machine_mode mode = GET_MODE (op);
4255   enum machine_mode inner = GET_MODE_INNER (mode);
4256
4257   unsigned i;
4258   unsigned nunits;
4259   unsigned bitsize;
4260   unsigned mask;
4261
4262   HOST_WIDE_INT val;
4263   HOST_WIDE_INT splat_val;
4264   HOST_WIDE_INT msb_val;
4265
4266   if (mode == V2DImode || mode == V2DFmode)
4267     return false;
4268
4269   nunits = GET_MODE_NUNITS (mode);
4270   bitsize = GET_MODE_BITSIZE (inner);
4271   mask = GET_MODE_MASK (inner);
4272
4273   val = const_vector_elt_as_int (op, nunits - 1);
4274   splat_val = val;
4275   msb_val = val > 0 ? 0 : -1;
4276
4277   /* Construct the value to be splatted, if possible.  If not, return 0.  */
4278   for (i = 2; i <= copies; i *= 2)
4279     {
4280       HOST_WIDE_INT small_val;
4281       bitsize /= 2;
4282       small_val = splat_val >> bitsize;
4283       mask >>= bitsize;
4284       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
4285         return false;
4286       splat_val = small_val;
4287     }
4288
4289   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
4290   if (EASY_VECTOR_15 (splat_val))
4291     ;
4292
4293   /* Also check if we can splat, and then add the result to itself.  Do so if
4294      the value is positive, of if the splat instruction is using OP's mode;
4295      for splat_val < 0, the splat and the add should use the same mode.  */
4296   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
4297            && (splat_val >= 0 || (step == 1 && copies == 1)))
4298     ;
4299
4300   /* Also check if are loading up the most significant bit which can be done by
4301      loading up -1 and shifting the value left by -1.  */
4302   else if (EASY_VECTOR_MSB (splat_val, inner))
4303     ;
4304
4305   else
4306     return false;
4307
4308   /* Check if VAL is present in every STEP-th element, and the
4309      other elements are filled with its most significant bit.  */
4310   for (i = 0; i < nunits - 1; ++i)
4311     {
4312       HOST_WIDE_INT desired_val;
4313       if (((i + 1) & (step - 1)) == 0)
4314         desired_val = val;
4315       else
4316         desired_val = msb_val;
4317
4318       if (desired_val != const_vector_elt_as_int (op, i))
4319         return false;
4320     }
4321
4322   return true;
4323 }
4324
4325
4326 /* Return true if OP is of the given MODE and can be synthesized
4327    with a vspltisb, vspltish or vspltisw.  */
4328
4329 bool
4330 easy_altivec_constant (rtx op, enum machine_mode mode)
4331 {
4332   unsigned step, copies;
4333
4334   if (mode == VOIDmode)
4335     mode = GET_MODE (op);
4336   else if (mode != GET_MODE (op))
4337     return false;
4338
4339   /* V2DI/V2DF was added with VSX.  Only allow 0 and all 1's as easy
4340      constants.  */
4341   if (mode == V2DFmode)
4342     return zero_constant (op, mode);
4343
4344   if (mode == V2DImode)
4345     {
4346       /* In case the compiler is built 32-bit, CONST_DOUBLE constants are not
4347          easy.  */
4348       if (GET_CODE (CONST_VECTOR_ELT (op, 0)) != CONST_INT
4349           || GET_CODE (CONST_VECTOR_ELT (op, 1)) != CONST_INT)
4350         return false;
4351
4352       if (zero_constant (op, mode))
4353         return true;
4354
4355       if (INTVAL (CONST_VECTOR_ELT (op, 0)) == -1
4356           && INTVAL (CONST_VECTOR_ELT (op, 1)) == -1)
4357         return true;
4358
4359       return false;
4360     }
4361
4362   /* Start with a vspltisw.  */
4363   step = GET_MODE_NUNITS (mode) / 4;
4364   copies = 1;
4365
4366   if (vspltis_constant (op, step, copies))
4367     return true;
4368
4369   /* Then try with a vspltish.  */
4370   if (step == 1)
4371     copies <<= 1;
4372   else
4373     step >>= 1;
4374
4375   if (vspltis_constant (op, step, copies))
4376     return true;
4377
4378   /* And finally a vspltisb.  */
4379   if (step == 1)
4380     copies <<= 1;
4381   else
4382     step >>= 1;
4383
4384   if (vspltis_constant (op, step, copies))
4385     return true;
4386
4387   return false;
4388 }
4389
4390 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
4391    result is OP.  Abort if it is not possible.  */
4392
4393 rtx
4394 gen_easy_altivec_constant (rtx op)
4395 {
4396   enum machine_mode mode = GET_MODE (op);
4397   int nunits = GET_MODE_NUNITS (mode);
4398   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
4399   unsigned step = nunits / 4;
4400   unsigned copies = 1;
4401
4402   /* Start with a vspltisw.  */
4403   if (vspltis_constant (op, step, copies))
4404     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
4405
4406   /* Then try with a vspltish.  */
4407   if (step == 1)
4408     copies <<= 1;
4409   else
4410     step >>= 1;
4411
4412   if (vspltis_constant (op, step, copies))
4413     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
4414
4415   /* And finally a vspltisb.  */
4416   if (step == 1)
4417     copies <<= 1;
4418   else
4419     step >>= 1;
4420
4421   if (vspltis_constant (op, step, copies))
4422     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
4423
4424   gcc_unreachable ();
4425 }
4426
4427 const char *
4428 output_vec_const_move (rtx *operands)
4429 {
4430   int cst, cst2;
4431   enum machine_mode mode;
4432   rtx dest, vec;
4433
4434   dest = operands[0];
4435   vec = operands[1];
4436   mode = GET_MODE (dest);
4437
4438   if (TARGET_VSX)
4439     {
4440       if (zero_constant (vec, mode))
4441         return "xxlxor %x0,%x0,%x0";
4442
4443       if (mode == V2DImode
4444           && INTVAL (CONST_VECTOR_ELT (vec, 0)) == -1
4445           && INTVAL (CONST_VECTOR_ELT (vec, 1)) == -1)
4446         return "vspltisw %0,-1";
4447     }
4448
4449   if (TARGET_ALTIVEC)
4450     {
4451       rtx splat_vec;
4452       if (zero_constant (vec, mode))
4453         return "vxor %0,%0,%0";
4454
4455       splat_vec = gen_easy_altivec_constant (vec);
4456       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
4457       operands[1] = XEXP (splat_vec, 0);
4458       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
4459         return "#";
4460
4461       switch (GET_MODE (splat_vec))
4462         {
4463         case V4SImode:
4464           return "vspltisw %0,%1";
4465
4466         case V8HImode:
4467           return "vspltish %0,%1";
4468
4469         case V16QImode:
4470           return "vspltisb %0,%1";
4471
4472         default:
4473           gcc_unreachable ();
4474         }
4475     }
4476
4477   gcc_assert (TARGET_SPE);
4478
4479   /* Vector constant 0 is handled as a splitter of V2SI, and in the
4480      pattern of V1DI, V4HI, and V2SF.
4481
4482      FIXME: We should probably return # and add post reload
4483      splitters for these, but this way is so easy ;-).  */
4484   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
4485   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
4486   operands[1] = CONST_VECTOR_ELT (vec, 0);
4487   operands[2] = CONST_VECTOR_ELT (vec, 1);
4488   if (cst == cst2)
4489     return "li %0,%1\n\tevmergelo %0,%0,%0";
4490   else
4491     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
4492 }
4493
4494 /* Initialize TARGET of vector PAIRED to VALS.  */
4495
4496 void
4497 paired_expand_vector_init (rtx target, rtx vals)
4498 {
4499   enum machine_mode mode = GET_MODE (target);
4500   int n_elts = GET_MODE_NUNITS (mode);
4501   int n_var = 0;
4502   rtx x, new_rtx, tmp, constant_op, op1, op2;
4503   int i;
4504
4505   for (i = 0; i < n_elts; ++i)
4506     {
4507       x = XVECEXP (vals, 0, i);
4508       if (!CONSTANT_P (x))
4509         ++n_var;
4510     }
4511   if (n_var == 0)
4512     {
4513       /* Load from constant pool.  */
4514       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
4515       return;
4516     }
4517
4518   if (n_var == 2)
4519     {
4520       /* The vector is initialized only with non-constants.  */
4521       new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
4522                                 XVECEXP (vals, 0, 1));
4523
4524       emit_move_insn (target, new_rtx);
4525       return;
4526     }
4527   
4528   /* One field is non-constant and the other one is a constant.  Load the
4529      constant from the constant pool and use ps_merge instruction to
4530      construct the whole vector.  */
4531   op1 = XVECEXP (vals, 0, 0);
4532   op2 = XVECEXP (vals, 0, 1);
4533
4534   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
4535
4536   tmp = gen_reg_rtx (GET_MODE (constant_op));
4537   emit_move_insn (tmp, constant_op);
4538
4539   if (CONSTANT_P (op1))
4540     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
4541   else
4542     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
4543
4544   emit_move_insn (target, new_rtx);
4545 }
4546
4547 void
4548 paired_expand_vector_move (rtx operands[])
4549 {
4550   rtx op0 = operands[0], op1 = operands[1];
4551
4552   emit_move_insn (op0, op1);
4553 }
4554
4555 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
4556    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
4557    operands for the relation operation COND.  This is a recursive
4558    function.  */
4559
4560 static void
4561 paired_emit_vector_compare (enum rtx_code rcode,
4562                             rtx dest, rtx op0, rtx op1,
4563                             rtx cc_op0, rtx cc_op1)
4564 {
4565   rtx tmp = gen_reg_rtx (V2SFmode);
4566   rtx tmp1, max, min;
4567
4568   gcc_assert (TARGET_PAIRED_FLOAT);
4569   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
4570
4571   switch (rcode)
4572     {
4573     case LT:
4574     case LTU:
4575       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4576       return;
4577     case GE:
4578     case GEU:
4579       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4580       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
4581       return;
4582     case LE:
4583     case LEU:
4584       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
4585       return;
4586     case GT:
4587       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4588       return;
4589     case EQ:
4590       tmp1 = gen_reg_rtx (V2SFmode);
4591       max = gen_reg_rtx (V2SFmode);
4592       min = gen_reg_rtx (V2SFmode);
4593       gen_reg_rtx (V2SFmode);
4594       
4595       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4596       emit_insn (gen_selv2sf4
4597                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4598       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
4599       emit_insn (gen_selv2sf4
4600                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4601       emit_insn (gen_subv2sf3 (tmp1, min, max));
4602       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
4603       return;
4604     case NE:
4605       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
4606       return;
4607     case UNLE:
4608       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4609       return;
4610     case UNLT:
4611       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
4612       return;
4613     case UNGE:
4614       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4615       return;
4616     case UNGT:
4617       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
4618       return;
4619     default:
4620       gcc_unreachable ();
4621     }
4622
4623   return;
4624 }
4625
4626 /* Emit vector conditional expression.
4627    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
4628    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
4629
4630 int
4631 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
4632                               rtx cond, rtx cc_op0, rtx cc_op1)
4633 {
4634   enum rtx_code rcode = GET_CODE (cond);
4635
4636   if (!TARGET_PAIRED_FLOAT)
4637     return 0;
4638
4639   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
4640
4641   return 1;
4642 }
4643
4644 /* Initialize vector TARGET to VALS.  */
4645
4646 void
4647 rs6000_expand_vector_init (rtx target, rtx vals)
4648 {
4649   enum machine_mode mode = GET_MODE (target);
4650   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4651   int n_elts = GET_MODE_NUNITS (mode);
4652   int n_var = 0, one_var = -1;
4653   bool all_same = true, all_const_zero = true;
4654   rtx x, mem;
4655   int i;
4656
4657   for (i = 0; i < n_elts; ++i)
4658     {
4659       x = XVECEXP (vals, 0, i);
4660       if (!CONSTANT_P (x))
4661         ++n_var, one_var = i;
4662       else if (x != CONST0_RTX (inner_mode))
4663         all_const_zero = false;
4664
4665       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
4666         all_same = false;
4667     }
4668
4669   if (n_var == 0)
4670     {
4671       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
4672       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
4673       if ((int_vector_p || TARGET_VSX) && all_const_zero)
4674         {
4675           /* Zero register.  */
4676           emit_insn (gen_rtx_SET (VOIDmode, target,
4677                                   gen_rtx_XOR (mode, target, target)));
4678           return;
4679         }
4680       else if (int_vector_p && easy_vector_constant (const_vec, mode))
4681         {
4682           /* Splat immediate.  */
4683           emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
4684           return;
4685         }
4686       else
4687         {
4688           /* Load from constant pool.  */
4689           emit_move_insn (target, const_vec);
4690           return;
4691         }
4692     }
4693
4694   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
4695   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4696     {
4697       if (all_same)
4698         {
4699           rtx element = XVECEXP (vals, 0, 0);
4700           if (mode == V2DFmode)
4701             emit_insn (gen_vsx_splat_v2df (target, element));
4702           else
4703             emit_insn (gen_vsx_splat_v2di (target, element));
4704         }
4705       else
4706         {
4707           if (mode == V2DFmode)
4708             {
4709               rtx op0 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 0));
4710               rtx op1 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 1));
4711               emit_insn (gen_vsx_concat_v2df (target, op0, op1));
4712             }
4713           else
4714             {
4715               rtx op0 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 0));
4716               rtx op1 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 1));
4717               emit_insn (gen_vsx_concat_v2di (target, op0, op1));
4718             }
4719         }
4720       return;
4721     }
4722
4723   /* With single precision floating point on VSX, know that internally single
4724      precision is actually represented as a double, and either make 2 V2DF
4725      vectors, and convert these vectors to single precision, or do one
4726      conversion, and splat the result to the other elements.  */
4727   if (mode == V4SFmode && VECTOR_MEM_VSX_P (mode))
4728     {
4729       if (all_same)
4730         {
4731           rtx freg = gen_reg_rtx (V4SFmode);
4732           rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
4733
4734           emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
4735           emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
4736         }
4737       else
4738         {
4739           rtx dbl_even = gen_reg_rtx (V2DFmode);
4740           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
4741           rtx flt_even = gen_reg_rtx (V4SFmode);
4742           rtx flt_odd  = gen_reg_rtx (V4SFmode);
4743
4744           emit_insn (gen_vsx_concat_v2sf (dbl_even,
4745                                           copy_to_reg (XVECEXP (vals, 0, 0)),
4746                                           copy_to_reg (XVECEXP (vals, 0, 1))));
4747           emit_insn (gen_vsx_concat_v2sf (dbl_odd,
4748                                           copy_to_reg (XVECEXP (vals, 0, 2)),
4749                                           copy_to_reg (XVECEXP (vals, 0, 3))));
4750           emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
4751           emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
4752           emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
4753         }
4754       return;
4755     }
4756
4757   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
4758      of 64-bit items is not supported on Altivec.  */
4759   if (all_same && GET_MODE_SIZE (mode) <= 4)
4760     {
4761       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
4762       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
4763                       XVECEXP (vals, 0, 0));
4764       x = gen_rtx_UNSPEC (VOIDmode,
4765                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
4766       emit_insn (gen_rtx_PARALLEL (VOIDmode,
4767                                    gen_rtvec (2,
4768                                               gen_rtx_SET (VOIDmode,
4769                                                            target, mem),
4770                                               x)));
4771       x = gen_rtx_VEC_SELECT (inner_mode, target,
4772                               gen_rtx_PARALLEL (VOIDmode,
4773                                                 gen_rtvec (1, const0_rtx)));
4774       emit_insn (gen_rtx_SET (VOIDmode, target,
4775                               gen_rtx_VEC_DUPLICATE (mode, x)));
4776       return;
4777     }
4778
4779   /* One field is non-constant.  Load constant then overwrite
4780      varying field.  */
4781   if (n_var == 1)
4782     {
4783       rtx copy = copy_rtx (vals);
4784
4785       /* Load constant part of vector, substitute neighboring value for
4786          varying element.  */
4787       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
4788       rs6000_expand_vector_init (target, copy);
4789
4790       /* Insert variable.  */
4791       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
4792       return;
4793     }
4794
4795   /* Construct the vector in memory one field at a time
4796      and load the whole vector.  */
4797   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
4798   for (i = 0; i < n_elts; i++)
4799     emit_move_insn (adjust_address_nv (mem, inner_mode,
4800                                     i * GET_MODE_SIZE (inner_mode)),
4801                     XVECEXP (vals, 0, i));
4802   emit_move_insn (target, mem);
4803 }
4804
4805 /* Set field ELT of TARGET to VAL.  */
4806
4807 void
4808 rs6000_expand_vector_set (rtx target, rtx val, int elt)
4809 {
4810   enum machine_mode mode = GET_MODE (target);
4811   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4812   rtx reg = gen_reg_rtx (mode);
4813   rtx mask, mem, x;
4814   int width = GET_MODE_SIZE (inner_mode);
4815   int i;
4816
4817   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4818     {
4819       rtx (*set_func) (rtx, rtx, rtx, rtx)
4820         = ((mode == V2DFmode) ? gen_vsx_set_v2df : gen_vsx_set_v2di);
4821       emit_insn (set_func (target, target, val, GEN_INT (elt)));
4822       return;
4823     }
4824
4825   /* Load single variable value.  */
4826   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
4827   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
4828   x = gen_rtx_UNSPEC (VOIDmode,
4829                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
4830   emit_insn (gen_rtx_PARALLEL (VOIDmode,
4831                                gen_rtvec (2,
4832                                           gen_rtx_SET (VOIDmode,
4833                                                        reg, mem),
4834                                           x)));
4835
4836   /* Linear sequence.  */
4837   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
4838   for (i = 0; i < 16; ++i)
4839     XVECEXP (mask, 0, i) = GEN_INT (i);
4840
4841   /* Set permute mask to insert element into target.  */
4842   for (i = 0; i < width; ++i)
4843     XVECEXP (mask, 0, elt*width + i)
4844       = GEN_INT (i + 0x10);
4845   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
4846   x = gen_rtx_UNSPEC (mode,
4847                       gen_rtvec (3, target, reg,
4848                                  force_reg (V16QImode, x)),
4849                       UNSPEC_VPERM);
4850   emit_insn (gen_rtx_SET (VOIDmode, target, x));
4851 }
4852
4853 /* Extract field ELT from VEC into TARGET.  */
4854
4855 void
4856 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
4857 {
4858   enum machine_mode mode = GET_MODE (vec);
4859   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4860   rtx mem;
4861
4862   if (VECTOR_MEM_VSX_P (mode))
4863     {
4864       switch (mode)
4865         {
4866         default:
4867           break;
4868         case V2DFmode:
4869           emit_insn (gen_vsx_extract_v2df (target, vec, GEN_INT (elt)));
4870           return;
4871         case V2DImode:
4872           emit_insn (gen_vsx_extract_v2di (target, vec, GEN_INT (elt)));
4873           return;
4874         case V4SFmode:
4875           emit_insn (gen_vsx_extract_v4sf (target, vec, GEN_INT (elt)));
4876           return;
4877         }
4878     }
4879
4880   /* Allocate mode-sized buffer.  */
4881   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
4882
4883   emit_move_insn (mem, vec);
4884
4885   /* Add offset to field within buffer matching vector element.  */
4886   mem = adjust_address_nv (mem, inner_mode, elt * GET_MODE_SIZE (inner_mode));
4887
4888   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
4889 }
4890
4891 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
4892    implement ANDing by the mask IN.  */
4893 void
4894 build_mask64_2_operands (rtx in, rtx *out)
4895 {
4896 #if HOST_BITS_PER_WIDE_INT >= 64
4897   unsigned HOST_WIDE_INT c, lsb, m1, m2;
4898   int shift;
4899
4900   gcc_assert (GET_CODE (in) == CONST_INT);
4901
4902   c = INTVAL (in);
4903   if (c & 1)
4904     {
4905       /* Assume c initially something like 0x00fff000000fffff.  The idea
4906          is to rotate the word so that the middle ^^^^^^ group of zeros
4907          is at the MS end and can be cleared with an rldicl mask.  We then
4908          rotate back and clear off the MS    ^^ group of zeros with a
4909          second rldicl.  */
4910       c = ~c;                   /*   c == 0xff000ffffff00000 */
4911       lsb = c & -c;             /* lsb == 0x0000000000100000 */
4912       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
4913       c = ~c;                   /*   c == 0x00fff000000fffff */
4914       c &= -lsb;                /*   c == 0x00fff00000000000 */
4915       lsb = c & -c;             /* lsb == 0x0000100000000000 */
4916       c = ~c;                   /*   c == 0xff000fffffffffff */
4917       c &= -lsb;                /*   c == 0xff00000000000000 */
4918       shift = 0;
4919       while ((lsb >>= 1) != 0)
4920         shift++;                /* shift == 44 on exit from loop */
4921       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
4922       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
4923       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
4924     }
4925   else
4926     {
4927       /* Assume c initially something like 0xff000f0000000000.  The idea
4928          is to rotate the word so that the     ^^^  middle group of zeros
4929          is at the LS end and can be cleared with an rldicr mask.  We then
4930          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
4931          a second rldicr.  */
4932       lsb = c & -c;             /* lsb == 0x0000010000000000 */
4933       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
4934       c = ~c;                   /*   c == 0x00fff0ffffffffff */
4935       c &= -lsb;                /*   c == 0x00fff00000000000 */
4936       lsb = c & -c;             /* lsb == 0x0000100000000000 */
4937       c = ~c;                   /*   c == 0xff000fffffffffff */
4938       c &= -lsb;                /*   c == 0xff00000000000000 */
4939       shift = 0;
4940       while ((lsb >>= 1) != 0)
4941         shift++;                /* shift == 44 on exit from loop */
4942       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
4943       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
4944       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
4945     }
4946
4947   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
4948      masks will be all 1's.  We are guaranteed more than one transition.  */
4949   out[0] = GEN_INT (64 - shift);
4950   out[1] = GEN_INT (m1);
4951   out[2] = GEN_INT (shift);
4952   out[3] = GEN_INT (m2);
4953 #else
4954   (void)in;
4955   (void)out;
4956   gcc_unreachable ();
4957 #endif
4958 }
4959
4960 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
4961
4962 bool
4963 invalid_e500_subreg (rtx op, enum machine_mode mode)
4964 {
4965   if (TARGET_E500_DOUBLE)
4966     {
4967       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
4968          subreg:TI and reg:TF.  Decimal float modes are like integer
4969          modes (only low part of each register used) for this
4970          purpose.  */
4971       if (GET_CODE (op) == SUBREG
4972           && (mode == SImode || mode == DImode || mode == TImode
4973               || mode == DDmode || mode == TDmode)
4974           && REG_P (SUBREG_REG (op))
4975           && (GET_MODE (SUBREG_REG (op)) == DFmode
4976               || GET_MODE (SUBREG_REG (op)) == TFmode))
4977         return true;
4978
4979       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
4980          reg:TI.  */
4981       if (GET_CODE (op) == SUBREG
4982           && (mode == DFmode || mode == TFmode)
4983           && REG_P (SUBREG_REG (op))
4984           && (GET_MODE (SUBREG_REG (op)) == DImode
4985               || GET_MODE (SUBREG_REG (op)) == TImode
4986               || GET_MODE (SUBREG_REG (op)) == DDmode
4987               || GET_MODE (SUBREG_REG (op)) == TDmode))
4988         return true;
4989     }
4990
4991   if (TARGET_SPE
4992       && GET_CODE (op) == SUBREG
4993       && mode == SImode
4994       && REG_P (SUBREG_REG (op))
4995       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
4996     return true;
4997
4998   return false;
4999 }
5000
5001 /* AIX increases natural record alignment to doubleword if the first
5002    field is an FP double while the FP fields remain word aligned.  */
5003
5004 unsigned int
5005 rs6000_special_round_type_align (tree type, unsigned int computed,
5006                                  unsigned int specified)
5007 {
5008   unsigned int align = MAX (computed, specified);
5009   tree field = TYPE_FIELDS (type);
5010
5011   /* Skip all non field decls */
5012   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5013     field = DECL_CHAIN (field);
5014
5015   if (field != NULL && field != type)
5016     {
5017       type = TREE_TYPE (field);
5018       while (TREE_CODE (type) == ARRAY_TYPE)
5019         type = TREE_TYPE (type);
5020
5021       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
5022         align = MAX (align, 64);
5023     }
5024
5025   return align;
5026 }
5027
5028 /* Darwin increases record alignment to the natural alignment of
5029    the first field.  */
5030
5031 unsigned int
5032 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
5033                                         unsigned int specified)
5034 {
5035   unsigned int align = MAX (computed, specified);
5036
5037   if (TYPE_PACKED (type))
5038     return align;
5039
5040   /* Find the first field, looking down into aggregates.  */
5041   do {
5042     tree field = TYPE_FIELDS (type);
5043     /* Skip all non field decls */
5044     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5045       field = DECL_CHAIN (field);
5046     if (! field)
5047       break;
5048     /* A packed field does not contribute any extra alignment.  */
5049     if (DECL_PACKED (field))
5050       return align;
5051     type = TREE_TYPE (field);
5052     while (TREE_CODE (type) == ARRAY_TYPE)
5053       type = TREE_TYPE (type);
5054   } while (AGGREGATE_TYPE_P (type));
5055
5056   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
5057     align = MAX (align, TYPE_ALIGN (type));
5058
5059   return align;
5060 }
5061
5062 /* Return 1 for an operand in small memory on V.4/eabi.  */
5063
5064 int
5065 small_data_operand (rtx op ATTRIBUTE_UNUSED,
5066                     enum machine_mode mode ATTRIBUTE_UNUSED)
5067 {
5068 #if TARGET_ELF
5069   rtx sym_ref;
5070
5071   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
5072     return 0;
5073
5074   if (DEFAULT_ABI != ABI_V4)
5075     return 0;
5076
5077   /* Vector and float memory instructions have a limited offset on the
5078      SPE, so using a vector or float variable directly as an operand is
5079      not useful.  */
5080   if (TARGET_SPE
5081       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
5082     return 0;
5083
5084   if (GET_CODE (op) == SYMBOL_REF)
5085     sym_ref = op;
5086
5087   else if (GET_CODE (op) != CONST
5088            || GET_CODE (XEXP (op, 0)) != PLUS
5089            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
5090            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
5091     return 0;
5092
5093   else
5094     {
5095       rtx sum = XEXP (op, 0);
5096       HOST_WIDE_INT summand;
5097
5098       /* We have to be careful here, because it is the referenced address
5099          that must be 32k from _SDA_BASE_, not just the symbol.  */
5100       summand = INTVAL (XEXP (sum, 1));
5101       if (summand < 0 || summand > g_switch_value)
5102         return 0;
5103
5104       sym_ref = XEXP (sum, 0);
5105     }
5106
5107   return SYMBOL_REF_SMALL_P (sym_ref);
5108 #else
5109   return 0;
5110 #endif
5111 }
5112
5113 /* Return true if either operand is a general purpose register.  */
5114
5115 bool
5116 gpr_or_gpr_p (rtx op0, rtx op1)
5117 {
5118   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
5119           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
5120 }
5121
5122 \f
5123 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
5124
5125 static bool
5126 reg_offset_addressing_ok_p (enum machine_mode mode)
5127 {
5128   switch (mode)
5129     {
5130     case V16QImode:
5131     case V8HImode:
5132     case V4SFmode:
5133     case V4SImode:
5134     case V2DFmode:
5135     case V2DImode:
5136       /* AltiVec/VSX vector modes.  Only reg+reg addressing is valid.  */
5137       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
5138         return false;
5139       break;
5140
5141     case V4HImode:
5142     case V2SImode:
5143     case V1DImode:
5144     case V2SFmode:
5145        /* Paired vector modes.  Only reg+reg addressing is valid.  */
5146       if (TARGET_PAIRED_FLOAT)
5147         return false;
5148       break;
5149
5150     default:
5151       break;
5152     }
5153
5154   return true;
5155 }
5156
5157 static bool
5158 virtual_stack_registers_memory_p (rtx op)
5159 {
5160   int regnum;
5161
5162   if (GET_CODE (op) == REG)
5163     regnum = REGNO (op);
5164
5165   else if (GET_CODE (op) == PLUS
5166            && GET_CODE (XEXP (op, 0)) == REG
5167            && GET_CODE (XEXP (op, 1)) == CONST_INT)
5168     regnum = REGNO (XEXP (op, 0));
5169
5170   else
5171     return false;
5172
5173   return (regnum >= FIRST_VIRTUAL_REGISTER
5174           && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
5175 }
5176
5177 /* Return true if memory accesses to OP are known to never straddle
5178    a 32k boundary.  */
5179
5180 static bool
5181 offsettable_ok_by_alignment (rtx op, HOST_WIDE_INT offset,
5182                              enum machine_mode mode)
5183 {
5184   tree decl, type;
5185   unsigned HOST_WIDE_INT dsize, dalign;
5186
5187   if (GET_CODE (op) != SYMBOL_REF)
5188     return false;
5189
5190   decl = SYMBOL_REF_DECL (op);
5191   if (!decl)
5192     {
5193       if (GET_MODE_SIZE (mode) == 0)
5194         return false;
5195
5196       /* -fsection-anchors loses the original SYMBOL_REF_DECL when
5197          replacing memory addresses with an anchor plus offset.  We
5198          could find the decl by rummaging around in the block->objects
5199          VEC for the given offset but that seems like too much work.  */
5200       dalign = 1;
5201       if (SYMBOL_REF_HAS_BLOCK_INFO_P (op)
5202           && SYMBOL_REF_ANCHOR_P (op)
5203           && SYMBOL_REF_BLOCK (op) != NULL)
5204         {
5205           struct object_block *block = SYMBOL_REF_BLOCK (op);
5206           HOST_WIDE_INT lsb, mask;
5207
5208           /* Given the alignment of the block..  */
5209           dalign = block->alignment;
5210           mask = dalign / BITS_PER_UNIT - 1;
5211
5212           /* ..and the combined offset of the anchor and any offset
5213              to this block object..  */
5214           offset += SYMBOL_REF_BLOCK_OFFSET (op);
5215           lsb = offset & -offset;
5216
5217           /* ..find how many bits of the alignment we know for the
5218              object.  */
5219           mask &= lsb - 1;
5220           dalign = mask + 1;
5221         }
5222       return dalign >= GET_MODE_SIZE (mode);
5223     }
5224
5225   if (DECL_P (decl))
5226     {
5227       if (TREE_CODE (decl) == FUNCTION_DECL)
5228         return true;
5229
5230       if (!DECL_SIZE_UNIT (decl))
5231         return false;
5232
5233       if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
5234         return false;
5235
5236       dsize = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
5237       if (dsize > 32768)
5238         return false;
5239
5240       dalign = DECL_ALIGN_UNIT (decl);
5241       return dalign >= dsize;
5242     }
5243
5244   type = TREE_TYPE (decl);
5245
5246   if (TREE_CODE (decl) == STRING_CST)
5247     dsize = TREE_STRING_LENGTH (decl);
5248   else if (TYPE_SIZE_UNIT (type)
5249            && host_integerp (TYPE_SIZE_UNIT (type), 1))
5250     dsize = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5251   else
5252     return false;
5253   if (dsize > 32768)
5254     return false;
5255
5256   dalign = TYPE_ALIGN (type);
5257   if (CONSTANT_CLASS_P (decl))
5258     dalign = CONSTANT_ALIGNMENT (decl, dalign);
5259   else
5260     dalign = DATA_ALIGNMENT (decl, dalign);
5261   dalign /= BITS_PER_UNIT;
5262   return dalign >= dsize;
5263 }
5264
5265 static bool
5266 constant_pool_expr_p (rtx op)
5267 {
5268   rtx base, offset;
5269
5270   split_const (op, &base, &offset);
5271   return (GET_CODE (base) == SYMBOL_REF
5272           && CONSTANT_POOL_ADDRESS_P (base)
5273           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
5274 }
5275
5276 static rtx tocrel_base, tocrel_offset;
5277
5278 bool
5279 toc_relative_expr_p (rtx op)
5280 {
5281   if (GET_CODE (op) != CONST)
5282     return false;
5283
5284   split_const (op, &tocrel_base, &tocrel_offset);
5285   return (GET_CODE (tocrel_base) == UNSPEC
5286           && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
5287 }
5288
5289 /* Return true if X is a constant pool address, and also for cmodel=medium
5290    if X is a toc-relative address known to be offsettable within MODE.  */
5291
5292 bool
5293 legitimate_constant_pool_address_p (const_rtx x, enum machine_mode mode,
5294                                     bool strict)
5295 {
5296   return (TARGET_TOC
5297           && (GET_CODE (x) == PLUS || GET_CODE (x) == LO_SUM)
5298           && GET_CODE (XEXP (x, 0)) == REG
5299           && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5300               || ((TARGET_MINIMAL_TOC
5301                    || TARGET_CMODEL != CMODEL_SMALL)
5302                   && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict)))
5303           && toc_relative_expr_p (XEXP (x, 1))
5304           && (TARGET_CMODEL != CMODEL_MEDIUM
5305               || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
5306               || mode == QImode
5307               || offsettable_ok_by_alignment (XVECEXP (tocrel_base, 0, 0),
5308                                               INTVAL (tocrel_offset), mode)));
5309 }
5310
5311 static bool
5312 legitimate_small_data_p (enum machine_mode mode, rtx x)
5313 {
5314   return (DEFAULT_ABI == ABI_V4
5315           && !flag_pic && !TARGET_TOC
5316           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
5317           && small_data_operand (x, mode));
5318 }
5319
5320 /* SPE offset addressing is limited to 5-bits worth of double words.  */
5321 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
5322
5323 bool
5324 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
5325 {
5326   unsigned HOST_WIDE_INT offset, extra;
5327
5328   if (GET_CODE (x) != PLUS)
5329     return false;
5330   if (GET_CODE (XEXP (x, 0)) != REG)
5331     return false;
5332   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5333     return false;
5334   if (!reg_offset_addressing_ok_p (mode))
5335     return virtual_stack_registers_memory_p (x);
5336   if (legitimate_constant_pool_address_p (x, mode, strict))
5337     return true;
5338   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5339     return false;
5340
5341   offset = INTVAL (XEXP (x, 1));
5342   extra = 0;
5343   switch (mode)
5344     {
5345     case V4HImode:
5346     case V2SImode:
5347     case V1DImode:
5348     case V2SFmode:
5349       /* SPE vector modes.  */
5350       return SPE_CONST_OFFSET_OK (offset);
5351
5352     case DFmode:
5353       if (TARGET_E500_DOUBLE)
5354         return SPE_CONST_OFFSET_OK (offset);
5355
5356       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
5357          addressing.  */
5358       if (VECTOR_MEM_VSX_P (DFmode))
5359         return false;
5360
5361     case DDmode:
5362     case DImode:
5363       /* On e500v2, we may have:
5364
5365            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
5366
5367          Which gets addressed with evldd instructions.  */
5368       if (TARGET_E500_DOUBLE)
5369         return SPE_CONST_OFFSET_OK (offset);
5370
5371       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
5372         extra = 4;
5373       else if (offset & 3)
5374         return false;
5375       break;
5376
5377     case TFmode:
5378       if (TARGET_E500_DOUBLE)
5379         return (SPE_CONST_OFFSET_OK (offset)
5380                 && SPE_CONST_OFFSET_OK (offset + 8));
5381
5382     case TDmode:
5383     case TImode:
5384       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
5385         extra = 12;
5386       else if (offset & 3)
5387         return false;
5388       else
5389         extra = 8;
5390       break;
5391
5392     default:
5393       break;
5394     }
5395
5396   offset += 0x8000;
5397   return (offset < 0x10000) && (offset + extra < 0x10000);
5398 }
5399
5400 bool
5401 legitimate_indexed_address_p (rtx x, int strict)
5402 {
5403   rtx op0, op1;
5404
5405   if (GET_CODE (x) != PLUS)
5406     return false;
5407
5408   op0 = XEXP (x, 0);
5409   op1 = XEXP (x, 1);
5410
5411   /* Recognize the rtl generated by reload which we know will later be
5412      replaced with proper base and index regs.  */
5413   if (!strict
5414       && reload_in_progress
5415       && (REG_P (op0) || GET_CODE (op0) == PLUS)
5416       && REG_P (op1))
5417     return true;
5418
5419   return (REG_P (op0) && REG_P (op1)
5420           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
5421                && INT_REG_OK_FOR_INDEX_P (op1, strict))
5422               || (INT_REG_OK_FOR_BASE_P (op1, strict)
5423                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
5424 }
5425
5426 bool
5427 avoiding_indexed_address_p (enum machine_mode mode)
5428 {
5429   /* Avoid indexed addressing for modes that have non-indexed
5430      load/store instruction forms.  */
5431   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
5432 }
5433
5434 inline bool
5435 legitimate_indirect_address_p (rtx x, int strict)
5436 {
5437   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
5438 }
5439
5440 bool
5441 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
5442 {
5443   if (!TARGET_MACHO || !flag_pic
5444       || mode != SImode || GET_CODE (x) != MEM)
5445     return false;
5446   x = XEXP (x, 0);
5447
5448   if (GET_CODE (x) != LO_SUM)
5449     return false;
5450   if (GET_CODE (XEXP (x, 0)) != REG)
5451     return false;
5452   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
5453     return false;
5454   x = XEXP (x, 1);
5455
5456   return CONSTANT_P (x);
5457 }
5458
5459 static bool
5460 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
5461 {
5462   if (GET_CODE (x) != LO_SUM)
5463     return false;
5464   if (GET_CODE (XEXP (x, 0)) != REG)
5465     return false;
5466   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5467     return false;
5468   /* Restrict addressing for DI because of our SUBREG hackery.  */
5469   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5470                              || mode == DDmode || mode == TDmode
5471                              || mode == DImode))
5472     return false;
5473   x = XEXP (x, 1);
5474
5475   if (TARGET_ELF || TARGET_MACHO)
5476     {
5477       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
5478         return false;
5479       if (TARGET_TOC)
5480         return false;
5481       if (GET_MODE_NUNITS (mode) != 1)
5482         return false;
5483       if (GET_MODE_BITSIZE (mode) > 64
5484           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
5485               && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
5486                    && (mode == DFmode || mode == DDmode))))
5487         return false;
5488
5489       return CONSTANT_P (x);
5490     }
5491
5492   return false;
5493 }
5494
5495
5496 /* Try machine-dependent ways of modifying an illegitimate address
5497    to be legitimate.  If we find one, return the new, valid address.
5498    This is used from only one place: `memory_address' in explow.c.
5499
5500    OLDX is the address as it was before break_out_memory_refs was
5501    called.  In some cases it is useful to look at this to decide what
5502    needs to be done.
5503
5504    It is always safe for this function to do nothing.  It exists to
5505    recognize opportunities to optimize the output.
5506
5507    On RS/6000, first check for the sum of a register with a constant
5508    integer that is out of range.  If so, generate code to add the
5509    constant with the low-order 16 bits masked to the register and force
5510    this result into another register (this can be done with `cau').
5511    Then generate an address of REG+(CONST&0xffff), allowing for the
5512    possibility of bit 16 being a one.
5513
5514    Then check for the sum of a register and something not constant, try to
5515    load the other things into a register and return the sum.  */
5516
5517 static rtx
5518 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
5519                            enum machine_mode mode)
5520 {
5521   unsigned int extra = 0;
5522
5523   if (!reg_offset_addressing_ok_p (mode))
5524     {
5525       if (virtual_stack_registers_memory_p (x))
5526         return x;
5527
5528       /* In theory we should not be seeing addresses of the form reg+0,
5529          but just in case it is generated, optimize it away.  */
5530       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
5531         return force_reg (Pmode, XEXP (x, 0));
5532
5533       /* Make sure both operands are registers.  */
5534       else if (GET_CODE (x) == PLUS)
5535         return gen_rtx_PLUS (Pmode,
5536                              force_reg (Pmode, XEXP (x, 0)),
5537                              force_reg (Pmode, XEXP (x, 1)));
5538       else
5539         return force_reg (Pmode, x);
5540     }
5541   if (GET_CODE (x) == SYMBOL_REF)
5542     {
5543       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
5544       if (model != 0)
5545         return rs6000_legitimize_tls_address (x, model);
5546     }
5547
5548   switch (mode)
5549     {
5550     case DFmode:
5551     case DDmode:
5552       extra = 4;
5553       break;
5554     case DImode:
5555       if (!TARGET_POWERPC64)
5556         extra = 4;
5557       break;
5558     case TFmode:
5559     case TDmode:
5560       extra = 12;
5561       break;
5562     case TImode:
5563       extra = TARGET_POWERPC64 ? 8 : 12;
5564       break;
5565     default:
5566       break;
5567     }
5568
5569   if (GET_CODE (x) == PLUS
5570       && GET_CODE (XEXP (x, 0)) == REG
5571       && GET_CODE (XEXP (x, 1)) == CONST_INT
5572       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
5573           >= 0x10000 - extra)
5574       && !((TARGET_POWERPC64
5575             && (mode == DImode || mode == TImode)
5576             && (INTVAL (XEXP (x, 1)) & 3) != 0)
5577            || SPE_VECTOR_MODE (mode)
5578            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5579                                       || mode == DImode || mode == DDmode
5580                                       || mode == TDmode))))
5581     {
5582       HOST_WIDE_INT high_int, low_int;
5583       rtx sum;
5584       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
5585       if (low_int >= 0x8000 - extra)
5586         low_int = 0;
5587       high_int = INTVAL (XEXP (x, 1)) - low_int;
5588       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
5589                                          GEN_INT (high_int)), 0);
5590       return plus_constant (sum, low_int);
5591     }
5592   else if (GET_CODE (x) == PLUS
5593            && GET_CODE (XEXP (x, 0)) == REG
5594            && GET_CODE (XEXP (x, 1)) != CONST_INT
5595            && GET_MODE_NUNITS (mode) == 1
5596            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5597                || TARGET_POWERPC64
5598                || ((mode != DImode && mode != DFmode && mode != DDmode)
5599                    || (TARGET_E500_DOUBLE && mode != DDmode)))
5600            && (TARGET_POWERPC64 || mode != DImode)
5601            && !avoiding_indexed_address_p (mode)
5602            && mode != TImode
5603            && mode != TFmode
5604            && mode != TDmode)
5605     {
5606       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
5607                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
5608     }
5609   else if (SPE_VECTOR_MODE (mode)
5610            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5611                                       || mode == DDmode || mode == TDmode
5612                                       || mode == DImode)))
5613     {
5614       if (mode == DImode)
5615         return x;
5616       /* We accept [reg + reg] and [reg + OFFSET].  */
5617
5618       if (GET_CODE (x) == PLUS)
5619        {
5620          rtx op1 = XEXP (x, 0);
5621          rtx op2 = XEXP (x, 1);
5622          rtx y;
5623
5624          op1 = force_reg (Pmode, op1);
5625
5626          if (GET_CODE (op2) != REG
5627              && (GET_CODE (op2) != CONST_INT
5628                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
5629                  || (GET_MODE_SIZE (mode) > 8
5630                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
5631            op2 = force_reg (Pmode, op2);
5632
5633          /* We can't always do [reg + reg] for these, because [reg +
5634             reg + offset] is not a legitimate addressing mode.  */
5635          y = gen_rtx_PLUS (Pmode, op1, op2);
5636
5637          if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
5638            return force_reg (Pmode, y);
5639          else
5640            return y;
5641        }
5642
5643       return force_reg (Pmode, x);
5644     }
5645   else if (TARGET_ELF
5646            && TARGET_32BIT
5647            && TARGET_NO_TOC
5648            && ! flag_pic
5649            && GET_CODE (x) != CONST_INT
5650            && GET_CODE (x) != CONST_DOUBLE
5651            && CONSTANT_P (x)
5652            && GET_MODE_NUNITS (mode) == 1
5653            && (GET_MODE_BITSIZE (mode) <= 32
5654                || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5655                    && (mode == DFmode || mode == DDmode))))
5656     {
5657       rtx reg = gen_reg_rtx (Pmode);
5658       emit_insn (gen_elf_high (reg, x));
5659       return gen_rtx_LO_SUM (Pmode, reg, x);
5660     }
5661   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
5662            && ! flag_pic
5663 #if TARGET_MACHO
5664            && ! MACHO_DYNAMIC_NO_PIC_P
5665 #endif
5666            && GET_CODE (x) != CONST_INT
5667            && GET_CODE (x) != CONST_DOUBLE
5668            && CONSTANT_P (x)
5669            && GET_MODE_NUNITS (mode) == 1
5670            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5671                || (mode != DFmode && mode != DDmode))
5672            && mode != DImode
5673            && mode != TImode)
5674     {
5675       rtx reg = gen_reg_rtx (Pmode);
5676       emit_insn (gen_macho_high (reg, x));
5677       return gen_rtx_LO_SUM (Pmode, reg, x);
5678     }
5679   else if (TARGET_TOC
5680            && GET_CODE (x) == SYMBOL_REF
5681            && constant_pool_expr_p (x)
5682            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
5683     {
5684       rtx reg = TARGET_CMODEL != CMODEL_SMALL ? gen_reg_rtx (Pmode) : NULL_RTX;
5685       return create_TOC_reference (x, reg);
5686     }
5687   else
5688     return x;
5689 }
5690
5691 /* Debug version of rs6000_legitimize_address.  */
5692 static rtx
5693 rs6000_debug_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
5694 {
5695   rtx ret;
5696   rtx insns;
5697
5698   start_sequence ();
5699   ret = rs6000_legitimize_address (x, oldx, mode);
5700   insns = get_insns ();
5701   end_sequence ();
5702
5703   if (ret != x)
5704     {
5705       fprintf (stderr,
5706                "\nrs6000_legitimize_address: mode %s, old code %s, "
5707                "new code %s, modified\n",
5708                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
5709                GET_RTX_NAME (GET_CODE (ret)));
5710
5711       fprintf (stderr, "Original address:\n");
5712       debug_rtx (x);
5713
5714       fprintf (stderr, "oldx:\n");
5715       debug_rtx (oldx);
5716
5717       fprintf (stderr, "New address:\n");
5718       debug_rtx (ret);
5719
5720       if (insns)
5721         {
5722           fprintf (stderr, "Insns added:\n");
5723           debug_rtx_list (insns, 20);
5724         }
5725     }
5726   else
5727     {
5728       fprintf (stderr,
5729                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
5730                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
5731
5732       debug_rtx (x);
5733     }
5734
5735   if (insns)
5736     emit_insn (insns);
5737
5738   return ret;
5739 }
5740
5741 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
5742    We need to emit DTP-relative relocations.  */
5743
5744 static void
5745 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
5746 {
5747   switch (size)
5748     {
5749     case 4:
5750       fputs ("\t.long\t", file);
5751       break;
5752     case 8:
5753       fputs (DOUBLE_INT_ASM_OP, file);
5754       break;
5755     default:
5756       gcc_unreachable ();
5757     }
5758   output_addr_const (file, x);
5759   fputs ("@dtprel+0x8000", file);
5760 }
5761
5762 /* In the name of slightly smaller debug output, and to cater to
5763    general assembler lossage, recognize various UNSPEC sequences
5764    and turn them back into a direct symbol reference.  */
5765
5766 static rtx
5767 rs6000_delegitimize_address (rtx orig_x)
5768 {
5769   rtx x, y;
5770
5771   orig_x = delegitimize_mem_from_attrs (orig_x);
5772   x = orig_x;
5773   if (MEM_P (x))
5774     x = XEXP (x, 0);
5775
5776   if (GET_CODE (x) == (TARGET_CMODEL != CMODEL_SMALL ? LO_SUM : PLUS)
5777       && GET_CODE (XEXP (x, 1)) == CONST)
5778     {
5779       rtx offset = NULL_RTX;
5780
5781       y = XEXP (XEXP (x, 1), 0);
5782       if (GET_CODE (y) == PLUS
5783           && GET_MODE (y) == Pmode
5784           && CONST_INT_P (XEXP (y, 1)))
5785         {
5786           offset = XEXP (y, 1);
5787           y = XEXP (y, 0);
5788         }
5789       if (GET_CODE (y) == UNSPEC
5790           && XINT (y, 1) == UNSPEC_TOCREL
5791           && ((GET_CODE (XEXP (x, 0)) == REG
5792                && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5793                    || TARGET_MINIMAL_TOC
5794                    || TARGET_CMODEL != CMODEL_SMALL))
5795               || (TARGET_CMODEL != CMODEL_SMALL
5796                   && GET_CODE (XEXP (x, 0)) == CONST
5797                   && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
5798                   && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == REG
5799                   && REGNO (XEXP (XEXP (XEXP (x, 0), 0), 0)) == TOC_REGISTER
5800                   && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == HIGH
5801                   && rtx_equal_p (XEXP (x, 1),
5802                                   XEXP (XEXP (XEXP (XEXP (x, 0), 0), 1), 0)))))
5803         {
5804           y = XVECEXP (y, 0, 0);
5805           if (offset != NULL_RTX)
5806             y = gen_rtx_PLUS (Pmode, y, offset);
5807           if (!MEM_P (orig_x))
5808             return y;
5809           else
5810             return replace_equiv_address_nv (orig_x, y);
5811         }
5812     }
5813
5814   if (TARGET_MACHO
5815       && GET_CODE (orig_x) == LO_SUM
5816       && GET_CODE (XEXP (orig_x, 1)) == CONST)
5817     {
5818       y = XEXP (XEXP (orig_x, 1), 0);
5819       if (GET_CODE (y) == UNSPEC
5820           && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
5821         return XVECEXP (y, 0, 0);
5822     }
5823
5824   return orig_x;
5825 }
5826
5827 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
5828
5829 static GTY(()) rtx rs6000_tls_symbol;
5830 static rtx
5831 rs6000_tls_get_addr (void)
5832 {
5833   if (!rs6000_tls_symbol)
5834     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
5835
5836   return rs6000_tls_symbol;
5837 }
5838
5839 /* Construct the SYMBOL_REF for TLS GOT references.  */
5840
5841 static GTY(()) rtx rs6000_got_symbol;
5842 static rtx
5843 rs6000_got_sym (void)
5844 {
5845   if (!rs6000_got_symbol)
5846     {
5847       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
5848       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
5849       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
5850     }
5851
5852   return rs6000_got_symbol;
5853 }
5854
5855 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
5856    this (thread-local) address.  */
5857
5858 static rtx
5859 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
5860 {
5861   rtx dest, insn;
5862
5863   dest = gen_reg_rtx (Pmode);
5864   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
5865     {
5866       rtx tlsreg;
5867
5868       if (TARGET_64BIT)
5869         {
5870           tlsreg = gen_rtx_REG (Pmode, 13);
5871           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
5872         }
5873       else
5874         {
5875           tlsreg = gen_rtx_REG (Pmode, 2);
5876           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
5877         }
5878       emit_insn (insn);
5879     }
5880   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
5881     {
5882       rtx tlsreg, tmp;
5883
5884       tmp = gen_reg_rtx (Pmode);
5885       if (TARGET_64BIT)
5886         {
5887           tlsreg = gen_rtx_REG (Pmode, 13);
5888           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
5889         }
5890       else
5891         {
5892           tlsreg = gen_rtx_REG (Pmode, 2);
5893           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
5894         }
5895       emit_insn (insn);
5896       if (TARGET_64BIT)
5897         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
5898       else
5899         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
5900       emit_insn (insn);
5901     }
5902   else
5903     {
5904       rtx r3, got, tga, tmp1, tmp2, call_insn;
5905
5906       /* We currently use relocations like @got@tlsgd for tls, which
5907          means the linker will handle allocation of tls entries, placing
5908          them in the .got section.  So use a pointer to the .got section,
5909          not one to secondary TOC sections used by 64-bit -mminimal-toc,
5910          or to secondary GOT sections used by 32-bit -fPIC.  */
5911       if (TARGET_64BIT)
5912         got = gen_rtx_REG (Pmode, 2);
5913       else
5914         {
5915           if (flag_pic == 1)
5916             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
5917           else
5918             {
5919               rtx gsym = rs6000_got_sym ();
5920               got = gen_reg_rtx (Pmode);
5921               if (flag_pic == 0)
5922                 rs6000_emit_move (got, gsym, Pmode);
5923               else
5924                 {
5925                   rtx mem, lab, last;
5926
5927                   tmp1 = gen_reg_rtx (Pmode);
5928                   tmp2 = gen_reg_rtx (Pmode);
5929                   mem = gen_const_mem (Pmode, tmp1);
5930                   lab = gen_label_rtx ();
5931                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
5932                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
5933                   emit_move_insn (tmp2, mem);
5934                   last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
5935                   set_unique_reg_note (last, REG_EQUAL, gsym);
5936                 }
5937             }
5938         }
5939
5940       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
5941         {
5942           tga = rs6000_tls_get_addr ();
5943           emit_library_call_value (tga, dest, LCT_CONST, Pmode,
5944                                    1, const0_rtx, Pmode);
5945
5946           r3 = gen_rtx_REG (Pmode, 3);
5947           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5948             insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
5949           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
5950             insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
5951           else if (DEFAULT_ABI == ABI_V4)
5952             insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
5953           else
5954             gcc_unreachable ();
5955           call_insn = last_call_insn ();
5956           PATTERN (call_insn) = insn;
5957           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
5958             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
5959                      pic_offset_table_rtx);
5960         }
5961       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
5962         {
5963           tga = rs6000_tls_get_addr ();
5964           tmp1 = gen_reg_rtx (Pmode);
5965           emit_library_call_value (tga, tmp1, LCT_CONST, Pmode,
5966                                    1, const0_rtx, Pmode);
5967
5968           r3 = gen_rtx_REG (Pmode, 3);
5969           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5970             insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
5971           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
5972             insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
5973           else if (DEFAULT_ABI == ABI_V4)
5974             insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
5975           else
5976             gcc_unreachable ();
5977           call_insn = last_call_insn ();
5978           PATTERN (call_insn) = insn;
5979           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
5980             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
5981                      pic_offset_table_rtx);
5982
5983           if (rs6000_tls_size == 16)
5984             {
5985               if (TARGET_64BIT)
5986                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
5987               else
5988                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
5989             }
5990           else if (rs6000_tls_size == 32)
5991             {
5992               tmp2 = gen_reg_rtx (Pmode);
5993               if (TARGET_64BIT)
5994                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
5995               else
5996                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
5997               emit_insn (insn);
5998               if (TARGET_64BIT)
5999                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
6000               else
6001                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
6002             }
6003           else
6004             {
6005               tmp2 = gen_reg_rtx (Pmode);
6006               if (TARGET_64BIT)
6007                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
6008               else
6009                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
6010               emit_insn (insn);
6011               insn = gen_rtx_SET (Pmode, dest,
6012                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
6013             }
6014           emit_insn (insn);
6015         }
6016       else
6017         {
6018           /* IE, or 64-bit offset LE.  */
6019           tmp2 = gen_reg_rtx (Pmode);
6020           if (TARGET_64BIT)
6021             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
6022           else
6023             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
6024           emit_insn (insn);
6025           if (TARGET_64BIT)
6026             insn = gen_tls_tls_64 (dest, tmp2, addr);
6027           else
6028             insn = gen_tls_tls_32 (dest, tmp2, addr);
6029           emit_insn (insn);
6030         }
6031     }
6032
6033   return dest;
6034 }
6035
6036 /* Return 1 if X contains a thread-local symbol.  */
6037
6038 static bool
6039 rs6000_tls_referenced_p (rtx x)
6040 {
6041   if (! TARGET_HAVE_TLS)
6042     return false;
6043
6044   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
6045 }
6046
6047 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
6048
6049 static bool
6050 rs6000_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
6051 {
6052   if (GET_CODE (x) == CONST
6053       && GET_CODE (XEXP (x, 0)) == PLUS
6054       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH)
6055     return true;
6056
6057   return rs6000_tls_referenced_p (x);
6058 }
6059
6060 /* Return 1 if *X is a thread-local symbol.  This is the same as
6061    rs6000_tls_symbol_ref except for the type of the unused argument.  */
6062
6063 static int
6064 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
6065 {
6066   return RS6000_SYMBOL_REF_TLS_P (*x);
6067 }
6068
6069 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
6070    replace the input X, or the original X if no replacement is called for.
6071    The output parameter *WIN is 1 if the calling macro should goto WIN,
6072    0 if it should not.
6073
6074    For RS/6000, we wish to handle large displacements off a base
6075    register by splitting the addend across an addiu/addis and the mem insn.
6076    This cuts number of extra insns needed from 3 to 1.
6077
6078    On Darwin, we use this to generate code for floating point constants.
6079    A movsf_low is generated so we wind up with 2 instructions rather than 3.
6080    The Darwin code is inside #if TARGET_MACHO because only then are the
6081    machopic_* functions defined.  */
6082 static rtx
6083 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
6084                                   int opnum, int type,
6085                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
6086 {
6087   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6088
6089   /* Nasty hack for vsx_splat_V2DF/V2DI load from mem, which takes a
6090      DFmode/DImode MEM.  */
6091   if (reg_offset_p
6092       && opnum == 1
6093       && ((mode == DFmode && recog_data.operand_mode[0] == V2DFmode)
6094           || (mode == DImode && recog_data.operand_mode[0] == V2DImode)))
6095     reg_offset_p = false;
6096
6097   /* We must recognize output that we have already generated ourselves.  */
6098   if (GET_CODE (x) == PLUS
6099       && GET_CODE (XEXP (x, 0)) == PLUS
6100       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6101       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6102       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6103     {
6104       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6105                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6106                    opnum, (enum reload_type)type);
6107       *win = 1;
6108       return x;
6109     }
6110
6111   /* Likewise for (lo_sum (high ...) ...) output we have generated.  */
6112   if (GET_CODE (x) == LO_SUM
6113       && GET_CODE (XEXP (x, 0)) == HIGH)
6114     {
6115       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6116                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6117                    opnum, (enum reload_type)type);
6118       *win = 1;
6119       return x;
6120     }
6121
6122 #if TARGET_MACHO
6123   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
6124       && GET_CODE (x) == LO_SUM
6125       && GET_CODE (XEXP (x, 0)) == PLUS
6126       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
6127       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6128       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
6129       && machopic_operand_p (XEXP (x, 1)))
6130     {
6131       /* Result of previous invocation of this function on Darwin
6132          floating point constant.  */
6133       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6134                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6135                    opnum, (enum reload_type)type);
6136       *win = 1;
6137       return x;
6138     }
6139 #endif
6140
6141   if (TARGET_CMODEL != CMODEL_SMALL
6142       && GET_CODE (x) == LO_SUM
6143       && GET_CODE (XEXP (x, 0)) == PLUS
6144       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6145       && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6146       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST
6147       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == HIGH
6148       && GET_CODE (XEXP (x, 1)) == CONST
6149       && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
6150       && XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_TOCREL
6151       && rtx_equal_p (XEXP (XEXP (XEXP (XEXP (x, 0), 1), 0), 0), XEXP (x, 1)))
6152     {
6153       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6154                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6155                    opnum, (enum reload_type) type);
6156       *win = 1;
6157       return x;
6158     }
6159
6160   /* Force ld/std non-word aligned offset into base register by wrapping
6161      in offset 0.  */
6162   if (GET_CODE (x) == PLUS
6163       && GET_CODE (XEXP (x, 0)) == REG
6164       && REGNO (XEXP (x, 0)) < 32
6165       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6166       && GET_CODE (XEXP (x, 1)) == CONST_INT
6167       && reg_offset_p
6168       && (INTVAL (XEXP (x, 1)) & 3) != 0
6169       && VECTOR_MEM_NONE_P (mode)
6170       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
6171       && TARGET_POWERPC64)
6172     {
6173       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
6174       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6175                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6176                    opnum, (enum reload_type) type);
6177       *win = 1;
6178       return x;
6179     }
6180
6181   if (GET_CODE (x) == PLUS
6182       && GET_CODE (XEXP (x, 0)) == REG
6183       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
6184       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6185       && GET_CODE (XEXP (x, 1)) == CONST_INT
6186       && reg_offset_p
6187       && !SPE_VECTOR_MODE (mode)
6188       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6189                                   || mode == DDmode || mode == TDmode
6190                                   || mode == DImode))
6191       && VECTOR_MEM_NONE_P (mode))
6192     {
6193       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
6194       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
6195       HOST_WIDE_INT high
6196         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
6197
6198       /* Check for 32-bit overflow.  */
6199       if (high + low != val)
6200         {
6201           *win = 0;
6202           return x;
6203         }
6204
6205       /* Reload the high part into a base reg; leave the low part
6206          in the mem directly.  */
6207
6208       x = gen_rtx_PLUS (GET_MODE (x),
6209                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6210                                       GEN_INT (high)),
6211                         GEN_INT (low));
6212
6213       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6214                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6215                    opnum, (enum reload_type)type);
6216       *win = 1;
6217       return x;
6218     }
6219
6220   if (GET_CODE (x) == SYMBOL_REF
6221       && reg_offset_p
6222       && VECTOR_MEM_NONE_P (mode)
6223       && !SPE_VECTOR_MODE (mode)
6224 #if TARGET_MACHO
6225       && DEFAULT_ABI == ABI_DARWIN
6226       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
6227 #else
6228       && DEFAULT_ABI == ABI_V4
6229       && !flag_pic
6230 #endif
6231       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
6232          The same goes for DImode without 64-bit gprs and DFmode and DDmode
6233          without fprs.  */
6234       && mode != TFmode
6235       && mode != TDmode
6236       && (mode != DImode || TARGET_POWERPC64)
6237       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
6238           || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
6239     {
6240 #if TARGET_MACHO
6241       if (flag_pic)
6242         {
6243           rtx offset = machopic_gen_offset (x);
6244           x = gen_rtx_LO_SUM (GET_MODE (x),
6245                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
6246                   gen_rtx_HIGH (Pmode, offset)), offset);
6247         }
6248       else
6249 #endif
6250         x = gen_rtx_LO_SUM (GET_MODE (x),
6251               gen_rtx_HIGH (Pmode, x), x);
6252
6253       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6254                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6255                    opnum, (enum reload_type)type);
6256       *win = 1;
6257       return x;
6258     }
6259
6260   /* Reload an offset address wrapped by an AND that represents the
6261      masking of the lower bits.  Strip the outer AND and let reload
6262      convert the offset address into an indirect address.  For VSX,
6263      force reload to create the address with an AND in a separate
6264      register, because we can't guarantee an altivec register will
6265      be used.  */
6266   if (VECTOR_MEM_ALTIVEC_P (mode)
6267       && GET_CODE (x) == AND
6268       && GET_CODE (XEXP (x, 0)) == PLUS
6269       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6270       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6271       && GET_CODE (XEXP (x, 1)) == CONST_INT
6272       && INTVAL (XEXP (x, 1)) == -16)
6273     {
6274       x = XEXP (x, 0);
6275       *win = 1;
6276       return x;
6277     }
6278
6279   if (TARGET_TOC
6280       && reg_offset_p
6281       && GET_CODE (x) == SYMBOL_REF
6282       && constant_pool_expr_p (x)
6283       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
6284     {
6285       x = create_TOC_reference (x, NULL_RTX);
6286       if (TARGET_CMODEL != CMODEL_SMALL)
6287         push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6288                      BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6289                      opnum, (enum reload_type) type);
6290       *win = 1;
6291       return x;
6292     }
6293   *win = 0;
6294   return x;
6295 }
6296
6297 /* Debug version of rs6000_legitimize_reload_address.  */
6298 static rtx
6299 rs6000_debug_legitimize_reload_address (rtx x, enum machine_mode mode,
6300                                         int opnum, int type,
6301                                         int ind_levels, int *win)
6302 {
6303   rtx ret = rs6000_legitimize_reload_address (x, mode, opnum, type,
6304                                               ind_levels, win);
6305   fprintf (stderr,
6306            "\nrs6000_legitimize_reload_address: mode = %s, opnum = %d, "
6307            "type = %d, ind_levels = %d, win = %d, original addr:\n",
6308            GET_MODE_NAME (mode), opnum, type, ind_levels, *win);
6309   debug_rtx (x);
6310
6311   if (x == ret)
6312     fprintf (stderr, "Same address returned\n");
6313   else if (!ret)
6314     fprintf (stderr, "NULL returned\n");
6315   else
6316     {
6317       fprintf (stderr, "New address:\n");
6318       debug_rtx (ret);
6319     }
6320
6321   return ret;
6322 }
6323
6324 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
6325    that is a valid memory address for an instruction.
6326    The MODE argument is the machine mode for the MEM expression
6327    that wants to use this address.
6328
6329    On the RS/6000, there are four valid address: a SYMBOL_REF that
6330    refers to a constant pool entry of an address (or the sum of it
6331    plus a constant), a short (16-bit signed) constant plus a register,
6332    the sum of two registers, or a register indirect, possibly with an
6333    auto-increment.  For DFmode, DDmode and DImode with a constant plus
6334    register, we must ensure that both words are addressable or PowerPC64
6335    with offset word aligned.
6336
6337    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
6338    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
6339    because adjacent memory cells are accessed by adding word-sized offsets
6340    during assembly output.  */
6341 bool
6342 rs6000_legitimate_address_p (enum machine_mode mode, rtx x, bool reg_ok_strict)
6343 {
6344   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6345
6346   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
6347   if (VECTOR_MEM_ALTIVEC_P (mode)
6348       && GET_CODE (x) == AND
6349       && GET_CODE (XEXP (x, 1)) == CONST_INT
6350       && INTVAL (XEXP (x, 1)) == -16)
6351     x = XEXP (x, 0);
6352
6353   if (RS6000_SYMBOL_REF_TLS_P (x))
6354     return 0;
6355   if (legitimate_indirect_address_p (x, reg_ok_strict))
6356     return 1;
6357   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
6358       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6359       && !SPE_VECTOR_MODE (mode)
6360       && mode != TFmode
6361       && mode != TDmode
6362       /* Restrict addressing for DI because of our SUBREG hackery.  */
6363       && !(TARGET_E500_DOUBLE
6364            && (mode == DFmode || mode == DDmode || mode == DImode))
6365       && TARGET_UPDATE
6366       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
6367     return 1;
6368   if (virtual_stack_registers_memory_p (x))
6369     return 1;
6370   if (reg_offset_p && legitimate_small_data_p (mode, x))
6371     return 1;
6372   if (reg_offset_p
6373       && legitimate_constant_pool_address_p (x, mode, reg_ok_strict))
6374     return 1;
6375   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
6376   if (! reg_ok_strict
6377       && reg_offset_p
6378       && GET_CODE (x) == PLUS
6379       && GET_CODE (XEXP (x, 0)) == REG
6380       && (XEXP (x, 0) == virtual_stack_vars_rtx
6381           || XEXP (x, 0) == arg_pointer_rtx)
6382       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6383     return 1;
6384   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
6385     return 1;
6386   if (mode != TImode
6387       && mode != TFmode
6388       && mode != TDmode
6389       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6390           || TARGET_POWERPC64
6391           || (mode != DFmode && mode != DDmode)
6392           || (TARGET_E500_DOUBLE && mode != DDmode))
6393       && (TARGET_POWERPC64 || mode != DImode)
6394       && !avoiding_indexed_address_p (mode)
6395       && legitimate_indexed_address_p (x, reg_ok_strict))
6396     return 1;
6397   if (GET_CODE (x) == PRE_MODIFY
6398       && mode != TImode
6399       && mode != TFmode
6400       && mode != TDmode
6401       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6402           || TARGET_POWERPC64
6403           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
6404       && (TARGET_POWERPC64 || mode != DImode)
6405       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6406       && !SPE_VECTOR_MODE (mode)
6407       /* Restrict addressing for DI because of our SUBREG hackery.  */
6408       && !(TARGET_E500_DOUBLE
6409            && (mode == DFmode || mode == DDmode || mode == DImode))
6410       && TARGET_UPDATE
6411       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
6412       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
6413           || (!avoiding_indexed_address_p (mode)
6414               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
6415       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6416     return 1;
6417   if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
6418     return 1;
6419   return 0;
6420 }
6421
6422 /* Debug version of rs6000_legitimate_address_p.  */
6423 static bool
6424 rs6000_debug_legitimate_address_p (enum machine_mode mode, rtx x,
6425                                    bool reg_ok_strict)
6426 {
6427   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
6428   fprintf (stderr,
6429            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
6430            "strict = %d, code = %s\n",
6431            ret ? "true" : "false",
6432            GET_MODE_NAME (mode),
6433            reg_ok_strict,
6434            GET_RTX_NAME (GET_CODE (x)));
6435   debug_rtx (x);
6436
6437   return ret;
6438 }
6439
6440 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
6441
6442 static bool
6443 rs6000_mode_dependent_address_p (const_rtx addr)
6444 {
6445   return rs6000_mode_dependent_address_ptr (addr);
6446 }
6447
6448 /* Go to LABEL if ADDR (a legitimate address expression)
6449    has an effect that depends on the machine mode it is used for.
6450
6451    On the RS/6000 this is true of all integral offsets (since AltiVec
6452    and VSX modes don't allow them) or is a pre-increment or decrement.
6453
6454    ??? Except that due to conceptual problems in offsettable_address_p
6455    we can't really report the problems of integral offsets.  So leave
6456    this assuming that the adjustable offset must be valid for the
6457    sub-words of a TFmode operand, which is what we had before.  */
6458
6459 static bool
6460 rs6000_mode_dependent_address (const_rtx addr)
6461 {
6462   switch (GET_CODE (addr))
6463     {
6464     case PLUS:
6465       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
6466          is considered a legitimate address before reload, so there
6467          are no offset restrictions in that case.  Note that this
6468          condition is safe in strict mode because any address involving
6469          virtual_stack_vars_rtx or arg_pointer_rtx would already have
6470          been rejected as illegitimate.  */
6471       if (XEXP (addr, 0) != virtual_stack_vars_rtx
6472           && XEXP (addr, 0) != arg_pointer_rtx
6473           && GET_CODE (XEXP (addr, 1)) == CONST_INT)
6474         {
6475           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
6476           return val + 12 + 0x8000 >= 0x10000;
6477         }
6478       break;
6479
6480     case LO_SUM:
6481       /* Anything in the constant pool is sufficiently aligned that
6482          all bytes have the same high part address.  */
6483       return !legitimate_constant_pool_address_p (addr, QImode, false);
6484
6485     /* Auto-increment cases are now treated generically in recog.c.  */
6486     case PRE_MODIFY:
6487       return TARGET_UPDATE;
6488
6489     /* AND is only allowed in Altivec loads.  */
6490     case AND:
6491       return true;
6492
6493     default:
6494       break;
6495     }
6496
6497   return false;
6498 }
6499
6500 /* Debug version of rs6000_mode_dependent_address.  */
6501 static bool
6502 rs6000_debug_mode_dependent_address (const_rtx addr)
6503 {
6504   bool ret = rs6000_mode_dependent_address (addr);
6505
6506   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
6507            ret ? "true" : "false");
6508   debug_rtx (addr);
6509
6510   return ret;
6511 }
6512
6513 /* Implement FIND_BASE_TERM.  */
6514
6515 rtx
6516 rs6000_find_base_term (rtx op)
6517 {
6518   rtx base, offset;
6519
6520   split_const (op, &base, &offset);
6521   if (GET_CODE (base) == UNSPEC)
6522     switch (XINT (base, 1))
6523       {
6524       case UNSPEC_TOCREL:
6525       case UNSPEC_MACHOPIC_OFFSET:
6526         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
6527            for aliasing purposes.  */
6528         return XVECEXP (base, 0, 0);
6529       }
6530
6531   return op;
6532 }
6533
6534 /* More elaborate version of recog's offsettable_memref_p predicate
6535    that works around the ??? note of rs6000_mode_dependent_address.
6536    In particular it accepts
6537
6538      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
6539
6540    in 32-bit mode, that the recog predicate rejects.  */
6541
6542 bool
6543 rs6000_offsettable_memref_p (rtx op)
6544 {
6545   if (!MEM_P (op))
6546     return false;
6547
6548   /* First mimic offsettable_memref_p.  */
6549   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
6550     return true;
6551
6552   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
6553      the latter predicate knows nothing about the mode of the memory
6554      reference and, therefore, assumes that it is the largest supported
6555      mode (TFmode).  As a consequence, legitimate offsettable memory
6556      references are rejected.  rs6000_legitimate_offset_address_p contains
6557      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
6558   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
6559 }
6560
6561 /* Change register usage conditional on target flags.  */
6562 static void
6563 rs6000_conditional_register_usage (void)
6564 {
6565   int i;
6566
6567   if (TARGET_DEBUG_TARGET)
6568     fprintf (stderr, "rs6000_conditional_register_usage called\n");
6569
6570   /* Set MQ register fixed (already call_used) if not POWER
6571      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
6572      be allocated.  */
6573   if (! TARGET_POWER)
6574     fixed_regs[64] = 1;
6575
6576   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
6577   if (TARGET_64BIT)
6578     fixed_regs[13] = call_used_regs[13]
6579       = call_really_used_regs[13] = 1;
6580
6581   /* Conditionally disable FPRs.  */
6582   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
6583     for (i = 32; i < 64; i++)
6584       fixed_regs[i] = call_used_regs[i]
6585         = call_really_used_regs[i] = 1;
6586
6587   /* The TOC register is not killed across calls in a way that is
6588      visible to the compiler.  */
6589   if (DEFAULT_ABI == ABI_AIX)
6590     call_really_used_regs[2] = 0;
6591
6592   if (DEFAULT_ABI == ABI_V4
6593       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6594       && flag_pic == 2)
6595     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6596
6597   if (DEFAULT_ABI == ABI_V4
6598       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6599       && flag_pic == 1)
6600     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6601       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6602       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6603
6604   if (DEFAULT_ABI == ABI_DARWIN
6605       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
6606       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6607       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6608       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6609
6610   if (TARGET_TOC && TARGET_MINIMAL_TOC)
6611     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6612       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6613
6614   if (TARGET_SPE)
6615     {
6616       global_regs[SPEFSCR_REGNO] = 1;
6617       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
6618          registers in prologues and epilogues.  We no longer use r14
6619          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
6620          pool for link-compatibility with older versions of GCC.  Once
6621          "old" code has died out, we can return r14 to the allocation
6622          pool.  */
6623       fixed_regs[14]
6624         = call_used_regs[14]
6625         = call_really_used_regs[14] = 1;
6626     }
6627
6628   if (!TARGET_ALTIVEC && !TARGET_VSX)
6629     {
6630       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
6631         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6632       call_really_used_regs[VRSAVE_REGNO] = 1;
6633     }
6634
6635   if (TARGET_ALTIVEC || TARGET_VSX)
6636     global_regs[VSCR_REGNO] = 1;
6637
6638   if (TARGET_ALTIVEC_ABI)
6639     {
6640       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
6641         call_used_regs[i] = call_really_used_regs[i] = 1;
6642
6643       /* AIX reserves VR20:31 in non-extended ABI mode.  */
6644       if (TARGET_XCOFF)
6645         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
6646           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6647     }
6648 }
6649 \f
6650 /* Try to output insns to set TARGET equal to the constant C if it can
6651    be done in less than N insns.  Do all computations in MODE.
6652    Returns the place where the output has been placed if it can be
6653    done and the insns have been emitted.  If it would take more than N
6654    insns, zero is returned and no insns and emitted.  */
6655
6656 rtx
6657 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
6658                        rtx source, int n ATTRIBUTE_UNUSED)
6659 {
6660   rtx result, insn, set;
6661   HOST_WIDE_INT c0, c1;
6662
6663   switch (mode)
6664     {
6665       case  QImode:
6666     case HImode:
6667       if (dest == NULL)
6668         dest = gen_reg_rtx (mode);
6669       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
6670       return dest;
6671
6672     case SImode:
6673       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
6674
6675       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
6676                               GEN_INT (INTVAL (source)
6677                                        & (~ (HOST_WIDE_INT) 0xffff))));
6678       emit_insn (gen_rtx_SET (VOIDmode, dest,
6679                               gen_rtx_IOR (SImode, copy_rtx (result),
6680                                            GEN_INT (INTVAL (source) & 0xffff))));
6681       result = dest;
6682       break;
6683
6684     case DImode:
6685       switch (GET_CODE (source))
6686         {
6687         case CONST_INT:
6688           c0 = INTVAL (source);
6689           c1 = -(c0 < 0);
6690           break;
6691
6692         case CONST_DOUBLE:
6693 #if HOST_BITS_PER_WIDE_INT >= 64
6694           c0 = CONST_DOUBLE_LOW (source);
6695           c1 = -(c0 < 0);
6696 #else
6697           c0 = CONST_DOUBLE_LOW (source);
6698           c1 = CONST_DOUBLE_HIGH (source);
6699 #endif
6700           break;
6701
6702         default:
6703           gcc_unreachable ();
6704         }
6705
6706       result = rs6000_emit_set_long_const (dest, c0, c1);
6707       break;
6708
6709     default:
6710       gcc_unreachable ();
6711     }
6712
6713   insn = get_last_insn ();
6714   set = single_set (insn);
6715   if (! CONSTANT_P (SET_SRC (set)))
6716     set_unique_reg_note (insn, REG_EQUAL, source);
6717
6718   return result;
6719 }
6720
6721 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
6722    fall back to a straight forward decomposition.  We do this to avoid
6723    exponential run times encountered when looking for longer sequences
6724    with rs6000_emit_set_const.  */
6725 static rtx
6726 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
6727 {
6728   if (!TARGET_POWERPC64)
6729     {
6730       rtx operand1, operand2;
6731
6732       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
6733                                         DImode);
6734       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
6735                                         DImode);
6736       emit_move_insn (operand1, GEN_INT (c1));
6737       emit_move_insn (operand2, GEN_INT (c2));
6738     }
6739   else
6740     {
6741       HOST_WIDE_INT ud1, ud2, ud3, ud4;
6742
6743       ud1 = c1 & 0xffff;
6744       ud2 = (c1 & 0xffff0000) >> 16;
6745 #if HOST_BITS_PER_WIDE_INT >= 64
6746       c2 = c1 >> 32;
6747 #endif
6748       ud3 = c2 & 0xffff;
6749       ud4 = (c2 & 0xffff0000) >> 16;
6750
6751       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
6752           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
6753         {
6754           if (ud1 & 0x8000)
6755             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
6756           else
6757             emit_move_insn (dest, GEN_INT (ud1));
6758         }
6759
6760       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
6761                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
6762         {
6763           if (ud2 & 0x8000)
6764             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6765                                            - 0x80000000));
6766           else
6767             emit_move_insn (dest, GEN_INT (ud2 << 16));
6768           if (ud1 != 0)
6769             emit_move_insn (copy_rtx (dest),
6770                             gen_rtx_IOR (DImode, copy_rtx (dest),
6771                                          GEN_INT (ud1)));
6772         }
6773       else if (ud3 == 0 && ud4 == 0)
6774         {
6775           gcc_assert (ud2 & 0x8000);
6776           emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6777                                          - 0x80000000));
6778           if (ud1 != 0)
6779             emit_move_insn (copy_rtx (dest),
6780                             gen_rtx_IOR (DImode, copy_rtx (dest),
6781                                          GEN_INT (ud1)));
6782           emit_move_insn (copy_rtx (dest),
6783                           gen_rtx_ZERO_EXTEND (DImode,
6784                                                gen_lowpart (SImode,
6785                                                             copy_rtx (dest))));
6786         }
6787       else if ((ud4 == 0xffff && (ud3 & 0x8000))
6788                || (ud4 == 0 && ! (ud3 & 0x8000)))
6789         {
6790           if (ud3 & 0x8000)
6791             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
6792                                            - 0x80000000));
6793           else
6794             emit_move_insn (dest, GEN_INT (ud3 << 16));
6795
6796           if (ud2 != 0)
6797             emit_move_insn (copy_rtx (dest),
6798                             gen_rtx_IOR (DImode, copy_rtx (dest),
6799                                          GEN_INT (ud2)));
6800           emit_move_insn (copy_rtx (dest),
6801                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
6802                                           GEN_INT (16)));
6803           if (ud1 != 0)
6804             emit_move_insn (copy_rtx (dest),
6805                             gen_rtx_IOR (DImode, copy_rtx (dest),
6806                                          GEN_INT (ud1)));
6807         }
6808       else
6809         {
6810           if (ud4 & 0x8000)
6811             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
6812                                            - 0x80000000));
6813           else
6814             emit_move_insn (dest, GEN_INT (ud4 << 16));
6815
6816           if (ud3 != 0)
6817             emit_move_insn (copy_rtx (dest),
6818                             gen_rtx_IOR (DImode, copy_rtx (dest),
6819                                          GEN_INT (ud3)));
6820
6821           emit_move_insn (copy_rtx (dest),
6822                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
6823                                           GEN_INT (32)));
6824           if (ud2 != 0)
6825             emit_move_insn (copy_rtx (dest),
6826                             gen_rtx_IOR (DImode, copy_rtx (dest),
6827                                          GEN_INT (ud2 << 16)));
6828           if (ud1 != 0)
6829             emit_move_insn (copy_rtx (dest),
6830                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
6831         }
6832     }
6833   return dest;
6834 }
6835
6836 /* Helper for the following.  Get rid of [r+r] memory refs
6837    in cases where it won't work (TImode, TFmode, TDmode).  */
6838
6839 static void
6840 rs6000_eliminate_indexed_memrefs (rtx operands[2])
6841 {
6842   if (reload_in_progress)
6843     return;
6844
6845   if (GET_CODE (operands[0]) == MEM
6846       && GET_CODE (XEXP (operands[0], 0)) != REG
6847       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0),
6848                                                GET_MODE (operands[0]), false))
6849     operands[0]
6850       = replace_equiv_address (operands[0],
6851                                copy_addr_to_reg (XEXP (operands[0], 0)));
6852
6853   if (GET_CODE (operands[1]) == MEM
6854       && GET_CODE (XEXP (operands[1], 0)) != REG
6855       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0),
6856                                                GET_MODE (operands[1]), false))
6857     operands[1]
6858       = replace_equiv_address (operands[1],
6859                                copy_addr_to_reg (XEXP (operands[1], 0)));
6860 }
6861
6862 /* Emit a move from SOURCE to DEST in mode MODE.  */
6863 void
6864 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
6865 {
6866   rtx operands[2];
6867   operands[0] = dest;
6868   operands[1] = source;
6869
6870   if (TARGET_DEBUG_ADDR)
6871     {
6872       fprintf (stderr,
6873                "\nrs6000_emit_move: mode = %s, reload_in_progress = %d, "
6874                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
6875                GET_MODE_NAME (mode),
6876                reload_in_progress,
6877                reload_completed,
6878                can_create_pseudo_p ());
6879       debug_rtx (dest);
6880       fprintf (stderr, "source:\n");
6881       debug_rtx (source);
6882     }
6883
6884   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
6885   if (GET_CODE (operands[1]) == CONST_DOUBLE
6886       && ! FLOAT_MODE_P (mode)
6887       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
6888     {
6889       /* FIXME.  This should never happen.  */
6890       /* Since it seems that it does, do the safe thing and convert
6891          to a CONST_INT.  */
6892       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
6893     }
6894   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
6895               || FLOAT_MODE_P (mode)
6896               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
6897                    || CONST_DOUBLE_LOW (operands[1]) < 0)
6898                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
6899                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
6900
6901   /* Check if GCC is setting up a block move that will end up using FP
6902      registers as temporaries.  We must make sure this is acceptable.  */
6903   if (GET_CODE (operands[0]) == MEM
6904       && GET_CODE (operands[1]) == MEM
6905       && mode == DImode
6906       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
6907           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
6908       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
6909                                             ? 32 : MEM_ALIGN (operands[0])))
6910             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
6911                                                ? 32
6912                                                : MEM_ALIGN (operands[1]))))
6913       && ! MEM_VOLATILE_P (operands [0])
6914       && ! MEM_VOLATILE_P (operands [1]))
6915     {
6916       emit_move_insn (adjust_address (operands[0], SImode, 0),
6917                       adjust_address (operands[1], SImode, 0));
6918       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
6919                       adjust_address (copy_rtx (operands[1]), SImode, 4));
6920       return;
6921     }
6922
6923   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
6924       && !gpc_reg_operand (operands[1], mode))
6925     operands[1] = force_reg (mode, operands[1]);
6926
6927   if (mode == SFmode && ! TARGET_POWERPC
6928       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
6929       && GET_CODE (operands[0]) == MEM)
6930     {
6931       int regnum;
6932
6933       if (reload_in_progress || reload_completed)
6934         regnum = true_regnum (operands[1]);
6935       else if (GET_CODE (operands[1]) == REG)
6936         regnum = REGNO (operands[1]);
6937       else
6938         regnum = -1;
6939
6940       /* If operands[1] is a register, on POWER it may have
6941          double-precision data in it, so truncate it to single
6942          precision.  */
6943       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
6944         {
6945           rtx newreg;
6946           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
6947                     : gen_reg_rtx (mode));
6948           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
6949           operands[1] = newreg;
6950         }
6951     }
6952
6953   /* Recognize the case where operand[1] is a reference to thread-local
6954      data and load its address to a register.  */
6955   if (rs6000_tls_referenced_p (operands[1]))
6956     {
6957       enum tls_model model;
6958       rtx tmp = operands[1];
6959       rtx addend = NULL;
6960
6961       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
6962         {
6963           addend = XEXP (XEXP (tmp, 0), 1);
6964           tmp = XEXP (XEXP (tmp, 0), 0);
6965         }
6966
6967       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
6968       model = SYMBOL_REF_TLS_MODEL (tmp);
6969       gcc_assert (model != 0);
6970
6971       tmp = rs6000_legitimize_tls_address (tmp, model);
6972       if (addend)
6973         {
6974           tmp = gen_rtx_PLUS (mode, tmp, addend);
6975           tmp = force_operand (tmp, operands[0]);
6976         }
6977       operands[1] = tmp;
6978     }
6979
6980   /* Handle the case where reload calls us with an invalid address.  */
6981   if (reload_in_progress && mode == Pmode
6982       && (! general_operand (operands[1], mode)
6983           || ! nonimmediate_operand (operands[0], mode)))
6984     goto emit_set;
6985
6986   /* 128-bit constant floating-point values on Darwin should really be
6987      loaded as two parts.  */
6988   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
6989       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
6990     {
6991       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
6992          know how to get a DFmode SUBREG of a TFmode.  */
6993       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
6994       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
6995                         simplify_gen_subreg (imode, operands[1], mode, 0),
6996                         imode);
6997       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
6998                                              GET_MODE_SIZE (imode)),
6999                         simplify_gen_subreg (imode, operands[1], mode,
7000                                              GET_MODE_SIZE (imode)),
7001                         imode);
7002       return;
7003     }
7004
7005   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
7006     cfun->machine->sdmode_stack_slot =
7007       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
7008
7009   if (reload_in_progress
7010       && mode == SDmode
7011       && MEM_P (operands[0])
7012       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
7013       && REG_P (operands[1]))
7014     {
7015       if (FP_REGNO_P (REGNO (operands[1])))
7016         {
7017           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
7018           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7019           emit_insn (gen_movsd_store (mem, operands[1]));
7020         }
7021       else if (INT_REGNO_P (REGNO (operands[1])))
7022         {
7023           rtx mem = adjust_address_nv (operands[0], mode, 4);
7024           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7025           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
7026         }
7027       else
7028         gcc_unreachable();
7029       return;
7030     }
7031   if (reload_in_progress
7032       && mode == SDmode
7033       && REG_P (operands[0])
7034       && MEM_P (operands[1])
7035       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
7036     {
7037       if (FP_REGNO_P (REGNO (operands[0])))
7038         {
7039           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
7040           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7041           emit_insn (gen_movsd_load (operands[0], mem));
7042         }
7043       else if (INT_REGNO_P (REGNO (operands[0])))
7044         {
7045           rtx mem = adjust_address_nv (operands[1], mode, 4);
7046           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7047           emit_insn (gen_movsd_hardfloat (operands[0], mem));
7048         }
7049       else
7050         gcc_unreachable();
7051       return;
7052     }
7053
7054   /* FIXME:  In the long term, this switch statement should go away
7055      and be replaced by a sequence of tests based on things like
7056      mode == Pmode.  */
7057   switch (mode)
7058     {
7059     case HImode:
7060     case QImode:
7061       if (CONSTANT_P (operands[1])
7062           && GET_CODE (operands[1]) != CONST_INT)
7063         operands[1] = force_const_mem (mode, operands[1]);
7064       break;
7065
7066     case TFmode:
7067     case TDmode:
7068       rs6000_eliminate_indexed_memrefs (operands);
7069       /* fall through */
7070
7071     case DFmode:
7072     case DDmode:
7073     case SFmode:
7074     case SDmode:
7075       if (CONSTANT_P (operands[1])
7076           && ! easy_fp_constant (operands[1], mode))
7077         operands[1] = force_const_mem (mode, operands[1]);
7078       break;
7079
7080     case V16QImode:
7081     case V8HImode:
7082     case V4SFmode:
7083     case V4SImode:
7084     case V4HImode:
7085     case V2SFmode:
7086     case V2SImode:
7087     case V1DImode:
7088     case V2DFmode:
7089     case V2DImode:
7090       if (CONSTANT_P (operands[1])
7091           && !easy_vector_constant (operands[1], mode))
7092         operands[1] = force_const_mem (mode, operands[1]);
7093       break;
7094
7095     case SImode:
7096     case DImode:
7097       /* Use default pattern for address of ELF small data */
7098       if (TARGET_ELF
7099           && mode == Pmode
7100           && DEFAULT_ABI == ABI_V4
7101           && (GET_CODE (operands[1]) == SYMBOL_REF
7102               || GET_CODE (operands[1]) == CONST)
7103           && small_data_operand (operands[1], mode))
7104         {
7105           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7106           return;
7107         }
7108
7109       if (DEFAULT_ABI == ABI_V4
7110           && mode == Pmode && mode == SImode
7111           && flag_pic == 1 && got_operand (operands[1], mode))
7112         {
7113           emit_insn (gen_movsi_got (operands[0], operands[1]));
7114           return;
7115         }
7116
7117       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
7118           && TARGET_NO_TOC
7119           && ! flag_pic
7120           && mode == Pmode
7121           && CONSTANT_P (operands[1])
7122           && GET_CODE (operands[1]) != HIGH
7123           && GET_CODE (operands[1]) != CONST_INT)
7124         {
7125           rtx target = (!can_create_pseudo_p ()
7126                         ? operands[0]
7127                         : gen_reg_rtx (mode));
7128
7129           /* If this is a function address on -mcall-aixdesc,
7130              convert it to the address of the descriptor.  */
7131           if (DEFAULT_ABI == ABI_AIX
7132               && GET_CODE (operands[1]) == SYMBOL_REF
7133               && XSTR (operands[1], 0)[0] == '.')
7134             {
7135               const char *name = XSTR (operands[1], 0);
7136               rtx new_ref;
7137               while (*name == '.')
7138                 name++;
7139               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
7140               CONSTANT_POOL_ADDRESS_P (new_ref)
7141                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
7142               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
7143               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
7144               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
7145               operands[1] = new_ref;
7146             }
7147
7148           if (DEFAULT_ABI == ABI_DARWIN)
7149             {
7150 #if TARGET_MACHO
7151               if (MACHO_DYNAMIC_NO_PIC_P)
7152                 {
7153                   /* Take care of any required data indirection.  */
7154                   operands[1] = rs6000_machopic_legitimize_pic_address (
7155                                   operands[1], mode, operands[0]);
7156                   if (operands[0] != operands[1])
7157                     emit_insn (gen_rtx_SET (VOIDmode,
7158                                             operands[0], operands[1]));
7159                   return;
7160                 }
7161 #endif
7162               emit_insn (gen_macho_high (target, operands[1]));
7163               emit_insn (gen_macho_low (operands[0], target, operands[1]));
7164               return;
7165             }
7166
7167           emit_insn (gen_elf_high (target, operands[1]));
7168           emit_insn (gen_elf_low (operands[0], target, operands[1]));
7169           return;
7170         }
7171
7172       /* If this is a SYMBOL_REF that refers to a constant pool entry,
7173          and we have put it in the TOC, we just need to make a TOC-relative
7174          reference to it.  */
7175       if ((TARGET_TOC
7176            && GET_CODE (operands[1]) == SYMBOL_REF
7177            && constant_pool_expr_p (operands[1])
7178            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
7179                                                get_pool_mode (operands[1])))
7180           || (TARGET_CMODEL == CMODEL_MEDIUM
7181               && GET_CODE (operands[1]) == SYMBOL_REF
7182               && !CONSTANT_POOL_ADDRESS_P (operands[1])
7183               && SYMBOL_REF_LOCAL_P (operands[1])))
7184         {
7185           rtx reg = NULL_RTX;
7186           if (TARGET_CMODEL != CMODEL_SMALL)
7187             {
7188               if (can_create_pseudo_p ())
7189                 reg = gen_reg_rtx (Pmode);
7190               else
7191                 reg = operands[0];
7192             }
7193           operands[1] = create_TOC_reference (operands[1], reg);
7194         }
7195       else if (mode == Pmode
7196                && CONSTANT_P (operands[1])
7197                && GET_CODE (operands[1]) != HIGH
7198                && !(TARGET_CMODEL != CMODEL_SMALL
7199                     && GET_CODE (operands[1]) == CONST
7200                     && GET_CODE (XEXP (operands[1], 0)) == PLUS
7201                     && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == HIGH)
7202                && ((GET_CODE (operands[1]) != CONST_INT
7203                     && ! easy_fp_constant (operands[1], mode))
7204                    || (GET_CODE (operands[1]) == CONST_INT
7205                        && (num_insns_constant (operands[1], mode)
7206                            > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
7207                    || (GET_CODE (operands[0]) == REG
7208                        && FP_REGNO_P (REGNO (operands[0]))))
7209                && ! legitimate_constant_pool_address_p (operands[1], mode,
7210                                                         false)
7211                && ! toc_relative_expr_p (operands[1])
7212                && (TARGET_CMODEL == CMODEL_SMALL
7213                    || can_create_pseudo_p ()
7214                    || (REG_P (operands[0])
7215                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
7216         {
7217
7218 #if TARGET_MACHO
7219           /* Darwin uses a special PIC legitimizer.  */
7220           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
7221             {
7222               operands[1] =
7223                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
7224                                                         operands[0]);
7225               if (operands[0] != operands[1])
7226                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7227               return;
7228             }
7229 #endif
7230
7231           /* If we are to limit the number of things we put in the TOC and
7232              this is a symbol plus a constant we can add in one insn,
7233              just put the symbol in the TOC and add the constant.  Don't do
7234              this if reload is in progress.  */
7235           if (GET_CODE (operands[1]) == CONST
7236               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
7237               && GET_CODE (XEXP (operands[1], 0)) == PLUS
7238               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
7239               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
7240                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
7241               && ! side_effects_p (operands[0]))
7242             {
7243               rtx sym =
7244                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
7245               rtx other = XEXP (XEXP (operands[1], 0), 1);
7246
7247               sym = force_reg (mode, sym);
7248               emit_insn (gen_add3_insn (operands[0], sym, other));
7249               return;
7250             }
7251
7252           operands[1] = force_const_mem (mode, operands[1]);
7253
7254           if (TARGET_TOC
7255               && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
7256               && constant_pool_expr_p (XEXP (operands[1], 0))
7257               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
7258                         get_pool_constant (XEXP (operands[1], 0)),
7259                         get_pool_mode (XEXP (operands[1], 0))))
7260             {
7261               rtx tocref;
7262               rtx reg = NULL_RTX;
7263               if (TARGET_CMODEL != CMODEL_SMALL)
7264                 {
7265                   if (can_create_pseudo_p ())
7266                     reg = gen_reg_rtx (Pmode);
7267                   else
7268                     reg = operands[0];
7269                 }
7270               tocref = create_TOC_reference (XEXP (operands[1], 0), reg);
7271               operands[1] = gen_const_mem (mode, tocref);
7272               set_mem_alias_set (operands[1], get_TOC_alias_set ());
7273             }
7274         }
7275       break;
7276
7277     case TImode:
7278       rs6000_eliminate_indexed_memrefs (operands);
7279
7280       if (TARGET_POWER)
7281         {
7282           emit_insn (gen_rtx_PARALLEL (VOIDmode,
7283                        gen_rtvec (2,
7284                                   gen_rtx_SET (VOIDmode,
7285                                                operands[0], operands[1]),
7286                                   gen_rtx_CLOBBER (VOIDmode,
7287                                                    gen_rtx_SCRATCH (SImode)))));
7288           return;
7289         }
7290       break;
7291
7292     default:
7293       fatal_insn ("bad move", gen_rtx_SET (VOIDmode, dest, source));
7294     }
7295
7296   /* Above, we may have called force_const_mem which may have returned
7297      an invalid address.  If we can, fix this up; otherwise, reload will
7298      have to deal with it.  */
7299   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
7300     operands[1] = validize_mem (operands[1]);
7301
7302  emit_set:
7303   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7304 }
7305 \f
7306 /* Nonzero if we can use a floating-point register to pass this arg.  */
7307 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
7308   (SCALAR_FLOAT_MODE_P (MODE)                   \
7309    && (CUM)->fregno <= FP_ARG_MAX_REG           \
7310    && TARGET_HARD_FLOAT && TARGET_FPRS)
7311
7312 /* Nonzero if we can use an AltiVec register to pass this arg.  */
7313 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)              \
7314   (ALTIVEC_OR_VSX_VECTOR_MODE (MODE)                            \
7315    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
7316    && TARGET_ALTIVEC_ABI                                        \
7317    && (NAMED))
7318
7319 /* Return a nonzero value to say to return the function value in
7320    memory, just as large structures are always returned.  TYPE will be
7321    the data type of the value, and FNTYPE will be the type of the
7322    function doing the returning, or @code{NULL} for libcalls.
7323
7324    The AIX ABI for the RS/6000 specifies that all structures are
7325    returned in memory.  The Darwin ABI does the same.
7326    
7327    For the Darwin 64 Bit ABI, a function result can be returned in
7328    registers or in memory, depending on the size of the return data
7329    type.  If it is returned in registers, the value occupies the same
7330    registers as it would if it were the first and only function
7331    argument.  Otherwise, the function places its result in memory at
7332    the location pointed to by GPR3.
7333    
7334    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
7335    but a draft put them in memory, and GCC used to implement the draft
7336    instead of the final standard.  Therefore, aix_struct_return
7337    controls this instead of DEFAULT_ABI; V.4 targets needing backward
7338    compatibility can change DRAFT_V4_STRUCT_RET to override the
7339    default, and -m switches get the final word.  See
7340    rs6000_option_override_internal for more details.
7341
7342    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
7343    long double support is enabled.  These values are returned in memory.
7344
7345    int_size_in_bytes returns -1 for variable size objects, which go in
7346    memory always.  The cast to unsigned makes -1 > 8.  */
7347
7348 static bool
7349 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7350 {
7351   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
7352   if (TARGET_MACHO
7353       && rs6000_darwin64_abi
7354       && TREE_CODE (type) == RECORD_TYPE
7355       && int_size_in_bytes (type) > 0)
7356     {
7357       CUMULATIVE_ARGS valcum;
7358       rtx valret;
7359
7360       valcum.words = 0;
7361       valcum.fregno = FP_ARG_MIN_REG;
7362       valcum.vregno = ALTIVEC_ARG_MIN_REG;
7363       /* Do a trial code generation as if this were going to be passed
7364          as an argument; if any part goes in memory, we return NULL.  */
7365       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
7366       if (valret)
7367         return false;
7368       /* Otherwise fall through to more conventional ABI rules.  */
7369     }
7370
7371   if (AGGREGATE_TYPE_P (type)
7372       && (aix_struct_return
7373           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
7374     return true;
7375
7376   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
7377      modes only exist for GCC vector types if -maltivec.  */
7378   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
7379       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7380     return false;
7381
7382   /* Return synthetic vectors in memory.  */
7383   if (TREE_CODE (type) == VECTOR_TYPE
7384       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
7385     {
7386       static bool warned_for_return_big_vectors = false;
7387       if (!warned_for_return_big_vectors)
7388         {
7389           warning (0, "GCC vector returned by reference: "
7390                    "non-standard ABI extension with no compatibility guarantee");
7391           warned_for_return_big_vectors = true;
7392         }
7393       return true;
7394     }
7395
7396   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
7397     return true;
7398
7399   return false;
7400 }
7401
7402 #ifdef HAVE_AS_GNU_ATTRIBUTE
7403 /* Return TRUE if a call to function FNDECL may be one that
7404    potentially affects the function calling ABI of the object file.  */
7405
7406 static bool
7407 call_ABI_of_interest (tree fndecl)
7408 {
7409   if (cgraph_state == CGRAPH_STATE_EXPANSION)
7410     {
7411       struct cgraph_node *c_node;
7412
7413       /* Libcalls are always interesting.  */
7414       if (fndecl == NULL_TREE)
7415         return true;
7416
7417       /* Any call to an external function is interesting.  */
7418       if (DECL_EXTERNAL (fndecl))
7419         return true;
7420
7421       /* Interesting functions that we are emitting in this object file.  */
7422       c_node = cgraph_get_node (fndecl);
7423       c_node = cgraph_function_or_thunk_node (c_node, NULL);
7424       return !cgraph_only_called_directly_p (c_node);
7425     }
7426   return false;
7427 }
7428 #endif
7429
7430 /* Initialize a variable CUM of type CUMULATIVE_ARGS
7431    for a call to a function whose data type is FNTYPE.
7432    For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
7433
7434    For incoming args we set the number of arguments in the prototype large
7435    so we never return a PARALLEL.  */
7436
7437 void
7438 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
7439                       rtx libname ATTRIBUTE_UNUSED, int incoming,
7440                       int libcall, int n_named_args,
7441                       tree fndecl ATTRIBUTE_UNUSED,
7442                       enum machine_mode return_mode ATTRIBUTE_UNUSED)
7443 {
7444   static CUMULATIVE_ARGS zero_cumulative;
7445
7446   *cum = zero_cumulative;
7447   cum->words = 0;
7448   cum->fregno = FP_ARG_MIN_REG;
7449   cum->vregno = ALTIVEC_ARG_MIN_REG;
7450   cum->prototype = (fntype && prototype_p (fntype));
7451   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
7452                       ? CALL_LIBCALL : CALL_NORMAL);
7453   cum->sysv_gregno = GP_ARG_MIN_REG;
7454   cum->stdarg = stdarg_p (fntype);
7455
7456   cum->nargs_prototype = 0;
7457   if (incoming || cum->prototype)
7458     cum->nargs_prototype = n_named_args;
7459
7460   /* Check for a longcall attribute.  */
7461   if ((!fntype && rs6000_default_long_calls)
7462       || (fntype
7463           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
7464           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
7465     cum->call_cookie |= CALL_LONG;
7466
7467   if (TARGET_DEBUG_ARG)
7468     {
7469       fprintf (stderr, "\ninit_cumulative_args:");
7470       if (fntype)
7471         {
7472           tree ret_type = TREE_TYPE (fntype);
7473           fprintf (stderr, " ret code = %s,",
7474                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
7475         }
7476
7477       if (cum->call_cookie & CALL_LONG)
7478         fprintf (stderr, " longcall,");
7479
7480       fprintf (stderr, " proto = %d, nargs = %d\n",
7481                cum->prototype, cum->nargs_prototype);
7482     }
7483
7484 #ifdef HAVE_AS_GNU_ATTRIBUTE
7485   if (DEFAULT_ABI == ABI_V4)
7486     {
7487       cum->escapes = call_ABI_of_interest (fndecl);
7488       if (cum->escapes)
7489         {
7490           tree return_type;
7491
7492           if (fntype)
7493             {
7494               return_type = TREE_TYPE (fntype);
7495               return_mode = TYPE_MODE (return_type);
7496             }
7497           else
7498             return_type = lang_hooks.types.type_for_mode (return_mode, 0);
7499
7500           if (return_type != NULL)
7501             {
7502               if (TREE_CODE (return_type) == RECORD_TYPE
7503                   && TYPE_TRANSPARENT_AGGR (return_type))
7504                 {
7505                   return_type = TREE_TYPE (first_field (return_type));
7506                   return_mode = TYPE_MODE (return_type);
7507                 }
7508               if (AGGREGATE_TYPE_P (return_type)
7509                   && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
7510                       <= 8))
7511                 rs6000_returns_struct = true;
7512             }
7513           if (SCALAR_FLOAT_MODE_P (return_mode))
7514             rs6000_passes_float = true;
7515           else if (ALTIVEC_OR_VSX_VECTOR_MODE (return_mode)
7516                    || SPE_VECTOR_MODE (return_mode))
7517             rs6000_passes_vector = true;
7518         }
7519     }
7520 #endif
7521
7522   if (fntype
7523       && !TARGET_ALTIVEC
7524       && TARGET_ALTIVEC_ABI
7525       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
7526     {
7527       error ("cannot return value in vector register because"
7528              " altivec instructions are disabled, use -maltivec"
7529              " to enable them");
7530     }
7531 }
7532 \f
7533 /* Return true if TYPE must be passed on the stack and not in registers.  */
7534
7535 static bool
7536 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
7537 {
7538   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
7539     return must_pass_in_stack_var_size (mode, type);
7540   else
7541     return must_pass_in_stack_var_size_or_pad (mode, type);
7542 }
7543
7544 /* If defined, a C expression which determines whether, and in which
7545    direction, to pad out an argument with extra space.  The value
7546    should be of type `enum direction': either `upward' to pad above
7547    the argument, `downward' to pad below, or `none' to inhibit
7548    padding.
7549
7550    For the AIX ABI structs are always stored left shifted in their
7551    argument slot.  */
7552
7553 enum direction
7554 function_arg_padding (enum machine_mode mode, const_tree type)
7555 {
7556 #ifndef AGGREGATE_PADDING_FIXED
7557 #define AGGREGATE_PADDING_FIXED 0
7558 #endif
7559 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
7560 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
7561 #endif
7562
7563   if (!AGGREGATE_PADDING_FIXED)
7564     {
7565       /* GCC used to pass structures of the same size as integer types as
7566          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
7567          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
7568          passed padded downward, except that -mstrict-align further
7569          muddied the water in that multi-component structures of 2 and 4
7570          bytes in size were passed padded upward.
7571
7572          The following arranges for best compatibility with previous
7573          versions of gcc, but removes the -mstrict-align dependency.  */
7574       if (BYTES_BIG_ENDIAN)
7575         {
7576           HOST_WIDE_INT size = 0;
7577
7578           if (mode == BLKmode)
7579             {
7580               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
7581                 size = int_size_in_bytes (type);
7582             }
7583           else
7584             size = GET_MODE_SIZE (mode);
7585
7586           if (size == 1 || size == 2 || size == 4)
7587             return downward;
7588         }
7589       return upward;
7590     }
7591
7592   if (AGGREGATES_PAD_UPWARD_ALWAYS)
7593     {
7594       if (type != 0 && AGGREGATE_TYPE_P (type))
7595         return upward;
7596     }
7597
7598   /* Fall back to the default.  */
7599   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7600 }
7601
7602 /* If defined, a C expression that gives the alignment boundary, in bits,
7603    of an argument with the specified mode and type.  If it is not defined,
7604    PARM_BOUNDARY is used for all arguments.
7605
7606    V.4 wants long longs and doubles to be double word aligned.  Just
7607    testing the mode size is a boneheaded way to do this as it means
7608    that other types such as complex int are also double word aligned.
7609    However, we're stuck with this because changing the ABI might break
7610    existing library interfaces.
7611
7612    Doubleword align SPE vectors.
7613    Quadword align Altivec/VSX vectors.
7614    Quadword align large synthetic vector types.   */
7615
7616 static unsigned int
7617 rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
7618 {
7619   if (DEFAULT_ABI == ABI_V4
7620       && (GET_MODE_SIZE (mode) == 8
7621           || (TARGET_HARD_FLOAT
7622               && TARGET_FPRS
7623               && (mode == TFmode || mode == TDmode))))
7624     return 64;
7625   else if (SPE_VECTOR_MODE (mode)
7626            || (type && TREE_CODE (type) == VECTOR_TYPE
7627                && int_size_in_bytes (type) >= 8
7628                && int_size_in_bytes (type) < 16))
7629     return 64;
7630   else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
7631            || (type && TREE_CODE (type) == VECTOR_TYPE
7632                && int_size_in_bytes (type) >= 16))
7633     return 128;
7634   else if (TARGET_MACHO
7635            && rs6000_darwin64_abi
7636            && mode == BLKmode
7637            && type && TYPE_ALIGN (type) > 64)
7638     return 128;
7639   else
7640     return PARM_BOUNDARY;
7641 }
7642
7643 /* For a function parm of MODE and TYPE, return the starting word in
7644    the parameter area.  NWORDS of the parameter area are already used.  */
7645
7646 static unsigned int
7647 rs6000_parm_start (enum machine_mode mode, const_tree type,
7648                    unsigned int nwords)
7649 {
7650   unsigned int align;
7651   unsigned int parm_offset;
7652
7653   align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
7654   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
7655   return nwords + (-(parm_offset + nwords) & align);
7656 }
7657
7658 /* Compute the size (in words) of a function argument.  */
7659
7660 static unsigned long
7661 rs6000_arg_size (enum machine_mode mode, const_tree type)
7662 {
7663   unsigned long size;
7664
7665   if (mode != BLKmode)
7666     size = GET_MODE_SIZE (mode);
7667   else
7668     size = int_size_in_bytes (type);
7669
7670   if (TARGET_32BIT)
7671     return (size + 3) >> 2;
7672   else
7673     return (size + 7) >> 3;
7674 }
7675 \f
7676 /* Use this to flush pending int fields.  */
7677
7678 static void
7679 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
7680                                           HOST_WIDE_INT bitpos, int final)
7681 {
7682   unsigned int startbit, endbit;
7683   int intregs, intoffset;
7684   enum machine_mode mode;
7685
7686   /* Handle the situations where a float is taking up the first half
7687      of the GPR, and the other half is empty (typically due to
7688      alignment restrictions). We can detect this by a 8-byte-aligned
7689      int field, or by seeing that this is the final flush for this
7690      argument. Count the word and continue on.  */
7691   if (cum->floats_in_gpr == 1
7692       && (cum->intoffset % 64 == 0
7693           || (cum->intoffset == -1 && final)))
7694     {
7695       cum->words++;
7696       cum->floats_in_gpr = 0;
7697     }
7698
7699   if (cum->intoffset == -1)
7700     return;
7701
7702   intoffset = cum->intoffset;
7703   cum->intoffset = -1;
7704   cum->floats_in_gpr = 0;
7705
7706   if (intoffset % BITS_PER_WORD != 0)
7707     {
7708       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
7709                             MODE_INT, 0);
7710       if (mode == BLKmode)
7711         {
7712           /* We couldn't find an appropriate mode, which happens,
7713              e.g., in packed structs when there are 3 bytes to load.
7714              Back intoffset back to the beginning of the word in this
7715              case.  */
7716           intoffset = intoffset & -BITS_PER_WORD;
7717         }
7718     }
7719
7720   startbit = intoffset & -BITS_PER_WORD;
7721   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
7722   intregs = (endbit - startbit) / BITS_PER_WORD;
7723   cum->words += intregs;
7724   /* words should be unsigned. */
7725   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
7726     {
7727       int pad = (endbit/BITS_PER_WORD) - cum->words;
7728       cum->words += pad;
7729     }
7730 }
7731
7732 /* The darwin64 ABI calls for us to recurse down through structs,
7733    looking for elements passed in registers.  Unfortunately, we have
7734    to track int register count here also because of misalignments
7735    in powerpc alignment mode.  */
7736
7737 static void
7738 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
7739                                             const_tree type,
7740                                             HOST_WIDE_INT startbitpos)
7741 {
7742   tree f;
7743
7744   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
7745     if (TREE_CODE (f) == FIELD_DECL)
7746       {
7747         HOST_WIDE_INT bitpos = startbitpos;
7748         tree ftype = TREE_TYPE (f);
7749         enum machine_mode mode;
7750         if (ftype == error_mark_node)
7751           continue;
7752         mode = TYPE_MODE (ftype);
7753
7754         if (DECL_SIZE (f) != 0
7755             && host_integerp (bit_position (f), 1))
7756           bitpos += int_bit_position (f);
7757
7758         /* ??? FIXME: else assume zero offset.  */
7759
7760         if (TREE_CODE (ftype) == RECORD_TYPE)
7761           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
7762         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
7763           {
7764             unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
7765             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7766             cum->fregno += n_fpregs;
7767             /* Single-precision floats present a special problem for
7768                us, because they are smaller than an 8-byte GPR, and so
7769                the structure-packing rules combined with the standard
7770                varargs behavior mean that we want to pack float/float
7771                and float/int combinations into a single register's
7772                space. This is complicated by the arg advance flushing,
7773                which works on arbitrarily large groups of int-type
7774                fields.  */
7775             if (mode == SFmode)
7776               {
7777                 if (cum->floats_in_gpr == 1)
7778                   {
7779                     /* Two floats in a word; count the word and reset
7780                        the float count.  */
7781                     cum->words++;
7782                     cum->floats_in_gpr = 0;
7783                   }
7784                 else if (bitpos % 64 == 0)
7785                   {
7786                     /* A float at the beginning of an 8-byte word;
7787                        count it and put off adjusting cum->words until
7788                        we see if a arg advance flush is going to do it
7789                        for us.  */
7790                     cum->floats_in_gpr++;
7791                   }
7792                 else
7793                   {
7794                     /* The float is at the end of a word, preceded
7795                        by integer fields, so the arg advance flush
7796                        just above has already set cum->words and
7797                        everything is taken care of.  */
7798                   }
7799               }
7800             else
7801               cum->words += n_fpregs;
7802           }
7803         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
7804           {
7805             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7806             cum->vregno++;
7807             cum->words += 2;
7808           }
7809         else if (cum->intoffset == -1)
7810           cum->intoffset = bitpos;
7811       }
7812 }
7813
7814 /* Check for an item that needs to be considered specially under the darwin 64
7815    bit ABI.  These are record types where the mode is BLK or the structure is
7816    8 bytes in size.  */
7817 static int
7818 rs6000_darwin64_struct_check_p (enum machine_mode mode, const_tree type)
7819 {
7820   return rs6000_darwin64_abi
7821          && ((mode == BLKmode 
7822               && TREE_CODE (type) == RECORD_TYPE 
7823               && int_size_in_bytes (type) > 0)
7824           || (type && TREE_CODE (type) == RECORD_TYPE 
7825               && int_size_in_bytes (type) == 8)) ? 1 : 0;
7826 }
7827
7828 /* Update the data in CUM to advance over an argument
7829    of mode MODE and data type TYPE.
7830    (TYPE is null for libcalls where that information may not be available.)
7831
7832    Note that for args passed by reference, function_arg will be called
7833    with MODE and TYPE set to that of the pointer to the arg, not the arg
7834    itself.  */
7835
7836 static void
7837 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
7838                                const_tree type, bool named, int depth)
7839 {
7840   /* Only tick off an argument if we're not recursing.  */
7841   if (depth == 0)
7842     cum->nargs_prototype--;
7843
7844 #ifdef HAVE_AS_GNU_ATTRIBUTE
7845   if (DEFAULT_ABI == ABI_V4
7846       && cum->escapes)
7847     {
7848       if (SCALAR_FLOAT_MODE_P (mode))
7849         rs6000_passes_float = true;
7850       else if (named && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
7851         rs6000_passes_vector = true;
7852       else if (SPE_VECTOR_MODE (mode)
7853                && !cum->stdarg
7854                && cum->sysv_gregno <= GP_ARG_MAX_REG)
7855         rs6000_passes_vector = true;
7856     }
7857 #endif
7858
7859   if (TARGET_ALTIVEC_ABI
7860       && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
7861           || (type && TREE_CODE (type) == VECTOR_TYPE
7862               && int_size_in_bytes (type) == 16)))
7863     {
7864       bool stack = false;
7865
7866       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
7867         {
7868           cum->vregno++;
7869           if (!TARGET_ALTIVEC)
7870             error ("cannot pass argument in vector register because"
7871                    " altivec instructions are disabled, use -maltivec"
7872                    " to enable them");
7873
7874           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
7875              even if it is going to be passed in a vector register.
7876              Darwin does the same for variable-argument functions.  */
7877           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
7878               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
7879             stack = true;
7880         }
7881       else
7882         stack = true;
7883
7884       if (stack)
7885         {
7886           int align;
7887
7888           /* Vector parameters must be 16-byte aligned.  This places
7889              them at 2 mod 4 in terms of words in 32-bit mode, since
7890              the parameter save area starts at offset 24 from the
7891              stack.  In 64-bit mode, they just have to start on an
7892              even word, since the parameter save area is 16-byte
7893              aligned.  Space for GPRs is reserved even if the argument
7894              will be passed in memory.  */
7895           if (TARGET_32BIT)
7896             align = (2 - cum->words) & 3;
7897           else
7898             align = cum->words & 1;
7899           cum->words += align + rs6000_arg_size (mode, type);
7900
7901           if (TARGET_DEBUG_ARG)
7902             {
7903               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
7904                        cum->words, align);
7905               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
7906                        cum->nargs_prototype, cum->prototype,
7907                        GET_MODE_NAME (mode));
7908             }
7909         }
7910     }
7911   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
7912            && !cum->stdarg
7913            && cum->sysv_gregno <= GP_ARG_MAX_REG)
7914     cum->sysv_gregno++;
7915
7916   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
7917     {
7918       int size = int_size_in_bytes (type);
7919       /* Variable sized types have size == -1 and are
7920          treated as if consisting entirely of ints.
7921          Pad to 16 byte boundary if needed.  */
7922       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
7923           && (cum->words % 2) != 0)
7924         cum->words++;
7925       /* For varargs, we can just go up by the size of the struct. */
7926       if (!named)
7927         cum->words += (size + 7) / 8;
7928       else
7929         {
7930           /* It is tempting to say int register count just goes up by
7931              sizeof(type)/8, but this is wrong in a case such as
7932              { int; double; int; } [powerpc alignment].  We have to
7933              grovel through the fields for these too.  */
7934           cum->intoffset = 0;
7935           cum->floats_in_gpr = 0;
7936           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
7937           rs6000_darwin64_record_arg_advance_flush (cum,
7938                                                     size * BITS_PER_UNIT, 1);
7939         }
7940           if (TARGET_DEBUG_ARG)
7941             {
7942               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
7943                        cum->words, TYPE_ALIGN (type), size);
7944               fprintf (stderr, 
7945                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
7946                        cum->nargs_prototype, cum->prototype,
7947                        GET_MODE_NAME (mode));
7948             }
7949     }
7950   else if (DEFAULT_ABI == ABI_V4)
7951     {
7952       if (TARGET_HARD_FLOAT && TARGET_FPRS
7953           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
7954               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
7955               || (mode == TFmode && !TARGET_IEEEQUAD)
7956               || mode == SDmode || mode == DDmode || mode == TDmode))
7957         {
7958           /* _Decimal128 must use an even/odd register pair.  This assumes
7959              that the register number is odd when fregno is odd.  */
7960           if (mode == TDmode && (cum->fregno % 2) == 1)
7961             cum->fregno++;
7962
7963           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
7964               <= FP_ARG_V4_MAX_REG)
7965             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
7966           else
7967             {
7968               cum->fregno = FP_ARG_V4_MAX_REG + 1;
7969               if (mode == DFmode || mode == TFmode
7970                   || mode == DDmode || mode == TDmode)
7971                 cum->words += cum->words & 1;
7972               cum->words += rs6000_arg_size (mode, type);
7973             }
7974         }
7975       else
7976         {
7977           int n_words = rs6000_arg_size (mode, type);
7978           int gregno = cum->sysv_gregno;
7979
7980           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
7981              (r7,r8) or (r9,r10).  As does any other 2 word item such
7982              as complex int due to a historical mistake.  */
7983           if (n_words == 2)
7984             gregno += (1 - gregno) & 1;
7985
7986           /* Multi-reg args are not split between registers and stack.  */
7987           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
7988             {
7989               /* Long long and SPE vectors are aligned on the stack.
7990                  So are other 2 word items such as complex int due to
7991                  a historical mistake.  */
7992               if (n_words == 2)
7993                 cum->words += cum->words & 1;
7994               cum->words += n_words;
7995             }
7996
7997           /* Note: continuing to accumulate gregno past when we've started
7998              spilling to the stack indicates the fact that we've started
7999              spilling to the stack to expand_builtin_saveregs.  */
8000           cum->sysv_gregno = gregno + n_words;
8001         }
8002
8003       if (TARGET_DEBUG_ARG)
8004         {
8005           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8006                    cum->words, cum->fregno);
8007           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
8008                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
8009           fprintf (stderr, "mode = %4s, named = %d\n",
8010                    GET_MODE_NAME (mode), named);
8011         }
8012     }
8013   else
8014     {
8015       int n_words = rs6000_arg_size (mode, type);
8016       int start_words = cum->words;
8017       int align_words = rs6000_parm_start (mode, type, start_words);
8018
8019       cum->words = align_words + n_words;
8020
8021       if (SCALAR_FLOAT_MODE_P (mode)
8022           && TARGET_HARD_FLOAT && TARGET_FPRS)
8023         {
8024           /* _Decimal128 must be passed in an even/odd float register pair.
8025              This assumes that the register number is odd when fregno is
8026              odd.  */
8027           if (mode == TDmode && (cum->fregno % 2) == 1)
8028             cum->fregno++;
8029           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8030         }
8031
8032       if (TARGET_DEBUG_ARG)
8033         {
8034           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8035                    cum->words, cum->fregno);
8036           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
8037                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
8038           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
8039                    named, align_words - start_words, depth);
8040         }
8041     }
8042 }
8043
8044 static void
8045 rs6000_function_arg_advance (cumulative_args_t cum, enum machine_mode mode,
8046                              const_tree type, bool named)
8047 {
8048   rs6000_function_arg_advance_1 (get_cumulative_args (cum), mode, type, named,
8049                                  0);
8050 }
8051
8052 static rtx
8053 spe_build_register_parallel (enum machine_mode mode, int gregno)
8054 {
8055   rtx r1, r3, r5, r7;
8056
8057   switch (mode)
8058     {
8059     case DFmode:
8060       r1 = gen_rtx_REG (DImode, gregno);
8061       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8062       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
8063
8064     case DCmode:
8065     case TFmode:
8066       r1 = gen_rtx_REG (DImode, gregno);
8067       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8068       r3 = gen_rtx_REG (DImode, gregno + 2);
8069       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8070       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
8071
8072     case TCmode:
8073       r1 = gen_rtx_REG (DImode, gregno);
8074       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8075       r3 = gen_rtx_REG (DImode, gregno + 2);
8076       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8077       r5 = gen_rtx_REG (DImode, gregno + 4);
8078       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
8079       r7 = gen_rtx_REG (DImode, gregno + 6);
8080       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
8081       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
8082
8083     default:
8084       gcc_unreachable ();
8085     }
8086 }
8087
8088 /* Determine where to put a SIMD argument on the SPE.  */
8089 static rtx
8090 rs6000_spe_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
8091                          const_tree type)
8092 {
8093   int gregno = cum->sysv_gregno;
8094
8095   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
8096      are passed and returned in a pair of GPRs for ABI compatibility.  */
8097   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
8098                              || mode == DCmode || mode == TCmode))
8099     {
8100       int n_words = rs6000_arg_size (mode, type);
8101
8102       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
8103       if (mode == DFmode)
8104         gregno += (1 - gregno) & 1;
8105
8106       /* Multi-reg args are not split between registers and stack.  */
8107       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8108         return NULL_RTX;
8109
8110       return spe_build_register_parallel (mode, gregno);
8111     }
8112   if (cum->stdarg)
8113     {
8114       int n_words = rs6000_arg_size (mode, type);
8115
8116       /* SPE vectors are put in odd registers.  */
8117       if (n_words == 2 && (gregno & 1) == 0)
8118         gregno += 1;
8119
8120       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
8121         {
8122           rtx r1, r2;
8123           enum machine_mode m = SImode;
8124
8125           r1 = gen_rtx_REG (m, gregno);
8126           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
8127           r2 = gen_rtx_REG (m, gregno + 1);
8128           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
8129           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
8130         }
8131       else
8132         return NULL_RTX;
8133     }
8134   else
8135     {
8136       if (gregno <= GP_ARG_MAX_REG)
8137         return gen_rtx_REG (mode, gregno);
8138       else
8139         return NULL_RTX;
8140     }
8141 }
8142
8143 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
8144    structure between cum->intoffset and bitpos to integer registers.  */
8145
8146 static void
8147 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
8148                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
8149 {
8150   enum machine_mode mode;
8151   unsigned int regno;
8152   unsigned int startbit, endbit;
8153   int this_regno, intregs, intoffset;
8154   rtx reg;
8155
8156   if (cum->intoffset == -1)
8157     return;
8158
8159   intoffset = cum->intoffset;
8160   cum->intoffset = -1;
8161
8162   /* If this is the trailing part of a word, try to only load that
8163      much into the register.  Otherwise load the whole register.  Note
8164      that in the latter case we may pick up unwanted bits.  It's not a
8165      problem at the moment but may wish to revisit.  */
8166
8167   if (intoffset % BITS_PER_WORD != 0)
8168     {
8169       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8170                           MODE_INT, 0);
8171       if (mode == BLKmode)
8172         {
8173           /* We couldn't find an appropriate mode, which happens,
8174              e.g., in packed structs when there are 3 bytes to load.
8175              Back intoffset back to the beginning of the word in this
8176              case.  */
8177          intoffset = intoffset & -BITS_PER_WORD;
8178          mode = word_mode;
8179         }
8180     }
8181   else
8182     mode = word_mode;
8183
8184   startbit = intoffset & -BITS_PER_WORD;
8185   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8186   intregs = (endbit - startbit) / BITS_PER_WORD;
8187   this_regno = cum->words + intoffset / BITS_PER_WORD;
8188
8189   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
8190     cum->use_stack = 1;
8191
8192   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
8193   if (intregs <= 0)
8194     return;
8195
8196   intoffset /= BITS_PER_UNIT;
8197   do
8198     {
8199       regno = GP_ARG_MIN_REG + this_regno;
8200       reg = gen_rtx_REG (mode, regno);
8201       rvec[(*k)++] =
8202         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
8203
8204       this_regno += 1;
8205       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
8206       mode = word_mode;
8207       intregs -= 1;
8208     }
8209   while (intregs > 0);
8210 }
8211
8212 /* Recursive workhorse for the following.  */
8213
8214 static void
8215 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
8216                                     HOST_WIDE_INT startbitpos, rtx rvec[],
8217                                     int *k)
8218 {
8219   tree f;
8220
8221   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8222     if (TREE_CODE (f) == FIELD_DECL)
8223       {
8224         HOST_WIDE_INT bitpos = startbitpos;
8225         tree ftype = TREE_TYPE (f);
8226         enum machine_mode mode;
8227         if (ftype == error_mark_node)
8228           continue;
8229         mode = TYPE_MODE (ftype);
8230
8231         if (DECL_SIZE (f) != 0
8232             && host_integerp (bit_position (f), 1))
8233           bitpos += int_bit_position (f);
8234
8235         /* ??? FIXME: else assume zero offset.  */
8236
8237         if (TREE_CODE (ftype) == RECORD_TYPE)
8238           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
8239         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
8240           {
8241             unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8242 #if 0
8243             switch (mode)
8244               {
8245               case SCmode: mode = SFmode; break;
8246               case DCmode: mode = DFmode; break;
8247               case TCmode: mode = TFmode; break;
8248               default: break;
8249               }
8250 #endif
8251             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8252             if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8253               {
8254                 gcc_assert (cum->fregno == FP_ARG_MAX_REG
8255                             && (mode == TFmode || mode == TDmode));
8256                 /* Long double or _Decimal128 split over regs and memory.  */
8257                 mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
8258                 cum->use_stack=1;
8259               }
8260             rvec[(*k)++]
8261               = gen_rtx_EXPR_LIST (VOIDmode,
8262                                    gen_rtx_REG (mode, cum->fregno++),
8263                                    GEN_INT (bitpos / BITS_PER_UNIT));
8264             if (mode == TFmode || mode == TDmode)
8265               cum->fregno++;
8266           }
8267         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
8268           {
8269             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8270             rvec[(*k)++]
8271               = gen_rtx_EXPR_LIST (VOIDmode,
8272                                    gen_rtx_REG (mode, cum->vregno++),
8273                                    GEN_INT (bitpos / BITS_PER_UNIT));
8274           }
8275         else if (cum->intoffset == -1)
8276           cum->intoffset = bitpos;
8277       }
8278 }
8279
8280 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
8281    the register(s) to be used for each field and subfield of a struct
8282    being passed by value, along with the offset of where the
8283    register's value may be found in the block.  FP fields go in FP
8284    register, vector fields go in vector registers, and everything
8285    else goes in int registers, packed as in memory.
8286
8287    This code is also used for function return values.  RETVAL indicates
8288    whether this is the case.
8289
8290    Much of this is taken from the SPARC V9 port, which has a similar
8291    calling convention.  */
8292
8293 static rtx
8294 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
8295                             bool named, bool retval)
8296 {
8297   rtx rvec[FIRST_PSEUDO_REGISTER];
8298   int k = 1, kbase = 1;
8299   HOST_WIDE_INT typesize = int_size_in_bytes (type);
8300   /* This is a copy; modifications are not visible to our caller.  */
8301   CUMULATIVE_ARGS copy_cum = *orig_cum;
8302   CUMULATIVE_ARGS *cum = &copy_cum;
8303
8304   /* Pad to 16 byte boundary if needed.  */
8305   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8306       && (cum->words % 2) != 0)
8307     cum->words++;
8308
8309   cum->intoffset = 0;
8310   cum->use_stack = 0;
8311   cum->named = named;
8312
8313   /* Put entries into rvec[] for individual FP and vector fields, and
8314      for the chunks of memory that go in int regs.  Note we start at
8315      element 1; 0 is reserved for an indication of using memory, and
8316      may or may not be filled in below. */
8317   rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
8318   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
8319
8320   /* If any part of the struct went on the stack put all of it there.
8321      This hack is because the generic code for
8322      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
8323      parts of the struct are not at the beginning.  */
8324   if (cum->use_stack)
8325     {
8326       if (retval)
8327         return NULL_RTX;    /* doesn't go in registers at all */
8328       kbase = 0;
8329       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8330     }
8331   if (k > 1 || cum->use_stack)
8332     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
8333   else
8334     return NULL_RTX;
8335 }
8336
8337 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
8338
8339 static rtx
8340 rs6000_mixed_function_arg (enum machine_mode mode, const_tree type,
8341                            int align_words)
8342 {
8343   int n_units;
8344   int i, k;
8345   rtx rvec[GP_ARG_NUM_REG + 1];
8346
8347   if (align_words >= GP_ARG_NUM_REG)
8348     return NULL_RTX;
8349
8350   n_units = rs6000_arg_size (mode, type);
8351
8352   /* Optimize the simple case where the arg fits in one gpr, except in
8353      the case of BLKmode due to assign_parms assuming that registers are
8354      BITS_PER_WORD wide.  */
8355   if (n_units == 0
8356       || (n_units == 1 && mode != BLKmode))
8357     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8358
8359   k = 0;
8360   if (align_words + n_units > GP_ARG_NUM_REG)
8361     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
8362        using a magic NULL_RTX component.
8363        This is not strictly correct.  Only some of the arg belongs in
8364        memory, not all of it.  However, the normal scheme using
8365        function_arg_partial_nregs can result in unusual subregs, eg.
8366        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
8367        store the whole arg to memory is often more efficient than code
8368        to store pieces, and we know that space is available in the right
8369        place for the whole arg.  */
8370     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8371
8372   i = 0;
8373   do
8374     {
8375       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
8376       rtx off = GEN_INT (i++ * 4);
8377       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8378     }
8379   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
8380
8381   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8382 }
8383
8384 /* Determine where to put an argument to a function.
8385    Value is zero to push the argument on the stack,
8386    or a hard register in which to store the argument.
8387
8388    MODE is the argument's machine mode.
8389    TYPE is the data type of the argument (as a tree).
8390     This is null for libcalls where that information may
8391     not be available.
8392    CUM is a variable of type CUMULATIVE_ARGS which gives info about
8393     the preceding args and about the function being called.  It is
8394     not modified in this routine.
8395    NAMED is nonzero if this argument is a named parameter
8396     (otherwise it is an extra parameter matching an ellipsis).
8397
8398    On RS/6000 the first eight words of non-FP are normally in registers
8399    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
8400    Under V.4, the first 8 FP args are in registers.
8401
8402    If this is floating-point and no prototype is specified, we use
8403    both an FP and integer register (or possibly FP reg and stack).  Library
8404    functions (when CALL_LIBCALL is set) always have the proper types for args,
8405    so we can pass the FP value just in one register.  emit_library_function
8406    doesn't support PARALLEL anyway.
8407
8408    Note that for args passed by reference, function_arg will be called
8409    with MODE and TYPE set to that of the pointer to the arg, not the arg
8410    itself.  */
8411
8412 static rtx
8413 rs6000_function_arg (cumulative_args_t cum_v, enum machine_mode mode,
8414                      const_tree type, bool named)
8415 {
8416   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
8417   enum rs6000_abi abi = DEFAULT_ABI;
8418
8419   /* Return a marker to indicate whether CR1 needs to set or clear the
8420      bit that V.4 uses to say fp args were passed in registers.
8421      Assume that we don't need the marker for software floating point,
8422      or compiler generated library calls.  */
8423   if (mode == VOIDmode)
8424     {
8425       if (abi == ABI_V4
8426           && (cum->call_cookie & CALL_LIBCALL) == 0
8427           && (cum->stdarg
8428               || (cum->nargs_prototype < 0
8429                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
8430         {
8431           /* For the SPE, we need to crxor CR6 always.  */
8432           if (TARGET_SPE_ABI)
8433             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
8434           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
8435             return GEN_INT (cum->call_cookie
8436                             | ((cum->fregno == FP_ARG_MIN_REG)
8437                                ? CALL_V4_SET_FP_ARGS
8438                                : CALL_V4_CLEAR_FP_ARGS));
8439         }
8440
8441       return GEN_INT (cum->call_cookie & ~CALL_LIBCALL);
8442     }
8443
8444   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8445     {
8446       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
8447       if (rslt != NULL_RTX)
8448         return rslt;
8449       /* Else fall through to usual handling.  */
8450     }
8451
8452   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8453     if (TARGET_64BIT && ! cum->prototype)
8454       {
8455         /* Vector parameters get passed in vector register
8456            and also in GPRs or memory, in absence of prototype.  */
8457         int align_words;
8458         rtx slot;
8459         align_words = (cum->words + 1) & ~1;
8460
8461         if (align_words >= GP_ARG_NUM_REG)
8462           {
8463             slot = NULL_RTX;
8464           }
8465         else
8466           {
8467             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8468           }
8469         return gen_rtx_PARALLEL (mode,
8470                  gen_rtvec (2,
8471                             gen_rtx_EXPR_LIST (VOIDmode,
8472                                                slot, const0_rtx),
8473                             gen_rtx_EXPR_LIST (VOIDmode,
8474                                                gen_rtx_REG (mode, cum->vregno),
8475                                                const0_rtx)));
8476       }
8477     else
8478       return gen_rtx_REG (mode, cum->vregno);
8479   else if (TARGET_ALTIVEC_ABI
8480            && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
8481                || (type && TREE_CODE (type) == VECTOR_TYPE
8482                    && int_size_in_bytes (type) == 16)))
8483     {
8484       if (named || abi == ABI_V4)
8485         return NULL_RTX;
8486       else
8487         {
8488           /* Vector parameters to varargs functions under AIX or Darwin
8489              get passed in memory and possibly also in GPRs.  */
8490           int align, align_words, n_words;
8491           enum machine_mode part_mode;
8492
8493           /* Vector parameters must be 16-byte aligned.  This places them at
8494              2 mod 4 in terms of words in 32-bit mode, since the parameter
8495              save area starts at offset 24 from the stack.  In 64-bit mode,
8496              they just have to start on an even word, since the parameter
8497              save area is 16-byte aligned.  */
8498           if (TARGET_32BIT)
8499             align = (2 - cum->words) & 3;
8500           else
8501             align = cum->words & 1;
8502           align_words = cum->words + align;
8503
8504           /* Out of registers?  Memory, then.  */
8505           if (align_words >= GP_ARG_NUM_REG)
8506             return NULL_RTX;
8507
8508           if (TARGET_32BIT && TARGET_POWERPC64)
8509             return rs6000_mixed_function_arg (mode, type, align_words);
8510
8511           /* The vector value goes in GPRs.  Only the part of the
8512              value in GPRs is reported here.  */
8513           part_mode = mode;
8514           n_words = rs6000_arg_size (mode, type);
8515           if (align_words + n_words > GP_ARG_NUM_REG)
8516             /* Fortunately, there are only two possibilities, the value
8517                is either wholly in GPRs or half in GPRs and half not.  */
8518             part_mode = DImode;
8519
8520           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
8521         }
8522     }
8523   else if (TARGET_SPE_ABI && TARGET_SPE
8524            && (SPE_VECTOR_MODE (mode)
8525                || (TARGET_E500_DOUBLE && (mode == DFmode
8526                                           || mode == DCmode
8527                                           || mode == TFmode
8528                                           || mode == TCmode))))
8529     return rs6000_spe_function_arg (cum, mode, type);
8530
8531   else if (abi == ABI_V4)
8532     {
8533       if (TARGET_HARD_FLOAT && TARGET_FPRS
8534           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8535               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8536               || (mode == TFmode && !TARGET_IEEEQUAD)
8537               || mode == SDmode || mode == DDmode || mode == TDmode))
8538         {
8539           /* _Decimal128 must use an even/odd register pair.  This assumes
8540              that the register number is odd when fregno is odd.  */
8541           if (mode == TDmode && (cum->fregno % 2) == 1)
8542             cum->fregno++;
8543
8544           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8545               <= FP_ARG_V4_MAX_REG)
8546             return gen_rtx_REG (mode, cum->fregno);
8547           else
8548             return NULL_RTX;
8549         }
8550       else
8551         {
8552           int n_words = rs6000_arg_size (mode, type);
8553           int gregno = cum->sysv_gregno;
8554
8555           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8556              (r7,r8) or (r9,r10).  As does any other 2 word item such
8557              as complex int due to a historical mistake.  */
8558           if (n_words == 2)
8559             gregno += (1 - gregno) & 1;
8560
8561           /* Multi-reg args are not split between registers and stack.  */
8562           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8563             return NULL_RTX;
8564
8565           if (TARGET_32BIT && TARGET_POWERPC64)
8566             return rs6000_mixed_function_arg (mode, type,
8567                                               gregno - GP_ARG_MIN_REG);
8568           return gen_rtx_REG (mode, gregno);
8569         }
8570     }
8571   else
8572     {
8573       int align_words = rs6000_parm_start (mode, type, cum->words);
8574
8575       /* _Decimal128 must be passed in an even/odd float register pair.
8576          This assumes that the register number is odd when fregno is odd.  */
8577       if (mode == TDmode && (cum->fregno % 2) == 1)
8578         cum->fregno++;
8579
8580       if (USE_FP_FOR_ARG_P (cum, mode, type))
8581         {
8582           rtx rvec[GP_ARG_NUM_REG + 1];
8583           rtx r;
8584           int k;
8585           bool needs_psave;
8586           enum machine_mode fmode = mode;
8587           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8588
8589           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8590             {
8591               /* Currently, we only ever need one reg here because complex
8592                  doubles are split.  */
8593               gcc_assert (cum->fregno == FP_ARG_MAX_REG
8594                           && (fmode == TFmode || fmode == TDmode));
8595
8596               /* Long double or _Decimal128 split over regs and memory.  */
8597               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
8598             }
8599
8600           /* Do we also need to pass this arg in the parameter save
8601              area?  */
8602           needs_psave = (type
8603                          && (cum->nargs_prototype <= 0
8604                              || (DEFAULT_ABI == ABI_AIX
8605                                  && TARGET_XL_COMPAT
8606                                  && align_words >= GP_ARG_NUM_REG)));
8607
8608           if (!needs_psave && mode == fmode)
8609             return gen_rtx_REG (fmode, cum->fregno);
8610
8611           k = 0;
8612           if (needs_psave)
8613             {
8614               /* Describe the part that goes in gprs or the stack.
8615                  This piece must come first, before the fprs.  */
8616               if (align_words < GP_ARG_NUM_REG)
8617                 {
8618                   unsigned long n_words = rs6000_arg_size (mode, type);
8619
8620                   if (align_words + n_words > GP_ARG_NUM_REG
8621                       || (TARGET_32BIT && TARGET_POWERPC64))
8622                     {
8623                       /* If this is partially on the stack, then we only
8624                          include the portion actually in registers here.  */
8625                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
8626                       rtx off;
8627                       int i = 0;
8628                       if (align_words + n_words > GP_ARG_NUM_REG)
8629                         /* Not all of the arg fits in gprs.  Say that it
8630                            goes in memory too, using a magic NULL_RTX
8631                            component.  Also see comment in
8632                            rs6000_mixed_function_arg for why the normal
8633                            function_arg_partial_nregs scheme doesn't work
8634                            in this case. */
8635                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
8636                                                        const0_rtx);
8637                       do
8638                         {
8639                           r = gen_rtx_REG (rmode,
8640                                            GP_ARG_MIN_REG + align_words);
8641                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
8642                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8643                         }
8644                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
8645                     }
8646                   else
8647                     {
8648                       /* The whole arg fits in gprs.  */
8649                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8650                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8651                     }
8652                 }
8653               else
8654                 /* It's entirely in memory.  */
8655                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8656             }
8657
8658           /* Describe where this piece goes in the fprs.  */
8659           r = gen_rtx_REG (fmode, cum->fregno);
8660           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8661
8662           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8663         }
8664       else if (align_words < GP_ARG_NUM_REG)
8665         {
8666           if (TARGET_32BIT && TARGET_POWERPC64)
8667             return rs6000_mixed_function_arg (mode, type, align_words);
8668
8669           if (mode == BLKmode)
8670             mode = Pmode;
8671
8672           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8673         }
8674       else
8675         return NULL_RTX;
8676     }
8677 }
8678 \f
8679 /* For an arg passed partly in registers and partly in memory, this is
8680    the number of bytes passed in registers.  For args passed entirely in
8681    registers or entirely in memory, zero.  When an arg is described by a
8682    PARALLEL, perhaps using more than one register type, this function
8683    returns the number of bytes used by the first element of the PARALLEL.  */
8684
8685 static int
8686 rs6000_arg_partial_bytes (cumulative_args_t cum_v, enum machine_mode mode,
8687                           tree type, bool named)
8688 {
8689   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
8690   int ret = 0;
8691   int align_words;
8692
8693   if (DEFAULT_ABI == ABI_V4)
8694     return 0;
8695
8696   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
8697       && cum->nargs_prototype >= 0)
8698     return 0;
8699
8700   /* In this complicated case we just disable the partial_nregs code.  */
8701   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8702     return 0;
8703
8704   align_words = rs6000_parm_start (mode, type, cum->words);
8705
8706   if (USE_FP_FOR_ARG_P (cum, mode, type))
8707     {
8708       /* If we are passing this arg in the fixed parameter save area
8709          (gprs or memory) as well as fprs, then this function should
8710          return the number of partial bytes passed in the parameter
8711          save area rather than partial bytes passed in fprs.  */
8712       if (type
8713           && (cum->nargs_prototype <= 0
8714               || (DEFAULT_ABI == ABI_AIX
8715                   && TARGET_XL_COMPAT
8716                   && align_words >= GP_ARG_NUM_REG)))
8717         return 0;
8718       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
8719                > FP_ARG_MAX_REG + 1)
8720         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
8721       else if (cum->nargs_prototype >= 0)
8722         return 0;
8723     }
8724
8725   if (align_words < GP_ARG_NUM_REG
8726       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
8727     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
8728
8729   if (ret != 0 && TARGET_DEBUG_ARG)
8730     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
8731
8732   return ret;
8733 }
8734 \f
8735 /* A C expression that indicates when an argument must be passed by
8736    reference.  If nonzero for an argument, a copy of that argument is
8737    made in memory and a pointer to the argument is passed instead of
8738    the argument itself.  The pointer is passed in whatever way is
8739    appropriate for passing a pointer to that type.
8740
8741    Under V.4, aggregates and long double are passed by reference.
8742
8743    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
8744    reference unless the AltiVec vector extension ABI is in force.
8745
8746    As an extension to all ABIs, variable sized types are passed by
8747    reference.  */
8748
8749 static bool
8750 rs6000_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
8751                           enum machine_mode mode, const_tree type,
8752                           bool named ATTRIBUTE_UNUSED)
8753 {
8754   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
8755     {
8756       if (TARGET_DEBUG_ARG)
8757         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
8758       return 1;
8759     }
8760
8761   if (!type)
8762     return 0;
8763
8764   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
8765     {
8766       if (TARGET_DEBUG_ARG)
8767         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
8768       return 1;
8769     }
8770
8771   if (int_size_in_bytes (type) < 0)
8772     {
8773       if (TARGET_DEBUG_ARG)
8774         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
8775       return 1;
8776     }
8777
8778   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
8779      modes only exist for GCC vector types if -maltivec.  */
8780   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
8781     {
8782       if (TARGET_DEBUG_ARG)
8783         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
8784       return 1;
8785     }
8786
8787   /* Pass synthetic vectors in memory.  */
8788   if (TREE_CODE (type) == VECTOR_TYPE
8789       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
8790     {
8791       static bool warned_for_pass_big_vectors = false;
8792       if (TARGET_DEBUG_ARG)
8793         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
8794       if (!warned_for_pass_big_vectors)
8795         {
8796           warning (0, "GCC vector passed by reference: "
8797                    "non-standard ABI extension with no compatibility guarantee");
8798           warned_for_pass_big_vectors = true;
8799         }
8800       return 1;
8801     }
8802
8803   return 0;
8804 }
8805
8806 static void
8807 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
8808 {
8809   int i;
8810   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
8811
8812   if (nregs == 0)
8813     return;
8814
8815   for (i = 0; i < nregs; i++)
8816     {
8817       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
8818       if (reload_completed)
8819         {
8820           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
8821             tem = NULL_RTX;
8822           else
8823             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
8824                                        i * GET_MODE_SIZE (reg_mode));
8825         }
8826       else
8827         tem = replace_equiv_address (tem, XEXP (tem, 0));
8828
8829       gcc_assert (tem);
8830
8831       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
8832     }
8833 }
8834 \f
8835 /* Perform any needed actions needed for a function that is receiving a
8836    variable number of arguments.
8837
8838    CUM is as above.
8839
8840    MODE and TYPE are the mode and type of the current parameter.
8841
8842    PRETEND_SIZE is a variable that should be set to the amount of stack
8843    that must be pushed by the prolog to pretend that our caller pushed
8844    it.
8845
8846    Normally, this macro will push all remaining incoming registers on the
8847    stack and set PRETEND_SIZE to the length of the registers pushed.  */
8848
8849 static void
8850 setup_incoming_varargs (cumulative_args_t cum, enum machine_mode mode,
8851                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
8852                         int no_rtl)
8853 {
8854   CUMULATIVE_ARGS next_cum;
8855   int reg_size = TARGET_32BIT ? 4 : 8;
8856   rtx save_area = NULL_RTX, mem;
8857   int first_reg_offset;
8858   alias_set_type set;
8859
8860   /* Skip the last named argument.  */
8861   next_cum = *get_cumulative_args (cum);
8862   rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
8863
8864   if (DEFAULT_ABI == ABI_V4)
8865     {
8866       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
8867
8868       if (! no_rtl)
8869         {
8870           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
8871           HOST_WIDE_INT offset = 0;
8872
8873           /* Try to optimize the size of the varargs save area.
8874              The ABI requires that ap.reg_save_area is doubleword
8875              aligned, but we don't need to allocate space for all
8876              the bytes, only those to which we actually will save
8877              anything.  */
8878           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
8879             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
8880           if (TARGET_HARD_FLOAT && TARGET_FPRS
8881               && next_cum.fregno <= FP_ARG_V4_MAX_REG
8882               && cfun->va_list_fpr_size)
8883             {
8884               if (gpr_reg_num)
8885                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
8886                            * UNITS_PER_FP_WORD;
8887               if (cfun->va_list_fpr_size
8888                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
8889                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
8890               else
8891                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
8892                             * UNITS_PER_FP_WORD;
8893             }
8894           if (gpr_reg_num)
8895             {
8896               offset = -((first_reg_offset * reg_size) & ~7);
8897               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
8898                 {
8899                   gpr_reg_num = cfun->va_list_gpr_size;
8900                   if (reg_size == 4 && (first_reg_offset & 1))
8901                     gpr_reg_num++;
8902                 }
8903               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
8904             }
8905           else if (fpr_size)
8906             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
8907                        * UNITS_PER_FP_WORD
8908                      - (int) (GP_ARG_NUM_REG * reg_size);
8909
8910           if (gpr_size + fpr_size)
8911             {
8912               rtx reg_save_area
8913                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
8914               gcc_assert (GET_CODE (reg_save_area) == MEM);
8915               reg_save_area = XEXP (reg_save_area, 0);
8916               if (GET_CODE (reg_save_area) == PLUS)
8917                 {
8918                   gcc_assert (XEXP (reg_save_area, 0)
8919                               == virtual_stack_vars_rtx);
8920                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
8921                   offset += INTVAL (XEXP (reg_save_area, 1));
8922                 }
8923               else
8924                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
8925             }
8926
8927           cfun->machine->varargs_save_offset = offset;
8928           save_area = plus_constant (virtual_stack_vars_rtx, offset);
8929         }
8930     }
8931   else
8932     {
8933       first_reg_offset = next_cum.words;
8934       save_area = virtual_incoming_args_rtx;
8935
8936       if (targetm.calls.must_pass_in_stack (mode, type))
8937         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
8938     }
8939
8940   set = get_varargs_alias_set ();
8941   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
8942       && cfun->va_list_gpr_size)
8943     {
8944       int nregs = GP_ARG_NUM_REG - first_reg_offset;
8945
8946       if (va_list_gpr_counter_field)
8947         {
8948           /* V4 va_list_gpr_size counts number of registers needed.  */
8949           if (nregs > cfun->va_list_gpr_size)
8950             nregs = cfun->va_list_gpr_size;
8951         }
8952       else
8953         {
8954           /* char * va_list instead counts number of bytes needed.  */
8955           if (nregs > cfun->va_list_gpr_size / reg_size)
8956             nregs = cfun->va_list_gpr_size / reg_size;
8957         }
8958
8959       mem = gen_rtx_MEM (BLKmode,
8960                          plus_constant (save_area,
8961                                         first_reg_offset * reg_size));
8962       MEM_NOTRAP_P (mem) = 1;
8963       set_mem_alias_set (mem, set);
8964       set_mem_align (mem, BITS_PER_WORD);
8965
8966       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
8967                                   nregs);
8968     }
8969
8970   /* Save FP registers if needed.  */
8971   if (DEFAULT_ABI == ABI_V4
8972       && TARGET_HARD_FLOAT && TARGET_FPRS
8973       && ! no_rtl
8974       && next_cum.fregno <= FP_ARG_V4_MAX_REG
8975       && cfun->va_list_fpr_size)
8976     {
8977       int fregno = next_cum.fregno, nregs;
8978       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
8979       rtx lab = gen_label_rtx ();
8980       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
8981                                                * UNITS_PER_FP_WORD);
8982
8983       emit_jump_insn
8984         (gen_rtx_SET (VOIDmode,
8985                       pc_rtx,
8986                       gen_rtx_IF_THEN_ELSE (VOIDmode,
8987                                             gen_rtx_NE (VOIDmode, cr1,
8988                                                         const0_rtx),
8989                                             gen_rtx_LABEL_REF (VOIDmode, lab),
8990                                             pc_rtx)));
8991
8992       for (nregs = 0;
8993            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
8994            fregno++, off += UNITS_PER_FP_WORD, nregs++)
8995         {
8996           mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
8997                               ? DFmode : SFmode, 
8998                              plus_constant (save_area, off));
8999           MEM_NOTRAP_P (mem) = 1;
9000           set_mem_alias_set (mem, set);
9001           set_mem_align (mem, GET_MODE_ALIGNMENT (
9002                          (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9003                           ? DFmode : SFmode));
9004           emit_move_insn (mem, gen_rtx_REG (
9005                           (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9006                            ? DFmode : SFmode, fregno));
9007         }
9008
9009       emit_label (lab);
9010     }
9011 }
9012
9013 /* Create the va_list data type.  */
9014
9015 static tree
9016 rs6000_build_builtin_va_list (void)
9017 {
9018   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
9019
9020   /* For AIX, prefer 'char *' because that's what the system
9021      header files like.  */
9022   if (DEFAULT_ABI != ABI_V4)
9023     return build_pointer_type (char_type_node);
9024
9025   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
9026   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
9027                           get_identifier ("__va_list_tag"), record);
9028
9029   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
9030                       unsigned_char_type_node);
9031   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
9032                       unsigned_char_type_node);
9033   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
9034      every user file.  */
9035   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9036                       get_identifier ("reserved"), short_unsigned_type_node);
9037   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9038                       get_identifier ("overflow_arg_area"),
9039                       ptr_type_node);
9040   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9041                       get_identifier ("reg_save_area"),
9042                       ptr_type_node);
9043
9044   va_list_gpr_counter_field = f_gpr;
9045   va_list_fpr_counter_field = f_fpr;
9046
9047   DECL_FIELD_CONTEXT (f_gpr) = record;
9048   DECL_FIELD_CONTEXT (f_fpr) = record;
9049   DECL_FIELD_CONTEXT (f_res) = record;
9050   DECL_FIELD_CONTEXT (f_ovf) = record;
9051   DECL_FIELD_CONTEXT (f_sav) = record;
9052
9053   TYPE_STUB_DECL (record) = type_decl;
9054   TYPE_NAME (record) = type_decl;
9055   TYPE_FIELDS (record) = f_gpr;
9056   DECL_CHAIN (f_gpr) = f_fpr;
9057   DECL_CHAIN (f_fpr) = f_res;
9058   DECL_CHAIN (f_res) = f_ovf;
9059   DECL_CHAIN (f_ovf) = f_sav;
9060
9061   layout_type (record);
9062
9063   /* The correct type is an array type of one element.  */
9064   return build_array_type (record, build_index_type (size_zero_node));
9065 }
9066
9067 /* Implement va_start.  */
9068
9069 static void
9070 rs6000_va_start (tree valist, rtx nextarg)
9071 {
9072   HOST_WIDE_INT words, n_gpr, n_fpr;
9073   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9074   tree gpr, fpr, ovf, sav, t;
9075
9076   /* Only SVR4 needs something special.  */
9077   if (DEFAULT_ABI != ABI_V4)
9078     {
9079       std_expand_builtin_va_start (valist, nextarg);
9080       return;
9081     }
9082
9083   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9084   f_fpr = DECL_CHAIN (f_gpr);
9085   f_res = DECL_CHAIN (f_fpr);
9086   f_ovf = DECL_CHAIN (f_res);
9087   f_sav = DECL_CHAIN (f_ovf);
9088
9089   valist = build_simple_mem_ref (valist);
9090   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9091   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9092                 f_fpr, NULL_TREE);
9093   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9094                 f_ovf, NULL_TREE);
9095   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9096                 f_sav, NULL_TREE);
9097
9098   /* Count number of gp and fp argument registers used.  */
9099   words = crtl->args.info.words;
9100   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
9101                GP_ARG_NUM_REG);
9102   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
9103                FP_ARG_NUM_REG);
9104
9105   if (TARGET_DEBUG_ARG)
9106     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
9107              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
9108              words, n_gpr, n_fpr);
9109
9110   if (cfun->va_list_gpr_size)
9111     {
9112       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
9113                   build_int_cst (NULL_TREE, n_gpr));
9114       TREE_SIDE_EFFECTS (t) = 1;
9115       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9116     }
9117
9118   if (cfun->va_list_fpr_size)
9119     {
9120       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
9121                   build_int_cst (NULL_TREE, n_fpr));
9122       TREE_SIDE_EFFECTS (t) = 1;
9123       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9124
9125 #ifdef HAVE_AS_GNU_ATTRIBUTE
9126       if (call_ABI_of_interest (cfun->decl))
9127         rs6000_passes_float = true;
9128 #endif
9129     }
9130
9131   /* Find the overflow area.  */
9132   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
9133   if (words != 0)
9134     t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD);
9135   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
9136   TREE_SIDE_EFFECTS (t) = 1;
9137   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9138
9139   /* If there were no va_arg invocations, don't set up the register
9140      save area.  */
9141   if (!cfun->va_list_gpr_size
9142       && !cfun->va_list_fpr_size
9143       && n_gpr < GP_ARG_NUM_REG
9144       && n_fpr < FP_ARG_V4_MAX_REG)
9145     return;
9146
9147   /* Find the register save area.  */
9148   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
9149   if (cfun->machine->varargs_save_offset)
9150     t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
9151   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
9152   TREE_SIDE_EFFECTS (t) = 1;
9153   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9154 }
9155
9156 /* Implement va_arg.  */
9157
9158 tree
9159 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
9160                         gimple_seq *post_p)
9161 {
9162   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9163   tree gpr, fpr, ovf, sav, reg, t, u;
9164   int size, rsize, n_reg, sav_ofs, sav_scale;
9165   tree lab_false, lab_over, addr;
9166   int align;
9167   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
9168   int regalign = 0;
9169   gimple stmt;
9170
9171   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
9172     {
9173       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
9174       return build_va_arg_indirect_ref (t);
9175     }
9176
9177   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
9178      earlier version of gcc, with the property that it always applied alignment
9179      adjustments to the va-args (even for zero-sized types).  The cheapest way
9180      to deal with this is to replicate the effect of the part of 
9181      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
9182      of relevance.  
9183      We don't need to check for pass-by-reference because of the test above.
9184      We can return a simplifed answer, since we know there's no offset to add.  */
9185
9186   if (TARGET_MACHO
9187       && rs6000_darwin64_abi 
9188       && integer_zerop (TYPE_SIZE (type)))
9189     {
9190       unsigned HOST_WIDE_INT align, boundary;
9191       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
9192       align = PARM_BOUNDARY / BITS_PER_UNIT;
9193       boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
9194       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
9195         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
9196       boundary /= BITS_PER_UNIT;
9197       if (boundary > align)
9198         {
9199           tree t ;
9200           /* This updates arg ptr by the amount that would be necessary
9201              to align the zero-sized (but not zero-alignment) item.  */
9202           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9203                       fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
9204           gimplify_and_add (t, pre_p);
9205
9206           t = fold_convert (sizetype, valist_tmp);
9207           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9208                   fold_convert (TREE_TYPE (valist),
9209                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
9210                                              size_int (-boundary))));
9211           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
9212           gimplify_and_add (t, pre_p);
9213         }
9214       /* Since it is zero-sized there's no increment for the item itself. */
9215       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
9216       return build_va_arg_indirect_ref (valist_tmp);
9217     }
9218
9219   if (DEFAULT_ABI != ABI_V4)
9220     {
9221       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
9222         {
9223           tree elem_type = TREE_TYPE (type);
9224           enum machine_mode elem_mode = TYPE_MODE (elem_type);
9225           int elem_size = GET_MODE_SIZE (elem_mode);
9226
9227           if (elem_size < UNITS_PER_WORD)
9228             {
9229               tree real_part, imag_part;
9230               gimple_seq post = NULL;
9231
9232               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9233                                                   &post);
9234               /* Copy the value into a temporary, lest the formal temporary
9235                  be reused out from under us.  */
9236               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
9237               gimple_seq_add_seq (pre_p, post);
9238
9239               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9240                                                   post_p);
9241
9242               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
9243             }
9244         }
9245
9246       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
9247     }
9248
9249   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9250   f_fpr = DECL_CHAIN (f_gpr);
9251   f_res = DECL_CHAIN (f_fpr);
9252   f_ovf = DECL_CHAIN (f_res);
9253   f_sav = DECL_CHAIN (f_ovf);
9254
9255   valist = build_va_arg_indirect_ref (valist);
9256   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9257   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9258                 f_fpr, NULL_TREE);
9259   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9260                 f_ovf, NULL_TREE);
9261   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9262                 f_sav, NULL_TREE);
9263
9264   size = int_size_in_bytes (type);
9265   rsize = (size + 3) / 4;
9266   align = 1;
9267
9268   if (TARGET_HARD_FLOAT && TARGET_FPRS
9269       && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
9270           || (TARGET_DOUBLE_FLOAT 
9271               && (TYPE_MODE (type) == DFmode 
9272                   || TYPE_MODE (type) == TFmode
9273                   || TYPE_MODE (type) == SDmode
9274                   || TYPE_MODE (type) == DDmode
9275                   || TYPE_MODE (type) == TDmode))))
9276     {
9277       /* FP args go in FP registers, if present.  */
9278       reg = fpr;
9279       n_reg = (size + 7) / 8;
9280       sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
9281       sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
9282       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
9283         align = 8;
9284     }
9285   else
9286     {
9287       /* Otherwise into GP registers.  */
9288       reg = gpr;
9289       n_reg = rsize;
9290       sav_ofs = 0;
9291       sav_scale = 4;
9292       if (n_reg == 2)
9293         align = 8;
9294     }
9295
9296   /* Pull the value out of the saved registers....  */
9297
9298   lab_over = NULL;
9299   addr = create_tmp_var (ptr_type_node, "addr");
9300
9301   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
9302   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
9303     align = 16;
9304   else
9305     {
9306       lab_false = create_artificial_label (input_location);
9307       lab_over = create_artificial_label (input_location);
9308
9309       /* Long long and SPE vectors are aligned in the registers.
9310          As are any other 2 gpr item such as complex int due to a
9311          historical mistake.  */
9312       u = reg;
9313       if (n_reg == 2 && reg == gpr)
9314         {
9315           regalign = 1;
9316           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9317                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
9318           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
9319                       unshare_expr (reg), u);
9320         }
9321       /* _Decimal128 is passed in even/odd fpr pairs; the stored
9322          reg number is 0 for f1, so we want to make it odd.  */
9323       else if (reg == fpr && TYPE_MODE (type) == TDmode)
9324         {
9325           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9326                       build_int_cst (TREE_TYPE (reg), 1));
9327           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
9328         }
9329
9330       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
9331       t = build2 (GE_EXPR, boolean_type_node, u, t);
9332       u = build1 (GOTO_EXPR, void_type_node, lab_false);
9333       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
9334       gimplify_and_add (t, pre_p);
9335
9336       t = sav;
9337       if (sav_ofs)
9338         t = fold_build_pointer_plus_hwi (sav, sav_ofs);
9339
9340       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9341                   build_int_cst (TREE_TYPE (reg), n_reg));
9342       u = fold_convert (sizetype, u);
9343       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
9344       t = fold_build_pointer_plus (t, u);
9345
9346       /* _Decimal32 varargs are located in the second word of the 64-bit
9347          FP register for 32-bit binaries.  */
9348       if (!TARGET_POWERPC64
9349           && TARGET_HARD_FLOAT && TARGET_FPRS
9350           && TYPE_MODE (type) == SDmode)
9351         t = fold_build_pointer_plus_hwi (t, size);
9352
9353       gimplify_assign (addr, t, pre_p);
9354
9355       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
9356
9357       stmt = gimple_build_label (lab_false);
9358       gimple_seq_add_stmt (pre_p, stmt);
9359
9360       if ((n_reg == 2 && !regalign) || n_reg > 2)
9361         {
9362           /* Ensure that we don't find any more args in regs.
9363              Alignment has taken care of for special cases.  */
9364           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
9365         }
9366     }
9367
9368   /* ... otherwise out of the overflow area.  */
9369
9370   /* Care for on-stack alignment if needed.  */
9371   t = ovf;
9372   if (align != 1)
9373     {
9374       t = fold_build_pointer_plus_hwi (t, align - 1);
9375       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
9376                   build_int_cst (TREE_TYPE (t), -align));
9377     }
9378   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
9379
9380   gimplify_assign (unshare_expr (addr), t, pre_p);
9381
9382   t = fold_build_pointer_plus_hwi (t, size);
9383   gimplify_assign (unshare_expr (ovf), t, pre_p);
9384
9385   if (lab_over)
9386     {
9387       stmt = gimple_build_label (lab_over);
9388       gimple_seq_add_stmt (pre_p, stmt);
9389     }
9390
9391   if (STRICT_ALIGNMENT
9392       && (TYPE_ALIGN (type)
9393           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
9394     {
9395       /* The value (of type complex double, for example) may not be
9396          aligned in memory in the saved registers, so copy via a
9397          temporary.  (This is the same code as used for SPARC.)  */
9398       tree tmp = create_tmp_var (type, "va_arg_tmp");
9399       tree dest_addr = build_fold_addr_expr (tmp);
9400
9401       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
9402                                    3, dest_addr, addr, size_int (rsize * 4));
9403
9404       gimplify_and_add (copy, pre_p);
9405       addr = dest_addr;
9406     }
9407
9408   addr = fold_convert (ptrtype, addr);
9409   return build_va_arg_indirect_ref (addr);
9410 }
9411
9412 /* Builtins.  */
9413
9414 static void
9415 def_builtin (int mask, const char *name, tree type, int code)
9416 {
9417   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
9418     {
9419       tree t;
9420       if (rs6000_builtin_decls[code])
9421         fatal_error ("internal error: builtin function to %s already processed",
9422                      name);
9423
9424       rs6000_builtin_decls[code] = t =
9425         add_builtin_function (name, type, code, BUILT_IN_MD,
9426                               NULL, NULL_TREE);
9427
9428       gcc_assert (code >= 0 && code < (int)RS6000_BUILTIN_COUNT);
9429       switch (builtin_classify[code])
9430         {
9431         default:
9432           gcc_unreachable ();
9433
9434           /* assume builtin can do anything.  */
9435         case RS6000_BTC_MISC:
9436           break;
9437
9438           /* const function, function only depends on the inputs.  */
9439         case RS6000_BTC_CONST:
9440           TREE_READONLY (t) = 1;
9441           TREE_NOTHROW (t) = 1;
9442           break;
9443
9444           /* pure function, function can read global memory.  */
9445         case RS6000_BTC_PURE:
9446           DECL_PURE_P (t) = 1;
9447           TREE_NOTHROW (t) = 1;
9448           break;
9449
9450           /* Function is a math function.  If rounding mode is on, then treat
9451              the function as not reading global memory, but it can have
9452              arbitrary side effects.  If it is off, then assume the function is
9453              a const function.  This mimics the ATTR_MATHFN_FPROUNDING
9454              attribute in builtin-attribute.def that is used for the math
9455              functions. */
9456         case RS6000_BTC_FP_PURE:
9457           TREE_NOTHROW (t) = 1;
9458           if (flag_rounding_math)
9459             {
9460               DECL_PURE_P (t) = 1;
9461               DECL_IS_NOVOPS (t) = 1;
9462             }
9463           else
9464             TREE_READONLY (t) = 1;
9465           break;
9466         }
9467     }
9468 }
9469
9470 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
9471
9472 static const struct builtin_description bdesc_3arg[] =
9473 {
9474   { MASK_ALTIVEC, CODE_FOR_fmav4sf4, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
9475   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
9476   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
9477   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
9478   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
9479   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
9480   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
9481   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
9482   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
9483   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
9484   { MASK_ALTIVEC, CODE_FOR_nfmsv4sf4, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
9485   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2df, "__builtin_altivec_vperm_2df", ALTIVEC_BUILTIN_VPERM_2DF },
9486   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di, "__builtin_altivec_vperm_2di", ALTIVEC_BUILTIN_VPERM_2DI },
9487   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
9488   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
9489   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
9490   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
9491   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_altivec_vperm_2di_uns", ALTIVEC_BUILTIN_VPERM_2DI_UNS },
9492   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_altivec_vperm_4si_uns", ALTIVEC_BUILTIN_VPERM_4SI_UNS },
9493   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_altivec_vperm_8hi_uns", ALTIVEC_BUILTIN_VPERM_8HI_UNS },
9494   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi_uns", ALTIVEC_BUILTIN_VPERM_16QI_UNS },
9495   { MASK_ALTIVEC, CODE_FOR_vector_select_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
9496   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
9497   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
9498   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
9499   { MASK_ALTIVEC, CODE_FOR_vector_select_v2df, "__builtin_altivec_vsel_2df", ALTIVEC_BUILTIN_VSEL_2DF },
9500   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di, "__builtin_altivec_vsel_2di", ALTIVEC_BUILTIN_VSEL_2DI },
9501   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si_uns, "__builtin_altivec_vsel_4si_uns", ALTIVEC_BUILTIN_VSEL_4SI_UNS },
9502   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi_uns, "__builtin_altivec_vsel_8hi_uns", ALTIVEC_BUILTIN_VSEL_8HI_UNS },
9503   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi_uns, "__builtin_altivec_vsel_16qi_uns", ALTIVEC_BUILTIN_VSEL_16QI_UNS },
9504   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di_uns, "__builtin_altivec_vsel_2di_uns", ALTIVEC_BUILTIN_VSEL_2DI_UNS },
9505   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
9506   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
9507   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
9508   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
9509
9510   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
9511   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
9512   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
9513   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
9514   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
9515   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
9516   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
9517   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
9518   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
9519   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
9520   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
9521   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
9522   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
9523   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
9524   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
9525
9526   { MASK_VSX, CODE_FOR_fmav2df4, "__builtin_vsx_xvmadddp", VSX_BUILTIN_XVMADDDP },
9527   { MASK_VSX, CODE_FOR_fmsv2df4, "__builtin_vsx_xvmsubdp", VSX_BUILTIN_XVMSUBDP },
9528   { MASK_VSX, CODE_FOR_nfmav2df4, "__builtin_vsx_xvnmadddp", VSX_BUILTIN_XVNMADDDP },
9529   { MASK_VSX, CODE_FOR_nfmsv2df4, "__builtin_vsx_xvnmsubdp", VSX_BUILTIN_XVNMSUBDP },
9530
9531   { MASK_VSX, CODE_FOR_fmav4sf4, "__builtin_vsx_xvmaddsp", VSX_BUILTIN_XVMADDSP },
9532   { MASK_VSX, CODE_FOR_fmsv4sf4, "__builtin_vsx_xvmsubsp", VSX_BUILTIN_XVMSUBSP },
9533   { MASK_VSX, CODE_FOR_nfmav4sf4, "__builtin_vsx_xvnmaddsp", VSX_BUILTIN_XVNMADDSP },
9534   { MASK_VSX, CODE_FOR_nfmsv4sf4, "__builtin_vsx_xvnmsubsp", VSX_BUILTIN_XVNMSUBSP },
9535
9536   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msub", VSX_BUILTIN_VEC_MSUB },
9537   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmadd", VSX_BUILTIN_VEC_NMADD },
9538
9539   { MASK_VSX, CODE_FOR_vector_select_v2di, "__builtin_vsx_xxsel_2di", VSX_BUILTIN_XXSEL_2DI },
9540   { MASK_VSX, CODE_FOR_vector_select_v2df, "__builtin_vsx_xxsel_2df", VSX_BUILTIN_XXSEL_2DF },
9541   { MASK_VSX, CODE_FOR_vector_select_v4sf, "__builtin_vsx_xxsel_4sf", VSX_BUILTIN_XXSEL_4SF },
9542   { MASK_VSX, CODE_FOR_vector_select_v4si, "__builtin_vsx_xxsel_4si", VSX_BUILTIN_XXSEL_4SI },
9543   { MASK_VSX, CODE_FOR_vector_select_v8hi, "__builtin_vsx_xxsel_8hi", VSX_BUILTIN_XXSEL_8HI },
9544   { MASK_VSX, CODE_FOR_vector_select_v16qi, "__builtin_vsx_xxsel_16qi", VSX_BUILTIN_XXSEL_16QI },
9545   { MASK_VSX, CODE_FOR_vector_select_v2di_uns, "__builtin_vsx_xxsel_2di_uns", VSX_BUILTIN_XXSEL_2DI_UNS },
9546   { MASK_VSX, CODE_FOR_vector_select_v4si_uns, "__builtin_vsx_xxsel_4si_uns", VSX_BUILTIN_XXSEL_4SI_UNS },
9547   { MASK_VSX, CODE_FOR_vector_select_v8hi_uns, "__builtin_vsx_xxsel_8hi_uns", VSX_BUILTIN_XXSEL_8HI_UNS },
9548   { MASK_VSX, CODE_FOR_vector_select_v16qi_uns, "__builtin_vsx_xxsel_16qi_uns", VSX_BUILTIN_XXSEL_16QI_UNS },
9549
9550   { MASK_VSX, CODE_FOR_altivec_vperm_v2di, "__builtin_vsx_vperm_2di", VSX_BUILTIN_VPERM_2DI },
9551   { MASK_VSX, CODE_FOR_altivec_vperm_v2df, "__builtin_vsx_vperm_2df", VSX_BUILTIN_VPERM_2DF },
9552   { MASK_VSX, CODE_FOR_altivec_vperm_v4sf, "__builtin_vsx_vperm_4sf", VSX_BUILTIN_VPERM_4SF },
9553   { MASK_VSX, CODE_FOR_altivec_vperm_v4si, "__builtin_vsx_vperm_4si", VSX_BUILTIN_VPERM_4SI },
9554   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi, "__builtin_vsx_vperm_8hi", VSX_BUILTIN_VPERM_8HI },
9555   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi, "__builtin_vsx_vperm_16qi", VSX_BUILTIN_VPERM_16QI },
9556   { MASK_VSX, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_vsx_vperm_2di_uns", VSX_BUILTIN_VPERM_2DI_UNS },
9557   { MASK_VSX, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_vsx_vperm_4si_uns", VSX_BUILTIN_VPERM_4SI_UNS },
9558   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_vsx_vperm_8hi_uns", VSX_BUILTIN_VPERM_8HI_UNS },
9559   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_vsx_vperm_16qi_uns", VSX_BUILTIN_VPERM_16QI_UNS },
9560
9561   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2df, "__builtin_vsx_xxpermdi_2df", VSX_BUILTIN_XXPERMDI_2DF },
9562   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2di, "__builtin_vsx_xxpermdi_2di", VSX_BUILTIN_XXPERMDI_2DI },
9563   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4sf, "__builtin_vsx_xxpermdi_4sf", VSX_BUILTIN_XXPERMDI_4SF },
9564   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4si, "__builtin_vsx_xxpermdi_4si", VSX_BUILTIN_XXPERMDI_4SI },
9565   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v8hi, "__builtin_vsx_xxpermdi_8hi", VSX_BUILTIN_XXPERMDI_8HI },
9566   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v16qi, "__builtin_vsx_xxpermdi_16qi", VSX_BUILTIN_XXPERMDI_16QI },
9567   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxpermdi", VSX_BUILTIN_VEC_XXPERMDI },
9568   { MASK_VSX, CODE_FOR_vsx_set_v2df, "__builtin_vsx_set_2df", VSX_BUILTIN_SET_2DF },
9569   { MASK_VSX, CODE_FOR_vsx_set_v2di, "__builtin_vsx_set_2di", VSX_BUILTIN_SET_2DI },
9570
9571   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2di, "__builtin_vsx_xxsldwi_2di", VSX_BUILTIN_XXSLDWI_2DI },
9572   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2df, "__builtin_vsx_xxsldwi_2df", VSX_BUILTIN_XXSLDWI_2DF },
9573   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4sf, "__builtin_vsx_xxsldwi_4sf", VSX_BUILTIN_XXSLDWI_4SF },
9574   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4si, "__builtin_vsx_xxsldwi_4si", VSX_BUILTIN_XXSLDWI_4SI },
9575   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v8hi, "__builtin_vsx_xxsldwi_8hi", VSX_BUILTIN_XXSLDWI_8HI },
9576   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v16qi, "__builtin_vsx_xxsldwi_16qi", VSX_BUILTIN_XXSLDWI_16QI },
9577   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxsldwi", VSX_BUILTIN_VEC_XXSLDWI },
9578
9579   { 0, CODE_FOR_fmsv2sf4, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
9580   { 0, CODE_FOR_fmav2sf4, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
9581   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
9582   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
9583   { 0, CODE_FOR_nfmsv2sf4, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
9584   { 0, CODE_FOR_nfmav2sf4, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
9585   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
9586   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
9587   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
9588 };
9589
9590 /* DST operations: void foo (void *, const int, const char).  */
9591
9592 static const struct builtin_description bdesc_dst[] =
9593 {
9594   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
9595   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
9596   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
9597   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
9598
9599   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
9600   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
9601   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
9602   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
9603 };
9604
9605 /* Simple binary operations: VECc = foo (VECa, VECb).  */
9606
9607 static struct builtin_description bdesc_2arg[] =
9608 {
9609   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
9610   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
9611   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
9612   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
9613   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
9614   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
9615   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
9616   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
9617   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
9618   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
9619   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
9620   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
9621   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
9622   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
9623   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
9624   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
9625   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
9626   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
9627   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
9628   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
9629   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
9630   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
9631   { MASK_ALTIVEC, CODE_FOR_vector_eqv16qi, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
9632   { MASK_ALTIVEC, CODE_FOR_vector_eqv8hi, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
9633   { MASK_ALTIVEC, CODE_FOR_vector_eqv4si, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
9634   { MASK_ALTIVEC, CODE_FOR_vector_eqv4sf, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
9635   { MASK_ALTIVEC, CODE_FOR_vector_gev4sf, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
9636   { MASK_ALTIVEC, CODE_FOR_vector_gtuv16qi, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
9637   { MASK_ALTIVEC, CODE_FOR_vector_gtv16qi, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
9638   { MASK_ALTIVEC, CODE_FOR_vector_gtuv8hi, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
9639   { MASK_ALTIVEC, CODE_FOR_vector_gtv8hi, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
9640   { MASK_ALTIVEC, CODE_FOR_vector_gtuv4si, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
9641   { MASK_ALTIVEC, CODE_FOR_vector_gtv4si, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
9642   { MASK_ALTIVEC, CODE_FOR_vector_gtv4sf, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
9643   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
9644   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
9645   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
9646   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
9647   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
9648   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
9649   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
9650   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
9651   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
9652   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
9653   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
9654   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
9655   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
9656   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
9657   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
9658   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
9659   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
9660   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
9661   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
9662   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
9663   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
9664   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
9665   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
9666   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub_uns", ALTIVEC_BUILTIN_VMULEUB_UNS },
9667   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
9668   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
9669   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh_uns", ALTIVEC_BUILTIN_VMULEUH_UNS },
9670   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
9671   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
9672   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub_uns", ALTIVEC_BUILTIN_VMULOUB_UNS },
9673   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
9674   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
9675   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh_uns", ALTIVEC_BUILTIN_VMULOUH_UNS },
9676   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
9677   { MASK_ALTIVEC, CODE_FOR_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
9678   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
9679   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
9680   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
9681   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
9682   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
9683   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
9684   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
9685   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
9686   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
9687   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
9688   { MASK_ALTIVEC, CODE_FOR_recipv4sf3, "__builtin_altivec_vrecipdivfp", ALTIVEC_BUILTIN_VRECIPFP },
9689   { MASK_ALTIVEC, CODE_FOR_vrotlv16qi3, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
9690   { MASK_ALTIVEC, CODE_FOR_vrotlv8hi3, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
9691   { MASK_ALTIVEC, CODE_FOR_vrotlv4si3, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
9692   { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
9693   { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
9694   { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
9695   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
9696   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
9697   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
9698   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
9699   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
9700   { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
9701   { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
9702   { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
9703   { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
9704   { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
9705   { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
9706   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
9707   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
9708   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
9709   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
9710   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
9711   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
9712   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
9713   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
9714   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
9715   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
9716   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
9717   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
9718   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
9719   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
9720   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
9721   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
9722   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
9723   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
9724   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
9725   { MASK_ALTIVEC, CODE_FOR_vector_copysignv4sf3, "__builtin_altivec_copysignfp", ALTIVEC_BUILTIN_COPYSIGN_V4SF },
9726
9727   { MASK_VSX, CODE_FOR_addv2df3, "__builtin_vsx_xvadddp", VSX_BUILTIN_XVADDDP },
9728   { MASK_VSX, CODE_FOR_subv2df3, "__builtin_vsx_xvsubdp", VSX_BUILTIN_XVSUBDP },
9729   { MASK_VSX, CODE_FOR_mulv2df3, "__builtin_vsx_xvmuldp", VSX_BUILTIN_XVMULDP },
9730   { MASK_VSX, CODE_FOR_divv2df3, "__builtin_vsx_xvdivdp", VSX_BUILTIN_XVDIVDP },
9731   { MASK_VSX, CODE_FOR_recipv2df3, "__builtin_vsx_xvrecipdivdp", VSX_BUILTIN_RECIP_V2DF },
9732   { MASK_VSX, CODE_FOR_sminv2df3, "__builtin_vsx_xvmindp", VSX_BUILTIN_XVMINDP },
9733   { MASK_VSX, CODE_FOR_smaxv2df3, "__builtin_vsx_xvmaxdp", VSX_BUILTIN_XVMAXDP },
9734   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fe, "__builtin_vsx_xvtdivdp_fe", VSX_BUILTIN_XVTDIVDP_FE },
9735   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fg, "__builtin_vsx_xvtdivdp_fg", VSX_BUILTIN_XVTDIVDP_FG },
9736   { MASK_VSX, CODE_FOR_vector_eqv2df, "__builtin_vsx_xvcmpeqdp", VSX_BUILTIN_XVCMPEQDP },
9737   { MASK_VSX, CODE_FOR_vector_gtv2df, "__builtin_vsx_xvcmpgtdp", VSX_BUILTIN_XVCMPGTDP },
9738   { MASK_VSX, CODE_FOR_vector_gev2df, "__builtin_vsx_xvcmpgedp", VSX_BUILTIN_XVCMPGEDP },
9739
9740   { MASK_VSX, CODE_FOR_addv4sf3, "__builtin_vsx_xvaddsp", VSX_BUILTIN_XVADDSP },
9741   { MASK_VSX, CODE_FOR_subv4sf3, "__builtin_vsx_xvsubsp", VSX_BUILTIN_XVSUBSP },
9742   { MASK_VSX, CODE_FOR_mulv4sf3, "__builtin_vsx_xvmulsp", VSX_BUILTIN_XVMULSP },
9743   { MASK_VSX, CODE_FOR_divv4sf3, "__builtin_vsx_xvdivsp", VSX_BUILTIN_XVDIVSP },
9744   { MASK_VSX, CODE_FOR_recipv4sf3, "__builtin_vsx_xvrecipdivsp", VSX_BUILTIN_RECIP_V4SF },
9745   { MASK_VSX, CODE_FOR_sminv4sf3, "__builtin_vsx_xvminsp", VSX_BUILTIN_XVMINSP },
9746   { MASK_VSX, CODE_FOR_smaxv4sf3, "__builtin_vsx_xvmaxsp", VSX_BUILTIN_XVMAXSP },
9747   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fe, "__builtin_vsx_xvtdivsp_fe", VSX_BUILTIN_XVTDIVSP_FE },
9748   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fg, "__builtin_vsx_xvtdivsp_fg", VSX_BUILTIN_XVTDIVSP_FG },
9749   { MASK_VSX, CODE_FOR_vector_eqv4sf, "__builtin_vsx_xvcmpeqsp", VSX_BUILTIN_XVCMPEQSP },
9750   { MASK_VSX, CODE_FOR_vector_gtv4sf, "__builtin_vsx_xvcmpgtsp", VSX_BUILTIN_XVCMPGTSP },
9751   { MASK_VSX, CODE_FOR_vector_gev4sf, "__builtin_vsx_xvcmpgesp", VSX_BUILTIN_XVCMPGESP },
9752
9753   { MASK_VSX, CODE_FOR_smindf3, "__builtin_vsx_xsmindp", VSX_BUILTIN_XSMINDP },
9754   { MASK_VSX, CODE_FOR_smaxdf3, "__builtin_vsx_xsmaxdp", VSX_BUILTIN_XSMAXDP },
9755   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fe, "__builtin_vsx_xstdivdp_fe", VSX_BUILTIN_XSTDIVDP_FE },
9756   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fg, "__builtin_vsx_xstdivdp_fg", VSX_BUILTIN_XSTDIVDP_FG },
9757   { MASK_VSX, CODE_FOR_vector_copysignv2df3, "__builtin_vsx_cpsgndp", VSX_BUILTIN_CPSGNDP },
9758   { MASK_VSX, CODE_FOR_vector_copysignv4sf3, "__builtin_vsx_cpsgnsp", VSX_BUILTIN_CPSGNSP },
9759
9760   { MASK_VSX, CODE_FOR_vsx_concat_v2df, "__builtin_vsx_concat_2df", VSX_BUILTIN_CONCAT_2DF },
9761   { MASK_VSX, CODE_FOR_vsx_concat_v2di, "__builtin_vsx_concat_2di", VSX_BUILTIN_CONCAT_2DI },
9762   { MASK_VSX, CODE_FOR_vsx_splat_v2df, "__builtin_vsx_splat_2df", VSX_BUILTIN_SPLAT_2DF },
9763   { MASK_VSX, CODE_FOR_vsx_splat_v2di, "__builtin_vsx_splat_2di", VSX_BUILTIN_SPLAT_2DI },
9764   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4sf, "__builtin_vsx_xxmrghw", VSX_BUILTIN_XXMRGHW_4SF },
9765   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
9766   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
9767   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
9768   { MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
9769   { MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
9770   { MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
9771   { MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
9772
9773   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
9774   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
9775   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
9776   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
9777   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
9778   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
9779   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
9780   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
9781   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
9782   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
9783   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
9784   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
9785   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
9786   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
9787   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
9788   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
9789   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
9790   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
9791   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
9792   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
9793   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
9794   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
9795   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
9796   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
9797   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
9798   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
9799   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
9800   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
9801   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
9802   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
9803   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
9804   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
9805   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
9806   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
9807   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
9808   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
9809   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
9810   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
9811   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
9812   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_copysign", ALTIVEC_BUILTIN_VEC_COPYSIGN },
9813   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
9814   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
9815   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
9816   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
9817   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
9818   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
9819   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
9820   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
9821   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
9822   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
9823   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
9824   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
9825   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
9826   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
9827   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
9828   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
9829   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
9830   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
9831   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
9832   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
9833   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
9834   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
9835   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
9836   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
9837   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
9838   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
9839   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
9840   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
9841   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
9842   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
9843   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
9844   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
9845   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
9846   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
9847   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
9848   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
9849   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
9850   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
9851   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
9852   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
9853   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
9854   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
9855   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
9856   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
9857   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
9858   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
9859   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
9860   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
9861   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_recipdiv", ALTIVEC_BUILTIN_VEC_RECIP },
9862   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
9863   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
9864   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
9865   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
9866   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
9867   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
9868   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
9869   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
9870   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
9871   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
9872   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
9873   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
9874   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
9875   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
9876   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
9877   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
9878   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
9879   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
9880   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
9881   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
9882   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
9883   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
9884   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
9885   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
9886   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
9887   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
9888   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
9889   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
9890   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
9891   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
9892   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
9893   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
9894   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
9895   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
9896   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
9897   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
9898   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
9899   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
9900   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
9901   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
9902
9903   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_mul", VSX_BUILTIN_VEC_MUL },
9904   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_div", VSX_BUILTIN_VEC_DIV },
9905
9906   { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
9907   { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
9908   { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
9909   { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
9910   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
9911   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
9912   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
9913   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
9914   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
9915   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
9916
9917   /* Place holder, leave as first spe builtin.  */
9918   { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
9919   { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
9920   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
9921   { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
9922   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
9923   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
9924   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
9925   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
9926   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
9927   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
9928   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
9929   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
9930   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
9931   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
9932   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
9933   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
9934   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
9935   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
9936   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
9937   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
9938   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
9939   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
9940   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
9941   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
9942   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
9943   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
9944   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
9945   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
9946   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
9947   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
9948   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
9949   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
9950   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
9951   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
9952   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
9953   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
9954   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
9955   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
9956   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
9957   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
9958   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
9959   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
9960   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
9961   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
9962   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
9963   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
9964   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
9965   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
9966   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
9967   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
9968   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
9969   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
9970   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
9971   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
9972   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
9973   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
9974   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
9975   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
9976   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
9977   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
9978   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
9979   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
9980   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
9981   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
9982   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
9983   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
9984   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
9985   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
9986   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
9987   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
9988   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
9989   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
9990   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
9991   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
9992   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
9993   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
9994   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
9995   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
9996   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
9997   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
9998   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
9999   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
10000   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
10001   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
10002   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
10003   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
10004   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
10005   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
10006   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
10007   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
10008   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
10009   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
10010   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
10011   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
10012   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
10013   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
10014   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
10015   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
10016   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
10017   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
10018   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
10019   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
10020   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
10021   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
10022   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
10023   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
10024   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
10025   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
10026   { 0, CODE_FOR_subv2si3, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
10027
10028   /* SPE binary operations expecting a 5-bit unsigned literal.  */
10029   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
10030
10031   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
10032   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
10033   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
10034   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
10035   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
10036   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
10037   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
10038   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
10039   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
10040   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
10041   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
10042   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
10043   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
10044   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
10045   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
10046   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
10047   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
10048   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
10049   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
10050   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
10051   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
10052   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
10053   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
10054   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
10055   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
10056   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
10057
10058   /* Place-holder.  Leave as last binary SPE builtin.  */
10059   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
10060 };
10061
10062 /* AltiVec predicates.  */
10063
10064 struct builtin_description_predicates
10065 {
10066   const unsigned int mask;
10067   const enum insn_code icode;
10068   const char *const name;
10069   const enum rs6000_builtins code;
10070 };
10071
10072 static const struct builtin_description_predicates bdesc_altivec_preds[] =
10073 {
10074   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p",
10075     ALTIVEC_BUILTIN_VCMPBFP_P },
10076   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_eq_v4sf_p,
10077     "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
10078   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_ge_v4sf_p,
10079     "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
10080   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_gt_v4sf_p,
10081     "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
10082   { MASK_ALTIVEC, CODE_FOR_vector_eq_v4si_p, "__builtin_altivec_vcmpequw_p",
10083     ALTIVEC_BUILTIN_VCMPEQUW_P },
10084   { MASK_ALTIVEC, CODE_FOR_vector_gt_v4si_p, "__builtin_altivec_vcmpgtsw_p",
10085     ALTIVEC_BUILTIN_VCMPGTSW_P },
10086   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v4si_p, "__builtin_altivec_vcmpgtuw_p",
10087     ALTIVEC_BUILTIN_VCMPGTUW_P },
10088   { MASK_ALTIVEC, CODE_FOR_vector_eq_v8hi_p, "__builtin_altivec_vcmpequh_p",
10089     ALTIVEC_BUILTIN_VCMPEQUH_P },
10090   { MASK_ALTIVEC, CODE_FOR_vector_gt_v8hi_p, "__builtin_altivec_vcmpgtsh_p",
10091     ALTIVEC_BUILTIN_VCMPGTSH_P },
10092   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v8hi_p, "__builtin_altivec_vcmpgtuh_p",
10093     ALTIVEC_BUILTIN_VCMPGTUH_P },
10094   { MASK_ALTIVEC, CODE_FOR_vector_eq_v16qi_p, "__builtin_altivec_vcmpequb_p",
10095     ALTIVEC_BUILTIN_VCMPEQUB_P },
10096   { MASK_ALTIVEC, CODE_FOR_vector_gt_v16qi_p, "__builtin_altivec_vcmpgtsb_p",
10097     ALTIVEC_BUILTIN_VCMPGTSB_P },
10098   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v16qi_p, "__builtin_altivec_vcmpgtub_p",
10099     ALTIVEC_BUILTIN_VCMPGTUB_P },
10100
10101   { MASK_VSX, CODE_FOR_vector_eq_v4sf_p, "__builtin_vsx_xvcmpeqsp_p",
10102     VSX_BUILTIN_XVCMPEQSP_P },
10103   { MASK_VSX, CODE_FOR_vector_ge_v4sf_p, "__builtin_vsx_xvcmpgesp_p",
10104     VSX_BUILTIN_XVCMPGESP_P },
10105   { MASK_VSX, CODE_FOR_vector_gt_v4sf_p, "__builtin_vsx_xvcmpgtsp_p",
10106     VSX_BUILTIN_XVCMPGTSP_P },
10107   { MASK_VSX, CODE_FOR_vector_eq_v2df_p, "__builtin_vsx_xvcmpeqdp_p",
10108     VSX_BUILTIN_XVCMPEQDP_P },
10109   { MASK_VSX, CODE_FOR_vector_ge_v2df_p, "__builtin_vsx_xvcmpgedp_p",
10110     VSX_BUILTIN_XVCMPGEDP_P },
10111   { MASK_VSX, CODE_FOR_vector_gt_v2df_p, "__builtin_vsx_xvcmpgtdp_p",
10112     VSX_BUILTIN_XVCMPGTDP_P },
10113
10114   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpeq_p",
10115     ALTIVEC_BUILTIN_VCMPEQ_P },
10116   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpgt_p",
10117     ALTIVEC_BUILTIN_VCMPGT_P },
10118   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpge_p",
10119     ALTIVEC_BUILTIN_VCMPGE_P }
10120 };
10121
10122 /* SPE predicates.  */
10123 static struct builtin_description bdesc_spe_predicates[] =
10124 {
10125   /* Place-holder.  Leave as first.  */
10126   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
10127   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
10128   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
10129   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
10130   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
10131   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
10132   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
10133   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
10134   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
10135   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
10136   /* Place-holder.  Leave as last.  */
10137   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
10138 };
10139
10140 /* SPE evsel predicates.  */
10141 static struct builtin_description bdesc_spe_evsel[] =
10142 {
10143   /* Place-holder.  Leave as first.  */
10144   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
10145   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
10146   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
10147   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
10148   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
10149   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
10150   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
10151   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
10152   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
10153   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
10154   /* Place-holder.  Leave as last.  */
10155   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
10156 };
10157
10158 /* PAIRED predicates.  */
10159 static const struct builtin_description bdesc_paired_preds[] =
10160 {
10161   /* Place-holder.  Leave as first.  */
10162   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
10163   /* Place-holder.  Leave as last.  */
10164   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
10165 };
10166
10167 /* ABS* operations.  */
10168
10169 static const struct builtin_description bdesc_abs[] =
10170 {
10171   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
10172   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
10173   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
10174   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
10175   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
10176   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
10177   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI },
10178   { MASK_VSX, CODE_FOR_absv2df2, "__builtin_vsx_xvabsdp", VSX_BUILTIN_XVABSDP },
10179   { MASK_VSX, CODE_FOR_vsx_nabsv2df2, "__builtin_vsx_xvnabsdp", VSX_BUILTIN_XVNABSDP },
10180   { MASK_VSX, CODE_FOR_absv4sf2, "__builtin_vsx_xvabssp", VSX_BUILTIN_XVABSSP },
10181   { MASK_VSX, CODE_FOR_vsx_nabsv4sf2, "__builtin_vsx_xvnabssp", VSX_BUILTIN_XVNABSSP },
10182 };
10183
10184 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
10185    foo (VECa).  */
10186
10187 static struct builtin_description bdesc_1arg[] =
10188 {
10189   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
10190   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
10191   { MASK_ALTIVEC, CODE_FOR_rev4sf2, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
10192   { MASK_ALTIVEC, CODE_FOR_vector_floorv4sf2, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
10193   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
10194   { MASK_ALTIVEC, CODE_FOR_vector_ceilv4sf2, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
10195   { MASK_ALTIVEC, CODE_FOR_vector_btruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
10196   { MASK_ALTIVEC, CODE_FOR_rsqrtv4sf2, "__builtin_altivec_vrsqrtfp", ALTIVEC_BUILTIN_VRSQRTFP },
10197   { MASK_ALTIVEC, CODE_FOR_rsqrtev4sf2, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
10198   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
10199   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
10200   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
10201   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
10202   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
10203   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
10204   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
10205   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
10206   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
10207
10208   { MASK_VSX, CODE_FOR_negv2df2, "__builtin_vsx_xvnegdp", VSX_BUILTIN_XVNEGDP },
10209   { MASK_VSX, CODE_FOR_sqrtv2df2, "__builtin_vsx_xvsqrtdp", VSX_BUILTIN_XVSQRTDP },
10210   { MASK_VSX, CODE_FOR_rsqrtv2df2, "__builtin_vsx_xvrsqrtdp", VSX_BUILTIN_VEC_RSQRT_V2DF },
10211   { MASK_VSX, CODE_FOR_rsqrtev2df2, "__builtin_vsx_xvrsqrtedp", VSX_BUILTIN_XVRSQRTEDP },
10212   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fe, "__builtin_vsx_xvtsqrtdp_fe", VSX_BUILTIN_XVTSQRTDP_FE },
10213   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fg, "__builtin_vsx_xvtsqrtdp_fg", VSX_BUILTIN_XVTSQRTDP_FG },
10214   { MASK_VSX, CODE_FOR_vsx_frev2df2, "__builtin_vsx_xvredp", VSX_BUILTIN_XVREDP },
10215
10216   { MASK_VSX, CODE_FOR_negv4sf2, "__builtin_vsx_xvnegsp", VSX_BUILTIN_XVNEGSP },
10217   { MASK_VSX, CODE_FOR_sqrtv4sf2, "__builtin_vsx_xvsqrtsp", VSX_BUILTIN_XVSQRTSP },
10218   { MASK_VSX, CODE_FOR_rsqrtv4sf2, "__builtin_vsx_xvrsqrtsp", VSX_BUILTIN_VEC_RSQRT_V4SF },
10219   { MASK_VSX, CODE_FOR_rsqrtev4sf2, "__builtin_vsx_xvrsqrtesp", VSX_BUILTIN_XVRSQRTESP },
10220   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fe, "__builtin_vsx_xvtsqrtsp_fe", VSX_BUILTIN_XVTSQRTSP_FE },
10221   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fg, "__builtin_vsx_xvtsqrtsp_fg", VSX_BUILTIN_XVTSQRTSP_FG },
10222   { MASK_VSX, CODE_FOR_vsx_frev4sf2, "__builtin_vsx_xvresp", VSX_BUILTIN_XVRESP },
10223
10224   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvdpsp", VSX_BUILTIN_XSCVDPSP },
10225   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvspdp", VSX_BUILTIN_XSCVSPDP },
10226   { MASK_VSX, CODE_FOR_vsx_xvcvdpsp, "__builtin_vsx_xvcvdpsp", VSX_BUILTIN_XVCVDPSP },
10227   { MASK_VSX, CODE_FOR_vsx_xvcvspdp, "__builtin_vsx_xvcvspdp", VSX_BUILTIN_XVCVSPDP },
10228   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fe, "__builtin_vsx_xstsqrtdp_fe", VSX_BUILTIN_XSTSQRTDP_FE },
10229   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fg, "__builtin_vsx_xstsqrtdp_fg", VSX_BUILTIN_XSTSQRTDP_FG },
10230
10231   { MASK_VSX, CODE_FOR_vsx_fix_truncv2dfv2di2, "__builtin_vsx_xvcvdpsxds", VSX_BUILTIN_XVCVDPSXDS },
10232   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds", VSX_BUILTIN_XVCVDPUXDS },
10233   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds_uns", VSX_BUILTIN_XVCVDPUXDS_UNS },
10234   { MASK_VSX, CODE_FOR_vsx_floatv2div2df2, "__builtin_vsx_xvcvsxddp", VSX_BUILTIN_XVCVSXDDP },
10235   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp", VSX_BUILTIN_XVCVUXDDP },
10236   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp_uns", VSX_BUILTIN_XVCVUXDDP_UNS },
10237
10238   { MASK_VSX, CODE_FOR_vsx_fix_truncv4sfv4si2, "__builtin_vsx_xvcvspsxws", VSX_BUILTIN_XVCVSPSXWS },
10239   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv4sfv4si2, "__builtin_vsx_xvcvspuxws", VSX_BUILTIN_XVCVSPUXWS },
10240   { MASK_VSX, CODE_FOR_vsx_floatv4siv4sf2, "__builtin_vsx_xvcvsxwsp", VSX_BUILTIN_XVCVSXWSP },
10241   { MASK_VSX, CODE_FOR_vsx_floatunsv4siv4sf2, "__builtin_vsx_xvcvuxwsp", VSX_BUILTIN_XVCVUXWSP },
10242
10243   { MASK_VSX, CODE_FOR_vsx_xvcvdpsxws, "__builtin_vsx_xvcvdpsxws", VSX_BUILTIN_XVCVDPSXWS },
10244   { MASK_VSX, CODE_FOR_vsx_xvcvdpuxws, "__builtin_vsx_xvcvdpuxws", VSX_BUILTIN_XVCVDPUXWS },
10245   { MASK_VSX, CODE_FOR_vsx_xvcvsxwdp, "__builtin_vsx_xvcvsxwdp", VSX_BUILTIN_XVCVSXWDP },
10246   { MASK_VSX, CODE_FOR_vsx_xvcvuxwdp, "__builtin_vsx_xvcvuxwdp", VSX_BUILTIN_XVCVUXWDP },
10247   { MASK_VSX, CODE_FOR_vsx_xvrdpi, "__builtin_vsx_xvrdpi", VSX_BUILTIN_XVRDPI },
10248   { MASK_VSX, CODE_FOR_vsx_xvrdpic, "__builtin_vsx_xvrdpic", VSX_BUILTIN_XVRDPIC },
10249   { MASK_VSX, CODE_FOR_vsx_floorv2df2, "__builtin_vsx_xvrdpim", VSX_BUILTIN_XVRDPIM },
10250   { MASK_VSX, CODE_FOR_vsx_ceilv2df2, "__builtin_vsx_xvrdpip", VSX_BUILTIN_XVRDPIP },
10251   { MASK_VSX, CODE_FOR_vsx_btruncv2df2, "__builtin_vsx_xvrdpiz", VSX_BUILTIN_XVRDPIZ },
10252
10253   { MASK_VSX, CODE_FOR_vsx_xvcvspsxds, "__builtin_vsx_xvcvspsxds", VSX_BUILTIN_XVCVSPSXDS },
10254   { MASK_VSX, CODE_FOR_vsx_xvcvspuxds, "__builtin_vsx_xvcvspuxds", VSX_BUILTIN_XVCVSPUXDS },
10255   { MASK_VSX, CODE_FOR_vsx_xvcvsxdsp, "__builtin_vsx_xvcvsxdsp", VSX_BUILTIN_XVCVSXDSP },
10256   { MASK_VSX, CODE_FOR_vsx_xvcvuxdsp, "__builtin_vsx_xvcvuxdsp", VSX_BUILTIN_XVCVUXDSP },
10257   { MASK_VSX, CODE_FOR_vsx_xvrspi, "__builtin_vsx_xvrspi", VSX_BUILTIN_XVRSPI },
10258   { MASK_VSX, CODE_FOR_vsx_xvrspic, "__builtin_vsx_xvrspic", VSX_BUILTIN_XVRSPIC },
10259   { MASK_VSX, CODE_FOR_vsx_floorv4sf2, "__builtin_vsx_xvrspim", VSX_BUILTIN_XVRSPIM },
10260   { MASK_VSX, CODE_FOR_vsx_ceilv4sf2, "__builtin_vsx_xvrspip", VSX_BUILTIN_XVRSPIP },
10261   { MASK_VSX, CODE_FOR_vsx_btruncv4sf2, "__builtin_vsx_xvrspiz", VSX_BUILTIN_XVRSPIZ },
10262
10263   { MASK_VSX, CODE_FOR_vsx_xsrdpi, "__builtin_vsx_xsrdpi", VSX_BUILTIN_XSRDPI },
10264   { MASK_VSX, CODE_FOR_vsx_xsrdpic, "__builtin_vsx_xsrdpic", VSX_BUILTIN_XSRDPIC },
10265   { MASK_VSX, CODE_FOR_vsx_floordf2, "__builtin_vsx_xsrdpim", VSX_BUILTIN_XSRDPIM },
10266   { MASK_VSX, CODE_FOR_vsx_ceildf2, "__builtin_vsx_xsrdpip", VSX_BUILTIN_XSRDPIP },
10267   { MASK_VSX, CODE_FOR_vsx_btruncdf2, "__builtin_vsx_xsrdpiz", VSX_BUILTIN_XSRDPIZ },
10268
10269   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
10270   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
10271   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
10272   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
10273   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
10274   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
10275   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
10276   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
10277   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
10278   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrt", ALTIVEC_BUILTIN_VEC_RSQRT },
10279   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
10280   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
10281   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
10282   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
10283   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
10284   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
10285   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
10286   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
10287   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
10288   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
10289
10290   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nearbyint", ALTIVEC_BUILTIN_VEC_NEARBYINT },
10291   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_rint", ALTIVEC_BUILTIN_VEC_RINT },
10292   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sqrt", ALTIVEC_BUILTIN_VEC_SQRT },
10293
10294   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_floatv4siv4sf2, "__builtin_vec_float_sisf", VECTOR_BUILTIN_FLOAT_V4SI_V4SF },
10295   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_unsigned_floatv4siv4sf2, "__builtin_vec_uns_float_sisf", VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF },
10296   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fix_truncv4sfv4si2, "__builtin_vec_fix_sfsi", VECTOR_BUILTIN_FIX_V4SF_V4SI },
10297   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fixuns_truncv4sfv4si2, "__builtin_vec_fixuns_sfsi", VECTOR_BUILTIN_FIXUNS_V4SF_V4SI },
10298
10299   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
10300      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
10301   { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
10302   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
10303   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
10304   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
10305   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
10306   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
10307   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
10308   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
10309   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
10310   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
10311   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
10312   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
10313   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
10314   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
10315   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
10316   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
10317   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
10318   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
10319   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
10320   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
10321   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
10322   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
10323   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
10324   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
10325   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
10326   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
10327   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
10328   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
10329
10330   /* Place-holder.  Leave as last unary SPE builtin.  */
10331   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
10332
10333   { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
10334   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
10335   { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
10336   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
10337   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
10338 };
10339
10340 static rtx
10341 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
10342 {
10343   rtx pat;
10344   tree arg0 = CALL_EXPR_ARG (exp, 0);
10345   rtx op0 = expand_normal (arg0);
10346   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10347   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10348
10349   if (icode == CODE_FOR_nothing)
10350     /* Builtin not supported on this processor.  */
10351     return 0;
10352
10353   /* If we got invalid arguments bail out before generating bad rtl.  */
10354   if (arg0 == error_mark_node)
10355     return const0_rtx;
10356
10357   if (icode == CODE_FOR_altivec_vspltisb
10358       || icode == CODE_FOR_altivec_vspltish
10359       || icode == CODE_FOR_altivec_vspltisw
10360       || icode == CODE_FOR_spe_evsplatfi
10361       || icode == CODE_FOR_spe_evsplati)
10362     {
10363       /* Only allow 5-bit *signed* literals.  */
10364       if (GET_CODE (op0) != CONST_INT
10365           || INTVAL (op0) > 15
10366           || INTVAL (op0) < -16)
10367         {
10368           error ("argument 1 must be a 5-bit signed literal");
10369           return const0_rtx;
10370         }
10371     }
10372
10373   if (target == 0
10374       || GET_MODE (target) != tmode
10375       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10376     target = gen_reg_rtx (tmode);
10377
10378   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10379     op0 = copy_to_mode_reg (mode0, op0);
10380
10381   pat = GEN_FCN (icode) (target, op0);
10382   if (! pat)
10383     return 0;
10384   emit_insn (pat);
10385
10386   return target;
10387 }
10388
10389 static rtx
10390 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
10391 {
10392   rtx pat, scratch1, scratch2;
10393   tree arg0 = CALL_EXPR_ARG (exp, 0);
10394   rtx op0 = expand_normal (arg0);
10395   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10396   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10397
10398   /* If we have invalid arguments, bail out before generating bad rtl.  */
10399   if (arg0 == error_mark_node)
10400     return const0_rtx;
10401
10402   if (target == 0
10403       || GET_MODE (target) != tmode
10404       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10405     target = gen_reg_rtx (tmode);
10406
10407   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10408     op0 = copy_to_mode_reg (mode0, op0);
10409
10410   scratch1 = gen_reg_rtx (mode0);
10411   scratch2 = gen_reg_rtx (mode0);
10412
10413   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
10414   if (! pat)
10415     return 0;
10416   emit_insn (pat);
10417
10418   return target;
10419 }
10420
10421 static rtx
10422 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
10423 {
10424   rtx pat;
10425   tree arg0 = CALL_EXPR_ARG (exp, 0);
10426   tree arg1 = CALL_EXPR_ARG (exp, 1);
10427   rtx op0 = expand_normal (arg0);
10428   rtx op1 = expand_normal (arg1);
10429   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10430   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10431   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10432
10433   if (icode == CODE_FOR_nothing)
10434     /* Builtin not supported on this processor.  */
10435     return 0;
10436
10437   /* If we got invalid arguments bail out before generating bad rtl.  */
10438   if (arg0 == error_mark_node || arg1 == error_mark_node)
10439     return const0_rtx;
10440
10441   if (icode == CODE_FOR_altivec_vcfux
10442       || icode == CODE_FOR_altivec_vcfsx
10443       || icode == CODE_FOR_altivec_vctsxs
10444       || icode == CODE_FOR_altivec_vctuxs
10445       || icode == CODE_FOR_altivec_vspltb
10446       || icode == CODE_FOR_altivec_vsplth
10447       || icode == CODE_FOR_altivec_vspltw
10448       || icode == CODE_FOR_spe_evaddiw
10449       || icode == CODE_FOR_spe_evldd
10450       || icode == CODE_FOR_spe_evldh
10451       || icode == CODE_FOR_spe_evldw
10452       || icode == CODE_FOR_spe_evlhhesplat
10453       || icode == CODE_FOR_spe_evlhhossplat
10454       || icode == CODE_FOR_spe_evlhhousplat
10455       || icode == CODE_FOR_spe_evlwhe
10456       || icode == CODE_FOR_spe_evlwhos
10457       || icode == CODE_FOR_spe_evlwhou
10458       || icode == CODE_FOR_spe_evlwhsplat
10459       || icode == CODE_FOR_spe_evlwwsplat
10460       || icode == CODE_FOR_spe_evrlwi
10461       || icode == CODE_FOR_spe_evslwi
10462       || icode == CODE_FOR_spe_evsrwis
10463       || icode == CODE_FOR_spe_evsubifw
10464       || icode == CODE_FOR_spe_evsrwiu)
10465     {
10466       /* Only allow 5-bit unsigned literals.  */
10467       STRIP_NOPS (arg1);
10468       if (TREE_CODE (arg1) != INTEGER_CST
10469           || TREE_INT_CST_LOW (arg1) & ~0x1f)
10470         {
10471           error ("argument 2 must be a 5-bit unsigned literal");
10472           return const0_rtx;
10473         }
10474     }
10475
10476   if (target == 0
10477       || GET_MODE (target) != tmode
10478       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10479     target = gen_reg_rtx (tmode);
10480
10481   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10482     op0 = copy_to_mode_reg (mode0, op0);
10483   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10484     op1 = copy_to_mode_reg (mode1, op1);
10485
10486   pat = GEN_FCN (icode) (target, op0, op1);
10487   if (! pat)
10488     return 0;
10489   emit_insn (pat);
10490
10491   return target;
10492 }
10493
10494 static rtx
10495 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
10496 {
10497   rtx pat, scratch;
10498   tree cr6_form = CALL_EXPR_ARG (exp, 0);
10499   tree arg0 = CALL_EXPR_ARG (exp, 1);
10500   tree arg1 = CALL_EXPR_ARG (exp, 2);
10501   rtx op0 = expand_normal (arg0);
10502   rtx op1 = expand_normal (arg1);
10503   enum machine_mode tmode = SImode;
10504   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10505   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10506   int cr6_form_int;
10507
10508   if (TREE_CODE (cr6_form) != INTEGER_CST)
10509     {
10510       error ("argument 1 of __builtin_altivec_predicate must be a constant");
10511       return const0_rtx;
10512     }
10513   else
10514     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
10515
10516   gcc_assert (mode0 == mode1);
10517
10518   /* If we have invalid arguments, bail out before generating bad rtl.  */
10519   if (arg0 == error_mark_node || arg1 == error_mark_node)
10520     return const0_rtx;
10521
10522   if (target == 0
10523       || GET_MODE (target) != tmode
10524       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10525     target = gen_reg_rtx (tmode);
10526
10527   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10528     op0 = copy_to_mode_reg (mode0, op0);
10529   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10530     op1 = copy_to_mode_reg (mode1, op1);
10531
10532   scratch = gen_reg_rtx (mode0);
10533
10534   pat = GEN_FCN (icode) (scratch, op0, op1);
10535   if (! pat)
10536     return 0;
10537   emit_insn (pat);
10538
10539   /* The vec_any* and vec_all* predicates use the same opcodes for two
10540      different operations, but the bits in CR6 will be different
10541      depending on what information we want.  So we have to play tricks
10542      with CR6 to get the right bits out.
10543
10544      If you think this is disgusting, look at the specs for the
10545      AltiVec predicates.  */
10546
10547   switch (cr6_form_int)
10548     {
10549     case 0:
10550       emit_insn (gen_cr6_test_for_zero (target));
10551       break;
10552     case 1:
10553       emit_insn (gen_cr6_test_for_zero_reverse (target));
10554       break;
10555     case 2:
10556       emit_insn (gen_cr6_test_for_lt (target));
10557       break;
10558     case 3:
10559       emit_insn (gen_cr6_test_for_lt_reverse (target));
10560       break;
10561     default:
10562       error ("argument 1 of __builtin_altivec_predicate is out of range");
10563       break;
10564     }
10565
10566   return target;
10567 }
10568
10569 static rtx
10570 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
10571 {
10572   rtx pat, addr;
10573   tree arg0 = CALL_EXPR_ARG (exp, 0);
10574   tree arg1 = CALL_EXPR_ARG (exp, 1);
10575   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10576   enum machine_mode mode0 = Pmode;
10577   enum machine_mode mode1 = Pmode;
10578   rtx op0 = expand_normal (arg0);
10579   rtx op1 = expand_normal (arg1);
10580
10581   if (icode == CODE_FOR_nothing)
10582     /* Builtin not supported on this processor.  */
10583     return 0;
10584
10585   /* If we got invalid arguments bail out before generating bad rtl.  */
10586   if (arg0 == error_mark_node || arg1 == error_mark_node)
10587     return const0_rtx;
10588
10589   if (target == 0
10590       || GET_MODE (target) != tmode
10591       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10592     target = gen_reg_rtx (tmode);
10593
10594   op1 = copy_to_mode_reg (mode1, op1);
10595
10596   if (op0 == const0_rtx)
10597     {
10598       addr = gen_rtx_MEM (tmode, op1);
10599     }
10600   else
10601     {
10602       op0 = copy_to_mode_reg (mode0, op0);
10603       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
10604     }
10605
10606   pat = GEN_FCN (icode) (target, addr);
10607
10608   if (! pat)
10609     return 0;
10610   emit_insn (pat);
10611
10612   return target;
10613 }
10614
10615 static rtx
10616 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
10617 {
10618   rtx pat, addr;
10619   tree arg0 = CALL_EXPR_ARG (exp, 0);
10620   tree arg1 = CALL_EXPR_ARG (exp, 1);
10621   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10622   enum machine_mode mode0 = Pmode;
10623   enum machine_mode mode1 = Pmode;
10624   rtx op0 = expand_normal (arg0);
10625   rtx op1 = expand_normal (arg1);
10626
10627   if (icode == CODE_FOR_nothing)
10628     /* Builtin not supported on this processor.  */
10629     return 0;
10630
10631   /* If we got invalid arguments bail out before generating bad rtl.  */
10632   if (arg0 == error_mark_node || arg1 == error_mark_node)
10633     return const0_rtx;
10634
10635   if (target == 0
10636       || GET_MODE (target) != tmode
10637       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10638     target = gen_reg_rtx (tmode);
10639
10640   op1 = copy_to_mode_reg (mode1, op1);
10641
10642   if (op0 == const0_rtx)
10643     {
10644       addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
10645     }
10646   else
10647     {
10648       op0 = copy_to_mode_reg (mode0, op0);
10649       addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
10650     }
10651
10652   pat = GEN_FCN (icode) (target, addr);
10653
10654   if (! pat)
10655     return 0;
10656   emit_insn (pat);
10657
10658   return target;
10659 }
10660
10661 static rtx
10662 spe_expand_stv_builtin (enum insn_code icode, tree exp)
10663 {
10664   tree arg0 = CALL_EXPR_ARG (exp, 0);
10665   tree arg1 = CALL_EXPR_ARG (exp, 1);
10666   tree arg2 = CALL_EXPR_ARG (exp, 2);
10667   rtx op0 = expand_normal (arg0);
10668   rtx op1 = expand_normal (arg1);
10669   rtx op2 = expand_normal (arg2);
10670   rtx pat;
10671   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
10672   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
10673   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
10674
10675   /* Invalid arguments.  Bail before doing anything stoopid!  */
10676   if (arg0 == error_mark_node
10677       || arg1 == error_mark_node
10678       || arg2 == error_mark_node)
10679     return const0_rtx;
10680
10681   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
10682     op0 = copy_to_mode_reg (mode2, op0);
10683   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
10684     op1 = copy_to_mode_reg (mode0, op1);
10685   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
10686     op2 = copy_to_mode_reg (mode1, op2);
10687
10688   pat = GEN_FCN (icode) (op1, op2, op0);
10689   if (pat)
10690     emit_insn (pat);
10691   return NULL_RTX;
10692 }
10693
10694 static rtx
10695 paired_expand_stv_builtin (enum insn_code icode, tree exp)
10696 {
10697   tree arg0 = CALL_EXPR_ARG (exp, 0);
10698   tree arg1 = CALL_EXPR_ARG (exp, 1);
10699   tree arg2 = CALL_EXPR_ARG (exp, 2);
10700   rtx op0 = expand_normal (arg0);
10701   rtx op1 = expand_normal (arg1);
10702   rtx op2 = expand_normal (arg2);
10703   rtx pat, addr;
10704   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10705   enum machine_mode mode1 = Pmode;
10706   enum machine_mode mode2 = Pmode;
10707
10708   /* Invalid arguments.  Bail before doing anything stoopid!  */
10709   if (arg0 == error_mark_node
10710       || arg1 == error_mark_node
10711       || arg2 == error_mark_node)
10712     return const0_rtx;
10713
10714   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
10715     op0 = copy_to_mode_reg (tmode, op0);
10716
10717   op2 = copy_to_mode_reg (mode2, op2);
10718
10719   if (op1 == const0_rtx)
10720     {
10721       addr = gen_rtx_MEM (tmode, op2);
10722     }
10723   else
10724     {
10725       op1 = copy_to_mode_reg (mode1, op1);
10726       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10727     }
10728
10729   pat = GEN_FCN (icode) (addr, op0);
10730   if (pat)
10731     emit_insn (pat);
10732   return NULL_RTX;
10733 }
10734
10735 static rtx
10736 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
10737 {
10738   tree arg0 = CALL_EXPR_ARG (exp, 0);
10739   tree arg1 = CALL_EXPR_ARG (exp, 1);
10740   tree arg2 = CALL_EXPR_ARG (exp, 2);
10741   rtx op0 = expand_normal (arg0);
10742   rtx op1 = expand_normal (arg1);
10743   rtx op2 = expand_normal (arg2);
10744   rtx pat, addr;
10745   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10746   enum machine_mode smode = insn_data[icode].operand[1].mode;
10747   enum machine_mode mode1 = Pmode;
10748   enum machine_mode mode2 = Pmode;
10749
10750   /* Invalid arguments.  Bail before doing anything stoopid!  */
10751   if (arg0 == error_mark_node
10752       || arg1 == error_mark_node
10753       || arg2 == error_mark_node)
10754     return const0_rtx;
10755
10756   if (! (*insn_data[icode].operand[1].predicate) (op0, smode))
10757     op0 = copy_to_mode_reg (smode, op0);
10758
10759   op2 = copy_to_mode_reg (mode2, op2);
10760
10761   if (op1 == const0_rtx)
10762     {
10763       addr = gen_rtx_MEM (tmode, op2);
10764     }
10765   else
10766     {
10767       op1 = copy_to_mode_reg (mode1, op1);
10768       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10769     }
10770
10771   pat = GEN_FCN (icode) (addr, op0);
10772   if (pat)
10773     emit_insn (pat);
10774   return NULL_RTX;
10775 }
10776
10777 static rtx
10778 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
10779 {
10780   rtx pat;
10781   tree arg0 = CALL_EXPR_ARG (exp, 0);
10782   tree arg1 = CALL_EXPR_ARG (exp, 1);
10783   tree arg2 = CALL_EXPR_ARG (exp, 2);
10784   rtx op0 = expand_normal (arg0);
10785   rtx op1 = expand_normal (arg1);
10786   rtx op2 = expand_normal (arg2);
10787   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10788   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10789   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10790   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
10791
10792   if (icode == CODE_FOR_nothing)
10793     /* Builtin not supported on this processor.  */
10794     return 0;
10795
10796   /* If we got invalid arguments bail out before generating bad rtl.  */
10797   if (arg0 == error_mark_node
10798       || arg1 == error_mark_node
10799       || arg2 == error_mark_node)
10800     return const0_rtx;
10801
10802   /* Check and prepare argument depending on the instruction code.
10803
10804      Note that a switch statement instead of the sequence of tests
10805      would be incorrect as many of the CODE_FOR values could be
10806      CODE_FOR_nothing and that would yield multiple alternatives
10807      with identical values.  We'd never reach here at runtime in
10808      this case.  */
10809   if (icode == CODE_FOR_altivec_vsldoi_v4sf
10810       || icode == CODE_FOR_altivec_vsldoi_v4si
10811       || icode == CODE_FOR_altivec_vsldoi_v8hi
10812       || icode == CODE_FOR_altivec_vsldoi_v16qi)
10813     {
10814       /* Only allow 4-bit unsigned literals.  */
10815       STRIP_NOPS (arg2);
10816       if (TREE_CODE (arg2) != INTEGER_CST
10817           || TREE_INT_CST_LOW (arg2) & ~0xf)
10818         {
10819           error ("argument 3 must be a 4-bit unsigned literal");
10820           return const0_rtx;
10821         }
10822     }
10823   else if (icode == CODE_FOR_vsx_xxpermdi_v2df
10824            || icode == CODE_FOR_vsx_xxpermdi_v2di
10825            || icode == CODE_FOR_vsx_xxsldwi_v16qi
10826            || icode == CODE_FOR_vsx_xxsldwi_v8hi
10827            || icode == CODE_FOR_vsx_xxsldwi_v4si
10828            || icode == CODE_FOR_vsx_xxsldwi_v4sf
10829            || icode == CODE_FOR_vsx_xxsldwi_v2di
10830            || icode == CODE_FOR_vsx_xxsldwi_v2df)
10831     {
10832       /* Only allow 2-bit unsigned literals.  */
10833       STRIP_NOPS (arg2);
10834       if (TREE_CODE (arg2) != INTEGER_CST
10835           || TREE_INT_CST_LOW (arg2) & ~0x3)
10836         {
10837           error ("argument 3 must be a 2-bit unsigned literal");
10838           return const0_rtx;
10839         }
10840     }
10841   else if (icode == CODE_FOR_vsx_set_v2df
10842            || icode == CODE_FOR_vsx_set_v2di)
10843     {
10844       /* Only allow 1-bit unsigned literals.  */
10845       STRIP_NOPS (arg2);
10846       if (TREE_CODE (arg2) != INTEGER_CST
10847           || TREE_INT_CST_LOW (arg2) & ~0x1)
10848         {
10849           error ("argument 3 must be a 1-bit unsigned literal");
10850           return const0_rtx;
10851         }
10852     }
10853
10854   if (target == 0
10855       || GET_MODE (target) != tmode
10856       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10857     target = gen_reg_rtx (tmode);
10858
10859   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10860     op0 = copy_to_mode_reg (mode0, op0);
10861   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10862     op1 = copy_to_mode_reg (mode1, op1);
10863   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
10864     op2 = copy_to_mode_reg (mode2, op2);
10865
10866   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
10867     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
10868   else 
10869     pat = GEN_FCN (icode) (target, op0, op1, op2);
10870   if (! pat)
10871     return 0;
10872   emit_insn (pat);
10873
10874   return target;
10875 }
10876
10877 /* Expand the lvx builtins.  */
10878 static rtx
10879 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
10880 {
10881   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10882   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10883   tree arg0;
10884   enum machine_mode tmode, mode0;
10885   rtx pat, op0;
10886   enum insn_code icode;
10887
10888   switch (fcode)
10889     {
10890     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
10891       icode = CODE_FOR_vector_altivec_load_v16qi;
10892       break;
10893     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
10894       icode = CODE_FOR_vector_altivec_load_v8hi;
10895       break;
10896     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
10897       icode = CODE_FOR_vector_altivec_load_v4si;
10898       break;
10899     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
10900       icode = CODE_FOR_vector_altivec_load_v4sf;
10901       break;
10902     case ALTIVEC_BUILTIN_LD_INTERNAL_2df:
10903       icode = CODE_FOR_vector_altivec_load_v2df;
10904       break;
10905     case ALTIVEC_BUILTIN_LD_INTERNAL_2di:
10906       icode = CODE_FOR_vector_altivec_load_v2di;
10907       break;
10908     default:
10909       *expandedp = false;
10910       return NULL_RTX;
10911     }
10912
10913   *expandedp = true;
10914
10915   arg0 = CALL_EXPR_ARG (exp, 0);
10916   op0 = expand_normal (arg0);
10917   tmode = insn_data[icode].operand[0].mode;
10918   mode0 = insn_data[icode].operand[1].mode;
10919
10920   if (target == 0
10921       || GET_MODE (target) != tmode
10922       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10923     target = gen_reg_rtx (tmode);
10924
10925   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10926     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
10927
10928   pat = GEN_FCN (icode) (target, op0);
10929   if (! pat)
10930     return 0;
10931   emit_insn (pat);
10932   return target;
10933 }
10934
10935 /* Expand the stvx builtins.  */
10936 static rtx
10937 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
10938                            bool *expandedp)
10939 {
10940   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10941   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10942   tree arg0, arg1;
10943   enum machine_mode mode0, mode1;
10944   rtx pat, op0, op1;
10945   enum insn_code icode;
10946
10947   switch (fcode)
10948     {
10949     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
10950       icode = CODE_FOR_vector_altivec_store_v16qi;
10951       break;
10952     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
10953       icode = CODE_FOR_vector_altivec_store_v8hi;
10954       break;
10955     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
10956       icode = CODE_FOR_vector_altivec_store_v4si;
10957       break;
10958     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
10959       icode = CODE_FOR_vector_altivec_store_v4sf;
10960       break;
10961     case ALTIVEC_BUILTIN_ST_INTERNAL_2df:
10962       icode = CODE_FOR_vector_altivec_store_v2df;
10963       break;
10964     case ALTIVEC_BUILTIN_ST_INTERNAL_2di:
10965       icode = CODE_FOR_vector_altivec_store_v2di;
10966       break;
10967     default:
10968       *expandedp = false;
10969       return NULL_RTX;
10970     }
10971
10972   arg0 = CALL_EXPR_ARG (exp, 0);
10973   arg1 = CALL_EXPR_ARG (exp, 1);
10974   op0 = expand_normal (arg0);
10975   op1 = expand_normal (arg1);
10976   mode0 = insn_data[icode].operand[0].mode;
10977   mode1 = insn_data[icode].operand[1].mode;
10978
10979   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
10980     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
10981   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
10982     op1 = copy_to_mode_reg (mode1, op1);
10983
10984   pat = GEN_FCN (icode) (op0, op1);
10985   if (pat)
10986     emit_insn (pat);
10987
10988   *expandedp = true;
10989   return NULL_RTX;
10990 }
10991
10992 /* Expand the dst builtins.  */
10993 static rtx
10994 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
10995                             bool *expandedp)
10996 {
10997   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10998   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10999   tree arg0, arg1, arg2;
11000   enum machine_mode mode0, mode1;
11001   rtx pat, op0, op1, op2;
11002   const struct builtin_description *d;
11003   size_t i;
11004
11005   *expandedp = false;
11006
11007   /* Handle DST variants.  */
11008   d = bdesc_dst;
11009   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
11010     if (d->code == fcode)
11011       {
11012         arg0 = CALL_EXPR_ARG (exp, 0);
11013         arg1 = CALL_EXPR_ARG (exp, 1);
11014         arg2 = CALL_EXPR_ARG (exp, 2);
11015         op0 = expand_normal (arg0);
11016         op1 = expand_normal (arg1);
11017         op2 = expand_normal (arg2);
11018         mode0 = insn_data[d->icode].operand[0].mode;
11019         mode1 = insn_data[d->icode].operand[1].mode;
11020
11021         /* Invalid arguments, bail out before generating bad rtl.  */
11022         if (arg0 == error_mark_node
11023             || arg1 == error_mark_node
11024             || arg2 == error_mark_node)
11025           return const0_rtx;
11026
11027         *expandedp = true;
11028         STRIP_NOPS (arg2);
11029         if (TREE_CODE (arg2) != INTEGER_CST
11030             || TREE_INT_CST_LOW (arg2) & ~0x3)
11031           {
11032             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
11033             return const0_rtx;
11034           }
11035
11036         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
11037           op0 = copy_to_mode_reg (Pmode, op0);
11038         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
11039           op1 = copy_to_mode_reg (mode1, op1);
11040
11041         pat = GEN_FCN (d->icode) (op0, op1, op2);
11042         if (pat != 0)
11043           emit_insn (pat);
11044
11045         return NULL_RTX;
11046       }
11047
11048   return NULL_RTX;
11049 }
11050
11051 /* Expand vec_init builtin.  */
11052 static rtx
11053 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
11054 {
11055   enum machine_mode tmode = TYPE_MODE (type);
11056   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
11057   int i, n_elt = GET_MODE_NUNITS (tmode);
11058   rtvec v = rtvec_alloc (n_elt);
11059
11060   gcc_assert (VECTOR_MODE_P (tmode));
11061   gcc_assert (n_elt == call_expr_nargs (exp));
11062
11063   for (i = 0; i < n_elt; ++i)
11064     {
11065       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
11066       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
11067     }
11068
11069   if (!target || !register_operand (target, tmode))
11070     target = gen_reg_rtx (tmode);
11071
11072   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
11073   return target;
11074 }
11075
11076 /* Return the integer constant in ARG.  Constrain it to be in the range
11077    of the subparts of VEC_TYPE; issue an error if not.  */
11078
11079 static int
11080 get_element_number (tree vec_type, tree arg)
11081 {
11082   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
11083
11084   if (!host_integerp (arg, 1)
11085       || (elt = tree_low_cst (arg, 1), elt > max))
11086     {
11087       error ("selector must be an integer constant in the range 0..%wi", max);
11088       return 0;
11089     }
11090
11091   return elt;
11092 }
11093
11094 /* Expand vec_set builtin.  */
11095 static rtx
11096 altivec_expand_vec_set_builtin (tree exp)
11097 {
11098   enum machine_mode tmode, mode1;
11099   tree arg0, arg1, arg2;
11100   int elt;
11101   rtx op0, op1;
11102
11103   arg0 = CALL_EXPR_ARG (exp, 0);
11104   arg1 = CALL_EXPR_ARG (exp, 1);
11105   arg2 = CALL_EXPR_ARG (exp, 2);
11106
11107   tmode = TYPE_MODE (TREE_TYPE (arg0));
11108   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11109   gcc_assert (VECTOR_MODE_P (tmode));
11110
11111   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
11112   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
11113   elt = get_element_number (TREE_TYPE (arg0), arg2);
11114
11115   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
11116     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
11117
11118   op0 = force_reg (tmode, op0);
11119   op1 = force_reg (mode1, op1);
11120
11121   rs6000_expand_vector_set (op0, op1, elt);
11122
11123   return op0;
11124 }
11125
11126 /* Expand vec_ext builtin.  */
11127 static rtx
11128 altivec_expand_vec_ext_builtin (tree exp, rtx target)
11129 {
11130   enum machine_mode tmode, mode0;
11131   tree arg0, arg1;
11132   int elt;
11133   rtx op0;
11134
11135   arg0 = CALL_EXPR_ARG (exp, 0);
11136   arg1 = CALL_EXPR_ARG (exp, 1);
11137
11138   op0 = expand_normal (arg0);
11139   elt = get_element_number (TREE_TYPE (arg0), arg1);
11140
11141   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11142   mode0 = TYPE_MODE (TREE_TYPE (arg0));
11143   gcc_assert (VECTOR_MODE_P (mode0));
11144
11145   op0 = force_reg (mode0, op0);
11146
11147   if (optimize || !target || !register_operand (target, tmode))
11148     target = gen_reg_rtx (tmode);
11149
11150   rs6000_expand_vector_extract (target, op0, elt);
11151
11152   return target;
11153 }
11154
11155 /* Expand the builtin in EXP and store the result in TARGET.  Store
11156    true in *EXPANDEDP if we found a builtin to expand.  */
11157 static rtx
11158 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
11159 {
11160   const struct builtin_description *d;
11161   const struct builtin_description_predicates *dp;
11162   size_t i;
11163   enum insn_code icode;
11164   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11165   tree arg0;
11166   rtx op0, pat;
11167   enum machine_mode tmode, mode0;
11168   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11169
11170   if ((fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
11171        && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
11172       || (fcode >= VSX_BUILTIN_OVERLOADED_FIRST
11173           && fcode <= VSX_BUILTIN_OVERLOADED_LAST))
11174     {
11175       *expandedp = true;
11176       error ("unresolved overload for Altivec builtin %qF", fndecl);
11177       return const0_rtx;
11178     }
11179
11180   target = altivec_expand_ld_builtin (exp, target, expandedp);
11181   if (*expandedp)
11182     return target;
11183
11184   target = altivec_expand_st_builtin (exp, target, expandedp);
11185   if (*expandedp)
11186     return target;
11187
11188   target = altivec_expand_dst_builtin (exp, target, expandedp);
11189   if (*expandedp)
11190     return target;
11191
11192   *expandedp = true;
11193
11194   switch (fcode)
11195     {
11196     case ALTIVEC_BUILTIN_STVX:
11197       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4si, exp);
11198     case ALTIVEC_BUILTIN_STVEBX:
11199       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
11200     case ALTIVEC_BUILTIN_STVEHX:
11201       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
11202     case ALTIVEC_BUILTIN_STVEWX:
11203       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
11204     case ALTIVEC_BUILTIN_STVXL:
11205       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
11206
11207     case ALTIVEC_BUILTIN_STVLX:
11208       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
11209     case ALTIVEC_BUILTIN_STVLXL:
11210       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
11211     case ALTIVEC_BUILTIN_STVRX:
11212       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
11213     case ALTIVEC_BUILTIN_STVRXL:
11214       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
11215
11216     case VSX_BUILTIN_STXVD2X_V2DF:
11217       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2df, exp);
11218     case VSX_BUILTIN_STXVD2X_V2DI:
11219       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2di, exp);
11220     case VSX_BUILTIN_STXVW4X_V4SF:
11221       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4sf, exp);
11222     case VSX_BUILTIN_STXVW4X_V4SI:
11223       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4si, exp);
11224     case VSX_BUILTIN_STXVW4X_V8HI:
11225       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v8hi, exp);
11226     case VSX_BUILTIN_STXVW4X_V16QI:
11227       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
11228
11229     case ALTIVEC_BUILTIN_MFVSCR:
11230       icode = CODE_FOR_altivec_mfvscr;
11231       tmode = insn_data[icode].operand[0].mode;
11232
11233       if (target == 0
11234           || GET_MODE (target) != tmode
11235           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11236         target = gen_reg_rtx (tmode);
11237
11238       pat = GEN_FCN (icode) (target);
11239       if (! pat)
11240         return 0;
11241       emit_insn (pat);
11242       return target;
11243
11244     case ALTIVEC_BUILTIN_MTVSCR:
11245       icode = CODE_FOR_altivec_mtvscr;
11246       arg0 = CALL_EXPR_ARG (exp, 0);
11247       op0 = expand_normal (arg0);
11248       mode0 = insn_data[icode].operand[0].mode;
11249
11250       /* If we got invalid arguments bail out before generating bad rtl.  */
11251       if (arg0 == error_mark_node)
11252         return const0_rtx;
11253
11254       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11255         op0 = copy_to_mode_reg (mode0, op0);
11256
11257       pat = GEN_FCN (icode) (op0);
11258       if (pat)
11259         emit_insn (pat);
11260       return NULL_RTX;
11261
11262     case ALTIVEC_BUILTIN_DSSALL:
11263       emit_insn (gen_altivec_dssall ());
11264       return NULL_RTX;
11265
11266     case ALTIVEC_BUILTIN_DSS:
11267       icode = CODE_FOR_altivec_dss;
11268       arg0 = CALL_EXPR_ARG (exp, 0);
11269       STRIP_NOPS (arg0);
11270       op0 = expand_normal (arg0);
11271       mode0 = insn_data[icode].operand[0].mode;
11272
11273       /* If we got invalid arguments bail out before generating bad rtl.  */
11274       if (arg0 == error_mark_node)
11275         return const0_rtx;
11276
11277       if (TREE_CODE (arg0) != INTEGER_CST
11278           || TREE_INT_CST_LOW (arg0) & ~0x3)
11279         {
11280           error ("argument to dss must be a 2-bit unsigned literal");
11281           return const0_rtx;
11282         }
11283
11284       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11285         op0 = copy_to_mode_reg (mode0, op0);
11286
11287       emit_insn (gen_altivec_dss (op0));
11288       return NULL_RTX;
11289
11290     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
11291     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
11292     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
11293     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
11294     case VSX_BUILTIN_VEC_INIT_V2DF:
11295     case VSX_BUILTIN_VEC_INIT_V2DI:
11296       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
11297
11298     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
11299     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
11300     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
11301     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
11302     case VSX_BUILTIN_VEC_SET_V2DF:
11303     case VSX_BUILTIN_VEC_SET_V2DI:
11304       return altivec_expand_vec_set_builtin (exp);
11305
11306     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
11307     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
11308     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
11309     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
11310     case VSX_BUILTIN_VEC_EXT_V2DF:
11311     case VSX_BUILTIN_VEC_EXT_V2DI:
11312       return altivec_expand_vec_ext_builtin (exp, target);
11313
11314     default:
11315       break;
11316       /* Fall through.  */
11317     }
11318
11319   /* Expand abs* operations.  */
11320   d = bdesc_abs;
11321   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
11322     if (d->code == fcode)
11323       return altivec_expand_abs_builtin (d->icode, exp, target);
11324
11325   /* Expand the AltiVec predicates.  */
11326   dp = bdesc_altivec_preds;
11327   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
11328     if (dp->code == fcode)
11329       return altivec_expand_predicate_builtin (dp->icode, exp, target);
11330
11331   /* LV* are funky.  We initialized them differently.  */
11332   switch (fcode)
11333     {
11334     case ALTIVEC_BUILTIN_LVSL:
11335       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
11336                                         exp, target, false);
11337     case ALTIVEC_BUILTIN_LVSR:
11338       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
11339                                         exp, target, false);
11340     case ALTIVEC_BUILTIN_LVEBX:
11341       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
11342                                         exp, target, false);
11343     case ALTIVEC_BUILTIN_LVEHX:
11344       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
11345                                         exp, target, false);
11346     case ALTIVEC_BUILTIN_LVEWX:
11347       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
11348                                         exp, target, false);
11349     case ALTIVEC_BUILTIN_LVXL:
11350       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
11351                                         exp, target, false);
11352     case ALTIVEC_BUILTIN_LVX:
11353       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4si,
11354                                         exp, target, false);
11355     case ALTIVEC_BUILTIN_LVLX:
11356       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
11357                                         exp, target, true);
11358     case ALTIVEC_BUILTIN_LVLXL:
11359       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
11360                                         exp, target, true);
11361     case ALTIVEC_BUILTIN_LVRX:
11362       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
11363                                         exp, target, true);
11364     case ALTIVEC_BUILTIN_LVRXL:
11365       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
11366                                         exp, target, true);
11367     case VSX_BUILTIN_LXVD2X_V2DF:
11368       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2df,
11369                                         exp, target, false);
11370     case VSX_BUILTIN_LXVD2X_V2DI:
11371       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2di,
11372                                         exp, target, false);
11373     case VSX_BUILTIN_LXVW4X_V4SF:
11374       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4sf,
11375                                         exp, target, false);
11376     case VSX_BUILTIN_LXVW4X_V4SI:
11377       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4si,
11378                                         exp, target, false);
11379     case VSX_BUILTIN_LXVW4X_V8HI:
11380       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v8hi,
11381                                         exp, target, false);
11382     case VSX_BUILTIN_LXVW4X_V16QI:
11383       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
11384                                         exp, target, false);
11385       break;
11386     default:
11387       break;
11388       /* Fall through.  */
11389     }
11390
11391   *expandedp = false;
11392   return NULL_RTX;
11393 }
11394
11395 /* Expand the builtin in EXP and store the result in TARGET.  Store
11396    true in *EXPANDEDP if we found a builtin to expand.  */
11397 static rtx
11398 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
11399 {
11400   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11401   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11402   const struct builtin_description *d;
11403   size_t i;
11404
11405   *expandedp = true;
11406
11407   switch (fcode)
11408     {
11409     case PAIRED_BUILTIN_STX:
11410       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
11411     case PAIRED_BUILTIN_LX:
11412       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
11413     default:
11414       break;
11415       /* Fall through.  */
11416     }
11417
11418   /* Expand the paired predicates.  */
11419   d = bdesc_paired_preds;
11420   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
11421     if (d->code == fcode)
11422       return paired_expand_predicate_builtin (d->icode, exp, target);
11423
11424   *expandedp = false;
11425   return NULL_RTX;
11426 }
11427
11428 /* Binops that need to be initialized manually, but can be expanded
11429    automagically by rs6000_expand_binop_builtin.  */
11430 static struct builtin_description bdesc_2arg_spe[] =
11431 {
11432   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
11433   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
11434   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
11435   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
11436   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
11437   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
11438   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
11439   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
11440   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
11441   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
11442   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
11443   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
11444   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
11445   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
11446   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
11447   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
11448   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
11449   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
11450   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
11451   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
11452   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
11453   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
11454 };
11455
11456 /* Expand the builtin in EXP and store the result in TARGET.  Store
11457    true in *EXPANDEDP if we found a builtin to expand.
11458
11459    This expands the SPE builtins that are not simple unary and binary
11460    operations.  */
11461 static rtx
11462 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
11463 {
11464   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11465   tree arg1, arg0;
11466   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11467   enum insn_code icode;
11468   enum machine_mode tmode, mode0;
11469   rtx pat, op0;
11470   struct builtin_description *d;
11471   size_t i;
11472
11473   *expandedp = true;
11474
11475   /* Syntax check for a 5-bit unsigned immediate.  */
11476   switch (fcode)
11477     {
11478     case SPE_BUILTIN_EVSTDD:
11479     case SPE_BUILTIN_EVSTDH:
11480     case SPE_BUILTIN_EVSTDW:
11481     case SPE_BUILTIN_EVSTWHE:
11482     case SPE_BUILTIN_EVSTWHO:
11483     case SPE_BUILTIN_EVSTWWE:
11484     case SPE_BUILTIN_EVSTWWO:
11485       arg1 = CALL_EXPR_ARG (exp, 2);
11486       if (TREE_CODE (arg1) != INTEGER_CST
11487           || TREE_INT_CST_LOW (arg1) & ~0x1f)
11488         {
11489           error ("argument 2 must be a 5-bit unsigned literal");
11490           return const0_rtx;
11491         }
11492       break;
11493     default:
11494       break;
11495     }
11496
11497   /* The evsplat*i instructions are not quite generic.  */
11498   switch (fcode)
11499     {
11500     case SPE_BUILTIN_EVSPLATFI:
11501       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
11502                                          exp, target);
11503     case SPE_BUILTIN_EVSPLATI:
11504       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
11505                                          exp, target);
11506     default:
11507       break;
11508     }
11509
11510   d = (struct builtin_description *) bdesc_2arg_spe;
11511   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
11512     if (d->code == fcode)
11513       return rs6000_expand_binop_builtin (d->icode, exp, target);
11514
11515   d = (struct builtin_description *) bdesc_spe_predicates;
11516   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
11517     if (d->code == fcode)
11518       return spe_expand_predicate_builtin (d->icode, exp, target);
11519
11520   d = (struct builtin_description *) bdesc_spe_evsel;
11521   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
11522     if (d->code == fcode)
11523       return spe_expand_evsel_builtin (d->icode, exp, target);
11524
11525   switch (fcode)
11526     {
11527     case SPE_BUILTIN_EVSTDDX:
11528       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
11529     case SPE_BUILTIN_EVSTDHX:
11530       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
11531     case SPE_BUILTIN_EVSTDWX:
11532       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
11533     case SPE_BUILTIN_EVSTWHEX:
11534       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
11535     case SPE_BUILTIN_EVSTWHOX:
11536       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
11537     case SPE_BUILTIN_EVSTWWEX:
11538       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
11539     case SPE_BUILTIN_EVSTWWOX:
11540       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
11541     case SPE_BUILTIN_EVSTDD:
11542       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
11543     case SPE_BUILTIN_EVSTDH:
11544       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
11545     case SPE_BUILTIN_EVSTDW:
11546       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
11547     case SPE_BUILTIN_EVSTWHE:
11548       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
11549     case SPE_BUILTIN_EVSTWHO:
11550       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
11551     case SPE_BUILTIN_EVSTWWE:
11552       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
11553     case SPE_BUILTIN_EVSTWWO:
11554       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
11555     case SPE_BUILTIN_MFSPEFSCR:
11556       icode = CODE_FOR_spe_mfspefscr;
11557       tmode = insn_data[icode].operand[0].mode;
11558
11559       if (target == 0
11560           || GET_MODE (target) != tmode
11561           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11562         target = gen_reg_rtx (tmode);
11563
11564       pat = GEN_FCN (icode) (target);
11565       if (! pat)
11566         return 0;
11567       emit_insn (pat);
11568       return target;
11569     case SPE_BUILTIN_MTSPEFSCR:
11570       icode = CODE_FOR_spe_mtspefscr;
11571       arg0 = CALL_EXPR_ARG (exp, 0);
11572       op0 = expand_normal (arg0);
11573       mode0 = insn_data[icode].operand[0].mode;
11574
11575       if (arg0 == error_mark_node)
11576         return const0_rtx;
11577
11578       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11579         op0 = copy_to_mode_reg (mode0, op0);
11580
11581       pat = GEN_FCN (icode) (op0);
11582       if (pat)
11583         emit_insn (pat);
11584       return NULL_RTX;
11585     default:
11586       break;
11587     }
11588
11589   *expandedp = false;
11590   return NULL_RTX;
11591 }
11592
11593 static rtx
11594 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11595 {
11596   rtx pat, scratch, tmp;
11597   tree form = CALL_EXPR_ARG (exp, 0);
11598   tree arg0 = CALL_EXPR_ARG (exp, 1);
11599   tree arg1 = CALL_EXPR_ARG (exp, 2);
11600   rtx op0 = expand_normal (arg0);
11601   rtx op1 = expand_normal (arg1);
11602   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11603   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11604   int form_int;
11605   enum rtx_code code;
11606
11607   if (TREE_CODE (form) != INTEGER_CST)
11608     {
11609       error ("argument 1 of __builtin_paired_predicate must be a constant");
11610       return const0_rtx;
11611     }
11612   else
11613     form_int = TREE_INT_CST_LOW (form);
11614
11615   gcc_assert (mode0 == mode1);
11616
11617   if (arg0 == error_mark_node || arg1 == error_mark_node)
11618     return const0_rtx;
11619
11620   if (target == 0
11621       || GET_MODE (target) != SImode
11622       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
11623     target = gen_reg_rtx (SImode);
11624   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
11625     op0 = copy_to_mode_reg (mode0, op0);
11626   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
11627     op1 = copy_to_mode_reg (mode1, op1);
11628
11629   scratch = gen_reg_rtx (CCFPmode);
11630
11631   pat = GEN_FCN (icode) (scratch, op0, op1);
11632   if (!pat)
11633     return const0_rtx;
11634
11635   emit_insn (pat);
11636
11637   switch (form_int)
11638     {
11639       /* LT bit.  */
11640     case 0:
11641       code = LT;
11642       break;
11643       /* GT bit.  */
11644     case 1:
11645       code = GT;
11646       break;
11647       /* EQ bit.  */
11648     case 2:
11649       code = EQ;
11650       break;
11651       /* UN bit.  */
11652     case 3:
11653       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11654       return target;
11655     default:
11656       error ("argument 1 of __builtin_paired_predicate is out of range");
11657       return const0_rtx;
11658     }
11659
11660   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11661   emit_move_insn (target, tmp);
11662   return target;
11663 }
11664
11665 static rtx
11666 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11667 {
11668   rtx pat, scratch, tmp;
11669   tree form = CALL_EXPR_ARG (exp, 0);
11670   tree arg0 = CALL_EXPR_ARG (exp, 1);
11671   tree arg1 = CALL_EXPR_ARG (exp, 2);
11672   rtx op0 = expand_normal (arg0);
11673   rtx op1 = expand_normal (arg1);
11674   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11675   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11676   int form_int;
11677   enum rtx_code code;
11678
11679   if (TREE_CODE (form) != INTEGER_CST)
11680     {
11681       error ("argument 1 of __builtin_spe_predicate must be a constant");
11682       return const0_rtx;
11683     }
11684   else
11685     form_int = TREE_INT_CST_LOW (form);
11686
11687   gcc_assert (mode0 == mode1);
11688
11689   if (arg0 == error_mark_node || arg1 == error_mark_node)
11690     return const0_rtx;
11691
11692   if (target == 0
11693       || GET_MODE (target) != SImode
11694       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
11695     target = gen_reg_rtx (SImode);
11696
11697   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11698     op0 = copy_to_mode_reg (mode0, op0);
11699   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11700     op1 = copy_to_mode_reg (mode1, op1);
11701
11702   scratch = gen_reg_rtx (CCmode);
11703
11704   pat = GEN_FCN (icode) (scratch, op0, op1);
11705   if (! pat)
11706     return const0_rtx;
11707   emit_insn (pat);
11708
11709   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
11710      _lower_.  We use one compare, but look in different bits of the
11711      CR for each variant.
11712
11713      There are 2 elements in each SPE simd type (upper/lower).  The CR
11714      bits are set as follows:
11715
11716      BIT0  | BIT 1  | BIT 2   | BIT 3
11717      U     |   L    | (U | L) | (U & L)
11718
11719      So, for an "all" relationship, BIT 3 would be set.
11720      For an "any" relationship, BIT 2 would be set.  Etc.
11721
11722      Following traditional nomenclature, these bits map to:
11723
11724      BIT0  | BIT 1  | BIT 2   | BIT 3
11725      LT    | GT     | EQ      | OV
11726
11727      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
11728   */
11729
11730   switch (form_int)
11731     {
11732       /* All variant.  OV bit.  */
11733     case 0:
11734       /* We need to get to the OV bit, which is the ORDERED bit.  We
11735          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
11736          that's ugly and will make validate_condition_mode die.
11737          So let's just use another pattern.  */
11738       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11739       return target;
11740       /* Any variant.  EQ bit.  */
11741     case 1:
11742       code = EQ;
11743       break;
11744       /* Upper variant.  LT bit.  */
11745     case 2:
11746       code = LT;
11747       break;
11748       /* Lower variant.  GT bit.  */
11749     case 3:
11750       code = GT;
11751       break;
11752     default:
11753       error ("argument 1 of __builtin_spe_predicate is out of range");
11754       return const0_rtx;
11755     }
11756
11757   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11758   emit_move_insn (target, tmp);
11759
11760   return target;
11761 }
11762
11763 /* The evsel builtins look like this:
11764
11765      e = __builtin_spe_evsel_OP (a, b, c, d);
11766
11767    and work like this:
11768
11769      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
11770      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
11771 */
11772
11773 static rtx
11774 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
11775 {
11776   rtx pat, scratch;
11777   tree arg0 = CALL_EXPR_ARG (exp, 0);
11778   tree arg1 = CALL_EXPR_ARG (exp, 1);
11779   tree arg2 = CALL_EXPR_ARG (exp, 2);
11780   tree arg3 = CALL_EXPR_ARG (exp, 3);
11781   rtx op0 = expand_normal (arg0);
11782   rtx op1 = expand_normal (arg1);
11783   rtx op2 = expand_normal (arg2);
11784   rtx op3 = expand_normal (arg3);
11785   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11786   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11787
11788   gcc_assert (mode0 == mode1);
11789
11790   if (arg0 == error_mark_node || arg1 == error_mark_node
11791       || arg2 == error_mark_node || arg3 == error_mark_node)
11792     return const0_rtx;
11793
11794   if (target == 0
11795       || GET_MODE (target) != mode0
11796       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
11797     target = gen_reg_rtx (mode0);
11798
11799   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11800     op0 = copy_to_mode_reg (mode0, op0);
11801   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11802     op1 = copy_to_mode_reg (mode0, op1);
11803   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
11804     op2 = copy_to_mode_reg (mode0, op2);
11805   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
11806     op3 = copy_to_mode_reg (mode0, op3);
11807
11808   /* Generate the compare.  */
11809   scratch = gen_reg_rtx (CCmode);
11810   pat = GEN_FCN (icode) (scratch, op0, op1);
11811   if (! pat)
11812     return const0_rtx;
11813   emit_insn (pat);
11814
11815   if (mode0 == V2SImode)
11816     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
11817   else
11818     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
11819
11820   return target;
11821 }
11822
11823 /* Expand an expression EXP that calls a built-in function,
11824    with result going to TARGET if that's convenient
11825    (and in mode MODE if that's convenient).
11826    SUBTARGET may be used as the target for computing one of EXP's operands.
11827    IGNORE is nonzero if the value is to be ignored.  */
11828
11829 static rtx
11830 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
11831                        enum machine_mode mode ATTRIBUTE_UNUSED,
11832                        int ignore ATTRIBUTE_UNUSED)
11833 {
11834   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11835   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11836   const struct builtin_description *d;
11837   size_t i;
11838   rtx ret;
11839   bool success;
11840
11841   switch (fcode)
11842     {
11843     case RS6000_BUILTIN_RECIP:
11844       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
11845
11846     case RS6000_BUILTIN_RECIPF:
11847       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
11848
11849     case RS6000_BUILTIN_RSQRTF:
11850       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
11851
11852     case RS6000_BUILTIN_RSQRT:
11853       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
11854
11855     case RS6000_BUILTIN_BSWAP_HI:
11856       return rs6000_expand_unop_builtin (CODE_FOR_bswaphi2, exp, target);
11857
11858     case POWER7_BUILTIN_BPERMD:
11859       return rs6000_expand_binop_builtin (((TARGET_64BIT)
11860                                            ? CODE_FOR_bpermd_di
11861                                            : CODE_FOR_bpermd_si), exp, target);
11862
11863     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
11864     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
11865       {
11866         int icode = (int) CODE_FOR_altivec_lvsr;
11867         enum machine_mode tmode = insn_data[icode].operand[0].mode;
11868         enum machine_mode mode = insn_data[icode].operand[1].mode;
11869         tree arg;
11870         rtx op, addr, pat;
11871
11872         gcc_assert (TARGET_ALTIVEC);
11873
11874         arg = CALL_EXPR_ARG (exp, 0);
11875         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
11876         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
11877         addr = memory_address (mode, op);
11878         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
11879           op = addr;
11880         else
11881           {
11882             /* For the load case need to negate the address.  */
11883             op = gen_reg_rtx (GET_MODE (addr));
11884             emit_insn (gen_rtx_SET (VOIDmode, op,
11885                                     gen_rtx_NEG (GET_MODE (addr), addr)));
11886           }
11887         op = gen_rtx_MEM (mode, op);
11888
11889         if (target == 0
11890             || GET_MODE (target) != tmode
11891             || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11892           target = gen_reg_rtx (tmode);
11893
11894         /*pat = gen_altivec_lvsr (target, op);*/
11895         pat = GEN_FCN (icode) (target, op);
11896         if (!pat)
11897           return 0;
11898         emit_insn (pat);
11899
11900         return target;
11901       }
11902
11903     case ALTIVEC_BUILTIN_VCFUX:
11904     case ALTIVEC_BUILTIN_VCFSX:
11905     case ALTIVEC_BUILTIN_VCTUXS:
11906     case ALTIVEC_BUILTIN_VCTSXS:
11907   /* FIXME: There's got to be a nicer way to handle this case than
11908      constructing a new CALL_EXPR.  */
11909       if (call_expr_nargs (exp) == 1)
11910         {
11911           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
11912                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
11913         }
11914       break;
11915
11916     default:
11917       break;
11918     }
11919
11920   if (TARGET_ALTIVEC)
11921     {
11922       ret = altivec_expand_builtin (exp, target, &success);
11923
11924       if (success)
11925         return ret;
11926     }
11927   if (TARGET_SPE)
11928     {
11929       ret = spe_expand_builtin (exp, target, &success);
11930
11931       if (success)
11932         return ret;
11933     }
11934   if (TARGET_PAIRED_FLOAT)
11935     {
11936       ret = paired_expand_builtin (exp, target, &success);
11937
11938       if (success)
11939         return ret;
11940     }  
11941
11942   gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
11943
11944   /* Handle simple unary operations.  */
11945   d = (struct builtin_description *) bdesc_1arg;
11946   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
11947     if (d->code == fcode)
11948       return rs6000_expand_unop_builtin (d->icode, exp, target);
11949
11950   /* Handle simple binary operations.  */
11951   d = (struct builtin_description *) bdesc_2arg;
11952   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
11953     if (d->code == fcode)
11954       return rs6000_expand_binop_builtin (d->icode, exp, target);
11955
11956   /* Handle simple ternary operations.  */
11957   d = bdesc_3arg;
11958   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
11959     if (d->code == fcode)
11960       return rs6000_expand_ternop_builtin (d->icode, exp, target);
11961
11962   gcc_unreachable ();
11963 }
11964
11965 static void
11966 rs6000_init_builtins (void)
11967 {
11968   tree tdecl;
11969   tree ftype;
11970
11971   V2SI_type_node = build_vector_type (intSI_type_node, 2);
11972   V2SF_type_node = build_vector_type (float_type_node, 2);
11973   V2DI_type_node = build_vector_type (intDI_type_node, 2);
11974   V2DF_type_node = build_vector_type (double_type_node, 2);
11975   V4HI_type_node = build_vector_type (intHI_type_node, 4);
11976   V4SI_type_node = build_vector_type (intSI_type_node, 4);
11977   V4SF_type_node = build_vector_type (float_type_node, 4);
11978   V8HI_type_node = build_vector_type (intHI_type_node, 8);
11979   V16QI_type_node = build_vector_type (intQI_type_node, 16);
11980
11981   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
11982   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
11983   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
11984   unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2);
11985
11986   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
11987   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
11988   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
11989   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
11990
11991   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
11992      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
11993      'vector unsigned short'.  */
11994
11995   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
11996   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
11997   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
11998   bool_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
11999   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12000
12001   long_integer_type_internal_node = long_integer_type_node;
12002   long_unsigned_type_internal_node = long_unsigned_type_node;
12003   long_long_integer_type_internal_node = long_long_integer_type_node;
12004   long_long_unsigned_type_internal_node = long_long_unsigned_type_node;
12005   intQI_type_internal_node = intQI_type_node;
12006   uintQI_type_internal_node = unsigned_intQI_type_node;
12007   intHI_type_internal_node = intHI_type_node;
12008   uintHI_type_internal_node = unsigned_intHI_type_node;
12009   intSI_type_internal_node = intSI_type_node;
12010   uintSI_type_internal_node = unsigned_intSI_type_node;
12011   intDI_type_internal_node = intDI_type_node;
12012   uintDI_type_internal_node = unsigned_intDI_type_node;
12013   float_type_internal_node = float_type_node;
12014   double_type_internal_node = double_type_node;
12015   void_type_internal_node = void_type_node;
12016
12017   /* Initialize the modes for builtin_function_type, mapping a machine mode to
12018      tree type node.  */
12019   builtin_mode_to_type[QImode][0] = integer_type_node;
12020   builtin_mode_to_type[HImode][0] = integer_type_node;
12021   builtin_mode_to_type[SImode][0] = intSI_type_node;
12022   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
12023   builtin_mode_to_type[DImode][0] = intDI_type_node;
12024   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
12025   builtin_mode_to_type[SFmode][0] = float_type_node;
12026   builtin_mode_to_type[DFmode][0] = double_type_node;
12027   builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
12028   builtin_mode_to_type[V2SFmode][0] = V2SF_type_node;
12029   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
12030   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
12031   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
12032   builtin_mode_to_type[V4HImode][0] = V4HI_type_node;
12033   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
12034   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
12035   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
12036   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
12037   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
12038   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
12039   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
12040
12041   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12042                       get_identifier ("__bool char"),
12043                       bool_char_type_node);
12044   TYPE_NAME (bool_char_type_node) = tdecl;
12045   (*lang_hooks.decls.pushdecl) (tdecl);
12046   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12047                       get_identifier ("__bool short"),
12048                       bool_short_type_node);
12049   TYPE_NAME (bool_short_type_node) = tdecl;
12050   (*lang_hooks.decls.pushdecl) (tdecl);
12051   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12052                       get_identifier ("__bool int"),
12053                       bool_int_type_node);
12054   TYPE_NAME (bool_int_type_node) = tdecl;
12055   (*lang_hooks.decls.pushdecl) (tdecl);
12056   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"),
12057                       pixel_type_node);
12058   TYPE_NAME (pixel_type_node) = tdecl;
12059   (*lang_hooks.decls.pushdecl) (tdecl);
12060
12061   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
12062   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
12063   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
12064   bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2);
12065   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
12066
12067   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12068                       get_identifier ("__vector unsigned char"),
12069                       unsigned_V16QI_type_node);
12070   TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
12071   (*lang_hooks.decls.pushdecl) (tdecl);
12072   tdecl = build_decl (BUILTINS_LOCATION,
12073                       TYPE_DECL, get_identifier ("__vector signed char"),
12074                       V16QI_type_node);
12075   TYPE_NAME (V16QI_type_node) = tdecl;
12076   (*lang_hooks.decls.pushdecl) (tdecl);
12077   tdecl = build_decl (BUILTINS_LOCATION,
12078                       TYPE_DECL, get_identifier ("__vector __bool char"),
12079                       bool_V16QI_type_node);
12080   TYPE_NAME ( bool_V16QI_type_node) = tdecl;
12081   (*lang_hooks.decls.pushdecl) (tdecl);
12082
12083   tdecl = build_decl (BUILTINS_LOCATION,
12084                       TYPE_DECL, get_identifier ("__vector unsigned short"),
12085                       unsigned_V8HI_type_node);
12086   TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
12087   (*lang_hooks.decls.pushdecl) (tdecl);
12088   tdecl = build_decl (BUILTINS_LOCATION,
12089                       TYPE_DECL, get_identifier ("__vector signed short"),
12090                       V8HI_type_node);
12091   TYPE_NAME (V8HI_type_node) = tdecl;
12092   (*lang_hooks.decls.pushdecl) (tdecl);
12093   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12094                       get_identifier ("__vector __bool short"),
12095                       bool_V8HI_type_node);
12096   TYPE_NAME (bool_V8HI_type_node) = tdecl;
12097   (*lang_hooks.decls.pushdecl) (tdecl);
12098
12099   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12100                       get_identifier ("__vector unsigned int"),
12101                       unsigned_V4SI_type_node);
12102   TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
12103   (*lang_hooks.decls.pushdecl) (tdecl);
12104   tdecl = build_decl (BUILTINS_LOCATION,
12105                       TYPE_DECL, get_identifier ("__vector signed int"),
12106                       V4SI_type_node);
12107   TYPE_NAME (V4SI_type_node) = tdecl;
12108   (*lang_hooks.decls.pushdecl) (tdecl);
12109   tdecl = build_decl (BUILTINS_LOCATION,
12110                       TYPE_DECL, get_identifier ("__vector __bool int"),
12111                       bool_V4SI_type_node);
12112   TYPE_NAME (bool_V4SI_type_node) = tdecl;
12113   (*lang_hooks.decls.pushdecl) (tdecl);
12114
12115   tdecl = build_decl (BUILTINS_LOCATION,
12116                       TYPE_DECL, get_identifier ("__vector float"),
12117                       V4SF_type_node);
12118   TYPE_NAME (V4SF_type_node) = tdecl;
12119   (*lang_hooks.decls.pushdecl) (tdecl);
12120   tdecl = build_decl (BUILTINS_LOCATION,
12121                       TYPE_DECL, get_identifier ("__vector __pixel"),
12122                       pixel_V8HI_type_node);
12123   TYPE_NAME (pixel_V8HI_type_node) = tdecl;
12124   (*lang_hooks.decls.pushdecl) (tdecl);
12125
12126   if (TARGET_VSX)
12127     {
12128       tdecl = build_decl (BUILTINS_LOCATION,
12129                           TYPE_DECL, get_identifier ("__vector double"),
12130                           V2DF_type_node);
12131       TYPE_NAME (V2DF_type_node) = tdecl;
12132       (*lang_hooks.decls.pushdecl) (tdecl);
12133
12134       tdecl = build_decl (BUILTINS_LOCATION,
12135                           TYPE_DECL, get_identifier ("__vector long"),
12136                           V2DI_type_node);
12137       TYPE_NAME (V2DI_type_node) = tdecl;
12138       (*lang_hooks.decls.pushdecl) (tdecl);
12139
12140       tdecl = build_decl (BUILTINS_LOCATION,
12141                           TYPE_DECL, get_identifier ("__vector unsigned long"),
12142                           unsigned_V2DI_type_node);
12143       TYPE_NAME (unsigned_V2DI_type_node) = tdecl;
12144       (*lang_hooks.decls.pushdecl) (tdecl);
12145
12146       tdecl = build_decl (BUILTINS_LOCATION,
12147                           TYPE_DECL, get_identifier ("__vector __bool long"),
12148                           bool_V2DI_type_node);
12149       TYPE_NAME (bool_V2DI_type_node) = tdecl;
12150       (*lang_hooks.decls.pushdecl) (tdecl);
12151     }
12152
12153   if (TARGET_PAIRED_FLOAT)
12154     paired_init_builtins ();
12155   if (TARGET_SPE)
12156     spe_init_builtins ();
12157   if (TARGET_ALTIVEC)
12158     altivec_init_builtins ();
12159   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT || TARGET_VSX)
12160     rs6000_common_init_builtins ();
12161   if (TARGET_FRE)
12162     {
12163       ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
12164                                      RS6000_BUILTIN_RECIP,
12165                                      "__builtin_recipdiv");
12166       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
12167                    RS6000_BUILTIN_RECIP);
12168     }
12169   if (TARGET_FRES)
12170     {
12171       ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
12172                                      RS6000_BUILTIN_RECIPF,
12173                                      "__builtin_recipdivf");
12174       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
12175                    RS6000_BUILTIN_RECIPF);
12176     }
12177   if (TARGET_FRSQRTE)
12178     {
12179       ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
12180                                      RS6000_BUILTIN_RSQRT,
12181                                      "__builtin_rsqrt");
12182       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrt", ftype,
12183                    RS6000_BUILTIN_RSQRT);
12184     }
12185   if (TARGET_FRSQRTES)
12186     {
12187       ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
12188                                      RS6000_BUILTIN_RSQRTF,
12189                                      "__builtin_rsqrtf");
12190       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
12191                    RS6000_BUILTIN_RSQRTF);
12192     }
12193   if (TARGET_POPCNTD)
12194     {
12195       enum machine_mode mode = (TARGET_64BIT) ? DImode : SImode;
12196       tree ftype = builtin_function_type (mode, mode, mode, VOIDmode,
12197                                           POWER7_BUILTIN_BPERMD,
12198                                           "__builtin_bpermd");
12199       def_builtin (MASK_POPCNTD, "__builtin_bpermd", ftype,
12200                    POWER7_BUILTIN_BPERMD);
12201     }
12202   if (TARGET_POWERPC)
12203     {
12204       /* Don't use builtin_function_type here, as it maps HI/QI to SI.  */
12205       tree ftype = build_function_type_list (unsigned_intHI_type_node,
12206                                              unsigned_intHI_type_node,
12207                                              NULL_TREE);
12208       def_builtin (MASK_POWERPC, "__builtin_bswap16", ftype,
12209                    RS6000_BUILTIN_BSWAP_HI);
12210     }
12211
12212 #if TARGET_XCOFF
12213   /* AIX libm provides clog as __clog.  */
12214   if (built_in_decls [BUILT_IN_CLOG])
12215     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
12216 #endif
12217
12218 #ifdef SUBTARGET_INIT_BUILTINS
12219   SUBTARGET_INIT_BUILTINS;
12220 #endif
12221 }
12222
12223 /* Returns the rs6000 builtin decl for CODE.  */
12224
12225 static tree
12226 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
12227 {
12228   if (code >= RS6000_BUILTIN_COUNT)
12229     return error_mark_node;
12230
12231   return rs6000_builtin_decls[code];
12232 }
12233
12234 /* Search through a set of builtins and enable the mask bits.
12235    DESC is an array of builtins.
12236    SIZE is the total number of builtins.
12237    START is the builtin enum at which to start.
12238    END is the builtin enum at which to end.  */
12239 static void
12240 enable_mask_for_builtins (struct builtin_description *desc, int size,
12241                           enum rs6000_builtins start,
12242                           enum rs6000_builtins end)
12243 {
12244   int i;
12245
12246   for (i = 0; i < size; ++i)
12247     if (desc[i].code == start)
12248       break;
12249
12250   if (i == size)
12251     return;
12252
12253   for (; i < size; ++i)
12254     {
12255       /* Flip all the bits on.  */
12256       desc[i].mask = target_flags;
12257       if (desc[i].code == end)
12258         break;
12259     }
12260 }
12261
12262 static void
12263 spe_init_builtins (void)
12264 {
12265   tree puint_type_node = build_pointer_type (unsigned_type_node);
12266   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
12267   struct builtin_description *d;
12268   size_t i;
12269
12270   tree v2si_ftype_4_v2si
12271     = build_function_type_list (opaque_V2SI_type_node,
12272                                 opaque_V2SI_type_node,
12273                                 opaque_V2SI_type_node,
12274                                 opaque_V2SI_type_node,
12275                                 opaque_V2SI_type_node,
12276                                 NULL_TREE);
12277
12278   tree v2sf_ftype_4_v2sf
12279     = build_function_type_list (opaque_V2SF_type_node,
12280                                 opaque_V2SF_type_node,
12281                                 opaque_V2SF_type_node,
12282                                 opaque_V2SF_type_node,
12283                                 opaque_V2SF_type_node,
12284                                 NULL_TREE);
12285
12286   tree int_ftype_int_v2si_v2si
12287     = build_function_type_list (integer_type_node,
12288                                 integer_type_node,
12289                                 opaque_V2SI_type_node,
12290                                 opaque_V2SI_type_node,
12291                                 NULL_TREE);
12292
12293   tree int_ftype_int_v2sf_v2sf
12294     = build_function_type_list (integer_type_node,
12295                                 integer_type_node,
12296                                 opaque_V2SF_type_node,
12297                                 opaque_V2SF_type_node,
12298                                 NULL_TREE);
12299
12300   tree void_ftype_v2si_puint_int
12301     = build_function_type_list (void_type_node,
12302                                 opaque_V2SI_type_node,
12303                                 puint_type_node,
12304                                 integer_type_node,
12305                                 NULL_TREE);
12306
12307   tree void_ftype_v2si_puint_char
12308     = build_function_type_list (void_type_node,
12309                                 opaque_V2SI_type_node,
12310                                 puint_type_node,
12311                                 char_type_node,
12312                                 NULL_TREE);
12313
12314   tree void_ftype_v2si_pv2si_int
12315     = build_function_type_list (void_type_node,
12316                                 opaque_V2SI_type_node,
12317                                 opaque_p_V2SI_type_node,
12318                                 integer_type_node,
12319                                 NULL_TREE);
12320
12321   tree void_ftype_v2si_pv2si_char
12322     = build_function_type_list (void_type_node,
12323                                 opaque_V2SI_type_node,
12324                                 opaque_p_V2SI_type_node,
12325                                 char_type_node,
12326                                 NULL_TREE);
12327
12328   tree void_ftype_int
12329     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
12330
12331   tree int_ftype_void
12332     = build_function_type_list (integer_type_node, NULL_TREE);
12333
12334   tree v2si_ftype_pv2si_int
12335     = build_function_type_list (opaque_V2SI_type_node,
12336                                 opaque_p_V2SI_type_node,
12337                                 integer_type_node,
12338                                 NULL_TREE);
12339
12340   tree v2si_ftype_puint_int
12341     = build_function_type_list (opaque_V2SI_type_node,
12342                                 puint_type_node,
12343                                 integer_type_node,
12344                                 NULL_TREE);
12345
12346   tree v2si_ftype_pushort_int
12347     = build_function_type_list (opaque_V2SI_type_node,
12348                                 pushort_type_node,
12349                                 integer_type_node,
12350                                 NULL_TREE);
12351
12352   tree v2si_ftype_signed_char
12353     = build_function_type_list (opaque_V2SI_type_node,
12354                                 signed_char_type_node,
12355                                 NULL_TREE);
12356
12357   /* The initialization of the simple binary and unary builtins is
12358      done in rs6000_common_init_builtins, but we have to enable the
12359      mask bits here manually because we have run out of `target_flags'
12360      bits.  We really need to redesign this mask business.  */
12361
12362   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
12363                             ARRAY_SIZE (bdesc_2arg),
12364                             SPE_BUILTIN_EVADDW,
12365                             SPE_BUILTIN_EVXOR);
12366   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
12367                             ARRAY_SIZE (bdesc_1arg),
12368                             SPE_BUILTIN_EVABS,
12369                             SPE_BUILTIN_EVSUBFUSIAAW);
12370   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
12371                             ARRAY_SIZE (bdesc_spe_predicates),
12372                             SPE_BUILTIN_EVCMPEQ,
12373                             SPE_BUILTIN_EVFSTSTLT);
12374   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
12375                             ARRAY_SIZE (bdesc_spe_evsel),
12376                             SPE_BUILTIN_EVSEL_CMPGTS,
12377                             SPE_BUILTIN_EVSEL_FSTSTEQ);
12378
12379   (*lang_hooks.decls.pushdecl)
12380     (build_decl (BUILTINS_LOCATION, TYPE_DECL,
12381                  get_identifier ("__ev64_opaque__"),
12382                  opaque_V2SI_type_node));
12383
12384   /* Initialize irregular SPE builtins.  */
12385
12386   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
12387   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
12388   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
12389   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
12390   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
12391   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
12392   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
12393   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
12394   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
12395   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
12396   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
12397   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
12398   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
12399   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
12400   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
12401   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
12402   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
12403   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
12404
12405   /* Loads.  */
12406   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
12407   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
12408   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
12409   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
12410   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
12411   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
12412   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
12413   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
12414   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
12415   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
12416   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
12417   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
12418   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
12419   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
12420   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
12421   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
12422   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
12423   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
12424   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
12425   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
12426   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
12427   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
12428
12429   /* Predicates.  */
12430   d = (struct builtin_description *) bdesc_spe_predicates;
12431   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
12432     {
12433       tree type;
12434
12435       switch (insn_data[d->icode].operand[1].mode)
12436         {
12437         case V2SImode:
12438           type = int_ftype_int_v2si_v2si;
12439           break;
12440         case V2SFmode:
12441           type = int_ftype_int_v2sf_v2sf;
12442           break;
12443         default:
12444           gcc_unreachable ();
12445         }
12446
12447       def_builtin (d->mask, d->name, type, d->code);
12448     }
12449
12450   /* Evsel predicates.  */
12451   d = (struct builtin_description *) bdesc_spe_evsel;
12452   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
12453     {
12454       tree type;
12455
12456       switch (insn_data[d->icode].operand[1].mode)
12457         {
12458         case V2SImode:
12459           type = v2si_ftype_4_v2si;
12460           break;
12461         case V2SFmode:
12462           type = v2sf_ftype_4_v2sf;
12463           break;
12464         default:
12465           gcc_unreachable ();
12466         }
12467
12468       def_builtin (d->mask, d->name, type, d->code);
12469     }
12470 }
12471
12472 static void
12473 paired_init_builtins (void)
12474 {
12475   const struct builtin_description *d;
12476   size_t i;
12477
12478    tree int_ftype_int_v2sf_v2sf
12479     = build_function_type_list (integer_type_node,
12480                                 integer_type_node,
12481                                 V2SF_type_node,
12482                                 V2SF_type_node,
12483                                 NULL_TREE);
12484   tree pcfloat_type_node =
12485     build_pointer_type (build_qualified_type
12486                         (float_type_node, TYPE_QUAL_CONST));
12487
12488   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
12489                                                            long_integer_type_node,
12490                                                            pcfloat_type_node,
12491                                                            NULL_TREE);
12492   tree void_ftype_v2sf_long_pcfloat =
12493     build_function_type_list (void_type_node,
12494                               V2SF_type_node,
12495                               long_integer_type_node,
12496                               pcfloat_type_node,
12497                               NULL_TREE);
12498
12499
12500   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
12501                PAIRED_BUILTIN_LX);
12502
12503
12504   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
12505                PAIRED_BUILTIN_STX);
12506
12507   /* Predicates.  */
12508   d = bdesc_paired_preds;
12509   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
12510     {
12511       tree type;
12512
12513       switch (insn_data[d->icode].operand[1].mode)
12514         {
12515         case V2SFmode:
12516           type = int_ftype_int_v2sf_v2sf;
12517           break;
12518         default:
12519           gcc_unreachable ();
12520         }
12521
12522       def_builtin (d->mask, d->name, type, d->code);
12523     }
12524 }
12525
12526 static void
12527 altivec_init_builtins (void)
12528 {
12529   const struct builtin_description *d;
12530   const struct builtin_description_predicates *dp;
12531   size_t i;
12532   tree ftype;
12533
12534   tree pvoid_type_node = build_pointer_type (void_type_node);
12535
12536   tree pcvoid_type_node
12537     = build_pointer_type (build_qualified_type (void_type_node,
12538                                                 TYPE_QUAL_CONST));
12539
12540   tree int_ftype_opaque
12541     = build_function_type_list (integer_type_node,
12542                                 opaque_V4SI_type_node, NULL_TREE);
12543   tree opaque_ftype_opaque
12544     = build_function_type_list (integer_type_node, NULL_TREE);
12545   tree opaque_ftype_opaque_int
12546     = build_function_type_list (opaque_V4SI_type_node,
12547                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
12548   tree opaque_ftype_opaque_opaque_int
12549     = build_function_type_list (opaque_V4SI_type_node,
12550                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
12551                                 integer_type_node, NULL_TREE);
12552   tree int_ftype_int_opaque_opaque
12553     = build_function_type_list (integer_type_node,
12554                                 integer_type_node, opaque_V4SI_type_node,
12555                                 opaque_V4SI_type_node, NULL_TREE);
12556   tree int_ftype_int_v4si_v4si
12557     = build_function_type_list (integer_type_node,
12558                                 integer_type_node, V4SI_type_node,
12559                                 V4SI_type_node, NULL_TREE);
12560   tree void_ftype_v4si
12561     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
12562   tree v8hi_ftype_void
12563     = build_function_type_list (V8HI_type_node, NULL_TREE);
12564   tree void_ftype_void
12565     = build_function_type_list (void_type_node, NULL_TREE);
12566   tree void_ftype_int
12567     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
12568
12569   tree opaque_ftype_long_pcvoid
12570     = build_function_type_list (opaque_V4SI_type_node,
12571                                 long_integer_type_node, pcvoid_type_node,
12572                                 NULL_TREE);
12573   tree v16qi_ftype_long_pcvoid
12574     = build_function_type_list (V16QI_type_node,
12575                                 long_integer_type_node, pcvoid_type_node,
12576                                 NULL_TREE);
12577   tree v8hi_ftype_long_pcvoid
12578     = build_function_type_list (V8HI_type_node,
12579                                 long_integer_type_node, pcvoid_type_node,
12580                                 NULL_TREE);
12581   tree v4si_ftype_long_pcvoid
12582     = build_function_type_list (V4SI_type_node,
12583                                 long_integer_type_node, pcvoid_type_node,
12584                                 NULL_TREE);
12585   tree v4sf_ftype_long_pcvoid
12586     = build_function_type_list (V4SF_type_node,
12587                                 long_integer_type_node, pcvoid_type_node,
12588                                 NULL_TREE);
12589   tree v2df_ftype_long_pcvoid
12590     = build_function_type_list (V2DF_type_node,
12591                                 long_integer_type_node, pcvoid_type_node,
12592                                 NULL_TREE);
12593   tree v2di_ftype_long_pcvoid
12594     = build_function_type_list (V2DI_type_node,
12595                                 long_integer_type_node, pcvoid_type_node,
12596                                 NULL_TREE);
12597
12598   tree void_ftype_opaque_long_pvoid
12599     = build_function_type_list (void_type_node,
12600                                 opaque_V4SI_type_node, long_integer_type_node,
12601                                 pvoid_type_node, NULL_TREE);
12602   tree void_ftype_v4si_long_pvoid
12603     = build_function_type_list (void_type_node,
12604                                 V4SI_type_node, long_integer_type_node,
12605                                 pvoid_type_node, NULL_TREE);
12606   tree void_ftype_v16qi_long_pvoid
12607     = build_function_type_list (void_type_node,
12608                                 V16QI_type_node, long_integer_type_node,
12609                                 pvoid_type_node, NULL_TREE);
12610   tree void_ftype_v8hi_long_pvoid
12611     = build_function_type_list (void_type_node,
12612                                 V8HI_type_node, long_integer_type_node,
12613                                 pvoid_type_node, NULL_TREE);
12614   tree void_ftype_v4sf_long_pvoid
12615     = build_function_type_list (void_type_node,
12616                                 V4SF_type_node, long_integer_type_node,
12617                                 pvoid_type_node, NULL_TREE);
12618   tree void_ftype_v2df_long_pvoid
12619     = build_function_type_list (void_type_node,
12620                                 V2DF_type_node, long_integer_type_node,
12621                                 pvoid_type_node, NULL_TREE);
12622   tree void_ftype_v2di_long_pvoid
12623     = build_function_type_list (void_type_node,
12624                                 V2DI_type_node, long_integer_type_node,
12625                                 pvoid_type_node, NULL_TREE);
12626   tree int_ftype_int_v8hi_v8hi
12627     = build_function_type_list (integer_type_node,
12628                                 integer_type_node, V8HI_type_node,
12629                                 V8HI_type_node, NULL_TREE);
12630   tree int_ftype_int_v16qi_v16qi
12631     = build_function_type_list (integer_type_node,
12632                                 integer_type_node, V16QI_type_node,
12633                                 V16QI_type_node, NULL_TREE);
12634   tree int_ftype_int_v4sf_v4sf
12635     = build_function_type_list (integer_type_node,
12636                                 integer_type_node, V4SF_type_node,
12637                                 V4SF_type_node, NULL_TREE);
12638   tree int_ftype_int_v2df_v2df
12639     = build_function_type_list (integer_type_node,
12640                                 integer_type_node, V2DF_type_node,
12641                                 V2DF_type_node, NULL_TREE);
12642   tree v4si_ftype_v4si
12643     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
12644   tree v8hi_ftype_v8hi
12645     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
12646   tree v16qi_ftype_v16qi
12647     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
12648   tree v4sf_ftype_v4sf
12649     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
12650   tree v2df_ftype_v2df
12651     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
12652   tree void_ftype_pcvoid_int_int
12653     = build_function_type_list (void_type_node,
12654                                 pcvoid_type_node, integer_type_node,
12655                                 integer_type_node, NULL_TREE);
12656
12657   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
12658   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
12659   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
12660   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
12661   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
12662   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
12663   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
12664   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
12665   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
12666   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
12667   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
12668   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
12669   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
12670   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
12671   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
12672   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
12673   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
12674   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
12675   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
12676   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
12677   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
12678   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
12679   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
12680   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
12681   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
12682   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
12683   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
12684   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
12685   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
12686   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
12687
12688   def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2df", v2df_ftype_long_pcvoid,
12689                VSX_BUILTIN_LXVD2X_V2DF);
12690   def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2di", v2di_ftype_long_pcvoid,
12691                VSX_BUILTIN_LXVD2X_V2DI);
12692   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4sf", v4sf_ftype_long_pcvoid,
12693                VSX_BUILTIN_LXVW4X_V4SF);
12694   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4si", v4si_ftype_long_pcvoid,
12695                VSX_BUILTIN_LXVW4X_V4SI);
12696   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v8hi",
12697                v8hi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V8HI);
12698   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v16qi",
12699                v16qi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V16QI);
12700   def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2df",
12701                void_ftype_v2df_long_pvoid, VSX_BUILTIN_STXVD2X_V2DF);
12702   def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2di",
12703                void_ftype_v2di_long_pvoid, VSX_BUILTIN_STXVD2X_V2DI);
12704   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4sf",
12705                void_ftype_v4sf_long_pvoid, VSX_BUILTIN_STXVW4X_V4SF);
12706   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4si",
12707                void_ftype_v4si_long_pvoid, VSX_BUILTIN_STXVW4X_V4SI);
12708   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v8hi",
12709                void_ftype_v8hi_long_pvoid, VSX_BUILTIN_STXVW4X_V8HI);
12710   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v16qi",
12711                void_ftype_v16qi_long_pvoid, VSX_BUILTIN_STXVW4X_V16QI);
12712   def_builtin (MASK_VSX, "__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
12713                VSX_BUILTIN_VEC_LD);
12714   def_builtin (MASK_VSX, "__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
12715                VSX_BUILTIN_VEC_ST);
12716
12717   if (rs6000_cpu == PROCESSOR_CELL)
12718     {
12719       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
12720       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
12721       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
12722       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
12723
12724       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
12725       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
12726       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
12727       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
12728
12729       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
12730       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
12731       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
12732       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
12733
12734       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
12735       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
12736       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
12737       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
12738     }
12739   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
12740   def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
12741   def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
12742
12743   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
12744   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
12745   def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
12746   def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
12747   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
12748   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
12749   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
12750   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
12751   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
12752   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
12753   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
12754   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
12755
12756   /* Add the DST variants.  */
12757   d = bdesc_dst;
12758   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
12759     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
12760
12761   /* Initialize the predicates.  */
12762   dp = bdesc_altivec_preds;
12763   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
12764     {
12765       enum machine_mode mode1;
12766       tree type;
12767       bool is_overloaded = ((dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
12768                              && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
12769                             || (dp->code >= VSX_BUILTIN_OVERLOADED_FIRST
12770                                 && dp->code <= VSX_BUILTIN_OVERLOADED_LAST));
12771
12772       if (is_overloaded)
12773         mode1 = VOIDmode;
12774       else
12775         mode1 = insn_data[dp->icode].operand[1].mode;
12776
12777       switch (mode1)
12778         {
12779         case VOIDmode:
12780           type = int_ftype_int_opaque_opaque;
12781           break;
12782         case V4SImode:
12783           type = int_ftype_int_v4si_v4si;
12784           break;
12785         case V8HImode:
12786           type = int_ftype_int_v8hi_v8hi;
12787           break;
12788         case V16QImode:
12789           type = int_ftype_int_v16qi_v16qi;
12790           break;
12791         case V4SFmode:
12792           type = int_ftype_int_v4sf_v4sf;
12793           break;
12794         case V2DFmode:
12795           type = int_ftype_int_v2df_v2df;
12796           break;
12797         default:
12798           gcc_unreachable ();
12799         }
12800
12801       def_builtin (dp->mask, dp->name, type, dp->code);
12802     }
12803
12804   /* Initialize the abs* operators.  */
12805   d = bdesc_abs;
12806   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
12807     {
12808       enum machine_mode mode0;
12809       tree type;
12810
12811       mode0 = insn_data[d->icode].operand[0].mode;
12812
12813       switch (mode0)
12814         {
12815         case V4SImode:
12816           type = v4si_ftype_v4si;
12817           break;
12818         case V8HImode:
12819           type = v8hi_ftype_v8hi;
12820           break;
12821         case V16QImode:
12822           type = v16qi_ftype_v16qi;
12823           break;
12824         case V4SFmode:
12825           type = v4sf_ftype_v4sf;
12826           break;
12827         case V2DFmode:
12828           type = v2df_ftype_v2df;
12829           break;
12830         default:
12831           gcc_unreachable ();
12832         }
12833
12834       def_builtin (d->mask, d->name, type, d->code);
12835     }
12836
12837   if (TARGET_ALTIVEC)
12838     {
12839       tree decl;
12840
12841       /* Initialize target builtin that implements
12842          targetm.vectorize.builtin_mask_for_load.  */
12843
12844       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
12845                                    v16qi_ftype_long_pcvoid,
12846                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
12847                                    BUILT_IN_MD, NULL, NULL_TREE);
12848       TREE_READONLY (decl) = 1;
12849       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
12850       altivec_builtin_mask_for_load = decl;
12851     }
12852
12853   /* Access to the vec_init patterns.  */
12854   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
12855                                     integer_type_node, integer_type_node,
12856                                     integer_type_node, NULL_TREE);
12857   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
12858                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
12859
12860   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
12861                                     short_integer_type_node,
12862                                     short_integer_type_node,
12863                                     short_integer_type_node,
12864                                     short_integer_type_node,
12865                                     short_integer_type_node,
12866                                     short_integer_type_node,
12867                                     short_integer_type_node, NULL_TREE);
12868   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
12869                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
12870
12871   ftype = build_function_type_list (V16QI_type_node, char_type_node,
12872                                     char_type_node, char_type_node,
12873                                     char_type_node, char_type_node,
12874                                     char_type_node, char_type_node,
12875                                     char_type_node, char_type_node,
12876                                     char_type_node, char_type_node,
12877                                     char_type_node, char_type_node,
12878                                     char_type_node, char_type_node,
12879                                     char_type_node, NULL_TREE);
12880   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
12881                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
12882
12883   ftype = build_function_type_list (V4SF_type_node, float_type_node,
12884                                     float_type_node, float_type_node,
12885                                     float_type_node, NULL_TREE);
12886   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
12887                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
12888
12889   if (TARGET_VSX)
12890     {
12891       ftype = build_function_type_list (V2DF_type_node, double_type_node,
12892                                         double_type_node, NULL_TREE);
12893       def_builtin (MASK_VSX, "__builtin_vec_init_v2df", ftype,
12894                    VSX_BUILTIN_VEC_INIT_V2DF);
12895
12896       ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
12897                                         intDI_type_node, NULL_TREE);
12898       def_builtin (MASK_VSX, "__builtin_vec_init_v2di", ftype,
12899                    VSX_BUILTIN_VEC_INIT_V2DI);
12900     }
12901
12902   /* Access to the vec_set patterns.  */
12903   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
12904                                     intSI_type_node,
12905                                     integer_type_node, NULL_TREE);
12906   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
12907                ALTIVEC_BUILTIN_VEC_SET_V4SI);
12908
12909   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
12910                                     intHI_type_node,
12911                                     integer_type_node, NULL_TREE);
12912   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
12913                ALTIVEC_BUILTIN_VEC_SET_V8HI);
12914
12915   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
12916                                     intQI_type_node,
12917                                     integer_type_node, NULL_TREE);
12918   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
12919                ALTIVEC_BUILTIN_VEC_SET_V16QI);
12920
12921   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
12922                                     float_type_node,
12923                                     integer_type_node, NULL_TREE);
12924   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_set_v4sf", ftype,
12925                ALTIVEC_BUILTIN_VEC_SET_V4SF);
12926
12927   if (TARGET_VSX)
12928     {
12929       ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
12930                                         double_type_node,
12931                                         integer_type_node, NULL_TREE);
12932       def_builtin (MASK_VSX, "__builtin_vec_set_v2df", ftype,
12933                    VSX_BUILTIN_VEC_SET_V2DF);
12934
12935       ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
12936                                         intDI_type_node,
12937                                         integer_type_node, NULL_TREE);
12938       def_builtin (MASK_VSX, "__builtin_vec_set_v2di", ftype,
12939                    VSX_BUILTIN_VEC_SET_V2DI);
12940     }
12941
12942   /* Access to the vec_extract patterns.  */
12943   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
12944                                     integer_type_node, NULL_TREE);
12945   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
12946                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
12947
12948   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
12949                                     integer_type_node, NULL_TREE);
12950   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
12951                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
12952
12953   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
12954                                     integer_type_node, NULL_TREE);
12955   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
12956                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
12957
12958   ftype = build_function_type_list (float_type_node, V4SF_type_node,
12959                                     integer_type_node, NULL_TREE);
12960   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_ext_v4sf", ftype,
12961                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
12962
12963   if (TARGET_VSX)
12964     {
12965       ftype = build_function_type_list (double_type_node, V2DF_type_node,
12966                                         integer_type_node, NULL_TREE);
12967       def_builtin (MASK_VSX, "__builtin_vec_ext_v2df", ftype,
12968                    VSX_BUILTIN_VEC_EXT_V2DF);
12969
12970       ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
12971                                         integer_type_node, NULL_TREE);
12972       def_builtin (MASK_VSX, "__builtin_vec_ext_v2di", ftype,
12973                    VSX_BUILTIN_VEC_EXT_V2DI);
12974     }
12975 }
12976
12977 /* Hash function for builtin functions with up to 3 arguments and a return
12978    type.  */
12979 static unsigned
12980 builtin_hash_function (const void *hash_entry)
12981 {
12982   unsigned ret = 0;
12983   int i;
12984   const struct builtin_hash_struct *bh =
12985     (const struct builtin_hash_struct *) hash_entry;
12986
12987   for (i = 0; i < 4; i++)
12988     {
12989       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
12990       ret = (ret * 2) + bh->uns_p[i];
12991     }
12992
12993   return ret;
12994 }
12995
12996 /* Compare builtin hash entries H1 and H2 for equivalence.  */
12997 static int
12998 builtin_hash_eq (const void *h1, const void *h2)
12999 {
13000   const struct builtin_hash_struct *p1 = (const struct builtin_hash_struct *) h1;
13001   const struct builtin_hash_struct *p2 = (const struct builtin_hash_struct *) h2;
13002
13003   return ((p1->mode[0] == p2->mode[0])
13004           && (p1->mode[1] == p2->mode[1])
13005           && (p1->mode[2] == p2->mode[2])
13006           && (p1->mode[3] == p2->mode[3])
13007           && (p1->uns_p[0] == p2->uns_p[0])
13008           && (p1->uns_p[1] == p2->uns_p[1])
13009           && (p1->uns_p[2] == p2->uns_p[2])
13010           && (p1->uns_p[3] == p2->uns_p[3]));
13011 }
13012
13013 /* Map types for builtin functions with an explicit return type and up to 3
13014    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
13015    of the argument.  */
13016 static tree
13017 builtin_function_type (enum machine_mode mode_ret, enum machine_mode mode_arg0,
13018                        enum machine_mode mode_arg1, enum machine_mode mode_arg2,
13019                        enum rs6000_builtins builtin, const char *name)
13020 {
13021   struct builtin_hash_struct h;
13022   struct builtin_hash_struct *h2;
13023   void **found;
13024   int num_args = 3;
13025   int i;
13026   tree ret_type = NULL_TREE;
13027   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
13028
13029   /* Create builtin_hash_table.  */
13030   if (builtin_hash_table == NULL)
13031     builtin_hash_table = htab_create_ggc (1500, builtin_hash_function,
13032                                           builtin_hash_eq, NULL);
13033
13034   h.type = NULL_TREE;
13035   h.mode[0] = mode_ret;
13036   h.mode[1] = mode_arg0;
13037   h.mode[2] = mode_arg1;
13038   h.mode[3] = mode_arg2;
13039   h.uns_p[0] = 0;
13040   h.uns_p[1] = 0;
13041   h.uns_p[2] = 0;
13042   h.uns_p[3] = 0;
13043
13044   /* If the builtin is a type that produces unsigned results or takes unsigned
13045      arguments, and it is returned as a decl for the vectorizer (such as
13046      widening multiplies, permute), make sure the arguments and return value
13047      are type correct.  */
13048   switch (builtin)
13049     {
13050       /* unsigned 2 argument functions.  */
13051     case ALTIVEC_BUILTIN_VMULEUB_UNS:
13052     case ALTIVEC_BUILTIN_VMULEUH_UNS:
13053     case ALTIVEC_BUILTIN_VMULOUB_UNS:
13054     case ALTIVEC_BUILTIN_VMULOUH_UNS:
13055       h.uns_p[0] = 1;
13056       h.uns_p[1] = 1;
13057       h.uns_p[2] = 1;
13058       break;
13059
13060       /* unsigned 3 argument functions.  */
13061     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
13062     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
13063     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
13064     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
13065     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
13066     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
13067     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
13068     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
13069     case VSX_BUILTIN_VPERM_16QI_UNS:
13070     case VSX_BUILTIN_VPERM_8HI_UNS:
13071     case VSX_BUILTIN_VPERM_4SI_UNS:
13072     case VSX_BUILTIN_VPERM_2DI_UNS:
13073     case VSX_BUILTIN_XXSEL_16QI_UNS:
13074     case VSX_BUILTIN_XXSEL_8HI_UNS:
13075     case VSX_BUILTIN_XXSEL_4SI_UNS:
13076     case VSX_BUILTIN_XXSEL_2DI_UNS:
13077       h.uns_p[0] = 1;
13078       h.uns_p[1] = 1;
13079       h.uns_p[2] = 1;
13080       h.uns_p[3] = 1;
13081       break;
13082
13083       /* signed permute functions with unsigned char mask.  */
13084     case ALTIVEC_BUILTIN_VPERM_16QI:
13085     case ALTIVEC_BUILTIN_VPERM_8HI:
13086     case ALTIVEC_BUILTIN_VPERM_4SI:
13087     case ALTIVEC_BUILTIN_VPERM_4SF:
13088     case ALTIVEC_BUILTIN_VPERM_2DI:
13089     case ALTIVEC_BUILTIN_VPERM_2DF:
13090     case VSX_BUILTIN_VPERM_16QI:
13091     case VSX_BUILTIN_VPERM_8HI:
13092     case VSX_BUILTIN_VPERM_4SI:
13093     case VSX_BUILTIN_VPERM_4SF:
13094     case VSX_BUILTIN_VPERM_2DI:
13095     case VSX_BUILTIN_VPERM_2DF:
13096       h.uns_p[3] = 1;
13097       break;
13098
13099       /* unsigned args, signed return.  */
13100     case VSX_BUILTIN_XVCVUXDDP_UNS:
13101     case VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF:
13102       h.uns_p[1] = 1;
13103       break;
13104
13105       /* signed args, unsigned return.  */
13106     case VSX_BUILTIN_XVCVDPUXDS_UNS:
13107     case VECTOR_BUILTIN_FIXUNS_V4SF_V4SI:
13108       h.uns_p[0] = 1;
13109       break;
13110
13111     default:
13112       break;
13113     }
13114
13115   /* Figure out how many args are present.  */
13116   while (num_args > 0 && h.mode[num_args] == VOIDmode)
13117     num_args--;
13118
13119   if (num_args == 0)
13120     fatal_error ("internal error: builtin function %s had no type", name);
13121
13122   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
13123   if (!ret_type && h.uns_p[0])
13124     ret_type = builtin_mode_to_type[h.mode[0]][0];
13125
13126   if (!ret_type)
13127     fatal_error ("internal error: builtin function %s had an unexpected "
13128                  "return type %s", name, GET_MODE_NAME (h.mode[0]));
13129
13130   for (i = 0; i < (int) ARRAY_SIZE (arg_type); i++)
13131     arg_type[i] = NULL_TREE;
13132
13133   for (i = 0; i < num_args; i++)
13134     {
13135       int m = (int) h.mode[i+1];
13136       int uns_p = h.uns_p[i+1];
13137
13138       arg_type[i] = builtin_mode_to_type[m][uns_p];
13139       if (!arg_type[i] && uns_p)
13140         arg_type[i] = builtin_mode_to_type[m][0];
13141
13142       if (!arg_type[i])
13143         fatal_error ("internal error: builtin function %s, argument %d "
13144                      "had unexpected argument type %s", name, i,
13145                      GET_MODE_NAME (m));
13146     }
13147
13148   found = htab_find_slot (builtin_hash_table, &h, INSERT);
13149   if (*found == NULL)
13150     {
13151       h2 = ggc_alloc_builtin_hash_struct ();
13152       *h2 = h;
13153       *found = (void *)h2;
13154
13155       h2->type = build_function_type_list (ret_type, arg_type[0], arg_type[1],
13156                                            arg_type[2], NULL_TREE);
13157     }
13158
13159   return ((struct builtin_hash_struct *)(*found))->type;
13160 }
13161
13162 static void
13163 rs6000_common_init_builtins (void)
13164 {
13165   const struct builtin_description *d;
13166   size_t i;
13167
13168   tree opaque_ftype_opaque = NULL_TREE;
13169   tree opaque_ftype_opaque_opaque = NULL_TREE;
13170   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
13171   tree v2si_ftype_qi = NULL_TREE;
13172   tree v2si_ftype_v2si_qi = NULL_TREE;
13173   tree v2si_ftype_int_qi = NULL_TREE;
13174
13175   if (!TARGET_PAIRED_FLOAT)
13176     {
13177       builtin_mode_to_type[V2SImode][0] = opaque_V2SI_type_node;
13178       builtin_mode_to_type[V2SFmode][0] = opaque_V2SF_type_node;
13179     }
13180
13181   /* Add the ternary operators.  */
13182   d = bdesc_3arg;
13183   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
13184     {
13185       tree type;
13186       int mask = d->mask;
13187
13188       if ((mask != 0 && (mask & target_flags) == 0)
13189           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13190         continue;
13191
13192       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13193            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13194           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13195               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13196         {
13197           if (! (type = opaque_ftype_opaque_opaque_opaque))
13198             type = opaque_ftype_opaque_opaque_opaque
13199               = build_function_type_list (opaque_V4SI_type_node,
13200                                           opaque_V4SI_type_node,
13201                                           opaque_V4SI_type_node,
13202                                           opaque_V4SI_type_node,
13203                                           NULL_TREE);
13204         }
13205       else
13206         {
13207           enum insn_code icode = d->icode;
13208           if (d->name == 0 || icode == CODE_FOR_nothing)
13209             continue;
13210
13211           type = builtin_function_type (insn_data[icode].operand[0].mode,
13212                                         insn_data[icode].operand[1].mode,
13213                                         insn_data[icode].operand[2].mode,
13214                                         insn_data[icode].operand[3].mode,
13215                                         d->code, d->name);
13216         }
13217
13218       def_builtin (d->mask, d->name, type, d->code);
13219     }
13220
13221   /* Add the binary operators.  */
13222   d = bdesc_2arg;
13223   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13224     {
13225       enum machine_mode mode0, mode1, mode2;
13226       tree type;
13227       int mask = d->mask;
13228
13229       if ((mask != 0 && (mask & target_flags) == 0)
13230           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13231         continue;
13232
13233       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13234            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13235           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13236               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13237         {
13238           if (! (type = opaque_ftype_opaque_opaque))
13239             type = opaque_ftype_opaque_opaque
13240               = build_function_type_list (opaque_V4SI_type_node,
13241                                           opaque_V4SI_type_node,
13242                                           opaque_V4SI_type_node,
13243                                           NULL_TREE);
13244         }
13245       else
13246         {
13247           enum insn_code icode = d->icode;
13248           if (d->name == 0 || icode == CODE_FOR_nothing)
13249             continue;
13250
13251           mode0 = insn_data[icode].operand[0].mode;
13252           mode1 = insn_data[icode].operand[1].mode;
13253           mode2 = insn_data[icode].operand[2].mode;
13254
13255           if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
13256             {
13257               if (! (type = v2si_ftype_v2si_qi))
13258                 type = v2si_ftype_v2si_qi
13259                   = build_function_type_list (opaque_V2SI_type_node,
13260                                               opaque_V2SI_type_node,
13261                                               char_type_node,
13262                                               NULL_TREE);
13263             }
13264
13265           else if (mode0 == V2SImode && GET_MODE_CLASS (mode1) == MODE_INT
13266                    && mode2 == QImode)
13267             {
13268               if (! (type = v2si_ftype_int_qi))
13269                 type = v2si_ftype_int_qi
13270                   = build_function_type_list (opaque_V2SI_type_node,
13271                                               integer_type_node,
13272                                               char_type_node,
13273                                               NULL_TREE);
13274             }
13275
13276           else
13277             type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
13278                                           d->code, d->name);
13279         }
13280
13281       def_builtin (d->mask, d->name, type, d->code);
13282     }
13283
13284   /* Add the simple unary operators.  */
13285   d = (struct builtin_description *) bdesc_1arg;
13286   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13287     {
13288       enum machine_mode mode0, mode1;
13289       tree type;
13290       int mask = d->mask;
13291
13292       if ((mask != 0 && (mask & target_flags) == 0)
13293           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13294         continue;
13295
13296       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13297            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13298           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13299               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13300         {
13301           if (! (type = opaque_ftype_opaque))
13302             type = opaque_ftype_opaque
13303               = build_function_type_list (opaque_V4SI_type_node,
13304                                           opaque_V4SI_type_node,
13305                                           NULL_TREE);
13306         }
13307       else
13308         {
13309           enum insn_code icode = d->icode;
13310           if (d->name == 0 || icode == CODE_FOR_nothing)
13311             continue;
13312
13313           mode0 = insn_data[icode].operand[0].mode;
13314           mode1 = insn_data[icode].operand[1].mode;
13315
13316           if (mode0 == V2SImode && mode1 == QImode)
13317             {
13318               if (! (type = v2si_ftype_qi))
13319                 type = v2si_ftype_qi
13320                   = build_function_type_list (opaque_V2SI_type_node,
13321                                               char_type_node,
13322                                               NULL_TREE);
13323             }
13324
13325           else
13326             type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
13327                                           d->code, d->name);
13328         }
13329
13330       def_builtin (d->mask, d->name, type, d->code);
13331     }
13332 }
13333
13334 static void
13335 rs6000_init_libfuncs (void)
13336 {
13337   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
13338       && !TARGET_POWER2 && !TARGET_POWERPC)
13339     {
13340       /* AIX library routines for float->int conversion.  */
13341       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
13342       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
13343       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
13344       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
13345     }
13346
13347   if (!TARGET_IEEEQUAD)
13348       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
13349     if (!TARGET_XL_COMPAT)
13350       {
13351         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
13352         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
13353         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
13354         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
13355
13356         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
13357           {
13358             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
13359             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
13360             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
13361             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
13362             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
13363             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
13364             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
13365
13366             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
13367             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
13368             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
13369             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
13370             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
13371             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
13372             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
13373             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
13374           }
13375
13376         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
13377           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
13378       }
13379     else
13380       {
13381         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
13382         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
13383         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
13384         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
13385       }
13386   else
13387     {
13388       /* 32-bit SVR4 quad floating point routines.  */
13389
13390       set_optab_libfunc (add_optab, TFmode, "_q_add");
13391       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
13392       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
13393       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
13394       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
13395       if (TARGET_PPC_GPOPT || TARGET_POWER2)
13396         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
13397
13398       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
13399       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
13400       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
13401       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
13402       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
13403       set_optab_libfunc (le_optab, TFmode, "_q_fle");
13404
13405       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
13406       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
13407       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
13408       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
13409       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
13410       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
13411       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
13412       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
13413     }
13414 }
13415
13416 \f
13417 /* Expand a block clear operation, and return 1 if successful.  Return 0
13418    if we should let the compiler generate normal code.
13419
13420    operands[0] is the destination
13421    operands[1] is the length
13422    operands[3] is the alignment */
13423
13424 int
13425 expand_block_clear (rtx operands[])
13426 {
13427   rtx orig_dest = operands[0];
13428   rtx bytes_rtx = operands[1];
13429   rtx align_rtx = operands[3];
13430   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
13431   HOST_WIDE_INT align;
13432   HOST_WIDE_INT bytes;
13433   int offset;
13434   int clear_bytes;
13435   int clear_step;
13436
13437   /* If this is not a fixed size move, just call memcpy */
13438   if (! constp)
13439     return 0;
13440
13441   /* This must be a fixed size alignment  */
13442   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13443   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13444
13445   /* Anything to clear? */
13446   bytes = INTVAL (bytes_rtx);
13447   if (bytes <= 0)
13448     return 1;
13449
13450   /* Use the builtin memset after a point, to avoid huge code bloat.
13451      When optimize_size, avoid any significant code bloat; calling
13452      memset is about 4 instructions, so allow for one instruction to
13453      load zero and three to do clearing.  */
13454   if (TARGET_ALTIVEC && align >= 128)
13455     clear_step = 16;
13456   else if (TARGET_POWERPC64 && align >= 32)
13457     clear_step = 8;
13458   else if (TARGET_SPE && align >= 64)
13459     clear_step = 8;
13460   else
13461     clear_step = 4;
13462
13463   if (optimize_size && bytes > 3 * clear_step)
13464     return 0;
13465   if (! optimize_size && bytes > 8 * clear_step)
13466     return 0;
13467
13468   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
13469     {
13470       enum machine_mode mode = BLKmode;
13471       rtx dest;
13472
13473       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
13474         {
13475           clear_bytes = 16;
13476           mode = V4SImode;
13477         }
13478       else if (bytes >= 8 && TARGET_SPE && align >= 64)
13479         {
13480           clear_bytes = 8;
13481           mode = V2SImode;
13482         }
13483       else if (bytes >= 8 && TARGET_POWERPC64
13484                /* 64-bit loads and stores require word-aligned
13485                   displacements.  */
13486                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13487         {
13488           clear_bytes = 8;
13489           mode = DImode;
13490         }
13491       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13492         {                       /* move 4 bytes */
13493           clear_bytes = 4;
13494           mode = SImode;
13495         }
13496       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13497         {                       /* move 2 bytes */
13498           clear_bytes = 2;
13499           mode = HImode;
13500         }
13501       else /* move 1 byte at a time */
13502         {
13503           clear_bytes = 1;
13504           mode = QImode;
13505         }
13506
13507       dest = adjust_address (orig_dest, mode, offset);
13508
13509       emit_move_insn (dest, CONST0_RTX (mode));
13510     }
13511
13512   return 1;
13513 }
13514
13515 \f
13516 /* Expand a block move operation, and return 1 if successful.  Return 0
13517    if we should let the compiler generate normal code.
13518
13519    operands[0] is the destination
13520    operands[1] is the source
13521    operands[2] is the length
13522    operands[3] is the alignment */
13523
13524 #define MAX_MOVE_REG 4
13525
13526 int
13527 expand_block_move (rtx operands[])
13528 {
13529   rtx orig_dest = operands[0];
13530   rtx orig_src  = operands[1];
13531   rtx bytes_rtx = operands[2];
13532   rtx align_rtx = operands[3];
13533   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
13534   int align;
13535   int bytes;
13536   int offset;
13537   int move_bytes;
13538   rtx stores[MAX_MOVE_REG];
13539   int num_reg = 0;
13540
13541   /* If this is not a fixed size move, just call memcpy */
13542   if (! constp)
13543     return 0;
13544
13545   /* This must be a fixed size alignment */
13546   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13547   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13548
13549   /* Anything to move? */
13550   bytes = INTVAL (bytes_rtx);
13551   if (bytes <= 0)
13552     return 1;
13553
13554   if (bytes > rs6000_block_move_inline_limit)
13555     return 0;
13556
13557   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
13558     {
13559       union {
13560         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
13561         rtx (*mov) (rtx, rtx);
13562       } gen_func;
13563       enum machine_mode mode = BLKmode;
13564       rtx src, dest;
13565
13566       /* Altivec first, since it will be faster than a string move
13567          when it applies, and usually not significantly larger.  */
13568       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
13569         {
13570           move_bytes = 16;
13571           mode = V4SImode;
13572           gen_func.mov = gen_movv4si;
13573         }
13574       else if (TARGET_SPE && bytes >= 8 && align >= 64)
13575         {
13576           move_bytes = 8;
13577           mode = V2SImode;
13578           gen_func.mov = gen_movv2si;
13579         }
13580       else if (TARGET_STRING
13581           && bytes > 24         /* move up to 32 bytes at a time */
13582           && ! fixed_regs[5]
13583           && ! fixed_regs[6]
13584           && ! fixed_regs[7]
13585           && ! fixed_regs[8]
13586           && ! fixed_regs[9]
13587           && ! fixed_regs[10]
13588           && ! fixed_regs[11]
13589           && ! fixed_regs[12])
13590         {
13591           move_bytes = (bytes > 32) ? 32 : bytes;
13592           gen_func.movmemsi = gen_movmemsi_8reg;
13593         }
13594       else if (TARGET_STRING
13595                && bytes > 16    /* move up to 24 bytes at a time */
13596                && ! fixed_regs[5]
13597                && ! fixed_regs[6]
13598                && ! fixed_regs[7]
13599                && ! fixed_regs[8]
13600                && ! fixed_regs[9]
13601                && ! fixed_regs[10])
13602         {
13603           move_bytes = (bytes > 24) ? 24 : bytes;
13604           gen_func.movmemsi = gen_movmemsi_6reg;
13605         }
13606       else if (TARGET_STRING
13607                && bytes > 8     /* move up to 16 bytes at a time */
13608                && ! fixed_regs[5]
13609                && ! fixed_regs[6]
13610                && ! fixed_regs[7]
13611                && ! fixed_regs[8])
13612         {
13613           move_bytes = (bytes > 16) ? 16 : bytes;
13614           gen_func.movmemsi = gen_movmemsi_4reg;
13615         }
13616       else if (bytes >= 8 && TARGET_POWERPC64
13617                /* 64-bit loads and stores require word-aligned
13618                   displacements.  */
13619                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13620         {
13621           move_bytes = 8;
13622           mode = DImode;
13623           gen_func.mov = gen_movdi;
13624         }
13625       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
13626         {                       /* move up to 8 bytes at a time */
13627           move_bytes = (bytes > 8) ? 8 : bytes;
13628           gen_func.movmemsi = gen_movmemsi_2reg;
13629         }
13630       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13631         {                       /* move 4 bytes */
13632           move_bytes = 4;
13633           mode = SImode;
13634           gen_func.mov = gen_movsi;
13635         }
13636       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13637         {                       /* move 2 bytes */
13638           move_bytes = 2;
13639           mode = HImode;
13640           gen_func.mov = gen_movhi;
13641         }
13642       else if (TARGET_STRING && bytes > 1)
13643         {                       /* move up to 4 bytes at a time */
13644           move_bytes = (bytes > 4) ? 4 : bytes;
13645           gen_func.movmemsi = gen_movmemsi_1reg;
13646         }
13647       else /* move 1 byte at a time */
13648         {
13649           move_bytes = 1;
13650           mode = QImode;
13651           gen_func.mov = gen_movqi;
13652         }
13653
13654       src = adjust_address (orig_src, mode, offset);
13655       dest = adjust_address (orig_dest, mode, offset);
13656
13657       if (mode != BLKmode)
13658         {
13659           rtx tmp_reg = gen_reg_rtx (mode);
13660
13661           emit_insn ((*gen_func.mov) (tmp_reg, src));
13662           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
13663         }
13664
13665       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
13666         {
13667           int i;
13668           for (i = 0; i < num_reg; i++)
13669             emit_insn (stores[i]);
13670           num_reg = 0;
13671         }
13672
13673       if (mode == BLKmode)
13674         {
13675           /* Move the address into scratch registers.  The movmemsi
13676              patterns require zero offset.  */
13677           if (!REG_P (XEXP (src, 0)))
13678             {
13679               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
13680               src = replace_equiv_address (src, src_reg);
13681             }
13682           set_mem_size (src, GEN_INT (move_bytes));
13683
13684           if (!REG_P (XEXP (dest, 0)))
13685             {
13686               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
13687               dest = replace_equiv_address (dest, dest_reg);
13688             }
13689           set_mem_size (dest, GEN_INT (move_bytes));
13690
13691           emit_insn ((*gen_func.movmemsi) (dest, src,
13692                                            GEN_INT (move_bytes & 31),
13693                                            align_rtx));
13694         }
13695     }
13696
13697   return 1;
13698 }
13699
13700 \f
13701 /* Return a string to perform a load_multiple operation.
13702    operands[0] is the vector.
13703    operands[1] is the source address.
13704    operands[2] is the first destination register.  */
13705
13706 const char *
13707 rs6000_output_load_multiple (rtx operands[3])
13708 {
13709   /* We have to handle the case where the pseudo used to contain the address
13710      is assigned to one of the output registers.  */
13711   int i, j;
13712   int words = XVECLEN (operands[0], 0);
13713   rtx xop[10];
13714
13715   if (XVECLEN (operands[0], 0) == 1)
13716     return "{l|lwz} %2,0(%1)";
13717
13718   for (i = 0; i < words; i++)
13719     if (refers_to_regno_p (REGNO (operands[2]) + i,
13720                            REGNO (operands[2]) + i + 1, operands[1], 0))
13721       {
13722         if (i == words-1)
13723           {
13724             xop[0] = GEN_INT (4 * (words-1));
13725             xop[1] = operands[1];
13726             xop[2] = operands[2];
13727             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
13728             return "";
13729           }
13730         else if (i == 0)
13731           {
13732             xop[0] = GEN_INT (4 * (words-1));
13733             xop[1] = operands[1];
13734             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
13735             output_asm_insn ("{cal %1,4(%1)|addi %1,%1,4}\n\t{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,-4(%1)", xop);
13736             return "";
13737           }
13738         else
13739           {
13740             for (j = 0; j < words; j++)
13741               if (j != i)
13742                 {
13743                   xop[0] = GEN_INT (j * 4);
13744                   xop[1] = operands[1];
13745                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
13746                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
13747                 }
13748             xop[0] = GEN_INT (i * 4);
13749             xop[1] = operands[1];
13750             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
13751             return "";
13752           }
13753       }
13754
13755   return "{lsi|lswi} %2,%1,%N0";
13756 }
13757
13758 \f
13759 /* A validation routine: say whether CODE, a condition code, and MODE
13760    match.  The other alternatives either don't make sense or should
13761    never be generated.  */
13762
13763 void
13764 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
13765 {
13766   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
13767                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
13768               && GET_MODE_CLASS (mode) == MODE_CC);
13769
13770   /* These don't make sense.  */
13771   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
13772               || mode != CCUNSmode);
13773
13774   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
13775               || mode == CCUNSmode);
13776
13777   gcc_assert (mode == CCFPmode
13778               || (code != ORDERED && code != UNORDERED
13779                   && code != UNEQ && code != LTGT
13780                   && code != UNGT && code != UNLT
13781                   && code != UNGE && code != UNLE));
13782
13783   /* These should never be generated except for
13784      flag_finite_math_only.  */
13785   gcc_assert (mode != CCFPmode
13786               || flag_finite_math_only
13787               || (code != LE && code != GE
13788                   && code != UNEQ && code != LTGT
13789                   && code != UNGT && code != UNLT));
13790
13791   /* These are invalid; the information is not there.  */
13792   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
13793 }
13794
13795 \f
13796 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
13797    mask required to convert the result of a rotate insn into a shift
13798    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
13799
13800 int
13801 includes_lshift_p (rtx shiftop, rtx andop)
13802 {
13803   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13804
13805   shift_mask <<= INTVAL (shiftop);
13806
13807   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13808 }
13809
13810 /* Similar, but for right shift.  */
13811
13812 int
13813 includes_rshift_p (rtx shiftop, rtx andop)
13814 {
13815   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13816
13817   shift_mask >>= INTVAL (shiftop);
13818
13819   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13820 }
13821
13822 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
13823    to perform a left shift.  It must have exactly SHIFTOP least
13824    significant 0's, then one or more 1's, then zero or more 0's.  */
13825
13826 int
13827 includes_rldic_lshift_p (rtx shiftop, rtx andop)
13828 {
13829   if (GET_CODE (andop) == CONST_INT)
13830     {
13831       HOST_WIDE_INT c, lsb, shift_mask;
13832
13833       c = INTVAL (andop);
13834       if (c == 0 || c == ~0)
13835         return 0;
13836
13837       shift_mask = ~0;
13838       shift_mask <<= INTVAL (shiftop);
13839
13840       /* Find the least significant one bit.  */
13841       lsb = c & -c;
13842
13843       /* It must coincide with the LSB of the shift mask.  */
13844       if (-lsb != shift_mask)
13845         return 0;
13846
13847       /* Invert to look for the next transition (if any).  */
13848       c = ~c;
13849
13850       /* Remove the low group of ones (originally low group of zeros).  */
13851       c &= -lsb;
13852
13853       /* Again find the lsb, and check we have all 1's above.  */
13854       lsb = c & -c;
13855       return c == -lsb;
13856     }
13857   else if (GET_CODE (andop) == CONST_DOUBLE
13858            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13859     {
13860       HOST_WIDE_INT low, high, lsb;
13861       HOST_WIDE_INT shift_mask_low, shift_mask_high;
13862
13863       low = CONST_DOUBLE_LOW (andop);
13864       if (HOST_BITS_PER_WIDE_INT < 64)
13865         high = CONST_DOUBLE_HIGH (andop);
13866
13867       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
13868           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
13869         return 0;
13870
13871       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13872         {
13873           shift_mask_high = ~0;
13874           if (INTVAL (shiftop) > 32)
13875             shift_mask_high <<= INTVAL (shiftop) - 32;
13876
13877           lsb = high & -high;
13878
13879           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
13880             return 0;
13881
13882           high = ~high;
13883           high &= -lsb;
13884
13885           lsb = high & -high;
13886           return high == -lsb;
13887         }
13888
13889       shift_mask_low = ~0;
13890       shift_mask_low <<= INTVAL (shiftop);
13891
13892       lsb = low & -low;
13893
13894       if (-lsb != shift_mask_low)
13895         return 0;
13896
13897       if (HOST_BITS_PER_WIDE_INT < 64)
13898         high = ~high;
13899       low = ~low;
13900       low &= -lsb;
13901
13902       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13903         {
13904           lsb = high & -high;
13905           return high == -lsb;
13906         }
13907
13908       lsb = low & -low;
13909       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
13910     }
13911   else
13912     return 0;
13913 }
13914
13915 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
13916    to perform a left shift.  It must have SHIFTOP or more least
13917    significant 0's, with the remainder of the word 1's.  */
13918
13919 int
13920 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
13921 {
13922   if (GET_CODE (andop) == CONST_INT)
13923     {
13924       HOST_WIDE_INT c, lsb, shift_mask;
13925
13926       shift_mask = ~0;
13927       shift_mask <<= INTVAL (shiftop);
13928       c = INTVAL (andop);
13929
13930       /* Find the least significant one bit.  */
13931       lsb = c & -c;
13932
13933       /* It must be covered by the shift mask.
13934          This test also rejects c == 0.  */
13935       if ((lsb & shift_mask) == 0)
13936         return 0;
13937
13938       /* Check we have all 1's above the transition, and reject all 1's.  */
13939       return c == -lsb && lsb != 1;
13940     }
13941   else if (GET_CODE (andop) == CONST_DOUBLE
13942            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13943     {
13944       HOST_WIDE_INT low, lsb, shift_mask_low;
13945
13946       low = CONST_DOUBLE_LOW (andop);
13947
13948       if (HOST_BITS_PER_WIDE_INT < 64)
13949         {
13950           HOST_WIDE_INT high, shift_mask_high;
13951
13952           high = CONST_DOUBLE_HIGH (andop);
13953
13954           if (low == 0)
13955             {
13956               shift_mask_high = ~0;
13957               if (INTVAL (shiftop) > 32)
13958                 shift_mask_high <<= INTVAL (shiftop) - 32;
13959
13960               lsb = high & -high;
13961
13962               if ((lsb & shift_mask_high) == 0)
13963                 return 0;
13964
13965               return high == -lsb;
13966             }
13967           if (high != ~0)
13968             return 0;
13969         }
13970
13971       shift_mask_low = ~0;
13972       shift_mask_low <<= INTVAL (shiftop);
13973
13974       lsb = low & -low;
13975
13976       if ((lsb & shift_mask_low) == 0)
13977         return 0;
13978
13979       return low == -lsb && lsb != 1;
13980     }
13981   else
13982     return 0;
13983 }
13984
13985 /* Return 1 if operands will generate a valid arguments to rlwimi
13986 instruction for insert with right shift in 64-bit mode.  The mask may
13987 not start on the first bit or stop on the last bit because wrap-around
13988 effects of instruction do not correspond to semantics of RTL insn.  */
13989
13990 int
13991 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
13992 {
13993   if (INTVAL (startop) > 32
13994       && INTVAL (startop) < 64
13995       && INTVAL (sizeop) > 1
13996       && INTVAL (sizeop) + INTVAL (startop) < 64
13997       && INTVAL (shiftop) > 0
13998       && INTVAL (sizeop) + INTVAL (shiftop) < 32
13999       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
14000     return 1;
14001
14002   return 0;
14003 }
14004
14005 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
14006    for lfq and stfq insns iff the registers are hard registers.   */
14007
14008 int
14009 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
14010 {
14011   /* We might have been passed a SUBREG.  */
14012   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
14013     return 0;
14014
14015   /* We might have been passed non floating point registers.  */
14016   if (!FP_REGNO_P (REGNO (reg1))
14017       || !FP_REGNO_P (REGNO (reg2)))
14018     return 0;
14019
14020   return (REGNO (reg1) == REGNO (reg2) - 1);
14021 }
14022
14023 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
14024    addr1 and addr2 must be in consecutive memory locations
14025    (addr2 == addr1 + 8).  */
14026
14027 int
14028 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
14029 {
14030   rtx addr1, addr2;
14031   unsigned int reg1, reg2;
14032   int offset1, offset2;
14033
14034   /* The mems cannot be volatile.  */
14035   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
14036     return 0;
14037
14038   addr1 = XEXP (mem1, 0);
14039   addr2 = XEXP (mem2, 0);
14040
14041   /* Extract an offset (if used) from the first addr.  */
14042   if (GET_CODE (addr1) == PLUS)
14043     {
14044       /* If not a REG, return zero.  */
14045       if (GET_CODE (XEXP (addr1, 0)) != REG)
14046         return 0;
14047       else
14048         {
14049           reg1 = REGNO (XEXP (addr1, 0));
14050           /* The offset must be constant!  */
14051           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
14052             return 0;
14053           offset1 = INTVAL (XEXP (addr1, 1));
14054         }
14055     }
14056   else if (GET_CODE (addr1) != REG)
14057     return 0;
14058   else
14059     {
14060       reg1 = REGNO (addr1);
14061       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14062       offset1 = 0;
14063     }
14064
14065   /* And now for the second addr.  */
14066   if (GET_CODE (addr2) == PLUS)
14067     {
14068       /* If not a REG, return zero.  */
14069       if (GET_CODE (XEXP (addr2, 0)) != REG)
14070         return 0;
14071       else
14072         {
14073           reg2 = REGNO (XEXP (addr2, 0));
14074           /* The offset must be constant. */
14075           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
14076             return 0;
14077           offset2 = INTVAL (XEXP (addr2, 1));
14078         }
14079     }
14080   else if (GET_CODE (addr2) != REG)
14081     return 0;
14082   else
14083     {
14084       reg2 = REGNO (addr2);
14085       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14086       offset2 = 0;
14087     }
14088
14089   /* Both of these must have the same base register.  */
14090   if (reg1 != reg2)
14091     return 0;
14092
14093   /* The offset for the second addr must be 8 more than the first addr.  */
14094   if (offset2 != offset1 + 8)
14095     return 0;
14096
14097   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
14098      instructions.  */
14099   return 1;
14100 }
14101 \f
14102
14103 rtx
14104 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
14105 {
14106   static bool eliminated = false;
14107   rtx ret;
14108
14109   if (mode != SDmode)
14110     ret = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
14111   else
14112     {
14113       rtx mem = cfun->machine->sdmode_stack_slot;
14114       gcc_assert (mem != NULL_RTX);
14115
14116       if (!eliminated)
14117         {
14118           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
14119           cfun->machine->sdmode_stack_slot = mem;
14120           eliminated = true;
14121         }
14122       ret = mem;
14123     }
14124
14125   if (TARGET_DEBUG_ADDR)
14126     {
14127       fprintf (stderr, "\nrs6000_secondary_memory_needed_rtx, mode %s, rtx:\n",
14128                GET_MODE_NAME (mode));
14129       if (!ret)
14130         fprintf (stderr, "\tNULL_RTX\n");
14131       else
14132         debug_rtx (ret);
14133     }
14134
14135   return ret;
14136 }
14137
14138 static tree
14139 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
14140 {
14141   /* Don't walk into types.  */
14142   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
14143     {
14144       *walk_subtrees = 0;
14145       return NULL_TREE;
14146     }
14147
14148   switch (TREE_CODE (*tp))
14149     {
14150     case VAR_DECL:
14151     case PARM_DECL:
14152     case FIELD_DECL:
14153     case RESULT_DECL:
14154     case SSA_NAME:
14155     case REAL_CST:
14156     case MEM_REF:
14157     case VIEW_CONVERT_EXPR:
14158       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
14159         return *tp;
14160       break;
14161     default:
14162       break;
14163     }
14164
14165   return NULL_TREE;
14166 }
14167
14168 enum reload_reg_type {
14169   GPR_REGISTER_TYPE,
14170   VECTOR_REGISTER_TYPE,
14171   OTHER_REGISTER_TYPE
14172 };
14173
14174 static enum reload_reg_type
14175 rs6000_reload_register_type (enum reg_class rclass)
14176 {
14177   switch (rclass)
14178     {
14179     case GENERAL_REGS:
14180     case BASE_REGS:
14181       return GPR_REGISTER_TYPE;
14182
14183     case FLOAT_REGS:
14184     case ALTIVEC_REGS:
14185     case VSX_REGS:
14186       return VECTOR_REGISTER_TYPE;
14187
14188     default:
14189       return OTHER_REGISTER_TYPE;
14190     }
14191 }
14192
14193 /* Inform reload about cases where moving X with a mode MODE to a register in
14194    RCLASS requires an extra scratch or immediate register.  Return the class
14195    needed for the immediate register.
14196
14197    For VSX and Altivec, we may need a register to convert sp+offset into
14198    reg+sp.
14199
14200    For misaligned 64-bit gpr loads and stores we need a register to
14201    convert an offset address to indirect.  */
14202
14203 static reg_class_t
14204 rs6000_secondary_reload (bool in_p,
14205                          rtx x,
14206                          reg_class_t rclass_i,
14207                          enum machine_mode mode,
14208                          secondary_reload_info *sri)
14209 {
14210   enum reg_class rclass = (enum reg_class) rclass_i;
14211   reg_class_t ret = ALL_REGS;
14212   enum insn_code icode;
14213   bool default_p = false;
14214
14215   sri->icode = CODE_FOR_nothing;
14216
14217   /* Convert vector loads and stores into gprs to use an additional base
14218      register.  */
14219   icode = rs6000_vector_reload[mode][in_p != false];
14220   if (icode != CODE_FOR_nothing)
14221     {
14222       ret = NO_REGS;
14223       sri->icode = CODE_FOR_nothing;
14224       sri->extra_cost = 0;
14225
14226       if (GET_CODE (x) == MEM)
14227         {
14228           rtx addr = XEXP (x, 0);
14229
14230           /* Loads to and stores from gprs can do reg+offset, and wouldn't need
14231              an extra register in that case, but it would need an extra
14232              register if the addressing is reg+reg or (reg+reg)&(-16).  */
14233           if (rclass == GENERAL_REGS || rclass == BASE_REGS)
14234             {
14235               if (!legitimate_indirect_address_p (addr, false)
14236                   && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14237                 {
14238                   sri->icode = icode;
14239                   /* account for splitting the loads, and converting the
14240                      address from reg+reg to reg.  */
14241                   sri->extra_cost = (((TARGET_64BIT) ? 3 : 5)
14242                                      + ((GET_CODE (addr) == AND) ? 1 : 0));
14243                 }
14244             }
14245           /* Loads to and stores from vector registers can only do reg+reg
14246              addressing.  Altivec registers can also do (reg+reg)&(-16).  */
14247           else if (rclass == VSX_REGS || rclass == ALTIVEC_REGS
14248                    || rclass == FLOAT_REGS || rclass == NO_REGS)
14249             {
14250               if (!VECTOR_MEM_ALTIVEC_P (mode)
14251                   && GET_CODE (addr) == AND
14252                   && GET_CODE (XEXP (addr, 1)) == CONST_INT
14253                   && INTVAL (XEXP (addr, 1)) == -16
14254                   && (legitimate_indirect_address_p (XEXP (addr, 0), false)
14255                       || legitimate_indexed_address_p (XEXP (addr, 0), false)))
14256                 {
14257                   sri->icode = icode;
14258                   sri->extra_cost = ((GET_CODE (XEXP (addr, 0)) == PLUS)
14259                                      ? 2 : 1);
14260                 }
14261               else if (!legitimate_indirect_address_p (addr, false)
14262                        && (rclass == NO_REGS
14263                            || !legitimate_indexed_address_p (addr, false)))
14264                 {
14265                   sri->icode = icode;
14266                   sri->extra_cost = 1;
14267                 }
14268               else
14269                 icode = CODE_FOR_nothing;
14270             }
14271           /* Any other loads, including to pseudo registers which haven't been
14272              assigned to a register yet, default to require a scratch
14273              register.  */
14274           else
14275             {
14276               sri->icode = icode;
14277               sri->extra_cost = 2;
14278             }
14279         }
14280       else if (REG_P (x))
14281         {
14282           int regno = true_regnum (x);
14283
14284           icode = CODE_FOR_nothing;
14285           if (regno < 0 || regno >= FIRST_PSEUDO_REGISTER)
14286             default_p = true;
14287           else
14288             {
14289               enum reg_class xclass = REGNO_REG_CLASS (regno);
14290               enum reload_reg_type rtype1 = rs6000_reload_register_type (rclass);
14291               enum reload_reg_type rtype2 = rs6000_reload_register_type (xclass);
14292
14293               /* If memory is needed, use default_secondary_reload to create the
14294                  stack slot.  */
14295               if (rtype1 != rtype2 || rtype1 == OTHER_REGISTER_TYPE)
14296                 default_p = true;
14297               else
14298                 ret = NO_REGS;
14299             }
14300         }
14301       else
14302         default_p = true;
14303     }
14304   else if (TARGET_POWERPC64
14305            && rs6000_reload_register_type (rclass) == GPR_REGISTER_TYPE
14306            && MEM_P (x)
14307            && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD)
14308     {
14309       rtx addr = XEXP (x, 0);
14310
14311       if (GET_CODE (addr) == PRE_MODIFY)
14312         addr = XEXP (addr, 1);
14313       else if (GET_CODE (addr) == LO_SUM
14314                && GET_CODE (XEXP (addr, 0)) == REG
14315                && GET_CODE (XEXP (addr, 1)) == CONST)
14316         addr = XEXP (XEXP (addr, 1), 0);
14317
14318       if (GET_CODE (addr) == PLUS
14319           && GET_CODE (XEXP (addr, 1)) == CONST_INT
14320           && (INTVAL (XEXP (addr, 1)) & 3) != 0)
14321         {
14322           if (in_p)
14323             sri->icode = CODE_FOR_reload_di_load;
14324           else
14325             sri->icode = CODE_FOR_reload_di_store;
14326           sri->extra_cost = 2;
14327           ret = NO_REGS;
14328         }
14329       else
14330         default_p = true;
14331     }
14332   else
14333     default_p = true;
14334
14335   if (default_p)
14336     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
14337
14338   gcc_assert (ret != ALL_REGS);
14339
14340   if (TARGET_DEBUG_ADDR)
14341     {
14342       fprintf (stderr,
14343                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
14344                "mode = %s",
14345                reg_class_names[ret],
14346                in_p ? "true" : "false",
14347                reg_class_names[rclass],
14348                GET_MODE_NAME (mode));
14349
14350       if (default_p)
14351         fprintf (stderr, ", default secondary reload");
14352
14353       if (sri->icode != CODE_FOR_nothing)
14354         fprintf (stderr, ", reload func = %s, extra cost = %d\n",
14355                  insn_data[sri->icode].name, sri->extra_cost);
14356       else
14357         fprintf (stderr, "\n");
14358
14359       debug_rtx (x);
14360     }
14361
14362   return ret;
14363 }
14364
14365 /* Fixup reload addresses for Altivec or VSX loads/stores to change SP+offset
14366    to SP+reg addressing.  */
14367
14368 void
14369 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
14370 {
14371   int regno = true_regnum (reg);
14372   enum machine_mode mode = GET_MODE (reg);
14373   enum reg_class rclass;
14374   rtx addr;
14375   rtx and_op2 = NULL_RTX;
14376   rtx addr_op1;
14377   rtx addr_op2;
14378   rtx scratch_or_premodify = scratch;
14379   rtx and_rtx;
14380   rtx cc_clobber;
14381
14382   if (TARGET_DEBUG_ADDR)
14383     {
14384       fprintf (stderr, "\nrs6000_secondary_reload_inner, type = %s\n",
14385                store_p ? "store" : "load");
14386       fprintf (stderr, "reg:\n");
14387       debug_rtx (reg);
14388       fprintf (stderr, "mem:\n");
14389       debug_rtx (mem);
14390       fprintf (stderr, "scratch:\n");
14391       debug_rtx (scratch);
14392     }
14393
14394   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14395   gcc_assert (GET_CODE (mem) == MEM);
14396   rclass = REGNO_REG_CLASS (regno);
14397   addr = XEXP (mem, 0);
14398
14399   switch (rclass)
14400     {
14401       /* GPRs can handle reg + small constant, all other addresses need to use
14402          the scratch register.  */
14403     case GENERAL_REGS:
14404     case BASE_REGS:
14405       if (GET_CODE (addr) == AND)
14406         {
14407           and_op2 = XEXP (addr, 1);
14408           addr = XEXP (addr, 0);
14409         }
14410
14411       if (GET_CODE (addr) == PRE_MODIFY)
14412         {
14413           scratch_or_premodify = XEXP (addr, 0);
14414           gcc_assert (REG_P (scratch_or_premodify));
14415           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14416           addr = XEXP (addr, 1);
14417         }
14418
14419       if (GET_CODE (addr) == PLUS
14420           && (!rs6000_legitimate_offset_address_p (TImode, addr, false)
14421               || and_op2 != NULL_RTX))
14422         {
14423           addr_op1 = XEXP (addr, 0);
14424           addr_op2 = XEXP (addr, 1);
14425           gcc_assert (legitimate_indirect_address_p (addr_op1, false));
14426
14427           if (!REG_P (addr_op2)
14428               && (GET_CODE (addr_op2) != CONST_INT
14429                   || !satisfies_constraint_I (addr_op2)))
14430             {
14431               if (TARGET_DEBUG_ADDR)
14432                 {
14433                   fprintf (stderr,
14434                            "\nMove plus addr to register %s, mode = %s: ",
14435                            rs6000_reg_names[REGNO (scratch)],
14436                            GET_MODE_NAME (mode));
14437                   debug_rtx (addr_op2);
14438                 }
14439               rs6000_emit_move (scratch, addr_op2, Pmode);
14440               addr_op2 = scratch;
14441             }
14442
14443           emit_insn (gen_rtx_SET (VOIDmode,
14444                                   scratch_or_premodify,
14445                                   gen_rtx_PLUS (Pmode,
14446                                                 addr_op1,
14447                                                 addr_op2)));
14448
14449           addr = scratch_or_premodify;
14450           scratch_or_premodify = scratch;
14451         }
14452       else if (!legitimate_indirect_address_p (addr, false)
14453                && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14454         {
14455           if (TARGET_DEBUG_ADDR)
14456             {
14457               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14458                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14459                        GET_MODE_NAME (mode));
14460               debug_rtx (addr);
14461             }
14462           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14463           addr = scratch_or_premodify;
14464           scratch_or_premodify = scratch;
14465         }
14466       break;
14467
14468       /* Float/Altivec registers can only handle reg+reg addressing.  Move
14469          other addresses into a scratch register.  */
14470     case FLOAT_REGS:
14471     case VSX_REGS:
14472     case ALTIVEC_REGS:
14473
14474       /* With float regs, we need to handle the AND ourselves, since we can't
14475          use the Altivec instruction with an implicit AND -16.  Allow scalar
14476          loads to float registers to use reg+offset even if VSX.  */
14477       if (GET_CODE (addr) == AND
14478           && (rclass != ALTIVEC_REGS || GET_MODE_SIZE (mode) != 16
14479               || GET_CODE (XEXP (addr, 1)) != CONST_INT
14480               || INTVAL (XEXP (addr, 1)) != -16
14481               || !VECTOR_MEM_ALTIVEC_P (mode)))
14482         {
14483           and_op2 = XEXP (addr, 1);
14484           addr = XEXP (addr, 0);
14485         }
14486
14487       /* If we aren't using a VSX load, save the PRE_MODIFY register and use it
14488          as the address later.  */
14489       if (GET_CODE (addr) == PRE_MODIFY
14490           && (!VECTOR_MEM_VSX_P (mode)
14491               || and_op2 != NULL_RTX
14492               || !legitimate_indexed_address_p (XEXP (addr, 1), false)))
14493         {
14494           scratch_or_premodify = XEXP (addr, 0);
14495           gcc_assert (legitimate_indirect_address_p (scratch_or_premodify,
14496                                                      false));
14497           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14498           addr = XEXP (addr, 1);
14499         }
14500
14501       if (legitimate_indirect_address_p (addr, false)   /* reg */
14502           || legitimate_indexed_address_p (addr, false) /* reg+reg */
14503           || GET_CODE (addr) == PRE_MODIFY              /* VSX pre-modify */
14504           || (GET_CODE (addr) == AND                    /* Altivec memory */
14505               && GET_CODE (XEXP (addr, 1)) == CONST_INT
14506               && INTVAL (XEXP (addr, 1)) == -16
14507               && VECTOR_MEM_ALTIVEC_P (mode))
14508           || (rclass == FLOAT_REGS                      /* legacy float mem */
14509               && GET_MODE_SIZE (mode) == 8
14510               && and_op2 == NULL_RTX
14511               && scratch_or_premodify == scratch
14512               && rs6000_legitimate_offset_address_p (mode, addr, false)))
14513         ;
14514
14515       else if (GET_CODE (addr) == PLUS)
14516         {
14517           addr_op1 = XEXP (addr, 0);
14518           addr_op2 = XEXP (addr, 1);
14519           gcc_assert (REG_P (addr_op1));
14520
14521           if (TARGET_DEBUG_ADDR)
14522             {
14523               fprintf (stderr, "\nMove plus addr to register %s, mode = %s: ",
14524                        rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14525               debug_rtx (addr_op2);
14526             }
14527           rs6000_emit_move (scratch, addr_op2, Pmode);
14528           emit_insn (gen_rtx_SET (VOIDmode,
14529                                   scratch_or_premodify,
14530                                   gen_rtx_PLUS (Pmode,
14531                                                 addr_op1,
14532                                                 scratch)));
14533           addr = scratch_or_premodify;
14534           scratch_or_premodify = scratch;
14535         }
14536
14537       else if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == CONST
14538                || GET_CODE (addr) == CONST_INT || REG_P (addr))
14539         {
14540           if (TARGET_DEBUG_ADDR)
14541             {
14542               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14543                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14544                        GET_MODE_NAME (mode));
14545               debug_rtx (addr);
14546             }
14547
14548           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14549           addr = scratch_or_premodify;
14550           scratch_or_premodify = scratch;
14551         }
14552
14553       else
14554         gcc_unreachable ();
14555
14556       break;
14557
14558     default:
14559       gcc_unreachable ();
14560     }
14561
14562   /* If the original address involved a pre-modify that we couldn't use the VSX
14563      memory instruction with update, and we haven't taken care of already,
14564      store the address in the pre-modify register and use that as the
14565      address.  */
14566   if (scratch_or_premodify != scratch && scratch_or_premodify != addr)
14567     {
14568       emit_insn (gen_rtx_SET (VOIDmode, scratch_or_premodify, addr));
14569       addr = scratch_or_premodify;
14570     }
14571
14572   /* If the original address involved an AND -16 and we couldn't use an ALTIVEC
14573      memory instruction, recreate the AND now, including the clobber which is
14574      generated by the general ANDSI3/ANDDI3 patterns for the
14575      andi. instruction.  */
14576   if (and_op2 != NULL_RTX)
14577     {
14578       if (! legitimate_indirect_address_p (addr, false))
14579         {
14580           emit_insn (gen_rtx_SET (VOIDmode, scratch, addr));
14581           addr = scratch;
14582         }
14583
14584       if (TARGET_DEBUG_ADDR)
14585         {
14586           fprintf (stderr, "\nAnd addr to register %s, mode = %s: ",
14587                    rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14588           debug_rtx (and_op2);
14589         }
14590
14591       and_rtx = gen_rtx_SET (VOIDmode,
14592                              scratch,
14593                              gen_rtx_AND (Pmode,
14594                                           addr,
14595                                           and_op2));
14596
14597       cc_clobber = gen_rtx_CLOBBER (CCmode, gen_rtx_SCRATCH (CCmode));
14598       emit_insn (gen_rtx_PARALLEL (VOIDmode,
14599                                    gen_rtvec (2, and_rtx, cc_clobber)));
14600       addr = scratch;
14601     }
14602
14603   /* Adjust the address if it changed.  */
14604   if (addr != XEXP (mem, 0))
14605     {
14606       mem = change_address (mem, mode, addr);
14607       if (TARGET_DEBUG_ADDR)
14608         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
14609     }
14610
14611   /* Now create the move.  */
14612   if (store_p)
14613     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
14614   else
14615     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
14616
14617   return;
14618 }
14619
14620 /* Convert reloads involving 64-bit gprs and misaligned offset
14621    addressing to use indirect addressing.  */
14622
14623 void
14624 rs6000_secondary_reload_ppc64 (rtx reg, rtx mem, rtx scratch, bool store_p)
14625 {
14626   int regno = true_regnum (reg);
14627   enum reg_class rclass;
14628   rtx addr;
14629   rtx scratch_or_premodify = scratch;
14630
14631   if (TARGET_DEBUG_ADDR)
14632     {
14633       fprintf (stderr, "\nrs6000_secondary_reload_ppc64, type = %s\n",
14634                store_p ? "store" : "load");
14635       fprintf (stderr, "reg:\n");
14636       debug_rtx (reg);
14637       fprintf (stderr, "mem:\n");
14638       debug_rtx (mem);
14639       fprintf (stderr, "scratch:\n");
14640       debug_rtx (scratch);
14641     }
14642
14643   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14644   gcc_assert (GET_CODE (mem) == MEM);
14645   rclass = REGNO_REG_CLASS (regno);
14646   gcc_assert (rclass == GENERAL_REGS || rclass == BASE_REGS);
14647   addr = XEXP (mem, 0);
14648
14649   if (GET_CODE (addr) == PRE_MODIFY)
14650     {
14651       scratch_or_premodify = XEXP (addr, 0);
14652       gcc_assert (REG_P (scratch_or_premodify));
14653       addr = XEXP (addr, 1);
14654     }
14655   gcc_assert (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM);
14656
14657   rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14658
14659   mem = replace_equiv_address_nv (mem, scratch_or_premodify);
14660
14661   /* Now create the move.  */
14662   if (store_p)
14663     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
14664   else
14665     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
14666
14667   return;
14668 }
14669
14670 /* Allocate a 64-bit stack slot to be used for copying SDmode
14671    values through if this function has any SDmode references.  */
14672
14673 static void
14674 rs6000_alloc_sdmode_stack_slot (void)
14675 {
14676   tree t;
14677   basic_block bb;
14678   gimple_stmt_iterator gsi;
14679
14680   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
14681
14682   FOR_EACH_BB (bb)
14683     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
14684       {
14685         tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
14686         if (ret)
14687           {
14688             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14689             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14690                                                                   SDmode, 0);
14691             return;
14692           }
14693       }
14694
14695   /* Check for any SDmode parameters of the function.  */
14696   for (t = DECL_ARGUMENTS (cfun->decl); t; t = DECL_CHAIN (t))
14697     {
14698       if (TREE_TYPE (t) == error_mark_node)
14699         continue;
14700
14701       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
14702           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
14703         {
14704           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14705           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14706                                                                 SDmode, 0);
14707           return;
14708         }
14709     }
14710 }
14711
14712 static void
14713 rs6000_instantiate_decls (void)
14714 {
14715   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
14716     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
14717 }
14718
14719 /* Given an rtx X being reloaded into a reg required to be
14720    in class CLASS, return the class of reg to actually use.
14721    In general this is just CLASS; but on some machines
14722    in some cases it is preferable to use a more restrictive class.
14723
14724    On the RS/6000, we have to return NO_REGS when we want to reload a
14725    floating-point CONST_DOUBLE to force it to be copied to memory.
14726
14727    We also don't want to reload integer values into floating-point
14728    registers if we can at all help it.  In fact, this can
14729    cause reload to die, if it tries to generate a reload of CTR
14730    into a FP register and discovers it doesn't have the memory location
14731    required.
14732
14733    ??? Would it be a good idea to have reload do the converse, that is
14734    try to reload floating modes into FP registers if possible?
14735  */
14736
14737 static enum reg_class
14738 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
14739 {
14740   enum machine_mode mode = GET_MODE (x);
14741
14742   if (VECTOR_UNIT_VSX_P (mode)
14743       && x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
14744     return rclass;
14745
14746   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
14747       && (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
14748       && easy_vector_constant (x, mode))
14749     return ALTIVEC_REGS;
14750
14751   if (CONSTANT_P (x) && reg_classes_intersect_p (rclass, FLOAT_REGS))
14752     return NO_REGS;
14753
14754   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
14755     return GENERAL_REGS;
14756
14757   /* For VSX, prefer the traditional registers for 64-bit values because we can
14758      use the non-VSX loads.  Prefer the Altivec registers if Altivec is
14759      handling the vector operations (i.e. V16QI, V8HI, and V4SI), or if we
14760      prefer Altivec loads..  */
14761   if (rclass == VSX_REGS)
14762     {
14763       if (GET_MODE_SIZE (mode) <= 8)
14764         return FLOAT_REGS;
14765
14766       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode))
14767         return ALTIVEC_REGS;
14768
14769       return rclass;
14770     }
14771
14772   return rclass;
14773 }
14774
14775 /* Debug version of rs6000_preferred_reload_class.  */
14776 static enum reg_class
14777 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
14778 {
14779   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
14780
14781   fprintf (stderr,
14782            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
14783            "mode = %s, x:\n",
14784            reg_class_names[ret], reg_class_names[rclass],
14785            GET_MODE_NAME (GET_MODE (x)));
14786   debug_rtx (x);
14787
14788   return ret;
14789 }
14790
14791 /* If we are copying between FP or AltiVec registers and anything else, we need
14792    a memory location.  The exception is when we are targeting ppc64 and the
14793    move to/from fpr to gpr instructions are available.  Also, under VSX, you
14794    can copy vector registers from the FP register set to the Altivec register
14795    set and vice versa.  */
14796
14797 static bool
14798 rs6000_secondary_memory_needed (enum reg_class class1,
14799                                 enum reg_class class2,
14800                                 enum machine_mode mode)
14801 {
14802   if (class1 == class2)
14803     return false;
14804
14805   /* Under VSX, there are 3 register classes that values could be in (VSX_REGS,
14806      ALTIVEC_REGS, and FLOAT_REGS).  We don't need to use memory to copy
14807      between these classes.  But we need memory for other things that can go in
14808      FLOAT_REGS like SFmode.  */
14809   if (TARGET_VSX
14810       && (VECTOR_MEM_VSX_P (mode) || VECTOR_UNIT_VSX_P (mode))
14811       && (class1 == VSX_REGS || class1 == ALTIVEC_REGS
14812           || class1 == FLOAT_REGS))
14813     return (class2 != VSX_REGS && class2 != ALTIVEC_REGS
14814             && class2 != FLOAT_REGS);
14815
14816   if (class1 == VSX_REGS || class2 == VSX_REGS)
14817     return true;
14818
14819   if (class1 == FLOAT_REGS
14820       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14821           || ((mode != DFmode)
14822               && (mode != DDmode)
14823               && (mode != DImode))))
14824     return true;
14825
14826   if (class2 == FLOAT_REGS
14827       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14828           || ((mode != DFmode)
14829               && (mode != DDmode)
14830               && (mode != DImode))))
14831     return true;
14832
14833   if (class1 == ALTIVEC_REGS || class2 == ALTIVEC_REGS)
14834     return true;
14835
14836   return false;
14837 }
14838
14839 /* Debug version of rs6000_secondary_memory_needed.  */
14840 static bool
14841 rs6000_debug_secondary_memory_needed (enum reg_class class1,
14842                                       enum reg_class class2,
14843                                       enum machine_mode mode)
14844 {
14845   bool ret = rs6000_secondary_memory_needed (class1, class2, mode);
14846
14847   fprintf (stderr,
14848            "rs6000_secondary_memory_needed, return: %s, class1 = %s, "
14849            "class2 = %s, mode = %s\n",
14850            ret ? "true" : "false", reg_class_names[class1],
14851            reg_class_names[class2], GET_MODE_NAME (mode));
14852
14853   return ret;
14854 }
14855
14856 /* Return the register class of a scratch register needed to copy IN into
14857    or out of a register in RCLASS in MODE.  If it can be done directly,
14858    NO_REGS is returned.  */
14859
14860 static enum reg_class
14861 rs6000_secondary_reload_class (enum reg_class rclass, enum machine_mode mode,
14862                                rtx in)
14863 {
14864   int regno;
14865
14866   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
14867 #if TARGET_MACHO
14868                      && MACHOPIC_INDIRECT
14869 #endif
14870                      ))
14871     {
14872       /* We cannot copy a symbolic operand directly into anything
14873          other than BASE_REGS for TARGET_ELF.  So indicate that a
14874          register from BASE_REGS is needed as an intermediate
14875          register.
14876
14877          On Darwin, pic addresses require a load from memory, which
14878          needs a base register.  */
14879       if (rclass != BASE_REGS
14880           && (GET_CODE (in) == SYMBOL_REF
14881               || GET_CODE (in) == HIGH
14882               || GET_CODE (in) == LABEL_REF
14883               || GET_CODE (in) == CONST))
14884         return BASE_REGS;
14885     }
14886
14887   if (GET_CODE (in) == REG)
14888     {
14889       regno = REGNO (in);
14890       if (regno >= FIRST_PSEUDO_REGISTER)
14891         {
14892           regno = true_regnum (in);
14893           if (regno >= FIRST_PSEUDO_REGISTER)
14894             regno = -1;
14895         }
14896     }
14897   else if (GET_CODE (in) == SUBREG)
14898     {
14899       regno = true_regnum (in);
14900       if (regno >= FIRST_PSEUDO_REGISTER)
14901         regno = -1;
14902     }
14903   else
14904     regno = -1;
14905
14906   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
14907      into anything.  */
14908   if (rclass == GENERAL_REGS || rclass == BASE_REGS
14909       || (regno >= 0 && INT_REGNO_P (regno)))
14910     return NO_REGS;
14911
14912   /* Constants, memory, and FP registers can go into FP registers.  */
14913   if ((regno == -1 || FP_REGNO_P (regno))
14914       && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
14915     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
14916
14917   /* Memory, and FP/altivec registers can go into fp/altivec registers under
14918      VSX.  */
14919   if (TARGET_VSX
14920       && (regno == -1 || VSX_REGNO_P (regno))
14921       && VSX_REG_CLASS_P (rclass))
14922     return NO_REGS;
14923
14924   /* Memory, and AltiVec registers can go into AltiVec registers.  */
14925   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
14926       && rclass == ALTIVEC_REGS)
14927     return NO_REGS;
14928
14929   /* We can copy among the CR registers.  */
14930   if ((rclass == CR_REGS || rclass == CR0_REGS)
14931       && regno >= 0 && CR_REGNO_P (regno))
14932     return NO_REGS;
14933
14934   /* Otherwise, we need GENERAL_REGS.  */
14935   return GENERAL_REGS;
14936 }
14937
14938 /* Debug version of rs6000_secondary_reload_class.  */
14939 static enum reg_class
14940 rs6000_debug_secondary_reload_class (enum reg_class rclass,
14941                                      enum machine_mode mode, rtx in)
14942 {
14943   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
14944   fprintf (stderr,
14945            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
14946            "mode = %s, input rtx:\n",
14947            reg_class_names[ret], reg_class_names[rclass],
14948            GET_MODE_NAME (mode));
14949   debug_rtx (in);
14950
14951   return ret;
14952 }
14953
14954 /* Return nonzero if for CLASS a mode change from FROM to TO is invalid.  */
14955
14956 static bool
14957 rs6000_cannot_change_mode_class (enum machine_mode from,
14958                                  enum machine_mode to,
14959                                  enum reg_class rclass)
14960 {
14961   unsigned from_size = GET_MODE_SIZE (from);
14962   unsigned to_size = GET_MODE_SIZE (to);
14963
14964   if (from_size != to_size)
14965     {
14966       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
14967       return ((from_size < 8 || to_size < 8 || TARGET_IEEEQUAD)
14968               && reg_classes_intersect_p (xclass, rclass));
14969     }
14970
14971   if (TARGET_E500_DOUBLE
14972       && ((((to) == DFmode) + ((from) == DFmode)) == 1
14973           || (((to) == TFmode) + ((from) == TFmode)) == 1
14974           || (((to) == DDmode) + ((from) == DDmode)) == 1
14975           || (((to) == TDmode) + ((from) == TDmode)) == 1
14976           || (((to) == DImode) + ((from) == DImode)) == 1))
14977     return true;
14978
14979   /* Since the VSX register set includes traditional floating point registers
14980      and altivec registers, just check for the size being different instead of
14981      trying to check whether the modes are vector modes.  Otherwise it won't
14982      allow say DF and DI to change classes.  */
14983   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
14984     return (from_size != 8 && from_size != 16);
14985
14986   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
14987       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
14988     return true;
14989
14990   if (TARGET_SPE && (SPE_VECTOR_MODE (from) + SPE_VECTOR_MODE (to)) == 1
14991       && reg_classes_intersect_p (GENERAL_REGS, rclass))
14992     return true;
14993
14994   return false;
14995 }
14996
14997 /* Debug version of rs6000_cannot_change_mode_class.  */
14998 static bool
14999 rs6000_debug_cannot_change_mode_class (enum machine_mode from,
15000                                        enum machine_mode to,
15001                                        enum reg_class rclass)
15002 {
15003   bool ret = rs6000_cannot_change_mode_class (from, to, rclass);
15004
15005   fprintf (stderr,
15006            "rs6000_cannot_change_mode_class, return %s, from = %s, "
15007            "to = %s, rclass = %s\n",
15008            ret ? "true" : "false",
15009            GET_MODE_NAME (from), GET_MODE_NAME (to),
15010            reg_class_names[rclass]);
15011
15012   return ret;
15013 }
15014 \f
15015 /* Given a comparison operation, return the bit number in CCR to test.  We
15016    know this is a valid comparison.
15017
15018    SCC_P is 1 if this is for an scc.  That means that %D will have been
15019    used instead of %C, so the bits will be in different places.
15020
15021    Return -1 if OP isn't a valid comparison for some reason.  */
15022
15023 int
15024 ccr_bit (rtx op, int scc_p)
15025 {
15026   enum rtx_code code = GET_CODE (op);
15027   enum machine_mode cc_mode;
15028   int cc_regnum;
15029   int base_bit;
15030   rtx reg;
15031
15032   if (!COMPARISON_P (op))
15033     return -1;
15034
15035   reg = XEXP (op, 0);
15036
15037   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
15038
15039   cc_mode = GET_MODE (reg);
15040   cc_regnum = REGNO (reg);
15041   base_bit = 4 * (cc_regnum - CR0_REGNO);
15042
15043   validate_condition_mode (code, cc_mode);
15044
15045   /* When generating a sCOND operation, only positive conditions are
15046      allowed.  */
15047   gcc_assert (!scc_p
15048               || code == EQ || code == GT || code == LT || code == UNORDERED
15049               || code == GTU || code == LTU);
15050
15051   switch (code)
15052     {
15053     case NE:
15054       return scc_p ? base_bit + 3 : base_bit + 2;
15055     case EQ:
15056       return base_bit + 2;
15057     case GT:  case GTU:  case UNLE:
15058       return base_bit + 1;
15059     case LT:  case LTU:  case UNGE:
15060       return base_bit;
15061     case ORDERED:  case UNORDERED:
15062       return base_bit + 3;
15063
15064     case GE:  case GEU:
15065       /* If scc, we will have done a cror to put the bit in the
15066          unordered position.  So test that bit.  For integer, this is ! LT
15067          unless this is an scc insn.  */
15068       return scc_p ? base_bit + 3 : base_bit;
15069
15070     case LE:  case LEU:
15071       return scc_p ? base_bit + 3 : base_bit + 1;
15072
15073     default:
15074       gcc_unreachable ();
15075     }
15076 }
15077 \f
15078 /* Return the GOT register.  */
15079
15080 rtx
15081 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
15082 {
15083   /* The second flow pass currently (June 1999) can't update
15084      regs_ever_live without disturbing other parts of the compiler, so
15085      update it here to make the prolog/epilogue code happy.  */
15086   if (!can_create_pseudo_p ()
15087       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
15088     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
15089
15090   crtl->uses_pic_offset_table = 1;
15091
15092   return pic_offset_table_rtx;
15093 }
15094 \f
15095 static rs6000_stack_t stack_info;
15096
15097 /* Function to init struct machine_function.
15098    This will be called, via a pointer variable,
15099    from push_function_context.  */
15100
15101 static struct machine_function *
15102 rs6000_init_machine_status (void)
15103 {
15104   stack_info.reload_completed = 0;
15105   return ggc_alloc_cleared_machine_function ();
15106 }
15107 \f
15108 /* These macros test for integers and extract the low-order bits.  */
15109 #define INT_P(X)  \
15110 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
15111  && GET_MODE (X) == VOIDmode)
15112
15113 #define INT_LOWPART(X) \
15114   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
15115
15116 int
15117 extract_MB (rtx op)
15118 {
15119   int i;
15120   unsigned long val = INT_LOWPART (op);
15121
15122   /* If the high bit is zero, the value is the first 1 bit we find
15123      from the left.  */
15124   if ((val & 0x80000000) == 0)
15125     {
15126       gcc_assert (val & 0xffffffff);
15127
15128       i = 1;
15129       while (((val <<= 1) & 0x80000000) == 0)
15130         ++i;
15131       return i;
15132     }
15133
15134   /* If the high bit is set and the low bit is not, or the mask is all
15135      1's, the value is zero.  */
15136   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
15137     return 0;
15138
15139   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15140      from the right.  */
15141   i = 31;
15142   while (((val >>= 1) & 1) != 0)
15143     --i;
15144
15145   return i;
15146 }
15147
15148 int
15149 extract_ME (rtx op)
15150 {
15151   int i;
15152   unsigned long val = INT_LOWPART (op);
15153
15154   /* If the low bit is zero, the value is the first 1 bit we find from
15155      the right.  */
15156   if ((val & 1) == 0)
15157     {
15158       gcc_assert (val & 0xffffffff);
15159
15160       i = 30;
15161       while (((val >>= 1) & 1) == 0)
15162         --i;
15163
15164       return i;
15165     }
15166
15167   /* If the low bit is set and the high bit is not, or the mask is all
15168      1's, the value is 31.  */
15169   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
15170     return 31;
15171
15172   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15173      from the left.  */
15174   i = 0;
15175   while (((val <<= 1) & 0x80000000) != 0)
15176     ++i;
15177
15178   return i;
15179 }
15180
15181 /* Locate some local-dynamic symbol still in use by this function
15182    so that we can print its name in some tls_ld pattern.  */
15183
15184 static const char *
15185 rs6000_get_some_local_dynamic_name (void)
15186 {
15187   rtx insn;
15188
15189   if (cfun->machine->some_ld_name)
15190     return cfun->machine->some_ld_name;
15191
15192   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
15193     if (INSN_P (insn)
15194         && for_each_rtx (&PATTERN (insn),
15195                          rs6000_get_some_local_dynamic_name_1, 0))
15196       return cfun->machine->some_ld_name;
15197
15198   gcc_unreachable ();
15199 }
15200
15201 /* Helper function for rs6000_get_some_local_dynamic_name.  */
15202
15203 static int
15204 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
15205 {
15206   rtx x = *px;
15207
15208   if (GET_CODE (x) == SYMBOL_REF)
15209     {
15210       const char *str = XSTR (x, 0);
15211       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
15212         {
15213           cfun->machine->some_ld_name = str;
15214           return 1;
15215         }
15216     }
15217
15218   return 0;
15219 }
15220
15221 /* Write out a function code label.  */
15222
15223 void
15224 rs6000_output_function_entry (FILE *file, const char *fname)
15225 {
15226   if (fname[0] != '.')
15227     {
15228       switch (DEFAULT_ABI)
15229         {
15230         default:
15231           gcc_unreachable ();
15232
15233         case ABI_AIX:
15234           if (DOT_SYMBOLS)
15235             putc ('.', file);
15236           else
15237             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
15238           break;
15239
15240         case ABI_V4:
15241         case ABI_DARWIN:
15242           break;
15243         }
15244     }
15245
15246   RS6000_OUTPUT_BASENAME (file, fname);
15247 }
15248
15249 /* Print an operand.  Recognize special options, documented below.  */
15250
15251 #if TARGET_ELF
15252 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
15253 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
15254 #else
15255 #define SMALL_DATA_RELOC "sda21"
15256 #define SMALL_DATA_REG 0
15257 #endif
15258
15259 void
15260 print_operand (FILE *file, rtx x, int code)
15261 {
15262   int i;
15263   HOST_WIDE_INT val;
15264   unsigned HOST_WIDE_INT uval;
15265
15266   switch (code)
15267     {
15268     case '.':
15269       /* Write out an instruction after the call which may be replaced
15270          with glue code by the loader.  This depends on the AIX version.  */
15271       asm_fprintf (file, RS6000_CALL_GLUE);
15272       return;
15273
15274       /* %a is output_address.  */
15275
15276     case 'A':
15277       /* If X is a constant integer whose low-order 5 bits are zero,
15278          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
15279          in the AIX assembler where "sri" with a zero shift count
15280          writes a trash instruction.  */
15281       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
15282         putc ('l', file);
15283       else
15284         putc ('r', file);
15285       return;
15286
15287     case 'b':
15288       /* If constant, low-order 16 bits of constant, unsigned.
15289          Otherwise, write normally.  */
15290       if (INT_P (x))
15291         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
15292       else
15293         print_operand (file, x, 0);
15294       return;
15295
15296     case 'B':
15297       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
15298          for 64-bit mask direction.  */
15299       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
15300       return;
15301
15302       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
15303          output_operand.  */
15304
15305     case 'c':
15306       /* X is a CR register.  Print the number of the GT bit of the CR.  */
15307       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15308         output_operand_lossage ("invalid %%c value");
15309       else
15310         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
15311       return;
15312
15313     case 'D':
15314       /* Like 'J' but get to the GT bit only.  */
15315       gcc_assert (GET_CODE (x) == REG);
15316
15317       /* Bit 1 is GT bit.  */
15318       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
15319
15320       /* Add one for shift count in rlinm for scc.  */
15321       fprintf (file, "%d", i + 1);
15322       return;
15323
15324     case 'E':
15325       /* X is a CR register.  Print the number of the EQ bit of the CR */
15326       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15327         output_operand_lossage ("invalid %%E value");
15328       else
15329         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
15330       return;
15331
15332     case 'f':
15333       /* X is a CR register.  Print the shift count needed to move it
15334          to the high-order four bits.  */
15335       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15336         output_operand_lossage ("invalid %%f value");
15337       else
15338         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
15339       return;
15340
15341     case 'F':
15342       /* Similar, but print the count for the rotate in the opposite
15343          direction.  */
15344       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15345         output_operand_lossage ("invalid %%F value");
15346       else
15347         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
15348       return;
15349
15350     case 'G':
15351       /* X is a constant integer.  If it is negative, print "m",
15352          otherwise print "z".  This is to make an aze or ame insn.  */
15353       if (GET_CODE (x) != CONST_INT)
15354         output_operand_lossage ("invalid %%G value");
15355       else if (INTVAL (x) >= 0)
15356         putc ('z', file);
15357       else
15358         putc ('m', file);
15359       return;
15360
15361     case 'h':
15362       /* If constant, output low-order five bits.  Otherwise, write
15363          normally.  */
15364       if (INT_P (x))
15365         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
15366       else
15367         print_operand (file, x, 0);
15368       return;
15369
15370     case 'H':
15371       /* If constant, output low-order six bits.  Otherwise, write
15372          normally.  */
15373       if (INT_P (x))
15374         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
15375       else
15376         print_operand (file, x, 0);
15377       return;
15378
15379     case 'I':
15380       /* Print `i' if this is a constant, else nothing.  */
15381       if (INT_P (x))
15382         putc ('i', file);
15383       return;
15384
15385     case 'j':
15386       /* Write the bit number in CCR for jump.  */
15387       i = ccr_bit (x, 0);
15388       if (i == -1)
15389         output_operand_lossage ("invalid %%j code");
15390       else
15391         fprintf (file, "%d", i);
15392       return;
15393
15394     case 'J':
15395       /* Similar, but add one for shift count in rlinm for scc and pass
15396          scc flag to `ccr_bit'.  */
15397       i = ccr_bit (x, 1);
15398       if (i == -1)
15399         output_operand_lossage ("invalid %%J code");
15400       else
15401         /* If we want bit 31, write a shift count of zero, not 32.  */
15402         fprintf (file, "%d", i == 31 ? 0 : i + 1);
15403       return;
15404
15405     case 'k':
15406       /* X must be a constant.  Write the 1's complement of the
15407          constant.  */
15408       if (! INT_P (x))
15409         output_operand_lossage ("invalid %%k value");
15410       else
15411         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
15412       return;
15413
15414     case 'K':
15415       /* X must be a symbolic constant on ELF.  Write an
15416          expression suitable for an 'addi' that adds in the low 16
15417          bits of the MEM.  */
15418       if (GET_CODE (x) == CONST)
15419         {
15420           if (GET_CODE (XEXP (x, 0)) != PLUS
15421               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
15422                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
15423               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
15424             output_operand_lossage ("invalid %%K value");
15425         }
15426       print_operand_address (file, x);
15427       fputs ("@l", file);
15428       return;
15429
15430       /* %l is output_asm_label.  */
15431
15432     case 'L':
15433       /* Write second word of DImode or DFmode reference.  Works on register
15434          or non-indexed memory only.  */
15435       if (GET_CODE (x) == REG)
15436         fputs (reg_names[REGNO (x) + 1], file);
15437       else if (GET_CODE (x) == MEM)
15438         {
15439           /* Handle possible auto-increment.  Since it is pre-increment and
15440              we have already done it, we can just use an offset of word.  */
15441           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15442               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15443             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15444                                            UNITS_PER_WORD));
15445           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15446             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15447                                            UNITS_PER_WORD));
15448           else
15449             output_address (XEXP (adjust_address_nv (x, SImode,
15450                                                      UNITS_PER_WORD),
15451                                   0));
15452
15453           if (small_data_operand (x, GET_MODE (x)))
15454             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15455                      reg_names[SMALL_DATA_REG]);
15456         }
15457       return;
15458
15459     case 'm':
15460       /* MB value for a mask operand.  */
15461       if (! mask_operand (x, SImode))
15462         output_operand_lossage ("invalid %%m value");
15463
15464       fprintf (file, "%d", extract_MB (x));
15465       return;
15466
15467     case 'M':
15468       /* ME value for a mask operand.  */
15469       if (! mask_operand (x, SImode))
15470         output_operand_lossage ("invalid %%M value");
15471
15472       fprintf (file, "%d", extract_ME (x));
15473       return;
15474
15475       /* %n outputs the negative of its operand.  */
15476
15477     case 'N':
15478       /* Write the number of elements in the vector times 4.  */
15479       if (GET_CODE (x) != PARALLEL)
15480         output_operand_lossage ("invalid %%N value");
15481       else
15482         fprintf (file, "%d", XVECLEN (x, 0) * 4);
15483       return;
15484
15485     case 'O':
15486       /* Similar, but subtract 1 first.  */
15487       if (GET_CODE (x) != PARALLEL)
15488         output_operand_lossage ("invalid %%O value");
15489       else
15490         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
15491       return;
15492
15493     case 'p':
15494       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
15495       if (! INT_P (x)
15496           || INT_LOWPART (x) < 0
15497           || (i = exact_log2 (INT_LOWPART (x))) < 0)
15498         output_operand_lossage ("invalid %%p value");
15499       else
15500         fprintf (file, "%d", i);
15501       return;
15502
15503     case 'P':
15504       /* The operand must be an indirect memory reference.  The result
15505          is the register name.  */
15506       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
15507           || REGNO (XEXP (x, 0)) >= 32)
15508         output_operand_lossage ("invalid %%P value");
15509       else
15510         fputs (reg_names[REGNO (XEXP (x, 0))], file);
15511       return;
15512
15513     case 'q':
15514       /* This outputs the logical code corresponding to a boolean
15515          expression.  The expression may have one or both operands
15516          negated (if one, only the first one).  For condition register
15517          logical operations, it will also treat the negated
15518          CR codes as NOTs, but not handle NOTs of them.  */
15519       {
15520         const char *const *t = 0;
15521         const char *s;
15522         enum rtx_code code = GET_CODE (x);
15523         static const char * const tbl[3][3] = {
15524           { "and", "andc", "nor" },
15525           { "or", "orc", "nand" },
15526           { "xor", "eqv", "xor" } };
15527
15528         if (code == AND)
15529           t = tbl[0];
15530         else if (code == IOR)
15531           t = tbl[1];
15532         else if (code == XOR)
15533           t = tbl[2];
15534         else
15535           output_operand_lossage ("invalid %%q value");
15536
15537         if (GET_CODE (XEXP (x, 0)) != NOT)
15538           s = t[0];
15539         else
15540           {
15541             if (GET_CODE (XEXP (x, 1)) == NOT)
15542               s = t[2];
15543             else
15544               s = t[1];
15545           }
15546
15547         fputs (s, file);
15548       }
15549       return;
15550
15551     case 'Q':
15552       if (TARGET_MFCRF)
15553         fputc (',', file);
15554         /* FALLTHRU */
15555       else
15556         return;
15557
15558     case 'R':
15559       /* X is a CR register.  Print the mask for `mtcrf'.  */
15560       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15561         output_operand_lossage ("invalid %%R value");
15562       else
15563         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
15564       return;
15565
15566     case 's':
15567       /* Low 5 bits of 32 - value */
15568       if (! INT_P (x))
15569         output_operand_lossage ("invalid %%s value");
15570       else
15571         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
15572       return;
15573
15574     case 'S':
15575       /* PowerPC64 mask position.  All 0's is excluded.
15576          CONST_INT 32-bit mask is considered sign-extended so any
15577          transition must occur within the CONST_INT, not on the boundary.  */
15578       if (! mask64_operand (x, DImode))
15579         output_operand_lossage ("invalid %%S value");
15580
15581       uval = INT_LOWPART (x);
15582
15583       if (uval & 1)     /* Clear Left */
15584         {
15585 #if HOST_BITS_PER_WIDE_INT > 64
15586           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15587 #endif
15588           i = 64;
15589         }
15590       else              /* Clear Right */
15591         {
15592           uval = ~uval;
15593 #if HOST_BITS_PER_WIDE_INT > 64
15594           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15595 #endif
15596           i = 63;
15597         }
15598       while (uval != 0)
15599         --i, uval >>= 1;
15600       gcc_assert (i >= 0);
15601       fprintf (file, "%d", i);
15602       return;
15603
15604     case 't':
15605       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
15606       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
15607
15608       /* Bit 3 is OV bit.  */
15609       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
15610
15611       /* If we want bit 31, write a shift count of zero, not 32.  */
15612       fprintf (file, "%d", i == 31 ? 0 : i + 1);
15613       return;
15614
15615     case 'T':
15616       /* Print the symbolic name of a branch target register.  */
15617       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
15618                                   && REGNO (x) != CTR_REGNO))
15619         output_operand_lossage ("invalid %%T value");
15620       else if (REGNO (x) == LR_REGNO)
15621         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
15622       else
15623         fputs ("ctr", file);
15624       return;
15625
15626     case 'u':
15627       /* High-order 16 bits of constant for use in unsigned operand.  */
15628       if (! INT_P (x))
15629         output_operand_lossage ("invalid %%u value");
15630       else
15631         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15632                  (INT_LOWPART (x) >> 16) & 0xffff);
15633       return;
15634
15635     case 'v':
15636       /* High-order 16 bits of constant for use in signed operand.  */
15637       if (! INT_P (x))
15638         output_operand_lossage ("invalid %%v value");
15639       else
15640         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15641                  (INT_LOWPART (x) >> 16) & 0xffff);
15642       return;
15643
15644     case 'U':
15645       /* Print `u' if this has an auto-increment or auto-decrement.  */
15646       if (GET_CODE (x) == MEM
15647           && (GET_CODE (XEXP (x, 0)) == PRE_INC
15648               || GET_CODE (XEXP (x, 0)) == PRE_DEC
15649               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
15650         putc ('u', file);
15651       return;
15652
15653     case 'V':
15654       /* Print the trap code for this operand.  */
15655       switch (GET_CODE (x))
15656         {
15657         case EQ:
15658           fputs ("eq", file);   /* 4 */
15659           break;
15660         case NE:
15661           fputs ("ne", file);   /* 24 */
15662           break;
15663         case LT:
15664           fputs ("lt", file);   /* 16 */
15665           break;
15666         case LE:
15667           fputs ("le", file);   /* 20 */
15668           break;
15669         case GT:
15670           fputs ("gt", file);   /* 8 */
15671           break;
15672         case GE:
15673           fputs ("ge", file);   /* 12 */
15674           break;
15675         case LTU:
15676           fputs ("llt", file);  /* 2 */
15677           break;
15678         case LEU:
15679           fputs ("lle", file);  /* 6 */
15680           break;
15681         case GTU:
15682           fputs ("lgt", file);  /* 1 */
15683           break;
15684         case GEU:
15685           fputs ("lge", file);  /* 5 */
15686           break;
15687         default:
15688           gcc_unreachable ();
15689         }
15690       break;
15691
15692     case 'w':
15693       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
15694          normally.  */
15695       if (INT_P (x))
15696         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
15697                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
15698       else
15699         print_operand (file, x, 0);
15700       return;
15701
15702     case 'W':
15703       /* MB value for a PowerPC64 rldic operand.  */
15704       val = (GET_CODE (x) == CONST_INT
15705              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
15706
15707       if (val < 0)
15708         i = -1;
15709       else
15710         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
15711           if ((val <<= 1) < 0)
15712             break;
15713
15714 #if HOST_BITS_PER_WIDE_INT == 32
15715       if (GET_CODE (x) == CONST_INT && i >= 0)
15716         i += 32;  /* zero-extend high-part was all 0's */
15717       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
15718         {
15719           val = CONST_DOUBLE_LOW (x);
15720
15721           gcc_assert (val);
15722           if (val < 0)
15723             --i;
15724           else
15725             for ( ; i < 64; i++)
15726               if ((val <<= 1) < 0)
15727                 break;
15728         }
15729 #endif
15730
15731       fprintf (file, "%d", i + 1);
15732       return;
15733
15734     case 'x':
15735       /* X is a FPR or Altivec register used in a VSX context.  */
15736       if (GET_CODE (x) != REG || !VSX_REGNO_P (REGNO (x)))
15737         output_operand_lossage ("invalid %%x value");
15738       else
15739         {
15740           int reg = REGNO (x);
15741           int vsx_reg = (FP_REGNO_P (reg)
15742                          ? reg - 32
15743                          : reg - FIRST_ALTIVEC_REGNO + 32);
15744
15745 #ifdef TARGET_REGNAMES      
15746           if (TARGET_REGNAMES)
15747             fprintf (file, "%%vs%d", vsx_reg);
15748           else
15749 #endif
15750             fprintf (file, "%d", vsx_reg);
15751         }
15752       return;
15753
15754     case 'X':
15755       if (GET_CODE (x) == MEM
15756           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
15757               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
15758                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
15759         putc ('x', file);
15760       return;
15761
15762     case 'Y':
15763       /* Like 'L', for third word of TImode  */
15764       if (GET_CODE (x) == REG)
15765         fputs (reg_names[REGNO (x) + 2], file);
15766       else if (GET_CODE (x) == MEM)
15767         {
15768           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15769               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15770             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15771           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15772             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15773           else
15774             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
15775           if (small_data_operand (x, GET_MODE (x)))
15776             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15777                      reg_names[SMALL_DATA_REG]);
15778         }
15779       return;
15780
15781     case 'z':
15782       /* X is a SYMBOL_REF.  Write out the name preceded by a
15783          period and without any trailing data in brackets.  Used for function
15784          names.  If we are configured for System V (or the embedded ABI) on
15785          the PowerPC, do not emit the period, since those systems do not use
15786          TOCs and the like.  */
15787       gcc_assert (GET_CODE (x) == SYMBOL_REF);
15788
15789       /* Mark the decl as referenced so that cgraph will output the
15790          function.  */
15791       if (SYMBOL_REF_DECL (x))
15792         mark_decl_referenced (SYMBOL_REF_DECL (x));
15793
15794       /* For macho, check to see if we need a stub.  */
15795       if (TARGET_MACHO)
15796         {
15797           const char *name = XSTR (x, 0);
15798 #if TARGET_MACHO
15799           if (darwin_emit_branch_islands
15800               && MACHOPIC_INDIRECT
15801               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
15802             name = machopic_indirection_name (x, /*stub_p=*/true);
15803 #endif
15804           assemble_name (file, name);
15805         }
15806       else if (!DOT_SYMBOLS)
15807         assemble_name (file, XSTR (x, 0));
15808       else
15809         rs6000_output_function_entry (file, XSTR (x, 0));
15810       return;
15811
15812     case 'Z':
15813       /* Like 'L', for last word of TImode.  */
15814       if (GET_CODE (x) == REG)
15815         fputs (reg_names[REGNO (x) + 3], file);
15816       else if (GET_CODE (x) == MEM)
15817         {
15818           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15819               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15820             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15821           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15822             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15823           else
15824             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
15825           if (small_data_operand (x, GET_MODE (x)))
15826             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15827                      reg_names[SMALL_DATA_REG]);
15828         }
15829       return;
15830
15831       /* Print AltiVec or SPE memory operand.  */
15832     case 'y':
15833       {
15834         rtx tmp;
15835
15836         gcc_assert (GET_CODE (x) == MEM);
15837
15838         tmp = XEXP (x, 0);
15839
15840         /* Ugly hack because %y is overloaded.  */
15841         if ((TARGET_SPE || TARGET_E500_DOUBLE)
15842             && (GET_MODE_SIZE (GET_MODE (x)) == 8
15843                 || GET_MODE (x) == TFmode
15844                 || GET_MODE (x) == TImode))
15845           {
15846             /* Handle [reg].  */
15847             if (GET_CODE (tmp) == REG)
15848               {
15849                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
15850                 break;
15851               }
15852             /* Handle [reg+UIMM].  */
15853             else if (GET_CODE (tmp) == PLUS &&
15854                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
15855               {
15856                 int x;
15857
15858                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
15859
15860                 x = INTVAL (XEXP (tmp, 1));
15861                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
15862                 break;
15863               }
15864
15865             /* Fall through.  Must be [reg+reg].  */
15866           }
15867         if (VECTOR_MEM_ALTIVEC_P (GET_MODE (x))
15868             && GET_CODE (tmp) == AND
15869             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
15870             && INTVAL (XEXP (tmp, 1)) == -16)
15871           tmp = XEXP (tmp, 0);
15872         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
15873                  && GET_CODE (tmp) == PRE_MODIFY)
15874           tmp = XEXP (tmp, 1);
15875         if (GET_CODE (tmp) == REG)
15876           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
15877         else
15878           {
15879             if (!GET_CODE (tmp) == PLUS
15880                 || !REG_P (XEXP (tmp, 0))
15881                 || !REG_P (XEXP (tmp, 1)))
15882               {
15883                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
15884                 break;
15885               }
15886
15887             if (REGNO (XEXP (tmp, 0)) == 0)
15888               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
15889                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
15890             else
15891               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
15892                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
15893           }
15894         break;
15895       }
15896
15897     case 0:
15898       if (GET_CODE (x) == REG)
15899         fprintf (file, "%s", reg_names[REGNO (x)]);
15900       else if (GET_CODE (x) == MEM)
15901         {
15902           /* We need to handle PRE_INC and PRE_DEC here, since we need to
15903              know the width from the mode.  */
15904           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
15905             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
15906                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15907           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
15908             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
15909                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15910           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15911             output_address (XEXP (XEXP (x, 0), 1));
15912           else
15913             output_address (XEXP (x, 0));
15914         }
15915       else
15916         {
15917           if (toc_relative_expr_p (x))
15918             /* This hack along with a corresponding hack in
15919                rs6000_output_addr_const_extra arranges to output addends
15920                where the assembler expects to find them.  eg.
15921                (const (plus (unspec [symbol_ref ("x") tocrel]) 4))
15922                without this hack would be output as "x@toc+4".  We
15923                want "x+4@toc".  */
15924             output_addr_const (file, tocrel_base);
15925           else
15926             output_addr_const (file, x);
15927         }
15928       return;
15929
15930     case '&':
15931       assemble_name (file, rs6000_get_some_local_dynamic_name ());
15932       return;
15933
15934     default:
15935       output_operand_lossage ("invalid %%xn code");
15936     }
15937 }
15938 \f
15939 /* Print the address of an operand.  */
15940
15941 void
15942 print_operand_address (FILE *file, rtx x)
15943 {
15944   if (GET_CODE (x) == REG)
15945     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
15946   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
15947            || GET_CODE (x) == LABEL_REF)
15948     {
15949       output_addr_const (file, x);
15950       if (small_data_operand (x, GET_MODE (x)))
15951         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15952                  reg_names[SMALL_DATA_REG]);
15953       else
15954         gcc_assert (!TARGET_TOC);
15955     }
15956   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
15957     {
15958       gcc_assert (REG_P (XEXP (x, 0)));
15959       if (REGNO (XEXP (x, 0)) == 0)
15960         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
15961                  reg_names[ REGNO (XEXP (x, 0)) ]);
15962       else
15963         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
15964                  reg_names[ REGNO (XEXP (x, 1)) ]);
15965     }
15966   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
15967     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
15968              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
15969 #if TARGET_MACHO
15970   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
15971            && CONSTANT_P (XEXP (x, 1)))
15972     {
15973       fprintf (file, "lo16(");
15974       output_addr_const (file, XEXP (x, 1));
15975       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15976     }
15977 #endif
15978   else if (legitimate_constant_pool_address_p (x, QImode, true))
15979     {
15980       /* This hack along with a corresponding hack in
15981          rs6000_output_addr_const_extra arranges to output addends
15982          where the assembler expects to find them.  eg.
15983          (lo_sum (reg 9)
15984          .       (const (plus (unspec [symbol_ref ("x") tocrel]) 8)))
15985          without this hack would be output as "x@toc+8@l(9)".  We
15986          want "x+8@toc@l(9)".  */
15987       output_addr_const (file, tocrel_base);
15988       if (GET_CODE (x) == LO_SUM)
15989         fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15990       else
15991         fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
15992     }
15993 #if TARGET_ELF
15994   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
15995            && CONSTANT_P (XEXP (x, 1)))
15996     {
15997       output_addr_const (file, XEXP (x, 1));
15998       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15999     }
16000 #endif
16001   else
16002     gcc_unreachable ();
16003 }
16004 \f
16005 /* Implement TARGET_OUTPUT_ADDR_CONST_EXTRA.  */
16006
16007 static bool
16008 rs6000_output_addr_const_extra (FILE *file, rtx x)
16009 {
16010   if (GET_CODE (x) == UNSPEC)
16011     switch (XINT (x, 1))
16012       {
16013       case UNSPEC_TOCREL:
16014         gcc_assert (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF);
16015         output_addr_const (file, XVECEXP (x, 0, 0));
16016         if (x == tocrel_base && tocrel_offset != const0_rtx)
16017           {
16018             if (INTVAL (tocrel_offset) >= 0)
16019               fprintf (file, "+");
16020             output_addr_const (file, tocrel_offset);
16021           }
16022         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
16023           {
16024             putc ('-', file);
16025             assemble_name (file, toc_label_name);
16026           }
16027         else if (TARGET_ELF)
16028           fputs ("@toc", file);
16029         return true;
16030
16031 #if TARGET_MACHO
16032       case UNSPEC_MACHOPIC_OFFSET:
16033         output_addr_const (file, XVECEXP (x, 0, 0));
16034         putc ('-', file);
16035         machopic_output_function_base_name (file);
16036         return true;
16037 #endif
16038       }
16039   return false;
16040 }
16041 \f
16042 /* Target hook for assembling integer objects.  The PowerPC version has
16043    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
16044    is defined.  It also needs to handle DI-mode objects on 64-bit
16045    targets.  */
16046
16047 static bool
16048 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
16049 {
16050 #ifdef RELOCATABLE_NEEDS_FIXUP
16051   /* Special handling for SI values.  */
16052   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
16053     {
16054       static int recurse = 0;
16055
16056       /* For -mrelocatable, we mark all addresses that need to be fixed up
16057          in the .fixup section.  */
16058       if (TARGET_RELOCATABLE
16059           && in_section != toc_section
16060           && in_section != text_section
16061           && !unlikely_text_section_p (in_section)
16062           && !recurse
16063           && GET_CODE (x) != CONST_INT
16064           && GET_CODE (x) != CONST_DOUBLE
16065           && CONSTANT_P (x))
16066         {
16067           char buf[256];
16068
16069           recurse = 1;
16070           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
16071           fixuplabelno++;
16072           ASM_OUTPUT_LABEL (asm_out_file, buf);
16073           fprintf (asm_out_file, "\t.long\t(");
16074           output_addr_const (asm_out_file, x);
16075           fprintf (asm_out_file, ")@fixup\n");
16076           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
16077           ASM_OUTPUT_ALIGN (asm_out_file, 2);
16078           fprintf (asm_out_file, "\t.long\t");
16079           assemble_name (asm_out_file, buf);
16080           fprintf (asm_out_file, "\n\t.previous\n");
16081           recurse = 0;
16082           return true;
16083         }
16084       /* Remove initial .'s to turn a -mcall-aixdesc function
16085          address into the address of the descriptor, not the function
16086          itself.  */
16087       else if (GET_CODE (x) == SYMBOL_REF
16088                && XSTR (x, 0)[0] == '.'
16089                && DEFAULT_ABI == ABI_AIX)
16090         {
16091           const char *name = XSTR (x, 0);
16092           while (*name == '.')
16093             name++;
16094
16095           fprintf (asm_out_file, "\t.long\t%s\n", name);
16096           return true;
16097         }
16098     }
16099 #endif /* RELOCATABLE_NEEDS_FIXUP */
16100   return default_assemble_integer (x, size, aligned_p);
16101 }
16102
16103 #if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
16104 /* Emit an assembler directive to set symbol visibility for DECL to
16105    VISIBILITY_TYPE.  */
16106
16107 static void
16108 rs6000_assemble_visibility (tree decl, int vis)
16109 {
16110   /* Functions need to have their entry point symbol visibility set as
16111      well as their descriptor symbol visibility.  */
16112   if (DEFAULT_ABI == ABI_AIX
16113       && DOT_SYMBOLS
16114       && TREE_CODE (decl) == FUNCTION_DECL)
16115     {
16116       static const char * const visibility_types[] = {
16117         NULL, "internal", "hidden", "protected"
16118       };
16119
16120       const char *name, *type;
16121
16122       name = ((* targetm.strip_name_encoding)
16123               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
16124       type = visibility_types[vis];
16125
16126       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
16127       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
16128     }
16129   else
16130     default_assemble_visibility (decl, vis);
16131 }
16132 #endif
16133 \f
16134 enum rtx_code
16135 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
16136 {
16137   /* Reversal of FP compares takes care -- an ordered compare
16138      becomes an unordered compare and vice versa.  */
16139   if (mode == CCFPmode
16140       && (!flag_finite_math_only
16141           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
16142           || code == UNEQ || code == LTGT))
16143     return reverse_condition_maybe_unordered (code);
16144   else
16145     return reverse_condition (code);
16146 }
16147
16148 /* Generate a compare for CODE.  Return a brand-new rtx that
16149    represents the result of the compare.  */
16150
16151 static rtx
16152 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
16153 {
16154   enum machine_mode comp_mode;
16155   rtx compare_result;
16156   enum rtx_code code = GET_CODE (cmp);
16157   rtx op0 = XEXP (cmp, 0);
16158   rtx op1 = XEXP (cmp, 1);
16159
16160   if (FLOAT_MODE_P (mode))
16161     comp_mode = CCFPmode;
16162   else if (code == GTU || code == LTU
16163            || code == GEU || code == LEU)
16164     comp_mode = CCUNSmode;
16165   else if ((code == EQ || code == NE)
16166            && GET_CODE (op0) == SUBREG
16167            && GET_CODE (op1) == SUBREG
16168            && SUBREG_PROMOTED_UNSIGNED_P (op0)
16169            && SUBREG_PROMOTED_UNSIGNED_P (op1))
16170     /* These are unsigned values, perhaps there will be a later
16171        ordering compare that can be shared with this one.
16172        Unfortunately we cannot detect the signedness of the operands
16173        for non-subregs.  */
16174     comp_mode = CCUNSmode;
16175   else
16176     comp_mode = CCmode;
16177
16178   /* First, the compare.  */
16179   compare_result = gen_reg_rtx (comp_mode);
16180
16181   /* E500 FP compare instructions on the GPRs.  Yuck!  */
16182   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
16183       && FLOAT_MODE_P (mode))
16184     {
16185       rtx cmp, or_result, compare_result2;
16186       enum machine_mode op_mode = GET_MODE (op0);
16187
16188       if (op_mode == VOIDmode)
16189         op_mode = GET_MODE (op1);
16190
16191       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
16192          This explains the following mess.  */
16193
16194       switch (code)
16195         {
16196         case EQ: case UNEQ: case NE: case LTGT:
16197           switch (op_mode)
16198             {
16199             case SFmode:
16200               cmp = (flag_finite_math_only && !flag_trapping_math)
16201                 ? gen_tstsfeq_gpr (compare_result, op0, op1)
16202                 : gen_cmpsfeq_gpr (compare_result, op0, op1);
16203               break;
16204
16205             case DFmode:
16206               cmp = (flag_finite_math_only && !flag_trapping_math)
16207                 ? gen_tstdfeq_gpr (compare_result, op0, op1)
16208                 : gen_cmpdfeq_gpr (compare_result, op0, op1);
16209               break;
16210
16211             case TFmode:
16212               cmp = (flag_finite_math_only && !flag_trapping_math)
16213                 ? gen_tsttfeq_gpr (compare_result, op0, op1)
16214                 : gen_cmptfeq_gpr (compare_result, op0, op1);
16215               break;
16216
16217             default:
16218               gcc_unreachable ();
16219             }
16220           break;
16221
16222         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
16223           switch (op_mode)
16224             {
16225             case SFmode:
16226               cmp = (flag_finite_math_only && !flag_trapping_math)
16227                 ? gen_tstsfgt_gpr (compare_result, op0, op1)
16228                 : gen_cmpsfgt_gpr (compare_result, op0, op1);
16229               break;
16230
16231             case DFmode:
16232               cmp = (flag_finite_math_only && !flag_trapping_math)
16233                 ? gen_tstdfgt_gpr (compare_result, op0, op1)
16234                 : gen_cmpdfgt_gpr (compare_result, op0, op1);
16235               break;
16236
16237             case TFmode:
16238               cmp = (flag_finite_math_only && !flag_trapping_math)
16239                 ? gen_tsttfgt_gpr (compare_result, op0, op1)
16240                 : gen_cmptfgt_gpr (compare_result, op0, op1);
16241               break;
16242
16243             default:
16244               gcc_unreachable ();
16245             }
16246           break;
16247
16248         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
16249           switch (op_mode)
16250             {
16251             case SFmode:
16252               cmp = (flag_finite_math_only && !flag_trapping_math)
16253                 ? gen_tstsflt_gpr (compare_result, op0, op1)
16254                 : gen_cmpsflt_gpr (compare_result, op0, op1);
16255               break;
16256
16257             case DFmode:
16258               cmp = (flag_finite_math_only && !flag_trapping_math)
16259                 ? gen_tstdflt_gpr (compare_result, op0, op1)
16260                 : gen_cmpdflt_gpr (compare_result, op0, op1);
16261               break;
16262
16263             case TFmode:
16264               cmp = (flag_finite_math_only && !flag_trapping_math)
16265                 ? gen_tsttflt_gpr (compare_result, op0, op1)
16266                 : gen_cmptflt_gpr (compare_result, op0, op1);
16267               break;
16268
16269             default:
16270               gcc_unreachable ();
16271             }
16272           break;
16273         default:
16274           gcc_unreachable ();
16275         }
16276
16277       /* Synthesize LE and GE from LT/GT || EQ.  */
16278       if (code == LE || code == GE || code == LEU || code == GEU)
16279         {
16280           emit_insn (cmp);
16281
16282           switch (code)
16283             {
16284             case LE: code = LT; break;
16285             case GE: code = GT; break;
16286             case LEU: code = LT; break;
16287             case GEU: code = GT; break;
16288             default: gcc_unreachable ();
16289             }
16290
16291           compare_result2 = gen_reg_rtx (CCFPmode);
16292
16293           /* Do the EQ.  */
16294           switch (op_mode)
16295             {
16296             case SFmode:
16297               cmp = (flag_finite_math_only && !flag_trapping_math)
16298                 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
16299                 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
16300               break;
16301
16302             case DFmode:
16303               cmp = (flag_finite_math_only && !flag_trapping_math)
16304                 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
16305                 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
16306               break;
16307
16308             case TFmode:
16309               cmp = (flag_finite_math_only && !flag_trapping_math)
16310                 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
16311                 : gen_cmptfeq_gpr (compare_result2, op0, op1);
16312               break;
16313
16314             default:
16315               gcc_unreachable ();
16316             }
16317           emit_insn (cmp);
16318
16319           /* OR them together.  */
16320           or_result = gen_reg_rtx (CCFPmode);
16321           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
16322                                            compare_result2);
16323           compare_result = or_result;
16324           code = EQ;
16325         }
16326       else
16327         {
16328           if (code == NE || code == LTGT)
16329             code = NE;
16330           else
16331             code = EQ;
16332         }
16333
16334       emit_insn (cmp);
16335     }
16336   else
16337     {
16338       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
16339          CLOBBERs to match cmptf_internal2 pattern.  */
16340       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
16341           && GET_MODE (op0) == TFmode
16342           && !TARGET_IEEEQUAD
16343           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
16344         emit_insn (gen_rtx_PARALLEL (VOIDmode,
16345           gen_rtvec (10,
16346                      gen_rtx_SET (VOIDmode,
16347                                   compare_result,
16348                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
16349                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16350                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16351                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16352                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16353                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16354                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16355                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16356                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16357                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
16358       else if (GET_CODE (op1) == UNSPEC
16359                && XINT (op1, 1) == UNSPEC_SP_TEST)
16360         {
16361           rtx op1b = XVECEXP (op1, 0, 0);
16362           comp_mode = CCEQmode;
16363           compare_result = gen_reg_rtx (CCEQmode);
16364           if (TARGET_64BIT)
16365             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
16366           else
16367             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
16368         }
16369       else
16370         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
16371                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
16372     }
16373
16374   /* Some kinds of FP comparisons need an OR operation;
16375      under flag_finite_math_only we don't bother.  */
16376   if (FLOAT_MODE_P (mode)
16377       && !flag_finite_math_only
16378       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
16379       && (code == LE || code == GE
16380           || code == UNEQ || code == LTGT
16381           || code == UNGT || code == UNLT))
16382     {
16383       enum rtx_code or1, or2;
16384       rtx or1_rtx, or2_rtx, compare2_rtx;
16385       rtx or_result = gen_reg_rtx (CCEQmode);
16386
16387       switch (code)
16388         {
16389         case LE: or1 = LT;  or2 = EQ;  break;
16390         case GE: or1 = GT;  or2 = EQ;  break;
16391         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
16392         case LTGT: or1 = LT;  or2 = GT;  break;
16393         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
16394         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
16395         default:  gcc_unreachable ();
16396         }
16397       validate_condition_mode (or1, comp_mode);
16398       validate_condition_mode (or2, comp_mode);
16399       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
16400       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
16401       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
16402                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
16403                                       const_true_rtx);
16404       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
16405
16406       compare_result = or_result;
16407       code = EQ;
16408     }
16409
16410   validate_condition_mode (code, GET_MODE (compare_result));
16411
16412   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
16413 }
16414
16415
16416 /* Emit the RTL for an sISEL pattern.  */
16417
16418 void
16419 rs6000_emit_sISEL (enum machine_mode mode ATTRIBUTE_UNUSED, rtx operands[])
16420 {
16421   rs6000_emit_int_cmove (operands[0], operands[1], const1_rtx, const0_rtx);
16422 }
16423
16424 void
16425 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
16426 {
16427   rtx condition_rtx;
16428   enum machine_mode op_mode;
16429   enum rtx_code cond_code;
16430   rtx result = operands[0];
16431
16432   if (TARGET_ISEL && (mode == SImode || mode == DImode))
16433     {
16434       rs6000_emit_sISEL (mode, operands);
16435       return;
16436     }
16437
16438   condition_rtx = rs6000_generate_compare (operands[1], mode);
16439   cond_code = GET_CODE (condition_rtx);
16440
16441   if (FLOAT_MODE_P (mode)
16442       && !TARGET_FPRS && TARGET_HARD_FLOAT)
16443     {
16444       rtx t;
16445
16446       PUT_MODE (condition_rtx, SImode);
16447       t = XEXP (condition_rtx, 0);
16448
16449       gcc_assert (cond_code == NE || cond_code == EQ);
16450
16451       if (cond_code == NE)
16452         emit_insn (gen_e500_flip_gt_bit (t, t));
16453
16454       emit_insn (gen_move_from_CR_gt_bit (result, t));
16455       return;
16456     }
16457
16458   if (cond_code == NE
16459       || cond_code == GE || cond_code == LE
16460       || cond_code == GEU || cond_code == LEU
16461       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
16462     {
16463       rtx not_result = gen_reg_rtx (CCEQmode);
16464       rtx not_op, rev_cond_rtx;
16465       enum machine_mode cc_mode;
16466
16467       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
16468
16469       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
16470                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
16471       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
16472       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
16473       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
16474     }
16475
16476   op_mode = GET_MODE (XEXP (operands[1], 0));
16477   if (op_mode == VOIDmode)
16478     op_mode = GET_MODE (XEXP (operands[1], 1));
16479
16480   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
16481     {
16482       PUT_MODE (condition_rtx, DImode);
16483       convert_move (result, condition_rtx, 0);
16484     }
16485   else
16486     {
16487       PUT_MODE (condition_rtx, SImode);
16488       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
16489     }
16490 }
16491
16492 /* Emit a branch of kind CODE to location LOC.  */
16493
16494 void
16495 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
16496 {
16497   rtx condition_rtx, loc_ref;
16498
16499   condition_rtx = rs6000_generate_compare (operands[0], mode);
16500   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
16501   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
16502                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
16503                                                      loc_ref, pc_rtx)));
16504 }
16505
16506 /* Return the string to output a conditional branch to LABEL, which is
16507    the operand number of the label, or -1 if the branch is really a
16508    conditional return.
16509
16510    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
16511    condition code register and its mode specifies what kind of
16512    comparison we made.
16513
16514    REVERSED is nonzero if we should reverse the sense of the comparison.
16515
16516    INSN is the insn.  */
16517
16518 char *
16519 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
16520 {
16521   static char string[64];
16522   enum rtx_code code = GET_CODE (op);
16523   rtx cc_reg = XEXP (op, 0);
16524   enum machine_mode mode = GET_MODE (cc_reg);
16525   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
16526   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
16527   int really_reversed = reversed ^ need_longbranch;
16528   char *s = string;
16529   const char *ccode;
16530   const char *pred;
16531   rtx note;
16532
16533   validate_condition_mode (code, mode);
16534
16535   /* Work out which way this really branches.  We could use
16536      reverse_condition_maybe_unordered here always but this
16537      makes the resulting assembler clearer.  */
16538   if (really_reversed)
16539     {
16540       /* Reversal of FP compares takes care -- an ordered compare
16541          becomes an unordered compare and vice versa.  */
16542       if (mode == CCFPmode)
16543         code = reverse_condition_maybe_unordered (code);
16544       else
16545         code = reverse_condition (code);
16546     }
16547
16548   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
16549     {
16550       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
16551          to the GT bit.  */
16552       switch (code)
16553         {
16554         case EQ:
16555           /* Opposite of GT.  */
16556           code = GT;
16557           break;
16558
16559         case NE:
16560           code = UNLE;
16561           break;
16562
16563         default:
16564           gcc_unreachable ();
16565         }
16566     }
16567
16568   switch (code)
16569     {
16570       /* Not all of these are actually distinct opcodes, but
16571          we distinguish them for clarity of the resulting assembler.  */
16572     case NE: case LTGT:
16573       ccode = "ne"; break;
16574     case EQ: case UNEQ:
16575       ccode = "eq"; break;
16576     case GE: case GEU:
16577       ccode = "ge"; break;
16578     case GT: case GTU: case UNGT:
16579       ccode = "gt"; break;
16580     case LE: case LEU:
16581       ccode = "le"; break;
16582     case LT: case LTU: case UNLT:
16583       ccode = "lt"; break;
16584     case UNORDERED: ccode = "un"; break;
16585     case ORDERED: ccode = "nu"; break;
16586     case UNGE: ccode = "nl"; break;
16587     case UNLE: ccode = "ng"; break;
16588     default:
16589       gcc_unreachable ();
16590     }
16591
16592   /* Maybe we have a guess as to how likely the branch is.
16593      The old mnemonics don't have a way to specify this information.  */
16594   pred = "";
16595   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
16596   if (note != NULL_RTX)
16597     {
16598       /* PROB is the difference from 50%.  */
16599       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
16600
16601       /* Only hint for highly probable/improbable branches on newer
16602          cpus as static prediction overrides processor dynamic
16603          prediction.  For older cpus we may as well always hint, but
16604          assume not taken for branches that are very close to 50% as a
16605          mispredicted taken branch is more expensive than a
16606          mispredicted not-taken branch.  */
16607       if (rs6000_always_hint
16608           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
16609               && br_prob_note_reliable_p (note)))
16610         {
16611           if (abs (prob) > REG_BR_PROB_BASE / 20
16612               && ((prob > 0) ^ need_longbranch))
16613             pred = "+";
16614           else
16615             pred = "-";
16616         }
16617     }
16618
16619   if (label == NULL)
16620     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
16621   else
16622     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
16623
16624   /* We need to escape any '%' characters in the reg_names string.
16625      Assume they'd only be the first character....  */
16626   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
16627     *s++ = '%';
16628   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
16629
16630   if (label != NULL)
16631     {
16632       /* If the branch distance was too far, we may have to use an
16633          unconditional branch to go the distance.  */
16634       if (need_longbranch)
16635         s += sprintf (s, ",$+8\n\tb %s", label);
16636       else
16637         s += sprintf (s, ",%s", label);
16638     }
16639
16640   return string;
16641 }
16642
16643 /* Return the string to flip the GT bit on a CR.  */
16644 char *
16645 output_e500_flip_gt_bit (rtx dst, rtx src)
16646 {
16647   static char string[64];
16648   int a, b;
16649
16650   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
16651               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
16652
16653   /* GT bit.  */
16654   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
16655   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
16656
16657   sprintf (string, "crnot %d,%d", a, b);
16658   return string;
16659 }
16660
16661 /* Return insn for VSX or Altivec comparisons.  */
16662
16663 static rtx
16664 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
16665 {
16666   rtx mask;
16667   enum machine_mode mode = GET_MODE (op0);
16668
16669   switch (code)
16670     {
16671     default:
16672       break;
16673
16674     case GE:
16675       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
16676         return NULL_RTX;
16677
16678     case EQ:
16679     case GT:
16680     case GTU:
16681       mask = gen_reg_rtx (mode);
16682       emit_insn (gen_rtx_SET (VOIDmode,
16683                               mask,
16684                               gen_rtx_fmt_ee (code, mode, op0, op1)));
16685       return mask;
16686     }
16687
16688   return NULL_RTX;
16689 }
16690
16691 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
16692    DMODE is expected destination mode. This is a recursive function.  */
16693
16694 static rtx
16695 rs6000_emit_vector_compare (enum rtx_code rcode,
16696                             rtx op0, rtx op1,
16697                             enum machine_mode dmode)
16698 {
16699   rtx mask;
16700   bool swap_operands = false;
16701   bool try_again = false;
16702
16703   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
16704   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
16705
16706   /* See if the comparison works as is.  */
16707   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16708   if (mask)
16709     return mask;
16710
16711   switch (rcode)
16712     {
16713     case LT:
16714       rcode = GT;
16715       swap_operands = true;
16716       try_again = true;
16717       break;
16718     case LTU:
16719       rcode = GTU;
16720       swap_operands = true;
16721       try_again = true;
16722       break;
16723     case NE:
16724     case UNLE:
16725     case UNLT:
16726     case UNGE:
16727     case UNGT:
16728       /* Invert condition and try again.
16729          e.g., A != B becomes ~(A==B).  */
16730       {
16731         enum rtx_code rev_code;
16732         enum insn_code nor_code;
16733         rtx mask2;
16734
16735         rev_code = reverse_condition_maybe_unordered (rcode);
16736         if (rev_code == UNKNOWN)
16737           return NULL_RTX;
16738
16739         nor_code = optab_handler (one_cmpl_optab, dmode);
16740         if (nor_code == CODE_FOR_nothing)
16741           return NULL_RTX;
16742
16743         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
16744         if (!mask2)
16745           return NULL_RTX;
16746
16747         mask = gen_reg_rtx (dmode);
16748         emit_insn (GEN_FCN (nor_code) (mask, mask2));
16749         return mask;
16750       }
16751       break;
16752     case GE:
16753     case GEU:
16754     case LE:
16755     case LEU:
16756       /* Try GT/GTU/LT/LTU OR EQ */
16757       {
16758         rtx c_rtx, eq_rtx;
16759         enum insn_code ior_code;
16760         enum rtx_code new_code;
16761
16762         switch (rcode)
16763           {
16764           case  GE:
16765             new_code = GT;
16766             break;
16767
16768           case GEU:
16769             new_code = GTU;
16770             break;
16771
16772           case LE:
16773             new_code = LT;
16774             break;
16775
16776           case LEU:
16777             new_code = LTU;
16778             break;
16779
16780           default:
16781             gcc_unreachable ();
16782           }
16783
16784         ior_code = optab_handler (ior_optab, dmode);
16785         if (ior_code == CODE_FOR_nothing)
16786           return NULL_RTX;
16787
16788         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
16789         if (!c_rtx)
16790           return NULL_RTX;
16791
16792         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
16793         if (!eq_rtx)
16794           return NULL_RTX;
16795
16796         mask = gen_reg_rtx (dmode);
16797         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
16798         return mask;
16799       }
16800       break;
16801     default:
16802       return NULL_RTX;
16803     }
16804
16805   if (try_again)
16806     {
16807       if (swap_operands)
16808         {
16809           rtx tmp;
16810           tmp = op0;
16811           op0 = op1;
16812           op1 = tmp;
16813         }
16814
16815       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16816       if (mask)
16817         return mask;
16818     }
16819
16820   /* You only get two chances.  */
16821   return NULL_RTX;
16822 }
16823
16824 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
16825    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
16826    operands for the relation operation COND.  */
16827
16828 int
16829 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
16830                               rtx cond, rtx cc_op0, rtx cc_op1)
16831 {
16832   enum machine_mode dest_mode = GET_MODE (dest);
16833   enum rtx_code rcode = GET_CODE (cond);
16834   enum machine_mode cc_mode = CCmode;
16835   rtx mask;
16836   rtx cond2;
16837   rtx tmp;
16838   bool invert_move = false;
16839
16840   if (VECTOR_UNIT_NONE_P (dest_mode))
16841     return 0;
16842
16843   switch (rcode)
16844     {
16845       /* Swap operands if we can, and fall back to doing the operation as
16846          specified, and doing a NOR to invert the test.  */
16847     case NE:
16848     case UNLE:
16849     case UNLT:
16850     case UNGE:
16851     case UNGT:
16852       /* Invert condition and try again.
16853          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
16854       invert_move = true;
16855       rcode = reverse_condition_maybe_unordered (rcode);
16856       if (rcode == UNKNOWN)
16857         return 0;
16858       break;
16859
16860       /* Mark unsigned tests with CCUNSmode.  */
16861     case GTU:
16862     case GEU:
16863     case LTU:
16864     case LEU:
16865       cc_mode = CCUNSmode;
16866       break;
16867
16868     default:
16869       break;
16870     }
16871
16872   /* Get the vector mask for the given relational operations.  */
16873   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
16874
16875   if (!mask)
16876     return 0;
16877
16878   if (invert_move)
16879     {
16880       tmp = op_true;
16881       op_true = op_false;
16882       op_false = tmp;
16883     }
16884
16885   cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, CONST0_RTX (dest_mode));
16886   emit_insn (gen_rtx_SET (VOIDmode,
16887                           dest,
16888                           gen_rtx_IF_THEN_ELSE (dest_mode,
16889                                                 cond2,
16890                                                 op_true,
16891                                                 op_false)));
16892   return 1;
16893 }
16894
16895 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
16896    operands of the last comparison is nonzero/true, FALSE_COND if it
16897    is zero/false.  Return 0 if the hardware has no such operation.  */
16898
16899 int
16900 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
16901 {
16902   enum rtx_code code = GET_CODE (op);
16903   rtx op0 = XEXP (op, 0);
16904   rtx op1 = XEXP (op, 1);
16905   REAL_VALUE_TYPE c1;
16906   enum machine_mode compare_mode = GET_MODE (op0);
16907   enum machine_mode result_mode = GET_MODE (dest);
16908   rtx temp;
16909   bool is_against_zero;
16910
16911   /* These modes should always match.  */
16912   if (GET_MODE (op1) != compare_mode
16913       /* In the isel case however, we can use a compare immediate, so
16914          op1 may be a small constant.  */
16915       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
16916     return 0;
16917   if (GET_MODE (true_cond) != result_mode)
16918     return 0;
16919   if (GET_MODE (false_cond) != result_mode)
16920     return 0;
16921
16922   /* First, work out if the hardware can do this at all, or
16923      if it's too slow....  */
16924   if (!FLOAT_MODE_P (compare_mode))
16925     {
16926       if (TARGET_ISEL)
16927         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
16928       return 0;
16929     }
16930   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
16931            && SCALAR_FLOAT_MODE_P (compare_mode))
16932     return 0;
16933
16934   is_against_zero = op1 == CONST0_RTX (compare_mode);
16935
16936   /* A floating-point subtract might overflow, underflow, or produce
16937      an inexact result, thus changing the floating-point flags, so it
16938      can't be generated if we care about that.  It's safe if one side
16939      of the construct is zero, since then no subtract will be
16940      generated.  */
16941   if (SCALAR_FLOAT_MODE_P (compare_mode)
16942       && flag_trapping_math && ! is_against_zero)
16943     return 0;
16944
16945   /* Eliminate half of the comparisons by switching operands, this
16946      makes the remaining code simpler.  */
16947   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
16948       || code == LTGT || code == LT || code == UNLE)
16949     {
16950       code = reverse_condition_maybe_unordered (code);
16951       temp = true_cond;
16952       true_cond = false_cond;
16953       false_cond = temp;
16954     }
16955
16956   /* UNEQ and LTGT take four instructions for a comparison with zero,
16957      it'll probably be faster to use a branch here too.  */
16958   if (code == UNEQ && HONOR_NANS (compare_mode))
16959     return 0;
16960
16961   if (GET_CODE (op1) == CONST_DOUBLE)
16962     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
16963
16964   /* We're going to try to implement comparisons by performing
16965      a subtract, then comparing against zero.  Unfortunately,
16966      Inf - Inf is NaN which is not zero, and so if we don't
16967      know that the operand is finite and the comparison
16968      would treat EQ different to UNORDERED, we can't do it.  */
16969   if (HONOR_INFINITIES (compare_mode)
16970       && code != GT && code != UNGE
16971       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
16972       /* Constructs of the form (a OP b ? a : b) are safe.  */
16973       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
16974           || (! rtx_equal_p (op0, true_cond)
16975               && ! rtx_equal_p (op1, true_cond))))
16976     return 0;
16977
16978   /* At this point we know we can use fsel.  */
16979
16980   /* Reduce the comparison to a comparison against zero.  */
16981   if (! is_against_zero)
16982     {
16983       temp = gen_reg_rtx (compare_mode);
16984       emit_insn (gen_rtx_SET (VOIDmode, temp,
16985                               gen_rtx_MINUS (compare_mode, op0, op1)));
16986       op0 = temp;
16987       op1 = CONST0_RTX (compare_mode);
16988     }
16989
16990   /* If we don't care about NaNs we can reduce some of the comparisons
16991      down to faster ones.  */
16992   if (! HONOR_NANS (compare_mode))
16993     switch (code)
16994       {
16995       case GT:
16996         code = LE;
16997         temp = true_cond;
16998         true_cond = false_cond;
16999         false_cond = temp;
17000         break;
17001       case UNGE:
17002         code = GE;
17003         break;
17004       case UNEQ:
17005         code = EQ;
17006         break;
17007       default:
17008         break;
17009       }
17010
17011   /* Now, reduce everything down to a GE.  */
17012   switch (code)
17013     {
17014     case GE:
17015       break;
17016
17017     case LE:
17018       temp = gen_reg_rtx (compare_mode);
17019       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17020       op0 = temp;
17021       break;
17022
17023     case ORDERED:
17024       temp = gen_reg_rtx (compare_mode);
17025       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
17026       op0 = temp;
17027       break;
17028
17029     case EQ:
17030       temp = gen_reg_rtx (compare_mode);
17031       emit_insn (gen_rtx_SET (VOIDmode, temp,
17032                               gen_rtx_NEG (compare_mode,
17033                                            gen_rtx_ABS (compare_mode, op0))));
17034       op0 = temp;
17035       break;
17036
17037     case UNGE:
17038       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
17039       temp = gen_reg_rtx (result_mode);
17040       emit_insn (gen_rtx_SET (VOIDmode, temp,
17041                               gen_rtx_IF_THEN_ELSE (result_mode,
17042                                                     gen_rtx_GE (VOIDmode,
17043                                                                 op0, op1),
17044                                                     true_cond, false_cond)));
17045       false_cond = true_cond;
17046       true_cond = temp;
17047
17048       temp = gen_reg_rtx (compare_mode);
17049       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17050       op0 = temp;
17051       break;
17052
17053     case GT:
17054       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
17055       temp = gen_reg_rtx (result_mode);
17056       emit_insn (gen_rtx_SET (VOIDmode, temp,
17057                               gen_rtx_IF_THEN_ELSE (result_mode,
17058                                                     gen_rtx_GE (VOIDmode,
17059                                                                 op0, op1),
17060                                                     true_cond, false_cond)));
17061       true_cond = false_cond;
17062       false_cond = temp;
17063
17064       temp = gen_reg_rtx (compare_mode);
17065       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17066       op0 = temp;
17067       break;
17068
17069     default:
17070       gcc_unreachable ();
17071     }
17072
17073   emit_insn (gen_rtx_SET (VOIDmode, dest,
17074                           gen_rtx_IF_THEN_ELSE (result_mode,
17075                                                 gen_rtx_GE (VOIDmode,
17076                                                             op0, op1),
17077                                                 true_cond, false_cond)));
17078   return 1;
17079 }
17080
17081 /* Same as above, but for ints (isel).  */
17082
17083 static int
17084 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17085 {
17086   rtx condition_rtx, cr;
17087   enum machine_mode mode = GET_MODE (dest);
17088   enum rtx_code cond_code;
17089   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
17090   bool signedp;
17091
17092   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
17093     return 0;
17094
17095   /* We still have to do the compare, because isel doesn't do a
17096      compare, it just looks at the CRx bits set by a previous compare
17097      instruction.  */
17098   condition_rtx = rs6000_generate_compare (op, mode);
17099   cond_code = GET_CODE (condition_rtx);
17100   cr = XEXP (condition_rtx, 0);
17101   signedp = GET_MODE (cr) == CCmode;
17102
17103   isel_func = (mode == SImode
17104                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
17105                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
17106
17107   switch (cond_code)
17108     {
17109     case LT: case GT: case LTU: case GTU: case EQ:
17110       /* isel handles these directly.  */
17111       break;
17112
17113     default:
17114       /* We need to swap the sense of the comparison.  */
17115       {
17116         rtx t = true_cond;
17117         true_cond = false_cond;
17118         false_cond = t;
17119         PUT_CODE (condition_rtx, reverse_condition (cond_code));
17120       }
17121       break;
17122     }
17123
17124   false_cond = force_reg (mode, false_cond);
17125   if (true_cond != const0_rtx)
17126     true_cond = force_reg (mode, true_cond);
17127
17128   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
17129
17130   return 1;
17131 }
17132
17133 const char *
17134 output_isel (rtx *operands)
17135 {
17136   enum rtx_code code;
17137
17138   code = GET_CODE (operands[1]);
17139
17140   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
17141     {
17142       gcc_assert (GET_CODE (operands[2]) == REG
17143                   && GET_CODE (operands[3]) == REG);
17144       PUT_CODE (operands[1], reverse_condition (code));
17145       return "isel %0,%3,%2,%j1";
17146     }
17147
17148   return "isel %0,%2,%3,%j1";
17149 }
17150
17151 void
17152 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
17153 {
17154   enum machine_mode mode = GET_MODE (op0);
17155   enum rtx_code c;
17156   rtx target;
17157
17158   /* VSX/altivec have direct min/max insns.  */
17159   if ((code == SMAX || code == SMIN)
17160       && (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
17161           || (mode == SFmode && VECTOR_UNIT_VSX_P (DFmode))))
17162     {
17163       emit_insn (gen_rtx_SET (VOIDmode,
17164                               dest,
17165                               gen_rtx_fmt_ee (code, mode, op0, op1)));
17166       return;
17167     }
17168
17169   if (code == SMAX || code == SMIN)
17170     c = GE;
17171   else
17172     c = GEU;
17173
17174   if (code == SMAX || code == UMAX)
17175     target = emit_conditional_move (dest, c, op0, op1, mode,
17176                                     op0, op1, mode, 0);
17177   else
17178     target = emit_conditional_move (dest, c, op0, op1, mode,
17179                                     op1, op0, mode, 0);
17180   gcc_assert (target);
17181   if (target != dest)
17182     emit_move_insn (dest, target);
17183 }
17184
17185 /* Emit instructions to perform a load-reserved/store-conditional operation.
17186    The operation performed is an atomic
17187    (set M (CODE:MODE M OP))
17188    If not NULL, BEFORE is atomically set to M before the operation, and
17189    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
17190    If SYNC_P then a memory barrier is emitted before the operation.
17191    Either OP or M may be wrapped in a NOT operation.  */
17192
17193 void
17194 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
17195                   rtx m, rtx op, rtx before_param, rtx after_param,
17196                   bool sync_p)
17197 {
17198   enum machine_mode used_mode;
17199   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
17200   rtx used_m;
17201   rtvec vec;
17202   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17203   rtx shift = NULL_RTX;
17204
17205   if (sync_p)
17206     emit_insn (gen_lwsync ());
17207
17208     used_m = m;
17209
17210   /* If this is smaller than SImode, we'll have to use SImode with
17211      adjustments.  */
17212   if (mode == QImode || mode == HImode)
17213     {
17214       rtx newop, oldop;
17215
17216       if (MEM_ALIGN (used_m) >= 32)
17217         {
17218           int ishift = 0;
17219           if (BYTES_BIG_ENDIAN)
17220             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
17221
17222           shift = GEN_INT (ishift);
17223           used_m = change_address (used_m, SImode, 0);
17224         }
17225       else
17226         {
17227           rtx addrSI, aligned_addr;
17228           int shift_mask = mode == QImode ? 0x18 : 0x10;
17229
17230           addrSI = gen_lowpart_common (SImode,
17231                                        force_reg (Pmode, XEXP (used_m, 0)));
17232           addrSI = force_reg (SImode, addrSI);
17233           shift = gen_reg_rtx (SImode);
17234
17235           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17236                                  GEN_INT (shift_mask)));
17237           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17238
17239           aligned_addr = expand_binop (Pmode, and_optab,
17240                                        XEXP (used_m, 0),
17241                                        GEN_INT (-4), NULL_RTX,
17242                                        1, OPTAB_LIB_WIDEN);
17243           used_m = change_address (used_m, SImode, aligned_addr);
17244           set_mem_align (used_m, 32);
17245         }
17246       /* It's safe to keep the old alias set of USED_M, because
17247          the operation is atomic and only affects the original
17248          USED_M.  */
17249       m = used_m;
17250
17251       if (GET_CODE (op) == NOT)
17252         {
17253           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
17254           oldop = gen_rtx_NOT (SImode, oldop);
17255         }
17256       else
17257         oldop = lowpart_subreg (SImode, op, mode);
17258
17259       switch (code)
17260         {
17261         case IOR:
17262         case XOR:
17263           newop = expand_binop (SImode, and_optab,
17264                                 oldop, GEN_INT (imask), NULL_RTX,
17265                                 1, OPTAB_LIB_WIDEN);
17266           emit_insn (gen_ashlsi3 (newop, newop, shift));
17267           break;
17268
17269         case NOT: /* NAND */
17270           newop = expand_binop (SImode, ior_optab,
17271                                 oldop, GEN_INT (~imask), NULL_RTX,
17272                                 1, OPTAB_LIB_WIDEN);
17273           emit_insn (gen_rotlsi3 (newop, newop, shift));
17274           break;
17275
17276         case AND:
17277           newop = expand_binop (SImode, ior_optab,
17278                                 oldop, GEN_INT (~imask), NULL_RTX,
17279                                 1, OPTAB_LIB_WIDEN);
17280           emit_insn (gen_rotlsi3 (newop, newop, shift));
17281           break;
17282
17283         case PLUS:
17284         case MINUS:
17285           {
17286             rtx mask;
17287
17288             newop = expand_binop (SImode, and_optab,
17289                                   oldop, GEN_INT (imask), NULL_RTX,
17290                                   1, OPTAB_LIB_WIDEN);
17291             emit_insn (gen_ashlsi3 (newop, newop, shift));
17292
17293             mask = gen_reg_rtx (SImode);
17294             emit_move_insn (mask, GEN_INT (imask));
17295             emit_insn (gen_ashlsi3 (mask, mask, shift));
17296
17297             if (code == PLUS)
17298               newop = gen_rtx_PLUS (SImode, m, newop);
17299             else
17300               newop = gen_rtx_MINUS (SImode, m, newop);
17301             newop = gen_rtx_AND (SImode, newop, mask);
17302             newop = gen_rtx_IOR (SImode, newop,
17303                                  gen_rtx_AND (SImode,
17304                                               gen_rtx_NOT (SImode, mask),
17305                                               m));
17306             break;
17307           }
17308
17309         default:
17310           gcc_unreachable ();
17311         }
17312
17313       op = newop;
17314       used_mode = SImode;
17315       before = gen_reg_rtx (used_mode);
17316       after = gen_reg_rtx (used_mode);
17317     }
17318   else
17319     {
17320       used_mode = mode;
17321       before = before_param;
17322       after = after_param;
17323
17324       if (before == NULL_RTX)
17325         before = gen_reg_rtx (used_mode);
17326       if (after == NULL_RTX)
17327         after = gen_reg_rtx (used_mode);
17328     }
17329
17330   if ((code == PLUS || code == MINUS)
17331       && used_mode != mode)
17332     the_op = op;  /* Computed above.  */
17333   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
17334     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
17335   else if (code == NOT)
17336     the_op = gen_rtx_fmt_ee (IOR, used_mode,
17337                              gen_rtx_NOT (used_mode, m),
17338                              gen_rtx_NOT (used_mode, op));
17339   else
17340     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
17341
17342   set_after = gen_rtx_SET (VOIDmode, after, the_op);
17343   set_before = gen_rtx_SET (VOIDmode, before, used_m);
17344   set_atomic = gen_rtx_SET (VOIDmode, used_m,
17345                             gen_rtx_UNSPEC (used_mode,
17346                                             gen_rtvec (1, the_op),
17347                                             UNSPEC_SYNC_OP));
17348   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
17349
17350   if ((code == PLUS || code == MINUS) && used_mode != mode)
17351     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
17352                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
17353   else
17354     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
17355   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
17356
17357   /* Shift and mask the return values properly.  */
17358   if (used_mode != mode && before_param)
17359     {
17360       emit_insn (gen_lshrsi3 (before, before, shift));
17361       convert_move (before_param, before, 1);
17362     }
17363
17364   if (used_mode != mode && after_param)
17365     {
17366       emit_insn (gen_lshrsi3 (after, after, shift));
17367       convert_move (after_param, after, 1);
17368     }
17369
17370   /* The previous sequence will end with a branch that's dependent on
17371      the conditional store, so placing an isync will ensure that no
17372      other instructions (especially, no load or store instructions)
17373      can start before the atomic operation completes.  */
17374   if (sync_p)
17375     emit_insn (gen_isync ());
17376 }
17377
17378 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
17379    COND is true.  Mark the jump as unlikely to be taken.  */
17380
17381 static void
17382 emit_unlikely_jump (rtx cond, rtx label)
17383 {
17384   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
17385   rtx x;
17386
17387   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
17388   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
17389   add_reg_note (x, REG_BR_PROB, very_unlikely);
17390 }
17391
17392 /* A subroutine of the atomic operation splitters.  Emit a load-locked
17393    instruction in MODE.  */
17394
17395 static void
17396 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
17397 {
17398   rtx (*fn) (rtx, rtx) = NULL;
17399   if (mode == SImode)
17400     fn = gen_load_locked_si;
17401   else if (mode == DImode)
17402     fn = gen_load_locked_di;
17403   emit_insn (fn (reg, mem));
17404 }
17405
17406 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
17407    instruction in MODE.  */
17408
17409 static void
17410 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
17411 {
17412   rtx (*fn) (rtx, rtx, rtx) = NULL;
17413   if (mode == SImode)
17414     fn = gen_store_conditional_si;
17415   else if (mode == DImode)
17416     fn = gen_store_conditional_di;
17417
17418   /* Emit sync before stwcx. to address PPC405 Erratum.  */
17419   if (PPC405_ERRATUM77)
17420     emit_insn (gen_memory_barrier ());
17421
17422   emit_insn (fn (res, mem, val));
17423 }
17424
17425 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
17426    to perform.  MEM is the memory on which to operate.  VAL is the second
17427    operand of the binary operator.  BEFORE and AFTER are optional locations to
17428    return the value of MEM either before of after the operation.  SCRATCH is
17429    a scratch register.  */
17430
17431 void
17432 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
17433                        rtx before, rtx after, rtx scratch)
17434 {
17435   enum machine_mode mode = GET_MODE (mem);
17436   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17437
17438   emit_insn (gen_lwsync ());
17439
17440   label = gen_label_rtx ();
17441   emit_label (label);
17442   label = gen_rtx_LABEL_REF (VOIDmode, label);
17443
17444   if (before == NULL_RTX)
17445     before = scratch;
17446   emit_load_locked (mode, before, mem);
17447
17448   if (code == NOT)
17449     x = gen_rtx_IOR (mode,
17450                      gen_rtx_NOT (mode, before),
17451                      gen_rtx_NOT (mode, val));
17452   else if (code == AND)
17453     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
17454   else
17455     x = gen_rtx_fmt_ee (code, mode, before, val);
17456
17457   if (after != NULL_RTX)
17458     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
17459   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17460
17461   emit_store_conditional (mode, cond, mem, scratch);
17462
17463   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17464   emit_unlikely_jump (x, label);
17465
17466   emit_insn (gen_isync ());
17467 }
17468
17469 /* Expand an atomic compare and swap operation.  MEM is the memory on which
17470    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
17471    value to be stored.  SCRATCH is a scratch GPR.  */
17472
17473 void
17474 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
17475                                rtx scratch)
17476 {
17477   enum machine_mode mode = GET_MODE (mem);
17478   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17479
17480   emit_insn (gen_lwsync ());
17481
17482   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17483   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17484   emit_label (XEXP (label1, 0));
17485
17486   emit_load_locked (mode, retval, mem);
17487
17488   x = gen_rtx_COMPARE (CCmode, retval, oldval);
17489   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17490
17491   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17492   emit_unlikely_jump (x, label2);
17493
17494   emit_move_insn (scratch, newval);
17495   emit_store_conditional (mode, cond, mem, scratch);
17496
17497   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17498   emit_unlikely_jump (x, label1);
17499
17500   emit_insn (gen_isync ());
17501   emit_label (XEXP (label2, 0));
17502 }
17503
17504 /* Expand an atomic test and set operation.  MEM is the memory on which
17505    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
17506
17507 void
17508 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
17509 {
17510   enum machine_mode mode = GET_MODE (mem);
17511   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17512
17513   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17514   emit_label (XEXP (label, 0));
17515
17516   emit_load_locked (mode, retval, mem);
17517   emit_move_insn (scratch, val);
17518   emit_store_conditional (mode, cond, mem, scratch);
17519
17520   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17521   emit_unlikely_jump (x, label);
17522
17523   emit_insn (gen_isync ());
17524 }
17525
17526 void
17527 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
17528 {
17529   enum machine_mode mode = GET_MODE (mem);
17530   rtx addrSI, align, wdst, shift, mask;
17531   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
17532   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17533
17534   /* Shift amount for subword relative to aligned word.  */
17535   addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
17536   addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
17537   shift = gen_reg_rtx (SImode);
17538   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17539                          GEN_INT (shift_mask)));
17540   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17541
17542   /* Shift and mask old value into position within word.  */
17543   oldval = convert_modes (SImode, mode, oldval, 1);
17544   oldval = expand_binop (SImode, and_optab,
17545                          oldval, GEN_INT (imask), NULL_RTX,
17546                          1, OPTAB_LIB_WIDEN);
17547   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
17548
17549   /* Shift and mask new value into position within word.  */
17550   newval = convert_modes (SImode, mode, newval, 1);
17551   newval = expand_binop (SImode, and_optab,
17552                          newval, GEN_INT (imask), NULL_RTX,
17553                          1, OPTAB_LIB_WIDEN);
17554   emit_insn (gen_ashlsi3 (newval, newval, shift));
17555
17556   /* Mask for insertion.  */
17557   mask = gen_reg_rtx (SImode);
17558   emit_move_insn (mask, GEN_INT (imask));
17559   emit_insn (gen_ashlsi3 (mask, mask, shift));
17560
17561   /* Address of aligned word containing subword.  */
17562   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
17563                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
17564   mem = change_address (mem, SImode, align);
17565   set_mem_align (mem, 32);
17566   MEM_VOLATILE_P (mem) = 1;
17567
17568   wdst = gen_reg_rtx (SImode);
17569   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
17570                                                     oldval, newval, mem));
17571
17572   /* Shift the result back.  */
17573   emit_insn (gen_lshrsi3 (wdst, wdst, shift));
17574
17575   emit_move_insn (dst, gen_lowpart (mode, wdst));
17576 }
17577
17578 void
17579 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
17580                                   rtx oldval, rtx newval, rtx mem,
17581                                   rtx scratch)
17582 {
17583   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17584
17585   emit_insn (gen_lwsync ());
17586   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17587   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17588   emit_label (XEXP (label1, 0));
17589
17590   emit_load_locked (SImode, scratch, mem);
17591
17592   /* Mask subword within loaded value for comparison with oldval.
17593      Use UNSPEC_AND to avoid clobber.*/
17594   emit_insn (gen_rtx_SET (SImode, dest,
17595                           gen_rtx_UNSPEC (SImode,
17596                                           gen_rtvec (2, scratch, mask),
17597                                           UNSPEC_AND)));
17598
17599   x = gen_rtx_COMPARE (CCmode, dest, oldval);
17600   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17601
17602   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17603   emit_unlikely_jump (x, label2);
17604
17605   /* Clear subword within loaded value for insertion of new value.  */
17606   emit_insn (gen_rtx_SET (SImode, scratch,
17607                           gen_rtx_AND (SImode,
17608                                        gen_rtx_NOT (SImode, mask), scratch)));
17609   emit_insn (gen_iorsi3 (scratch, scratch, newval));
17610   emit_store_conditional (SImode, cond, mem, scratch);
17611
17612   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17613   emit_unlikely_jump (x, label1);
17614
17615   emit_insn (gen_isync ());
17616   emit_label (XEXP (label2, 0));
17617 }
17618
17619
17620   /* Emit instructions to move SRC to DST.  Called by splitters for
17621    multi-register moves.  It will emit at most one instruction for
17622    each register that is accessed; that is, it won't emit li/lis pairs
17623    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
17624    register.  */
17625
17626 void
17627 rs6000_split_multireg_move (rtx dst, rtx src)
17628 {
17629   /* The register number of the first register being moved.  */
17630   int reg;
17631   /* The mode that is to be moved.  */
17632   enum machine_mode mode;
17633   /* The mode that the move is being done in, and its size.  */
17634   enum machine_mode reg_mode;
17635   int reg_mode_size;
17636   /* The number of registers that will be moved.  */
17637   int nregs;
17638
17639   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
17640   mode = GET_MODE (dst);
17641   nregs = hard_regno_nregs[reg][mode];
17642   if (FP_REGNO_P (reg))
17643     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : 
17644         ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
17645   else if (ALTIVEC_REGNO_P (reg))
17646     reg_mode = V16QImode;
17647   else if (TARGET_E500_DOUBLE && mode == TFmode)
17648     reg_mode = DFmode;
17649   else
17650     reg_mode = word_mode;
17651   reg_mode_size = GET_MODE_SIZE (reg_mode);
17652
17653   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
17654
17655   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
17656     {
17657       /* Move register range backwards, if we might have destructive
17658          overlap.  */
17659       int i;
17660       for (i = nregs - 1; i >= 0; i--)
17661         emit_insn (gen_rtx_SET (VOIDmode,
17662                                 simplify_gen_subreg (reg_mode, dst, mode,
17663                                                      i * reg_mode_size),
17664                                 simplify_gen_subreg (reg_mode, src, mode,
17665                                                      i * reg_mode_size)));
17666     }
17667   else
17668     {
17669       int i;
17670       int j = -1;
17671       bool used_update = false;
17672       rtx restore_basereg = NULL_RTX;
17673
17674       if (MEM_P (src) && INT_REGNO_P (reg))
17675         {
17676           rtx breg;
17677
17678           if (GET_CODE (XEXP (src, 0)) == PRE_INC
17679               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
17680             {
17681               rtx delta_rtx;
17682               breg = XEXP (XEXP (src, 0), 0);
17683               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
17684                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
17685                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
17686               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17687               src = replace_equiv_address (src, breg);
17688             }
17689           else if (! rs6000_offsettable_memref_p (src))
17690             {
17691               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
17692                 {
17693                   rtx basereg = XEXP (XEXP (src, 0), 0);
17694                   if (TARGET_UPDATE)
17695                     {
17696                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
17697                       emit_insn (gen_rtx_SET (VOIDmode, ndst,
17698                                  gen_rtx_MEM (reg_mode, XEXP (src, 0))));
17699                       used_update = true;
17700                     }
17701                   else
17702                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17703                                XEXP (XEXP (src, 0), 1)));
17704                   src = replace_equiv_address (src, basereg);
17705                 }
17706               else
17707                 {
17708                   rtx basereg = gen_rtx_REG (Pmode, reg);
17709                   emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
17710                   src = replace_equiv_address (src, basereg);
17711                 }
17712             }
17713
17714           breg = XEXP (src, 0);
17715           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
17716             breg = XEXP (breg, 0);
17717
17718           /* If the base register we are using to address memory is
17719              also a destination reg, then change that register last.  */
17720           if (REG_P (breg)
17721               && REGNO (breg) >= REGNO (dst)
17722               && REGNO (breg) < REGNO (dst) + nregs)
17723             j = REGNO (breg) - REGNO (dst);
17724         }
17725       else if (MEM_P (dst) && INT_REGNO_P (reg))
17726         {
17727           rtx breg;
17728
17729           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
17730               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
17731             {
17732               rtx delta_rtx;
17733               breg = XEXP (XEXP (dst, 0), 0);
17734               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
17735                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
17736                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
17737
17738               /* We have to update the breg before doing the store.
17739                  Use store with update, if available.  */
17740
17741               if (TARGET_UPDATE)
17742                 {
17743                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17744                   emit_insn (TARGET_32BIT
17745                              ? (TARGET_POWERPC64
17746                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
17747                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
17748                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
17749                   used_update = true;
17750                 }
17751               else
17752                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17753               dst = replace_equiv_address (dst, breg);
17754             }
17755           else if (!rs6000_offsettable_memref_p (dst)
17756                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
17757             {
17758               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
17759                 {
17760                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17761                   if (TARGET_UPDATE)
17762                     {
17763                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17764                       emit_insn (gen_rtx_SET (VOIDmode,
17765                                  gen_rtx_MEM (reg_mode, XEXP (dst, 0)), nsrc));
17766                       used_update = true;
17767                     }
17768                   else
17769                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17770                                XEXP (XEXP (dst, 0), 1)));
17771                   dst = replace_equiv_address (dst, basereg);
17772                 }
17773               else
17774                 {
17775                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17776                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
17777                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
17778                               && REG_P (basereg)
17779                               && REG_P (offsetreg)
17780                               && REGNO (basereg) != REGNO (offsetreg));
17781                   if (REGNO (basereg) == 0)
17782                     {
17783                       rtx tmp = offsetreg;
17784                       offsetreg = basereg;
17785                       basereg = tmp;
17786                     }
17787                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
17788                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
17789                   dst = replace_equiv_address (dst, basereg);
17790                 }
17791             }
17792           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
17793             gcc_assert (rs6000_offsettable_memref_p (dst));
17794         }
17795
17796       for (i = 0; i < nregs; i++)
17797         {
17798           /* Calculate index to next subword.  */
17799           ++j;
17800           if (j == nregs)
17801             j = 0;
17802
17803           /* If compiler already emitted move of first word by
17804              store with update, no need to do anything.  */
17805           if (j == 0 && used_update)
17806             continue;
17807
17808           emit_insn (gen_rtx_SET (VOIDmode,
17809                                   simplify_gen_subreg (reg_mode, dst, mode,
17810                                                        j * reg_mode_size),
17811                                   simplify_gen_subreg (reg_mode, src, mode,
17812                                                        j * reg_mode_size)));
17813         }
17814       if (restore_basereg != NULL_RTX)
17815         emit_insn (restore_basereg);
17816     }
17817 }
17818
17819 \f
17820 /* This page contains routines that are used to determine what the
17821    function prologue and epilogue code will do and write them out.  */
17822
17823 /* Return the first fixed-point register that is required to be
17824    saved. 32 if none.  */
17825
17826 int
17827 first_reg_to_save (void)
17828 {
17829   int first_reg;
17830
17831   /* Find lowest numbered live register.  */
17832   for (first_reg = 13; first_reg <= 31; first_reg++)
17833     if (df_regs_ever_live_p (first_reg)
17834         && (! call_used_regs[first_reg]
17835             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
17836                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
17837                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
17838                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
17839       break;
17840
17841 #if TARGET_MACHO
17842   if (flag_pic
17843       && crtl->uses_pic_offset_table
17844       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
17845     return RS6000_PIC_OFFSET_TABLE_REGNUM;
17846 #endif
17847
17848   return first_reg;
17849 }
17850
17851 /* Similar, for FP regs.  */
17852
17853 int
17854 first_fp_reg_to_save (void)
17855 {
17856   int first_reg;
17857
17858   /* Find lowest numbered live register.  */
17859   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
17860     if (df_regs_ever_live_p (first_reg))
17861       break;
17862
17863   return first_reg;
17864 }
17865
17866 /* Similar, for AltiVec regs.  */
17867
17868 static int
17869 first_altivec_reg_to_save (void)
17870 {
17871   int i;
17872
17873   /* Stack frame remains as is unless we are in AltiVec ABI.  */
17874   if (! TARGET_ALTIVEC_ABI)
17875     return LAST_ALTIVEC_REGNO + 1;
17876
17877   /* On Darwin, the unwind routines are compiled without
17878      TARGET_ALTIVEC, and use save_world to save/restore the
17879      altivec registers when necessary.  */
17880   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17881       && ! TARGET_ALTIVEC)
17882     return FIRST_ALTIVEC_REGNO + 20;
17883
17884   /* Find lowest numbered live register.  */
17885   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
17886     if (df_regs_ever_live_p (i))
17887       break;
17888
17889   return i;
17890 }
17891
17892 /* Return a 32-bit mask of the AltiVec registers we need to set in
17893    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
17894    the 32-bit word is 0.  */
17895
17896 static unsigned int
17897 compute_vrsave_mask (void)
17898 {
17899   unsigned int i, mask = 0;
17900
17901   /* On Darwin, the unwind routines are compiled without
17902      TARGET_ALTIVEC, and use save_world to save/restore the
17903      call-saved altivec registers when necessary.  */
17904   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17905       && ! TARGET_ALTIVEC)
17906     mask |= 0xFFF;
17907
17908   /* First, find out if we use _any_ altivec registers.  */
17909   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
17910     if (df_regs_ever_live_p (i))
17911       mask |= ALTIVEC_REG_BIT (i);
17912
17913   if (mask == 0)
17914     return mask;
17915
17916   /* Next, remove the argument registers from the set.  These must
17917      be in the VRSAVE mask set by the caller, so we don't need to add
17918      them in again.  More importantly, the mask we compute here is
17919      used to generate CLOBBERs in the set_vrsave insn, and we do not
17920      wish the argument registers to die.  */
17921   for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
17922     mask &= ~ALTIVEC_REG_BIT (i);
17923
17924   /* Similarly, remove the return value from the set.  */
17925   {
17926     bool yes = false;
17927     diddle_return_value (is_altivec_return_reg, &yes);
17928     if (yes)
17929       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
17930   }
17931
17932   return mask;
17933 }
17934
17935 /* For a very restricted set of circumstances, we can cut down the
17936    size of prologues/epilogues by calling our own save/restore-the-world
17937    routines.  */
17938
17939 static void
17940 compute_save_world_info (rs6000_stack_t *info_ptr)
17941 {
17942   info_ptr->world_save_p = 1;
17943   info_ptr->world_save_p
17944     = (WORLD_SAVE_P (info_ptr)
17945        && DEFAULT_ABI == ABI_DARWIN
17946        && ! (cfun->calls_setjmp && flag_exceptions)
17947        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
17948        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
17949        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
17950        && info_ptr->cr_save_p);
17951
17952   /* This will not work in conjunction with sibcalls.  Make sure there
17953      are none.  (This check is expensive, but seldom executed.) */
17954   if (WORLD_SAVE_P (info_ptr))
17955     {
17956       rtx insn;
17957       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
17958         if ( GET_CODE (insn) == CALL_INSN
17959              && SIBLING_CALL_P (insn))
17960           {
17961             info_ptr->world_save_p = 0;
17962             break;
17963           }
17964     }
17965
17966   if (WORLD_SAVE_P (info_ptr))
17967     {
17968       /* Even if we're not touching VRsave, make sure there's room on the
17969          stack for it, if it looks like we're calling SAVE_WORLD, which
17970          will attempt to save it. */
17971       info_ptr->vrsave_size  = 4;
17972
17973       /* If we are going to save the world, we need to save the link register too.  */
17974       info_ptr->lr_save_p = 1;
17975
17976       /* "Save" the VRsave register too if we're saving the world.  */
17977       if (info_ptr->vrsave_mask == 0)
17978         info_ptr->vrsave_mask = compute_vrsave_mask ();
17979
17980       /* Because the Darwin register save/restore routines only handle
17981          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
17982          check.  */
17983       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
17984                   && (info_ptr->first_altivec_reg_save
17985                       >= FIRST_SAVED_ALTIVEC_REGNO));
17986     }
17987   return;
17988 }
17989
17990
17991 static void
17992 is_altivec_return_reg (rtx reg, void *xyes)
17993 {
17994   bool *yes = (bool *) xyes;
17995   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
17996     *yes = true;
17997 }
17998
17999 \f
18000 /* Determine the strategy for savings/restoring registers.  */
18001
18002 enum {
18003   SAVRES_MULTIPLE = 0x1,
18004   SAVE_INLINE_FPRS = 0x2,
18005   SAVE_INLINE_GPRS = 0x4,
18006   REST_INLINE_FPRS = 0x8,
18007   REST_INLINE_GPRS = 0x10,
18008   SAVE_NOINLINE_GPRS_SAVES_LR = 0x20,
18009   SAVE_NOINLINE_FPRS_SAVES_LR = 0x40,
18010   REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x80
18011 };
18012
18013 static int
18014 rs6000_savres_strategy (rs6000_stack_t *info,
18015                         bool using_static_chain_p)
18016 {
18017   int strategy = 0;
18018
18019   if (TARGET_MULTIPLE
18020       && !TARGET_POWERPC64
18021       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
18022       && info->first_gp_reg_save < 31
18023       && no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true))
18024     strategy |= SAVRES_MULTIPLE;
18025
18026   if (crtl->calls_eh_return
18027       || cfun->machine->ra_need_lr
18028       || info->total_size > 32767)
18029     strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
18030                  | SAVE_INLINE_GPRS | REST_INLINE_GPRS);
18031
18032   if (info->first_fp_reg_save == 64
18033       || FP_SAVE_INLINE (info->first_fp_reg_save)
18034       /* The out-of-line FP routines use double-precision stores;
18035          we can't use those routines if we don't have such stores.  */
18036       || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT)
18037       || !no_global_regs_above (info->first_fp_reg_save, /*gpr=*/false))
18038     strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
18039
18040   if (info->first_gp_reg_save == 32
18041       || GP_SAVE_INLINE (info->first_gp_reg_save)
18042       || !((strategy & SAVRES_MULTIPLE)
18043            || no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true)))
18044     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
18045
18046   /* Don't bother to try to save things out-of-line if r11 is occupied
18047      by the static chain.  It would require too much fiddling and the
18048      static chain is rarely used anyway.  */
18049   if (using_static_chain_p)
18050     strategy |= SAVE_INLINE_FPRS | SAVE_INLINE_GPRS;
18051
18052   /* If we are going to use store multiple, then don't even bother
18053      with the out-of-line routines, since the store-multiple
18054      instruction will always be smaller.  */
18055   if ((strategy & SAVRES_MULTIPLE))
18056     strategy |= SAVE_INLINE_GPRS;
18057
18058   /* The situation is more complicated with load multiple.  We'd
18059      prefer to use the out-of-line routines for restores, since the
18060      "exit" out-of-line routines can handle the restore of LR and the
18061      frame teardown.  However if doesn't make sense to use the
18062      out-of-line routine if that is the only reason we'd need to save
18063      LR, and we can't use the "exit" out-of-line gpr restore if we
18064      have saved some fprs; In those cases it is advantageous to use
18065      load multiple when available.  */
18066   if ((strategy & SAVRES_MULTIPLE)
18067       && (!info->lr_save_p
18068           || info->first_fp_reg_save != 64))
18069     strategy |= REST_INLINE_GPRS;
18070
18071   /* We can only use load multiple or the out-of-line routines to
18072      restore if we've used store multiple or out-of-line routines
18073      in the prologue, i.e. if we've saved all the registers from
18074      first_gp_reg_save.  Otherwise, we risk loading garbage.  */
18075   if ((strategy & (SAVE_INLINE_GPRS | SAVRES_MULTIPLE)) == SAVE_INLINE_GPRS)
18076     strategy |= REST_INLINE_GPRS;
18077
18078   /* Saving CR interferes with the exit routines used on the SPE, so
18079      just punt here.  */
18080   if (TARGET_SPE_ABI
18081       && info->spe_64bit_regs_used
18082       && info->cr_save_p)
18083     strategy |= REST_INLINE_GPRS;
18084
18085 #ifdef POWERPC_LINUX
18086   if (TARGET_64BIT)
18087     {
18088       if (!(strategy & SAVE_INLINE_FPRS))
18089         strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
18090       else if (!(strategy & SAVE_INLINE_GPRS)
18091                && info->first_fp_reg_save == 64)
18092         strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
18093     }
18094 #else
18095   if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
18096     strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
18097 #endif
18098   return strategy;
18099 }
18100
18101 /* Calculate the stack information for the current function.  This is
18102    complicated by having two separate calling sequences, the AIX calling
18103    sequence and the V.4 calling sequence.
18104
18105    AIX (and Darwin/Mac OS X) stack frames look like:
18106                                                           32-bit  64-bit
18107         SP----> +---------------------------------------+
18108                 | back chain to caller                  | 0       0
18109                 +---------------------------------------+
18110                 | saved CR                              | 4       8 (8-11)
18111                 +---------------------------------------+
18112                 | saved LR                              | 8       16
18113                 +---------------------------------------+
18114                 | reserved for compilers                | 12      24
18115                 +---------------------------------------+
18116                 | reserved for binders                  | 16      32
18117                 +---------------------------------------+
18118                 | saved TOC pointer                     | 20      40
18119                 +---------------------------------------+
18120                 | Parameter save area (P)               | 24      48
18121                 +---------------------------------------+
18122                 | Alloca space (A)                      | 24+P    etc.
18123                 +---------------------------------------+
18124                 | Local variable space (L)              | 24+P+A
18125                 +---------------------------------------+
18126                 | Float/int conversion temporary (X)    | 24+P+A+L
18127                 +---------------------------------------+
18128                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
18129                 +---------------------------------------+
18130                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
18131                 +---------------------------------------+
18132                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
18133                 +---------------------------------------+
18134                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
18135                 +---------------------------------------+
18136                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
18137                 +---------------------------------------+
18138         old SP->| back chain to caller's caller         |
18139                 +---------------------------------------+
18140
18141    The required alignment for AIX configurations is two words (i.e., 8
18142    or 16 bytes).
18143
18144
18145    V.4 stack frames look like:
18146
18147         SP----> +---------------------------------------+
18148                 | back chain to caller                  | 0
18149                 +---------------------------------------+
18150                 | caller's saved LR                     | 4
18151                 +---------------------------------------+
18152                 | Parameter save area (P)               | 8
18153                 +---------------------------------------+
18154                 | Alloca space (A)                      | 8+P
18155                 +---------------------------------------+
18156                 | Varargs save area (V)                 | 8+P+A
18157                 +---------------------------------------+
18158                 | Local variable space (L)              | 8+P+A+V
18159                 +---------------------------------------+
18160                 | Float/int conversion temporary (X)    | 8+P+A+V+L
18161                 +---------------------------------------+
18162                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
18163                 +---------------------------------------+
18164                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
18165                 +---------------------------------------+
18166                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
18167                 +---------------------------------------+
18168                 | SPE: area for 64-bit GP registers     |
18169                 +---------------------------------------+
18170                 | SPE alignment padding                 |
18171                 +---------------------------------------+
18172                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
18173                 +---------------------------------------+
18174                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
18175                 +---------------------------------------+
18176                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
18177                 +---------------------------------------+
18178         old SP->| back chain to caller's caller         |
18179                 +---------------------------------------+
18180
18181    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
18182    given.  (But note below and in sysv4.h that we require only 8 and
18183    may round up the size of our stack frame anyways.  The historical
18184    reason is early versions of powerpc-linux which didn't properly
18185    align the stack at program startup.  A happy side-effect is that
18186    -mno-eabi libraries can be used with -meabi programs.)
18187
18188    The EABI configuration defaults to the V.4 layout.  However,
18189    the stack alignment requirements may differ.  If -mno-eabi is not
18190    given, the required stack alignment is 8 bytes; if -mno-eabi is
18191    given, the required alignment is 16 bytes.  (But see V.4 comment
18192    above.)  */
18193
18194 #ifndef ABI_STACK_BOUNDARY
18195 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
18196 #endif
18197
18198 static rs6000_stack_t *
18199 rs6000_stack_info (void)
18200 {
18201   rs6000_stack_t *info_ptr = &stack_info;
18202   int reg_size = TARGET_32BIT ? 4 : 8;
18203   int ehrd_size;
18204   int save_align;
18205   int first_gp;
18206   HOST_WIDE_INT non_fixed_size;
18207   bool using_static_chain_p;
18208
18209   if (reload_completed && info_ptr->reload_completed)
18210     return info_ptr;
18211
18212   memset (info_ptr, 0, sizeof (*info_ptr));
18213   info_ptr->reload_completed = reload_completed;
18214
18215   if (TARGET_SPE)
18216     {
18217       /* Cache value so we don't rescan instruction chain over and over.  */
18218       if (cfun->machine->insn_chain_scanned_p == 0)
18219         cfun->machine->insn_chain_scanned_p
18220           = spe_func_has_64bit_regs_p () + 1;
18221       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
18222     }
18223
18224   /* Select which calling sequence.  */
18225   info_ptr->abi = DEFAULT_ABI;
18226
18227   /* Calculate which registers need to be saved & save area size.  */
18228   info_ptr->first_gp_reg_save = first_reg_to_save ();
18229   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
18230      even if it currently looks like we won't.  Reload may need it to
18231      get at a constant; if so, it will have already created a constant
18232      pool entry for it.  */
18233   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
18234        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
18235        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
18236       && crtl->uses_const_pool
18237       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
18238     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
18239   else
18240     first_gp = info_ptr->first_gp_reg_save;
18241
18242   info_ptr->gp_size = reg_size * (32 - first_gp);
18243
18244   /* For the SPE, we have an additional upper 32-bits on each GPR.
18245      Ideally we should save the entire 64-bits only when the upper
18246      half is used in SIMD instructions.  Since we only record
18247      registers live (not the size they are used in), this proves
18248      difficult because we'd have to traverse the instruction chain at
18249      the right time, taking reload into account.  This is a real pain,
18250      so we opt to save the GPRs in 64-bits always if but one register
18251      gets used in 64-bits.  Otherwise, all the registers in the frame
18252      get saved in 32-bits.
18253
18254      So... since when we save all GPRs (except the SP) in 64-bits, the
18255      traditional GP save area will be empty.  */
18256   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18257     info_ptr->gp_size = 0;
18258
18259   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
18260   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
18261
18262   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
18263   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
18264                                  - info_ptr->first_altivec_reg_save);
18265
18266   /* Does this function call anything?  */
18267   info_ptr->calls_p = (! current_function_is_leaf
18268                        || cfun->machine->ra_needs_full_frame);
18269
18270   /* Determine if we need to save the condition code registers.  */
18271   if (df_regs_ever_live_p (CR2_REGNO)
18272       || df_regs_ever_live_p (CR3_REGNO)
18273       || df_regs_ever_live_p (CR4_REGNO))
18274     {
18275       info_ptr->cr_save_p = 1;
18276       if (DEFAULT_ABI == ABI_V4)
18277         info_ptr->cr_size = reg_size;
18278     }
18279
18280   /* If the current function calls __builtin_eh_return, then we need
18281      to allocate stack space for registers that will hold data for
18282      the exception handler.  */
18283   if (crtl->calls_eh_return)
18284     {
18285       unsigned int i;
18286       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
18287         continue;
18288
18289       /* SPE saves EH registers in 64-bits.  */
18290       ehrd_size = i * (TARGET_SPE_ABI
18291                        && info_ptr->spe_64bit_regs_used != 0
18292                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
18293     }
18294   else
18295     ehrd_size = 0;
18296
18297   /* Determine various sizes.  */
18298   info_ptr->reg_size     = reg_size;
18299   info_ptr->fixed_size   = RS6000_SAVE_AREA;
18300   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
18301   info_ptr->parm_size    = RS6000_ALIGN (crtl->outgoing_args_size,
18302                                          TARGET_ALTIVEC ? 16 : 8);
18303   if (FRAME_GROWS_DOWNWARD)
18304     info_ptr->vars_size
18305       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
18306                        + info_ptr->parm_size,
18307                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
18308          - (info_ptr->fixed_size + info_ptr->vars_size
18309             + info_ptr->parm_size);
18310
18311   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18312     info_ptr->spe_gp_size = 8 * (32 - first_gp);
18313   else
18314     info_ptr->spe_gp_size = 0;
18315
18316   if (TARGET_ALTIVEC_ABI)
18317     info_ptr->vrsave_mask = compute_vrsave_mask ();
18318   else
18319     info_ptr->vrsave_mask = 0;
18320
18321   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
18322     info_ptr->vrsave_size  = 4;
18323   else
18324     info_ptr->vrsave_size  = 0;
18325
18326   compute_save_world_info (info_ptr);
18327
18328   /* Calculate the offsets.  */
18329   switch (DEFAULT_ABI)
18330     {
18331     case ABI_NONE:
18332     default:
18333       gcc_unreachable ();
18334
18335     case ABI_AIX:
18336     case ABI_DARWIN:
18337       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18338       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18339
18340       if (TARGET_ALTIVEC_ABI)
18341         {
18342           info_ptr->vrsave_save_offset
18343             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
18344
18345           /* Align stack so vector save area is on a quadword boundary.
18346              The padding goes above the vectors.  */
18347           if (info_ptr->altivec_size != 0)
18348             info_ptr->altivec_padding_size
18349               = info_ptr->vrsave_save_offset & 0xF;
18350           else
18351             info_ptr->altivec_padding_size = 0;
18352
18353           info_ptr->altivec_save_offset
18354             = info_ptr->vrsave_save_offset
18355             - info_ptr->altivec_padding_size
18356             - info_ptr->altivec_size;
18357           gcc_assert (info_ptr->altivec_size == 0
18358                       || info_ptr->altivec_save_offset % 16 == 0);
18359
18360           /* Adjust for AltiVec case.  */
18361           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
18362         }
18363       else
18364         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
18365       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
18366       info_ptr->lr_save_offset   = 2*reg_size;
18367       break;
18368
18369     case ABI_V4:
18370       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18371       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18372       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
18373
18374       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18375         {
18376           /* Align stack so SPE GPR save area is aligned on a
18377              double-word boundary.  */
18378           if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
18379             info_ptr->spe_padding_size
18380               = 8 - (-info_ptr->cr_save_offset % 8);
18381           else
18382             info_ptr->spe_padding_size = 0;
18383
18384           info_ptr->spe_gp_save_offset
18385             = info_ptr->cr_save_offset
18386             - info_ptr->spe_padding_size
18387             - info_ptr->spe_gp_size;
18388
18389           /* Adjust for SPE case.  */
18390           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
18391         }
18392       else if (TARGET_ALTIVEC_ABI)
18393         {
18394           info_ptr->vrsave_save_offset
18395             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
18396
18397           /* Align stack so vector save area is on a quadword boundary.  */
18398           if (info_ptr->altivec_size != 0)
18399             info_ptr->altivec_padding_size
18400               = 16 - (-info_ptr->vrsave_save_offset % 16);
18401           else
18402             info_ptr->altivec_padding_size = 0;
18403
18404           info_ptr->altivec_save_offset
18405             = info_ptr->vrsave_save_offset
18406             - info_ptr->altivec_padding_size
18407             - info_ptr->altivec_size;
18408
18409           /* Adjust for AltiVec case.  */
18410           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
18411         }
18412       else
18413         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
18414       info_ptr->ehrd_offset      -= ehrd_size;
18415       info_ptr->lr_save_offset   = reg_size;
18416       break;
18417     }
18418
18419   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
18420   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
18421                                          + info_ptr->gp_size
18422                                          + info_ptr->altivec_size
18423                                          + info_ptr->altivec_padding_size
18424                                          + info_ptr->spe_gp_size
18425                                          + info_ptr->spe_padding_size
18426                                          + ehrd_size
18427                                          + info_ptr->cr_size
18428                                          + info_ptr->vrsave_size,
18429                                          save_align);
18430
18431   non_fixed_size         = (info_ptr->vars_size
18432                             + info_ptr->parm_size
18433                             + info_ptr->save_size);
18434
18435   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
18436                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
18437
18438   /* Determine if we need to save the link register.  */
18439   if (info_ptr->calls_p
18440       || (DEFAULT_ABI == ABI_AIX
18441           && crtl->profile
18442           && !TARGET_PROFILE_KERNEL)
18443       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
18444 #ifdef TARGET_RELOCATABLE
18445       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
18446 #endif
18447       || rs6000_ra_ever_killed ())
18448     info_ptr->lr_save_p = 1;
18449
18450   using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
18451                           && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
18452                           && call_used_regs[STATIC_CHAIN_REGNUM]);
18453   info_ptr->savres_strategy = rs6000_savres_strategy (info_ptr,
18454                                                       using_static_chain_p);
18455
18456   if (!(info_ptr->savres_strategy & SAVE_INLINE_GPRS)
18457       || !(info_ptr->savres_strategy & SAVE_INLINE_FPRS)
18458       || !(info_ptr->savres_strategy & REST_INLINE_GPRS)
18459       || !(info_ptr->savres_strategy & REST_INLINE_FPRS))
18460     info_ptr->lr_save_p = 1;
18461
18462   if (info_ptr->lr_save_p)
18463     df_set_regs_ever_live (LR_REGNO, true);
18464
18465   /* Determine if we need to allocate any stack frame:
18466
18467      For AIX we need to push the stack if a frame pointer is needed
18468      (because the stack might be dynamically adjusted), if we are
18469      debugging, if we make calls, or if the sum of fp_save, gp_save,
18470      and local variables are more than the space needed to save all
18471      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
18472      + 18*8 = 288 (GPR13 reserved).
18473
18474      For V.4 we don't have the stack cushion that AIX uses, but assume
18475      that the debugger can handle stackless frames.  */
18476
18477   if (info_ptr->calls_p)
18478     info_ptr->push_p = 1;
18479
18480   else if (DEFAULT_ABI == ABI_V4)
18481     info_ptr->push_p = non_fixed_size != 0;
18482
18483   else if (frame_pointer_needed)
18484     info_ptr->push_p = 1;
18485
18486   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
18487     info_ptr->push_p = 1;
18488
18489   else
18490     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
18491
18492   /* Zero offsets if we're not saving those registers.  */
18493   if (info_ptr->fp_size == 0)
18494     info_ptr->fp_save_offset = 0;
18495
18496   if (info_ptr->gp_size == 0)
18497     info_ptr->gp_save_offset = 0;
18498
18499   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
18500     info_ptr->altivec_save_offset = 0;
18501
18502   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
18503     info_ptr->vrsave_save_offset = 0;
18504
18505   if (! TARGET_SPE_ABI
18506       || info_ptr->spe_64bit_regs_used == 0
18507       || info_ptr->spe_gp_size == 0)
18508     info_ptr->spe_gp_save_offset = 0;
18509
18510   if (! info_ptr->lr_save_p)
18511     info_ptr->lr_save_offset = 0;
18512
18513   if (! info_ptr->cr_save_p)
18514     info_ptr->cr_save_offset = 0;
18515
18516   return info_ptr;
18517 }
18518
18519 /* Return true if the current function uses any GPRs in 64-bit SIMD
18520    mode.  */
18521
18522 static bool
18523 spe_func_has_64bit_regs_p (void)
18524 {
18525   rtx insns, insn;
18526
18527   /* Functions that save and restore all the call-saved registers will
18528      need to save/restore the registers in 64-bits.  */
18529   if (crtl->calls_eh_return
18530       || cfun->calls_setjmp
18531       || crtl->has_nonlocal_goto)
18532     return true;
18533
18534   insns = get_insns ();
18535
18536   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
18537     {
18538       if (INSN_P (insn))
18539         {
18540           rtx i;
18541
18542           /* FIXME: This should be implemented with attributes...
18543
18544                  (set_attr "spe64" "true")....then,
18545                  if (get_spe64(insn)) return true;
18546
18547              It's the only reliable way to do the stuff below.  */
18548
18549           i = PATTERN (insn);
18550           if (GET_CODE (i) == SET)
18551             {
18552               enum machine_mode mode = GET_MODE (SET_SRC (i));
18553
18554               if (SPE_VECTOR_MODE (mode))
18555                 return true;
18556               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
18557                 return true;
18558             }
18559         }
18560     }
18561
18562   return false;
18563 }
18564
18565 static void
18566 debug_stack_info (rs6000_stack_t *info)
18567 {
18568   const char *abi_string;
18569
18570   if (! info)
18571     info = rs6000_stack_info ();
18572
18573   fprintf (stderr, "\nStack information for function %s:\n",
18574            ((current_function_decl && DECL_NAME (current_function_decl))
18575             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
18576             : "<unknown>"));
18577
18578   switch (info->abi)
18579     {
18580     default:             abi_string = "Unknown";        break;
18581     case ABI_NONE:       abi_string = "NONE";           break;
18582     case ABI_AIX:        abi_string = "AIX";            break;
18583     case ABI_DARWIN:     abi_string = "Darwin";         break;
18584     case ABI_V4:         abi_string = "V.4";            break;
18585     }
18586
18587   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
18588
18589   if (TARGET_ALTIVEC_ABI)
18590     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
18591
18592   if (TARGET_SPE_ABI)
18593     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
18594
18595   if (info->first_gp_reg_save != 32)
18596     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
18597
18598   if (info->first_fp_reg_save != 64)
18599     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
18600
18601   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
18602     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
18603              info->first_altivec_reg_save);
18604
18605   if (info->lr_save_p)
18606     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
18607
18608   if (info->cr_save_p)
18609     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
18610
18611   if (info->vrsave_mask)
18612     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
18613
18614   if (info->push_p)
18615     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
18616
18617   if (info->calls_p)
18618     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
18619
18620   if (info->gp_save_offset)
18621     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
18622
18623   if (info->fp_save_offset)
18624     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
18625
18626   if (info->altivec_save_offset)
18627     fprintf (stderr, "\taltivec_save_offset = %5d\n",
18628              info->altivec_save_offset);
18629
18630   if (info->spe_gp_save_offset)
18631     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
18632              info->spe_gp_save_offset);
18633
18634   if (info->vrsave_save_offset)
18635     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
18636              info->vrsave_save_offset);
18637
18638   if (info->lr_save_offset)
18639     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
18640
18641   if (info->cr_save_offset)
18642     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
18643
18644   if (info->varargs_save_offset)
18645     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
18646
18647   if (info->total_size)
18648     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
18649              info->total_size);
18650
18651   if (info->vars_size)
18652     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
18653              info->vars_size);
18654
18655   if (info->parm_size)
18656     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
18657
18658   if (info->fixed_size)
18659     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
18660
18661   if (info->gp_size)
18662     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
18663
18664   if (info->spe_gp_size)
18665     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
18666
18667   if (info->fp_size)
18668     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
18669
18670   if (info->altivec_size)
18671     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
18672
18673   if (info->vrsave_size)
18674     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
18675
18676   if (info->altivec_padding_size)
18677     fprintf (stderr, "\taltivec_padding_size= %5d\n",
18678              info->altivec_padding_size);
18679
18680   if (info->spe_padding_size)
18681     fprintf (stderr, "\tspe_padding_size    = %5d\n",
18682              info->spe_padding_size);
18683
18684   if (info->cr_size)
18685     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
18686
18687   if (info->save_size)
18688     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
18689
18690   if (info->reg_size != 4)
18691     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
18692
18693   fprintf (stderr, "\n");
18694 }
18695
18696 rtx
18697 rs6000_return_addr (int count, rtx frame)
18698 {
18699   /* Currently we don't optimize very well between prolog and body
18700      code and for PIC code the code can be actually quite bad, so
18701      don't try to be too clever here.  */
18702   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
18703     {
18704       cfun->machine->ra_needs_full_frame = 1;
18705
18706       return
18707         gen_rtx_MEM
18708           (Pmode,
18709            memory_address
18710            (Pmode,
18711             plus_constant (copy_to_reg
18712                            (gen_rtx_MEM (Pmode,
18713                                          memory_address (Pmode, frame))),
18714                            RETURN_ADDRESS_OFFSET)));
18715     }
18716
18717   cfun->machine->ra_need_lr = 1;
18718   return get_hard_reg_initial_val (Pmode, LR_REGNO);
18719 }
18720
18721 /* Say whether a function is a candidate for sibcall handling or not.  */
18722
18723 static bool
18724 rs6000_function_ok_for_sibcall (tree decl, tree exp)
18725 {
18726   tree fntype;
18727
18728   if (decl)
18729     fntype = TREE_TYPE (decl);
18730   else
18731     fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
18732
18733   /* We can't do it if the called function has more vector parameters
18734      than the current function; there's nowhere to put the VRsave code.  */
18735   if (TARGET_ALTIVEC_ABI
18736       && TARGET_ALTIVEC_VRSAVE
18737       && !(decl && decl == current_function_decl))
18738     {
18739       function_args_iterator args_iter;
18740       tree type;
18741       int nvreg = 0;
18742
18743       /* Functions with vector parameters are required to have a
18744          prototype, so the argument type info must be available
18745          here.  */
18746       FOREACH_FUNCTION_ARGS(fntype, type, args_iter)
18747         if (TREE_CODE (type) == VECTOR_TYPE
18748             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
18749           nvreg++;
18750
18751       FOREACH_FUNCTION_ARGS(TREE_TYPE (current_function_decl), type, args_iter)
18752         if (TREE_CODE (type) == VECTOR_TYPE
18753             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
18754           nvreg--;
18755
18756       if (nvreg > 0)
18757         return false;
18758     }
18759
18760   /* Under the AIX ABI we can't allow calls to non-local functions,
18761      because the callee may have a different TOC pointer to the
18762      caller and there's no way to ensure we restore the TOC when we
18763      return.  With the secure-plt SYSV ABI we can't make non-local
18764      calls when -fpic/PIC because the plt call stubs use r30.  */
18765   if (DEFAULT_ABI == ABI_DARWIN
18766       || (DEFAULT_ABI == ABI_AIX
18767           && decl
18768           && !DECL_EXTERNAL (decl)
18769           && (*targetm.binds_local_p) (decl))
18770       || (DEFAULT_ABI == ABI_V4
18771           && (!TARGET_SECURE_PLT
18772               || !flag_pic
18773               || (decl
18774                   && (*targetm.binds_local_p) (decl)))))
18775     {
18776       tree attr_list = TYPE_ATTRIBUTES (fntype);
18777
18778       if (!lookup_attribute ("longcall", attr_list)
18779           || lookup_attribute ("shortcall", attr_list))
18780         return true;
18781     }
18782
18783   return false;
18784 }
18785
18786 /* NULL if INSN insn is valid within a low-overhead loop.
18787    Otherwise return why doloop cannot be applied.
18788    PowerPC uses the COUNT register for branch on table instructions.  */
18789
18790 static const char *
18791 rs6000_invalid_within_doloop (const_rtx insn)
18792 {
18793   if (CALL_P (insn))
18794     return "Function call in the loop.";
18795
18796   if (JUMP_P (insn)
18797       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
18798           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
18799     return "Computed branch in the loop.";
18800
18801   return NULL;
18802 }
18803
18804 static int
18805 rs6000_ra_ever_killed (void)
18806 {
18807   rtx top;
18808   rtx reg;
18809   rtx insn;
18810
18811   if (cfun->is_thunk)
18812     return 0;
18813
18814   if (cfun->machine->lr_save_state)
18815     return cfun->machine->lr_save_state - 1;
18816
18817   /* regs_ever_live has LR marked as used if any sibcalls are present,
18818      but this should not force saving and restoring in the
18819      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
18820      clobbers LR, so that is inappropriate.  */
18821
18822   /* Also, the prologue can generate a store into LR that
18823      doesn't really count, like this:
18824
18825         move LR->R0
18826         bcl to set PIC register
18827         move LR->R31
18828         move R0->LR
18829
18830      When we're called from the epilogue, we need to avoid counting
18831      this as a store.  */
18832
18833   push_topmost_sequence ();
18834   top = get_insns ();
18835   pop_topmost_sequence ();
18836   reg = gen_rtx_REG (Pmode, LR_REGNO);
18837
18838   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
18839     {
18840       if (INSN_P (insn))
18841         {
18842           if (CALL_P (insn))
18843             {
18844               if (!SIBLING_CALL_P (insn))
18845                 return 1;
18846             }
18847           else if (find_regno_note (insn, REG_INC, LR_REGNO))
18848             return 1;
18849           else if (set_of (reg, insn) != NULL_RTX
18850                    && !prologue_epilogue_contains (insn))
18851             return 1;
18852         }
18853     }
18854   return 0;
18855 }
18856 \f
18857 /* Emit instructions needed to load the TOC register.
18858    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
18859    a constant pool; or for SVR4 -fpic.  */
18860
18861 void
18862 rs6000_emit_load_toc_table (int fromprolog)
18863 {
18864   rtx dest;
18865   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
18866
18867   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
18868     {
18869       char buf[30];
18870       rtx lab, tmp1, tmp2, got;
18871
18872       lab = gen_label_rtx ();
18873       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
18874       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18875       if (flag_pic == 2)
18876         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18877       else
18878         got = rs6000_got_sym ();
18879       tmp1 = tmp2 = dest;
18880       if (!fromprolog)
18881         {
18882           tmp1 = gen_reg_rtx (Pmode);
18883           tmp2 = gen_reg_rtx (Pmode);
18884         }
18885       emit_insn (gen_load_toc_v4_PIC_1 (lab));
18886       emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
18887       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
18888       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
18889     }
18890   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
18891     {
18892       emit_insn (gen_load_toc_v4_pic_si ());
18893       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18894     }
18895   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
18896     {
18897       char buf[30];
18898       rtx temp0 = (fromprolog
18899                    ? gen_rtx_REG (Pmode, 0)
18900                    : gen_reg_rtx (Pmode));
18901
18902       if (fromprolog)
18903         {
18904           rtx symF, symL;
18905
18906           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18907           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18908
18909           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
18910           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18911
18912           emit_insn (gen_load_toc_v4_PIC_1 (symF));
18913           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18914           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
18915         }
18916       else
18917         {
18918           rtx tocsym, lab;
18919
18920           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18921           lab = gen_label_rtx ();
18922           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
18923           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18924           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
18925         }
18926       emit_insn (gen_addsi3 (dest, temp0, dest));
18927     }
18928   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
18929     {
18930       /* This is for AIX code running in non-PIC ELF32.  */
18931       char buf[30];
18932       rtx realsym;
18933       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
18934       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18935
18936       emit_insn (gen_elf_high (dest, realsym));
18937       emit_insn (gen_elf_low (dest, dest, realsym));
18938     }
18939   else
18940     {
18941       gcc_assert (DEFAULT_ABI == ABI_AIX);
18942
18943       if (TARGET_32BIT)
18944         emit_insn (gen_load_toc_aix_si (dest));
18945       else
18946         emit_insn (gen_load_toc_aix_di (dest));
18947     }
18948 }
18949
18950 /* Emit instructions to restore the link register after determining where
18951    its value has been stored.  */
18952
18953 void
18954 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
18955 {
18956   rs6000_stack_t *info = rs6000_stack_info ();
18957   rtx operands[2];
18958
18959   operands[0] = source;
18960   operands[1] = scratch;
18961
18962   if (info->lr_save_p)
18963     {
18964       rtx frame_rtx = stack_pointer_rtx;
18965       HOST_WIDE_INT sp_offset = 0;
18966       rtx tmp;
18967
18968       if (frame_pointer_needed
18969           || cfun->calls_alloca
18970           || info->total_size > 32767)
18971         {
18972           tmp = gen_frame_mem (Pmode, frame_rtx);
18973           emit_move_insn (operands[1], tmp);
18974           frame_rtx = operands[1];
18975         }
18976       else if (info->push_p)
18977         sp_offset = info->total_size;
18978
18979       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
18980       tmp = gen_frame_mem (Pmode, tmp);
18981       emit_move_insn (tmp, operands[0]);
18982     }
18983   else
18984     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
18985
18986   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
18987      state of lr_save_p so any change from here on would be a bug.  In
18988      particular, stop rs6000_ra_ever_killed from considering the SET
18989      of lr we may have added just above.  */ 
18990   cfun->machine->lr_save_state = info->lr_save_p + 1;
18991 }
18992
18993 static GTY(()) alias_set_type set = -1;
18994
18995 alias_set_type
18996 get_TOC_alias_set (void)
18997 {
18998   if (set == -1)
18999     set = new_alias_set ();
19000   return set;
19001 }
19002
19003 /* This returns nonzero if the current function uses the TOC.  This is
19004    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
19005    is generated by the ABI_V4 load_toc_* patterns.  */
19006 #if TARGET_ELF
19007 static int
19008 uses_TOC (void)
19009 {
19010   rtx insn;
19011
19012   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
19013     if (INSN_P (insn))
19014       {
19015         rtx pat = PATTERN (insn);
19016         int i;
19017
19018         if (GET_CODE (pat) == PARALLEL)
19019           for (i = 0; i < XVECLEN (pat, 0); i++)
19020             {
19021               rtx sub = XVECEXP (pat, 0, i);
19022               if (GET_CODE (sub) == USE)
19023                 {
19024                   sub = XEXP (sub, 0);
19025                   if (GET_CODE (sub) == UNSPEC
19026                       && XINT (sub, 1) == UNSPEC_TOC)
19027                     return 1;
19028                 }
19029             }
19030       }
19031   return 0;
19032 }
19033 #endif
19034
19035 rtx
19036 create_TOC_reference (rtx symbol, rtx largetoc_reg)
19037 {
19038   rtx tocrel, tocreg;
19039
19040   if (TARGET_DEBUG_ADDR)
19041     {
19042       if (GET_CODE (symbol) == SYMBOL_REF)
19043         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
19044                  XSTR (symbol, 0));
19045       else
19046         {
19047           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
19048                    GET_RTX_NAME (GET_CODE (symbol)));
19049           debug_rtx (symbol);
19050         }
19051     }
19052
19053   if (!can_create_pseudo_p ())
19054     df_set_regs_ever_live (TOC_REGISTER, true);
19055
19056   tocrel = gen_rtx_CONST (Pmode,
19057                           gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol),
19058                                           UNSPEC_TOCREL));
19059   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
19060   if (TARGET_CMODEL != CMODEL_SMALL)
19061     {
19062       rtx hi = gen_rtx_CONST (Pmode,
19063                               gen_rtx_PLUS (Pmode, tocreg, 
19064                                             gen_rtx_HIGH (Pmode, tocrel)));
19065       if (largetoc_reg != NULL)
19066         {
19067           emit_move_insn (largetoc_reg, hi);
19068           hi = largetoc_reg;
19069         }
19070       return gen_rtx_LO_SUM (Pmode, hi, copy_rtx (tocrel));
19071     }
19072   else
19073     return gen_rtx_PLUS (Pmode, tocreg, tocrel);
19074 }
19075
19076 /* Issue assembly directives that create a reference to the given DWARF
19077    FRAME_TABLE_LABEL from the current function section.  */
19078 void
19079 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
19080 {
19081   fprintf (asm_out_file, "\t.ref %s\n",
19082            TARGET_STRIP_NAME_ENCODING (frame_table_label));
19083 }
19084 \f
19085 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
19086    and the change to the stack pointer.  */
19087
19088 static void
19089 rs6000_emit_stack_tie (void)
19090 {
19091   rtx mem = gen_frame_mem (BLKmode,
19092                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
19093
19094   emit_insn (gen_stack_tie (mem));
19095 }
19096
19097 /* Emit the correct code for allocating stack space, as insns.
19098    If COPY_REG, make sure a copy of the old frame is left there.
19099    The generated code may use hard register 0 as a temporary.  */
19100
19101 static void
19102 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg)
19103 {
19104   rtx insn;
19105   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19106   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
19107   rtx todec = gen_int_mode (-size, Pmode);
19108   rtx par, set, mem;
19109
19110   if (INTVAL (todec) != -size)
19111     {
19112       warning (0, "stack frame too large");
19113       emit_insn (gen_trap ());
19114       return;
19115     }
19116
19117   if (crtl->limit_stack)
19118     {
19119       if (REG_P (stack_limit_rtx)
19120           && REGNO (stack_limit_rtx) > 1
19121           && REGNO (stack_limit_rtx) <= 31)
19122         {
19123           emit_insn (gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size)));
19124           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19125                                     const0_rtx));
19126         }
19127       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
19128                && TARGET_32BIT
19129                && DEFAULT_ABI == ABI_V4)
19130         {
19131           rtx toload = gen_rtx_CONST (VOIDmode,
19132                                       gen_rtx_PLUS (Pmode,
19133                                                     stack_limit_rtx,
19134                                                     GEN_INT (size)));
19135
19136           emit_insn (gen_elf_high (tmp_reg, toload));
19137           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
19138           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19139                                     const0_rtx));
19140         }
19141       else
19142         warning (0, "stack limit expression is not supported");
19143     }
19144
19145   if (copy_reg)
19146     emit_move_insn (copy_reg, stack_reg);
19147
19148   if (size > 32767)
19149     {
19150       /* Need a note here so that try_split doesn't get confused.  */
19151       if (get_last_insn () == NULL_RTX)
19152         emit_note (NOTE_INSN_DELETED);
19153       insn = emit_move_insn (tmp_reg, todec);
19154       try_split (PATTERN (insn), insn, 0);
19155       todec = tmp_reg;
19156     }
19157   
19158   insn = emit_insn (TARGET_32BIT
19159                     ? gen_movsi_update_stack (stack_reg, stack_reg,
19160                                         todec, stack_reg)
19161                     : gen_movdi_di_update_stack (stack_reg, stack_reg,
19162                                            todec, stack_reg));
19163   /* Since we didn't use gen_frame_mem to generate the MEM, grab
19164      it now and set the alias set/attributes. The above gen_*_update
19165      calls will generate a PARALLEL with the MEM set being the first
19166      operation. */
19167   par = PATTERN (insn);
19168   gcc_assert (GET_CODE (par) == PARALLEL);
19169   set = XVECEXP (par, 0, 0);
19170   gcc_assert (GET_CODE (set) == SET);
19171   mem = SET_DEST (set);
19172   gcc_assert (MEM_P (mem));
19173   MEM_NOTRAP_P (mem) = 1;
19174   set_mem_alias_set (mem, get_frame_alias_set ());
19175
19176   RTX_FRAME_RELATED_P (insn) = 1;
19177   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
19178                 gen_rtx_SET (VOIDmode, stack_reg,
19179                              gen_rtx_PLUS (Pmode, stack_reg,
19180                                            GEN_INT (-size))));
19181 }
19182
19183 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
19184
19185 #if PROBE_INTERVAL > 32768
19186 #error Cannot use indexed addressing mode for stack probing
19187 #endif
19188
19189 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
19190    inclusive.  These are offsets from the current stack pointer.  */
19191
19192 static void
19193 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
19194 {
19195   /* See if we have a constant small number of probes to generate.  If so,
19196      that's the easy case.  */
19197   if (first + size <= 32768)
19198     {
19199       HOST_WIDE_INT i;
19200
19201       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
19202          it exceeds SIZE.  If only one probe is needed, this will not
19203          generate any code.  Then probe at FIRST + SIZE.  */
19204       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
19205         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
19206
19207       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
19208     }
19209
19210   /* Otherwise, do the same as above, but in a loop.  Note that we must be
19211      extra careful with variables wrapping around because we might be at
19212      the very top (or the very bottom) of the address space and we have
19213      to be able to handle this case properly; in particular, we use an
19214      equality test for the loop condition.  */
19215   else
19216     {
19217       HOST_WIDE_INT rounded_size;
19218       rtx r12 = gen_rtx_REG (Pmode, 12);
19219       rtx r0 = gen_rtx_REG (Pmode, 0);
19220
19221       /* Sanity check for the addressing mode we're going to use.  */
19222       gcc_assert (first <= 32768);
19223
19224       /* Step 1: round SIZE to the previous multiple of the interval.  */
19225
19226       rounded_size = size & -PROBE_INTERVAL;
19227
19228
19229       /* Step 2: compute initial and final value of the loop counter.  */
19230
19231       /* TEST_ADDR = SP + FIRST.  */
19232       emit_insn (gen_rtx_SET (VOIDmode, r12,
19233                               plus_constant (stack_pointer_rtx, -first)));
19234
19235       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
19236       if (rounded_size > 32768)
19237         {
19238           emit_move_insn (r0, GEN_INT (-rounded_size));
19239           emit_insn (gen_rtx_SET (VOIDmode, r0,
19240                                   gen_rtx_PLUS (Pmode, r12, r0)));
19241         }
19242       else
19243         emit_insn (gen_rtx_SET (VOIDmode, r0,
19244                                 plus_constant (r12, -rounded_size)));
19245
19246
19247       /* Step 3: the loop
19248
19249          while (TEST_ADDR != LAST_ADDR)
19250            {
19251              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
19252              probe at TEST_ADDR
19253            }
19254
19255          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
19256          until it is equal to ROUNDED_SIZE.  */
19257
19258       if (TARGET_64BIT)
19259         emit_insn (gen_probe_stack_rangedi (r12, r12, r0));
19260       else
19261         emit_insn (gen_probe_stack_rangesi (r12, r12, r0));
19262
19263
19264       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
19265          that SIZE is equal to ROUNDED_SIZE.  */
19266
19267       if (size != rounded_size)
19268         emit_stack_probe (plus_constant (r12, rounded_size - size));
19269     }
19270 }
19271
19272 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
19273    absolute addresses.  */
19274
19275 const char *
19276 output_probe_stack_range (rtx reg1, rtx reg2)
19277 {
19278   static int labelno = 0;
19279   char loop_lab[32], end_lab[32];
19280   rtx xops[2];
19281
19282   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
19283   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
19284
19285   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
19286
19287   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
19288   xops[0] = reg1;
19289   xops[1] = reg2;
19290   if (TARGET_64BIT)
19291     output_asm_insn ("{cmp|cmpd} 0,%0,%1", xops);
19292   else
19293     output_asm_insn ("{cmp|cmpw} 0,%0,%1", xops);
19294
19295   fputs ("\tbeq 0,", asm_out_file);
19296   assemble_name_raw (asm_out_file, end_lab);
19297   fputc ('\n', asm_out_file);
19298
19299   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
19300   xops[1] = GEN_INT (-PROBE_INTERVAL);
19301   output_asm_insn ("{cal %0,%1(%0)|addi %0,%0,%1}", xops);
19302
19303   /* Probe at TEST_ADDR and branch.  */
19304   output_asm_insn ("{st|stw} 0,0(%0)", xops);
19305   fprintf (asm_out_file, "\tb ");
19306   assemble_name_raw (asm_out_file, loop_lab);
19307   fputc ('\n', asm_out_file);
19308
19309   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
19310
19311   return "";
19312 }
19313
19314 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
19315    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
19316    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
19317    deduce these equivalences by itself so it wasn't necessary to hold
19318    its hand so much.  */
19319
19320 static void
19321 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
19322                       rtx reg2, rtx rreg)
19323 {
19324   rtx real, temp;
19325
19326   /* copy_rtx will not make unique copies of registers, so we need to
19327      ensure we don't have unwanted sharing here.  */
19328   if (reg == reg2)
19329     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19330
19331   if (reg == rreg)
19332     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19333
19334   real = copy_rtx (PATTERN (insn));
19335
19336   if (reg2 != NULL_RTX)
19337     real = replace_rtx (real, reg2, rreg);
19338
19339   real = replace_rtx (real, reg,
19340                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
19341                                                         STACK_POINTER_REGNUM),
19342                                     GEN_INT (val)));
19343
19344   /* We expect that 'real' is either a SET or a PARALLEL containing
19345      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
19346      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
19347
19348   if (GET_CODE (real) == SET)
19349     {
19350       rtx set = real;
19351
19352       temp = simplify_rtx (SET_SRC (set));
19353       if (temp)
19354         SET_SRC (set) = temp;
19355       temp = simplify_rtx (SET_DEST (set));
19356       if (temp)
19357         SET_DEST (set) = temp;
19358       if (GET_CODE (SET_DEST (set)) == MEM)
19359         {
19360           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19361           if (temp)
19362             XEXP (SET_DEST (set), 0) = temp;
19363         }
19364     }
19365   else
19366     {
19367       int i;
19368
19369       gcc_assert (GET_CODE (real) == PARALLEL);
19370       for (i = 0; i < XVECLEN (real, 0); i++)
19371         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
19372           {
19373             rtx set = XVECEXP (real, 0, i);
19374
19375             temp = simplify_rtx (SET_SRC (set));
19376             if (temp)
19377               SET_SRC (set) = temp;
19378             temp = simplify_rtx (SET_DEST (set));
19379             if (temp)
19380               SET_DEST (set) = temp;
19381             if (GET_CODE (SET_DEST (set)) == MEM)
19382               {
19383                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19384                 if (temp)
19385                   XEXP (SET_DEST (set), 0) = temp;
19386               }
19387             RTX_FRAME_RELATED_P (set) = 1;
19388           }
19389     }
19390
19391   RTX_FRAME_RELATED_P (insn) = 1;
19392   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
19393 }
19394
19395 /* Returns an insn that has a vrsave set operation with the
19396    appropriate CLOBBERs.  */
19397
19398 static rtx
19399 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
19400 {
19401   int nclobs, i;
19402   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
19403   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
19404
19405   clobs[0]
19406     = gen_rtx_SET (VOIDmode,
19407                    vrsave,
19408                    gen_rtx_UNSPEC_VOLATILE (SImode,
19409                                             gen_rtvec (2, reg, vrsave),
19410                                             UNSPECV_SET_VRSAVE));
19411
19412   nclobs = 1;
19413
19414   /* We need to clobber the registers in the mask so the scheduler
19415      does not move sets to VRSAVE before sets of AltiVec registers.
19416
19417      However, if the function receives nonlocal gotos, reload will set
19418      all call saved registers live.  We will end up with:
19419
19420         (set (reg 999) (mem))
19421         (parallel [ (set (reg vrsave) (unspec blah))
19422                     (clobber (reg 999))])
19423
19424      The clobber will cause the store into reg 999 to be dead, and
19425      flow will attempt to delete an epilogue insn.  In this case, we
19426      need an unspec use/set of the register.  */
19427
19428   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
19429     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
19430       {
19431         if (!epiloguep || call_used_regs [i])
19432           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
19433                                              gen_rtx_REG (V4SImode, i));
19434         else
19435           {
19436             rtx reg = gen_rtx_REG (V4SImode, i);
19437
19438             clobs[nclobs++]
19439               = gen_rtx_SET (VOIDmode,
19440                              reg,
19441                              gen_rtx_UNSPEC (V4SImode,
19442                                              gen_rtvec (1, reg), 27));
19443           }
19444       }
19445
19446   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
19447
19448   for (i = 0; i < nclobs; ++i)
19449     XVECEXP (insn, 0, i) = clobs[i];
19450
19451   return insn;
19452 }
19453
19454 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
19455    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
19456
19457 static void
19458 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
19459                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
19460 {
19461   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
19462   rtx replacea, replaceb;
19463
19464   int_rtx = GEN_INT (offset);
19465
19466   /* Some cases that need register indexed addressing.  */
19467   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
19468       || (TARGET_VSX && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
19469       || (TARGET_E500_DOUBLE && mode == DFmode)
19470       || (TARGET_SPE_ABI
19471           && SPE_VECTOR_MODE (mode)
19472           && !SPE_CONST_OFFSET_OK (offset)))
19473     {
19474       /* Whomever calls us must make sure r11 is available in the
19475          flow path of instructions in the prologue.  */
19476       offset_rtx = gen_rtx_REG (Pmode, 11);
19477       emit_move_insn (offset_rtx, int_rtx);
19478
19479       replacea = offset_rtx;
19480       replaceb = int_rtx;
19481     }
19482   else
19483     {
19484       offset_rtx = int_rtx;
19485       replacea = NULL_RTX;
19486       replaceb = NULL_RTX;
19487     }
19488
19489   reg = gen_rtx_REG (mode, regno);
19490   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
19491   mem = gen_frame_mem (mode, addr);
19492
19493   insn = emit_move_insn (mem, reg);
19494
19495   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
19496 }
19497
19498 /* Emit an offset memory reference suitable for a frame store, while
19499    converting to a valid addressing mode.  */
19500
19501 static rtx
19502 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
19503 {
19504   rtx int_rtx, offset_rtx;
19505
19506   int_rtx = GEN_INT (offset);
19507
19508   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
19509       || (TARGET_E500_DOUBLE && mode == DFmode))
19510     {
19511       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
19512       emit_move_insn (offset_rtx, int_rtx);
19513     }
19514   else
19515     offset_rtx = int_rtx;
19516
19517   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
19518 }
19519
19520 /* Look for user-defined global regs.  We should not save and restore these,
19521    and cannot use stmw/lmw if there are any in its range.  */
19522
19523 static bool
19524 no_global_regs_above (int first, bool gpr)
19525 {
19526   int i;
19527   int last = gpr ? 32 : 64;
19528   for (i = first; i < last; i++)
19529     if (global_regs[i])
19530       return false;
19531   return true;
19532 }
19533
19534 #ifndef TARGET_FIX_AND_CONTINUE
19535 #define TARGET_FIX_AND_CONTINUE 0
19536 #endif
19537
19538 /* It's really GPR 13 and FPR 14, but we need the smaller of the two.  */
19539 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
19540 #define LAST_SAVRES_REGISTER 31
19541 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
19542
19543 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
19544
19545 /* Temporary holding space for an out-of-line register save/restore
19546    routine name.  */
19547 static char savres_routine_name[30];
19548
19549 /* Return the name for an out-of-line register save/restore routine.
19550    We are saving/restoring GPRs if GPR is true.  */
19551
19552 static char *
19553 rs6000_savres_routine_name (rs6000_stack_t *info, int regno,
19554                             bool savep, bool gpr, bool lr)
19555 {
19556   const char *prefix = "";
19557   const char *suffix = "";
19558
19559   /* Different targets are supposed to define
19560      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
19561      routine name could be defined with:
19562
19563      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
19564
19565      This is a nice idea in practice, but in reality, things are
19566      complicated in several ways:
19567
19568      - ELF targets have save/restore routines for GPRs.
19569
19570      - SPE targets use different prefixes for 32/64-bit registers, and
19571        neither of them fit neatly in the FOO_{PREFIX,SUFFIX} regimen.
19572
19573      - PPC64 ELF targets have routines for save/restore of GPRs that
19574        differ in what they do with the link register, so having a set
19575        prefix doesn't work.  (We only use one of the save routines at
19576        the moment, though.)
19577
19578      - PPC32 elf targets have "exit" versions of the restore routines
19579        that restore the link register and can save some extra space.
19580        These require an extra suffix.  (There are also "tail" versions
19581        of the restore routines and "GOT" versions of the save routines,
19582        but we don't generate those at present.  Same problems apply,
19583        though.)
19584
19585      We deal with all this by synthesizing our own prefix/suffix and
19586      using that for the simple sprintf call shown above.  */
19587   if (TARGET_SPE)
19588     {
19589       /* No floating point saves on the SPE.  */
19590       gcc_assert (gpr);
19591
19592       if (savep)
19593         prefix = info->spe_64bit_regs_used ? "_save64gpr_" : "_save32gpr_";
19594       else
19595         prefix = info->spe_64bit_regs_used ? "_rest64gpr_" : "_rest32gpr_";
19596
19597       if (lr)
19598         suffix = "_x";
19599     }
19600   else if (DEFAULT_ABI == ABI_V4)
19601     {
19602       if (TARGET_64BIT)
19603         goto aix_names;
19604
19605       if (gpr)
19606         prefix = savep ? "_savegpr_" : "_restgpr_";
19607       else
19608         prefix = savep ? "_savefpr_" : "_restfpr_";
19609
19610       if (lr)
19611         suffix = "_x";
19612     }
19613   else if (DEFAULT_ABI == ABI_AIX)
19614     {
19615 #ifndef POWERPC_LINUX
19616       /* No out-of-line save/restore routines for GPRs on AIX.  */
19617       gcc_assert (!TARGET_AIX || !gpr);
19618 #endif
19619
19620     aix_names:
19621       if (gpr)
19622         prefix = (savep
19623                   ? (lr ? "_savegpr0_" : "_savegpr1_")
19624                   : (lr ? "_restgpr0_" : "_restgpr1_"));
19625 #ifdef POWERPC_LINUX
19626       else if (lr)
19627         prefix = (savep ? "_savefpr_" : "_restfpr_");
19628 #endif
19629       else
19630         {
19631           prefix = savep ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
19632           suffix = savep ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
19633         }
19634     }
19635   else if (DEFAULT_ABI == ABI_DARWIN)
19636     sorry ("out-of-line save/restore routines not supported on Darwin");
19637
19638   sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
19639
19640   return savres_routine_name;
19641 }
19642
19643 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
19644    We are saving/restoring GPRs if GPR is true.  */
19645
19646 static rtx
19647 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep,
19648                            bool gpr, bool lr)
19649 {
19650   int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
19651   rtx sym;
19652   int select = ((savep ? 1 : 0) << 2
19653                 | ((TARGET_SPE_ABI
19654                     /* On the SPE, we never have any FPRs, but we do have
19655                        32/64-bit versions of the routines.  */
19656                     ? (info->spe_64bit_regs_used ? 1 : 0)
19657                     : (gpr ? 1 : 0)) << 1)
19658                 | (lr ? 1: 0));
19659
19660   /* Don't generate bogus routine names.  */
19661   gcc_assert (FIRST_SAVRES_REGISTER <= regno
19662               && regno <= LAST_SAVRES_REGISTER);
19663
19664   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
19665
19666   if (sym == NULL)
19667     {
19668       char *name;
19669
19670       name = rs6000_savres_routine_name (info, regno, savep, gpr, lr);
19671
19672       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
19673         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
19674       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
19675     }
19676
19677   return sym;
19678 }
19679
19680 /* Emit a sequence of insns, including a stack tie if needed, for
19681    resetting the stack pointer.  If SAVRES is true, then don't reset the
19682    stack pointer, but move the base of the frame into r11 for use by
19683    out-of-line register restore routines.  */
19684
19685 static rtx
19686 rs6000_emit_stack_reset (rs6000_stack_t *info,
19687                          rtx sp_reg_rtx, rtx frame_reg_rtx,
19688                          int sp_offset, bool savres)
19689 {
19690   /* This blockage is needed so that sched doesn't decide to move
19691      the sp change before the register restores.  */
19692   if (frame_reg_rtx != sp_reg_rtx
19693       || (TARGET_SPE_ABI
19694           && info->spe_64bit_regs_used != 0
19695           && info->first_gp_reg_save != 32))
19696     rs6000_emit_stack_tie ();
19697   
19698   if (frame_reg_rtx != sp_reg_rtx)
19699     {
19700       if (sp_offset != 0)
19701         {
19702           rtx dest_reg = savres ? gen_rtx_REG (Pmode, 11) : sp_reg_rtx;
19703           return emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx,
19704                                            GEN_INT (sp_offset)));
19705         }
19706       else if (!savres)
19707         return emit_move_insn (sp_reg_rtx, frame_reg_rtx);
19708     }
19709   else if (sp_offset != 0)
19710     {
19711       /* If we are restoring registers out-of-line, we will be using the
19712          "exit" variants of the restore routines, which will reset the
19713          stack for us.  But we do need to point r11 into the right place
19714          for those routines.  */
19715       rtx dest_reg = (savres
19716                       ? gen_rtx_REG (Pmode, 11)
19717                       : sp_reg_rtx);
19718
19719       rtx insn = emit_insn (gen_add3_insn (dest_reg, sp_reg_rtx,
19720                                            GEN_INT (sp_offset)));
19721       if (!savres)
19722         return insn;
19723     }
19724   return NULL_RTX;
19725 }
19726
19727 /* Construct a parallel rtx describing the effect of a call to an
19728    out-of-line register save/restore routine.  */
19729
19730 static rtx
19731 rs6000_make_savres_rtx (rs6000_stack_t *info,
19732                         rtx frame_reg_rtx, int save_area_offset,
19733                         enum machine_mode reg_mode,
19734                         bool savep, bool gpr, bool lr)
19735 {
19736   int i;
19737   int offset, start_reg, end_reg, n_regs;
19738   int reg_size = GET_MODE_SIZE (reg_mode);
19739   rtx sym;
19740   rtvec p;
19741
19742   offset = 0;
19743   start_reg = (gpr
19744                ? info->first_gp_reg_save
19745                : info->first_fp_reg_save);
19746   end_reg = gpr ? 32 : 64;
19747   n_regs = end_reg - start_reg;
19748   p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
19749
19750   if (!savep && lr)
19751     RTVEC_ELT (p, offset++) = ret_rtx;
19752
19753   RTVEC_ELT (p, offset++)
19754     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
19755
19756   sym = rs6000_savres_routine_sym (info, savep, gpr, lr);
19757   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
19758   RTVEC_ELT (p, offset++)
19759     = gen_rtx_USE (VOIDmode,
19760                    gen_rtx_REG (Pmode, DEFAULT_ABI != ABI_AIX ? 11
19761                                        : gpr && !lr ? 12
19762                                        : 1));
19763
19764   for (i = 0; i < end_reg - start_reg; i++)
19765     {
19766       rtx addr, reg, mem;
19767       reg = gen_rtx_REG (reg_mode, start_reg + i);
19768       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19769                            GEN_INT (save_area_offset + reg_size*i));
19770       mem = gen_frame_mem (reg_mode, addr);
19771
19772       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
19773                                                savep ? mem : reg,
19774                                                savep ? reg : mem);
19775     }
19776
19777   if (savep && lr)
19778     {
19779       rtx addr, reg, mem;
19780       reg = gen_rtx_REG (Pmode, 0);
19781       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19782                            GEN_INT (info->lr_save_offset));
19783       mem = gen_frame_mem (Pmode, addr);
19784       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode, mem, reg);
19785     }
19786
19787   return gen_rtx_PARALLEL (VOIDmode, p);
19788 }
19789
19790 /* Determine whether the gp REG is really used.  */
19791
19792 static bool
19793 rs6000_reg_live_or_pic_offset_p (int reg)
19794 {
19795   /* If the function calls eh_return, claim used all the registers that would
19796      be checked for liveness otherwise.  This is required for the PIC offset
19797      register with -mminimal-toc on AIX, as it is advertised as "fixed" for
19798      register allocation purposes in this case.  */
19799
19800   return (((crtl->calls_eh_return || df_regs_ever_live_p (reg))
19801            && (!call_used_regs[reg]
19802                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19803                    && !TARGET_SINGLE_PIC_BASE
19804                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
19805           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19806               && !TARGET_SINGLE_PIC_BASE
19807               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
19808                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
19809 }
19810
19811 /* Emit function prologue as insns.  */
19812
19813 void
19814 rs6000_emit_prologue (void)
19815 {
19816   rs6000_stack_t *info = rs6000_stack_info ();
19817   enum machine_mode reg_mode = Pmode;
19818   int reg_size = TARGET_32BIT ? 4 : 8;
19819   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19820   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
19821   rtx frame_reg_rtx = sp_reg_rtx;
19822   rtx cr_save_rtx = NULL_RTX;
19823   rtx insn;
19824   int strategy;
19825   int saving_FPRs_inline;
19826   int saving_GPRs_inline;
19827   int using_store_multiple;
19828   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
19829                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
19830                               && call_used_regs[STATIC_CHAIN_REGNUM]);
19831   HOST_WIDE_INT sp_offset = 0;
19832
19833   if (flag_stack_usage_info)
19834     current_function_static_stack_size = info->total_size;
19835
19836   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && info->total_size)
19837     rs6000_emit_probe_stack_range (STACK_CHECK_PROTECT, info->total_size);
19838
19839   if (TARGET_FIX_AND_CONTINUE)
19840     {
19841       /* gdb on darwin arranges to forward a function from the old
19842          address by modifying the first 5 instructions of the function
19843          to branch to the overriding function.  This is necessary to
19844          permit function pointers that point to the old function to
19845          actually forward to the new function.  */
19846       emit_insn (gen_nop ());
19847       emit_insn (gen_nop ());
19848       emit_insn (gen_nop ());
19849       emit_insn (gen_nop ());
19850       emit_insn (gen_nop ());
19851     }
19852
19853   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
19854     {
19855       reg_mode = V2SImode;
19856       reg_size = 8;
19857     }
19858
19859   strategy = info->savres_strategy;
19860   using_store_multiple = strategy & SAVRES_MULTIPLE;
19861   saving_FPRs_inline = strategy & SAVE_INLINE_FPRS;
19862   saving_GPRs_inline = strategy & SAVE_INLINE_GPRS;
19863
19864   /* For V.4, update stack before we do any saving and set back pointer.  */
19865   if (! WORLD_SAVE_P (info)
19866       && info->push_p
19867       && (DEFAULT_ABI == ABI_V4
19868           || crtl->calls_eh_return))
19869     {
19870       bool need_r11 = (TARGET_SPE
19871                        ? (!saving_GPRs_inline
19872                           && info->spe_64bit_regs_used == 0)
19873                        : (!saving_FPRs_inline || !saving_GPRs_inline));
19874       rtx copy_reg = need_r11 ? gen_rtx_REG (Pmode, 11) : NULL;
19875
19876       if (info->total_size < 32767)
19877         sp_offset = info->total_size;
19878       else if (need_r11)
19879         frame_reg_rtx = copy_reg;
19880       else if (info->cr_save_p
19881                || info->lr_save_p
19882                || info->first_fp_reg_save < 64
19883                || info->first_gp_reg_save < 32
19884                || info->altivec_size != 0
19885                || info->vrsave_mask != 0
19886                || crtl->calls_eh_return)
19887         {
19888           copy_reg = frame_ptr_rtx;
19889           frame_reg_rtx = copy_reg;
19890         }
19891       else
19892         {
19893           /* The prologue won't be saving any regs so there is no need
19894              to set up a frame register to access any frame save area.
19895              We also won't be using sp_offset anywhere below, but set
19896              the correct value anyway to protect against future
19897              changes to this function.  */
19898           sp_offset = info->total_size;
19899         }
19900       rs6000_emit_allocate_stack (info->total_size, copy_reg);
19901       if (frame_reg_rtx != sp_reg_rtx)
19902         rs6000_emit_stack_tie ();
19903     }
19904
19905   /* Handle world saves specially here.  */
19906   if (WORLD_SAVE_P (info))
19907     {
19908       int i, j, sz;
19909       rtx treg;
19910       rtvec p;
19911       rtx reg0;
19912
19913       /* save_world expects lr in r0. */
19914       reg0 = gen_rtx_REG (Pmode, 0);
19915       if (info->lr_save_p)
19916         {
19917           insn = emit_move_insn (reg0,
19918                                  gen_rtx_REG (Pmode, LR_REGNO));
19919           RTX_FRAME_RELATED_P (insn) = 1;
19920         }
19921
19922       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
19923          assumptions about the offsets of various bits of the stack
19924          frame.  */
19925       gcc_assert (info->gp_save_offset == -220
19926                   && info->fp_save_offset == -144
19927                   && info->lr_save_offset == 8
19928                   && info->cr_save_offset == 4
19929                   && info->push_p
19930                   && info->lr_save_p
19931                   && (!crtl->calls_eh_return
19932                        || info->ehrd_offset == -432)
19933                   && info->vrsave_save_offset == -224
19934                   && info->altivec_save_offset == -416);
19935
19936       treg = gen_rtx_REG (SImode, 11);
19937       emit_move_insn (treg, GEN_INT (-info->total_size));
19938
19939       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
19940          in R11.  It also clobbers R12, so beware!  */
19941
19942       /* Preserve CR2 for save_world prologues */
19943       sz = 5;
19944       sz += 32 - info->first_gp_reg_save;
19945       sz += 64 - info->first_fp_reg_save;
19946       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
19947       p = rtvec_alloc (sz);
19948       j = 0;
19949       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
19950                                             gen_rtx_REG (SImode,
19951                                                          LR_REGNO));
19952       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
19953                                         gen_rtx_SYMBOL_REF (Pmode,
19954                                                             "*save_world"));
19955       /* We do floats first so that the instruction pattern matches
19956          properly.  */
19957       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
19958         {
19959           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19960                                    ? DFmode : SFmode), 
19961                                  info->first_fp_reg_save + i);
19962           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19963                                    GEN_INT (info->fp_save_offset
19964                                             + sp_offset + 8 * i));
19965           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19966                                      ? DFmode : SFmode), addr);
19967
19968           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19969         }
19970       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
19971         {
19972           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
19973           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19974                                    GEN_INT (info->altivec_save_offset
19975                                             + sp_offset + 16 * i));
19976           rtx mem = gen_frame_mem (V4SImode, addr);
19977
19978           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19979         }
19980       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
19981         {
19982           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
19983           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19984                                    GEN_INT (info->gp_save_offset
19985                                             + sp_offset + reg_size * i));
19986           rtx mem = gen_frame_mem (reg_mode, addr);
19987
19988           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19989         }
19990
19991       {
19992         /* CR register traditionally saved as CR2.  */
19993         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
19994         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19995                                  GEN_INT (info->cr_save_offset
19996                                           + sp_offset));
19997         rtx mem = gen_frame_mem (reg_mode, addr);
19998
19999         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20000       }
20001       /* Explain about use of R0.  */
20002       if (info->lr_save_p)
20003         {
20004           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20005                                    GEN_INT (info->lr_save_offset
20006                                             + sp_offset));
20007           rtx mem = gen_frame_mem (reg_mode, addr);
20008
20009           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
20010         }
20011       /* Explain what happens to the stack pointer.  */
20012       {
20013         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
20014         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
20015       }
20016
20017       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20018       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20019                             treg, GEN_INT (-info->total_size));
20020       sp_offset = info->total_size;
20021     }
20022
20023   /* If we use the link register, get it into r0.  */
20024   if (!WORLD_SAVE_P (info) && info->lr_save_p)
20025     {
20026       rtx addr, reg, mem;
20027
20028       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
20029                              gen_rtx_REG (Pmode, LR_REGNO));
20030       RTX_FRAME_RELATED_P (insn) = 1;
20031
20032       if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
20033                         | SAVE_NOINLINE_FPRS_SAVES_LR)))
20034         {
20035           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20036                                GEN_INT (info->lr_save_offset + sp_offset));
20037           reg = gen_rtx_REG (Pmode, 0);
20038           mem = gen_rtx_MEM (Pmode, addr);
20039           /* This should not be of rs6000_sr_alias_set, because of
20040              __builtin_return_address.  */
20041
20042           insn = emit_move_insn (mem, reg);
20043           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20044                                 NULL_RTX, NULL_RTX);
20045         }
20046     }
20047
20048   /* If we need to save CR, put it into r12 or r11.  */
20049   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
20050     {
20051       rtx set;
20052
20053       cr_save_rtx
20054         = gen_rtx_REG (SImode, DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline
20055                        ? 11 : 12);
20056       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20057       RTX_FRAME_RELATED_P (insn) = 1;
20058       /* Now, there's no way that dwarf2out_frame_debug_expr is going
20059          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
20060          But that's OK.  All we have to do is specify that _one_ condition
20061          code register is saved in this stack slot.  The thrower's epilogue
20062          will then restore all the call-saved registers.
20063          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
20064       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
20065                          gen_rtx_REG (SImode, CR2_REGNO));
20066       add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20067     }
20068
20069   /* Do any required saving of fpr's.  If only one or two to save, do
20070      it ourselves.  Otherwise, call function.  */
20071   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
20072     {
20073       int i;
20074       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20075         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
20076              && ! call_used_regs[info->first_fp_reg_save+i]))
20077           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, 
20078                            (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20079                             ? DFmode : SFmode,
20080                            info->first_fp_reg_save + i,
20081                            info->fp_save_offset + sp_offset + 8 * i,
20082                            info->total_size);
20083     }
20084   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
20085     {
20086       rtx par;
20087
20088       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20089                                     info->fp_save_offset + sp_offset,
20090                                     DFmode,
20091                                     /*savep=*/true, /*gpr=*/false,
20092                                     /*lr=*/(strategy
20093                                             & SAVE_NOINLINE_FPRS_SAVES_LR)
20094                                            != 0);
20095       insn = emit_insn (par);
20096       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20097                             NULL_RTX, NULL_RTX);
20098     }
20099
20100   /* Save GPRs.  This is done as a PARALLEL if we are using
20101      the store-multiple instructions.  */
20102   if (!WORLD_SAVE_P (info)
20103       && TARGET_SPE_ABI
20104       && info->spe_64bit_regs_used != 0
20105       && info->first_gp_reg_save != 32)
20106     {
20107       int i;
20108       rtx spe_save_area_ptr;
20109  
20110       /* Determine whether we can address all of the registers that need
20111          to be saved with an offset from the stack pointer that fits in
20112          the small const field for SPE memory instructions.  */
20113       int spe_regs_addressable_via_sp
20114         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
20115                                + (32 - info->first_gp_reg_save - 1) * reg_size)
20116            && saving_GPRs_inline);
20117       int spe_offset;
20118  
20119       if (spe_regs_addressable_via_sp)
20120         {
20121           spe_save_area_ptr = frame_reg_rtx;
20122           spe_offset = info->spe_gp_save_offset + sp_offset;
20123         }
20124       else
20125         {
20126           /* Make r11 point to the start of the SPE save area.  We need
20127              to be careful here if r11 is holding the static chain.  If
20128              it is, then temporarily save it in r0.  We would use r0 as
20129              our base register here, but using r0 as a base register in
20130              loads and stores means something different from what we
20131              would like.  */
20132           int ool_adjust = (saving_GPRs_inline
20133                             ? 0
20134                             : (info->first_gp_reg_save
20135                                - (FIRST_SAVRES_REGISTER+1))*8);
20136           HOST_WIDE_INT offset = (info->spe_gp_save_offset
20137                                   + sp_offset - ool_adjust);
20138
20139           if (using_static_chain_p)
20140             {
20141               rtx r0 = gen_rtx_REG (Pmode, 0);
20142               gcc_assert (info->first_gp_reg_save > 11);
20143  
20144               emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
20145             }
20146  
20147           spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
20148           insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
20149                                         frame_reg_rtx,
20150                                         GEN_INT (offset)));
20151           /* We need to make sure the move to r11 gets noted for
20152              properly outputting unwind information.  */
20153           if (!saving_GPRs_inline)
20154             rs6000_frame_related (insn, frame_reg_rtx, offset,
20155                                   NULL_RTX, NULL_RTX);
20156           spe_offset = 0;
20157         }
20158  
20159       if (saving_GPRs_inline)
20160         {
20161           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20162             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20163               {
20164                 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20165                 rtx offset, addr, mem;
20166
20167                 /* We're doing all this to ensure that the offset fits into
20168                    the immediate offset of 'evstdd'.  */
20169                 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
20170  
20171                 offset = GEN_INT (reg_size * i + spe_offset);
20172                 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
20173                 mem = gen_rtx_MEM (V2SImode, addr);
20174   
20175                 insn = emit_move_insn (mem, reg);
20176            
20177                 rs6000_frame_related (insn, spe_save_area_ptr,
20178                                       info->spe_gp_save_offset
20179                                       + sp_offset + reg_size * i,
20180                                       offset, const0_rtx);
20181               }
20182         }
20183       else
20184         {
20185           rtx par;
20186
20187           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
20188                                         0, reg_mode,
20189                                         /*savep=*/true, /*gpr=*/true,
20190                                         /*lr=*/false);
20191           insn = emit_insn (par);
20192           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20193                                 NULL_RTX, NULL_RTX);
20194         }
20195                                         
20196  
20197       /* Move the static chain pointer back.  */
20198       if (using_static_chain_p && !spe_regs_addressable_via_sp)
20199         emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
20200     }
20201   else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
20202     {
20203       rtx par;
20204
20205       /* Need to adjust r11 (r12) if we saved any FPRs.  */
20206       if (info->first_fp_reg_save != 64)
20207         {
20208           rtx dest_reg = gen_rtx_REG (reg_mode, DEFAULT_ABI == ABI_AIX
20209                                       ? 12 : 11);
20210           rtx offset = GEN_INT (sp_offset
20211                                 + (-8 * (64-info->first_fp_reg_save)));
20212           emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx, offset));
20213         }
20214
20215       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20216                                     info->gp_save_offset + sp_offset,
20217                                     reg_mode,
20218                                     /*savep=*/true, /*gpr=*/true,
20219                                     /*lr=*/(strategy
20220                                             & SAVE_NOINLINE_GPRS_SAVES_LR)
20221                                            != 0);
20222       insn = emit_insn (par);
20223       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20224                             NULL_RTX, NULL_RTX);
20225     }
20226   else if (!WORLD_SAVE_P (info) && using_store_multiple)
20227     {
20228       rtvec p;
20229       int i;
20230       p = rtvec_alloc (32 - info->first_gp_reg_save);
20231       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20232         {
20233           rtx addr, reg, mem;
20234           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20235           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20236                                GEN_INT (info->gp_save_offset
20237                                         + sp_offset
20238                                         + reg_size * i));
20239           mem = gen_frame_mem (reg_mode, addr);
20240
20241           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
20242         }
20243       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20244       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20245                             NULL_RTX, NULL_RTX);
20246     }
20247   else if (!WORLD_SAVE_P (info))
20248     {
20249       int i;
20250       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20251         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20252           {
20253             rtx addr, reg, mem;
20254             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20255
20256             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20257                                  GEN_INT (info->gp_save_offset
20258                                           + sp_offset
20259                                           + reg_size * i));
20260             mem = gen_frame_mem (reg_mode, addr);
20261
20262             insn = emit_move_insn (mem, reg);
20263             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20264                                   NULL_RTX, NULL_RTX);
20265           }
20266     }
20267
20268   /* ??? There's no need to emit actual instructions here, but it's the
20269      easiest way to get the frame unwind information emitted.  */
20270   if (crtl->calls_eh_return)
20271     {
20272       unsigned int i, regno;
20273
20274       for (i = 0; ; ++i)
20275         {
20276           regno = EH_RETURN_DATA_REGNO (i);
20277           if (regno == INVALID_REGNUM)
20278             break;
20279
20280           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
20281                            info->ehrd_offset + sp_offset
20282                            + reg_size * (int) i,
20283                            info->total_size);
20284         }
20285     }
20286
20287   /* In AIX ABI we need to make sure r2 is really saved.  */
20288   if (TARGET_AIX && crtl->calls_eh_return)
20289     {
20290       rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
20291       long toc_restore_insn;
20292
20293       gcc_assert (frame_reg_rtx == frame_ptr_rtx
20294                   || frame_reg_rtx == sp_reg_rtx);
20295       tmp_reg = gen_rtx_REG (Pmode, 11);
20296       tmp_reg_si = gen_rtx_REG (SImode, 11);
20297       if (using_static_chain_p)
20298         emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
20299       gcc_assert (saving_GPRs_inline && saving_FPRs_inline);
20300       emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
20301       /* Peek at instruction to which this function returns.  If it's
20302          restoring r2, then we know we've already saved r2.  We can't
20303          unconditionally save r2 because the value we have will already
20304          be updated if we arrived at this function via a plt call or
20305          toc adjusting stub.  */
20306       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
20307       toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
20308       hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
20309       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
20310       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
20311       validate_condition_mode (EQ, CCUNSmode);
20312       lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
20313       emit_insn (gen_rtx_SET (VOIDmode, compare_result,
20314                               gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
20315       toc_save_done = gen_label_rtx ();
20316       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
20317                                    gen_rtx_EQ (VOIDmode, compare_result,
20318                                                const0_rtx),
20319                                    gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
20320                                    pc_rtx);
20321       jump = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, jump));
20322       JUMP_LABEL (jump) = toc_save_done;
20323       LABEL_NUSES (toc_save_done) += 1;
20324
20325       emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, TOC_REGNUM,
20326                        sp_offset + 5 * reg_size, info->total_size);
20327       emit_label (toc_save_done);
20328       if (using_static_chain_p)
20329         emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
20330     }
20331
20332   /* Save CR if we use any that must be preserved.  */
20333   if (!WORLD_SAVE_P (info) && info->cr_save_p)
20334     {
20335       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20336                                GEN_INT (info->cr_save_offset + sp_offset));
20337       rtx mem = gen_frame_mem (SImode, addr);
20338       /* See the large comment above about why CR2_REGNO is used.  */
20339       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
20340
20341       /* If r12 was used to hold the original sp, copy cr into r0 now
20342          that it's free.  */
20343       if (REGNO (frame_reg_rtx) == 12)
20344         {
20345           rtx set;
20346
20347           cr_save_rtx = gen_rtx_REG (SImode, 0);
20348           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20349           RTX_FRAME_RELATED_P (insn) = 1;
20350           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
20351           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20352         }
20353       insn = emit_move_insn (mem, cr_save_rtx);
20354
20355       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20356                             NULL_RTX, NULL_RTX);
20357     }
20358
20359   /* Update stack and set back pointer unless this is V.4,
20360      for which it was done previously.  */
20361   if (!WORLD_SAVE_P (info) && info->push_p
20362       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
20363     {
20364       rtx copy_reg = NULL;
20365
20366       if (info->total_size < 32767)
20367         sp_offset = info->total_size;
20368       else if (info->altivec_size != 0
20369                || info->vrsave_mask != 0)
20370         {
20371           copy_reg = frame_ptr_rtx;
20372           frame_reg_rtx = copy_reg;
20373         }
20374       else
20375         sp_offset = info->total_size;
20376       rs6000_emit_allocate_stack (info->total_size, copy_reg);
20377       if (frame_reg_rtx != sp_reg_rtx)
20378         rs6000_emit_stack_tie ();
20379     }
20380
20381   /* Set frame pointer, if needed.  */
20382   if (frame_pointer_needed)
20383     {
20384       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
20385                              sp_reg_rtx);
20386       RTX_FRAME_RELATED_P (insn) = 1;
20387     }
20388
20389   /* Save AltiVec registers if needed.  Save here because the red zone does
20390      not include AltiVec registers.  */
20391   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
20392     {
20393       int i;
20394
20395       /* There should be a non inline version of this, for when we
20396          are saving lots of vector registers.  */
20397       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20398         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20399           {
20400             rtx areg, savereg, mem;
20401             int offset;
20402
20403             offset = info->altivec_save_offset + sp_offset
20404               + 16 * (i - info->first_altivec_reg_save);
20405
20406             savereg = gen_rtx_REG (V4SImode, i);
20407
20408             areg = gen_rtx_REG (Pmode, 0);
20409             emit_move_insn (areg, GEN_INT (offset));
20410
20411             /* AltiVec addressing mode is [reg+reg].  */
20412             mem = gen_frame_mem (V4SImode,
20413                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
20414
20415             insn = emit_move_insn (mem, savereg);
20416
20417             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20418                                   areg, GEN_INT (offset));
20419           }
20420     }
20421
20422   /* VRSAVE is a bit vector representing which AltiVec registers
20423      are used.  The OS uses this to determine which vector
20424      registers to save on a context switch.  We need to save
20425      VRSAVE on the stack frame, add whatever AltiVec registers we
20426      used in this function, and do the corresponding magic in the
20427      epilogue.  */
20428
20429   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
20430       && info->vrsave_mask != 0)
20431     {
20432       rtx reg, mem, vrsave;
20433       int offset;
20434
20435       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
20436          as frame_reg_rtx and r11 as the static chain pointer for
20437          nested functions.  */
20438       reg = gen_rtx_REG (SImode, 0);
20439       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
20440       if (TARGET_MACHO)
20441         emit_insn (gen_get_vrsave_internal (reg));
20442       else
20443         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
20444
20445       if (!WORLD_SAVE_P (info))
20446         {
20447           /* Save VRSAVE.  */
20448           offset = info->vrsave_save_offset + sp_offset;
20449           mem = gen_frame_mem (SImode,
20450                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
20451                                              GEN_INT (offset)));
20452           insn = emit_move_insn (mem, reg);
20453         }
20454
20455       /* Include the registers in the mask.  */
20456       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
20457
20458       insn = emit_insn (generate_set_vrsave (reg, info, 0));
20459     }
20460
20461   if (TARGET_SINGLE_PIC_BASE)
20462     return; /* Do not set PIC register */
20463
20464   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
20465   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
20466       || (DEFAULT_ABI == ABI_V4
20467           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
20468           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
20469     {
20470       /* If emit_load_toc_table will use the link register, we need to save
20471          it.  We use R12 for this purpose because emit_load_toc_table
20472          can use register 0.  This allows us to use a plain 'blr' to return
20473          from the procedure more often.  */
20474       int save_LR_around_toc_setup = (TARGET_ELF
20475                                       && DEFAULT_ABI != ABI_AIX
20476                                       && flag_pic
20477                                       && ! info->lr_save_p
20478                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
20479       if (save_LR_around_toc_setup)
20480         {
20481           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20482
20483           insn = emit_move_insn (frame_ptr_rtx, lr);
20484           RTX_FRAME_RELATED_P (insn) = 1;
20485
20486           rs6000_emit_load_toc_table (TRUE);
20487
20488           insn = emit_move_insn (lr, frame_ptr_rtx);
20489           RTX_FRAME_RELATED_P (insn) = 1;
20490         }
20491       else
20492         rs6000_emit_load_toc_table (TRUE);
20493     }
20494
20495 #if TARGET_MACHO
20496   if (DEFAULT_ABI == ABI_DARWIN
20497       && flag_pic && crtl->uses_pic_offset_table)
20498     {
20499       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20500       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
20501
20502       /* Save and restore LR locally around this call (in R0).  */
20503       if (!info->lr_save_p)
20504         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
20505
20506       emit_insn (gen_load_macho_picbase (src));
20507
20508       emit_move_insn (gen_rtx_REG (Pmode,
20509                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
20510                       lr);
20511
20512       if (!info->lr_save_p)
20513         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
20514     }
20515 #endif
20516
20517   /* If we need to, save the TOC register after doing the stack setup.  */
20518   if (rs6000_save_toc_in_prologue_p ())
20519     emit_frame_save (sp_reg_rtx, sp_reg_rtx, reg_mode, TOC_REGNUM,
20520                      5 * reg_size, info->total_size);
20521 }
20522
20523 /* Write function prologue.  */
20524
20525 static void
20526 rs6000_output_function_prologue (FILE *file,
20527                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
20528 {
20529   rs6000_stack_t *info = rs6000_stack_info ();
20530
20531   if (TARGET_DEBUG_STACK)
20532     debug_stack_info (info);
20533
20534   /* Write .extern for any function we will call to save and restore
20535      fp values.  */
20536   if (info->first_fp_reg_save < 64)
20537     {
20538       char *name;
20539       int regno = info->first_fp_reg_save - 32;
20540
20541       if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
20542         {
20543           name = rs6000_savres_routine_name (info, regno, /*savep=*/true,
20544                                              /*gpr=*/false, /*lr=*/false);
20545           fprintf (file, "\t.extern %s\n", name);
20546         }
20547       if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
20548         {
20549           name = rs6000_savres_routine_name (info, regno, /*savep=*/false,
20550                                              /*gpr=*/false, /*lr=*/true);
20551           fprintf (file, "\t.extern %s\n", name);
20552         }
20553     }
20554
20555   /* Write .extern for AIX common mode routines, if needed.  */
20556   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
20557     {
20558       fputs ("\t.extern __mulh\n", file);
20559       fputs ("\t.extern __mull\n", file);
20560       fputs ("\t.extern __divss\n", file);
20561       fputs ("\t.extern __divus\n", file);
20562       fputs ("\t.extern __quoss\n", file);
20563       fputs ("\t.extern __quous\n", file);
20564       common_mode_defined = 1;
20565     }
20566
20567   rs6000_pic_labelno++;
20568 }
20569
20570 /* Non-zero if vmx regs are restored before the frame pop, zero if
20571    we restore after the pop when possible.  */
20572 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
20573
20574 /* Reload CR from REG.  */
20575
20576 static void
20577 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
20578 {
20579   int count = 0;
20580   int i;
20581
20582   if (using_mfcr_multiple)
20583     {
20584       for (i = 0; i < 8; i++)
20585         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20586           count++;
20587       gcc_assert (count);
20588     }
20589
20590   if (using_mfcr_multiple && count > 1)
20591     {
20592       rtvec p;
20593       int ndx;
20594
20595       p = rtvec_alloc (count);
20596
20597       ndx = 0;
20598       for (i = 0; i < 8; i++)
20599         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20600           {
20601             rtvec r = rtvec_alloc (2);
20602             RTVEC_ELT (r, 0) = reg;
20603             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
20604             RTVEC_ELT (p, ndx) =
20605               gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
20606                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
20607             ndx++;
20608           }
20609       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20610       gcc_assert (ndx == count);
20611     }
20612   else
20613     for (i = 0; i < 8; i++)
20614       if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20615         {
20616           emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
20617                                                        CR0_REGNO+i),
20618                                           reg));
20619         }
20620 }
20621
20622 /* Return true if OFFSET from stack pointer can be clobbered by signals.
20623    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
20624    below stack pointer not cloberred by signals.  */
20625
20626 static inline bool
20627 offset_below_red_zone_p (HOST_WIDE_INT offset)
20628 {
20629   return offset < (DEFAULT_ABI == ABI_V4
20630                    ? 0
20631                    : TARGET_32BIT ? -220 : -288);
20632 }
20633
20634 /* Emit function epilogue as insns.  */
20635
20636 void
20637 rs6000_emit_epilogue (int sibcall)
20638 {
20639   rs6000_stack_t *info;
20640   int restoring_GPRs_inline;
20641   int restoring_FPRs_inline;
20642   int using_load_multiple;
20643   int using_mtcr_multiple;
20644   int use_backchain_to_restore_sp;
20645   int restore_lr;
20646   int strategy;
20647   int sp_offset = 0;
20648   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
20649   rtx frame_reg_rtx = sp_reg_rtx;
20650   rtx cfa_restores = NULL_RTX;
20651   rtx insn;
20652   rtx cr_save_reg = NULL_RTX;
20653   enum machine_mode reg_mode = Pmode;
20654   int reg_size = TARGET_32BIT ? 4 : 8;
20655   int i;
20656
20657   info = rs6000_stack_info ();
20658
20659   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
20660     {
20661       reg_mode = V2SImode;
20662       reg_size = 8;
20663     }
20664
20665   strategy = info->savres_strategy;
20666   using_load_multiple = strategy & SAVRES_MULTIPLE;
20667   restoring_FPRs_inline = sibcall || (strategy & REST_INLINE_FPRS);
20668   restoring_GPRs_inline = sibcall || (strategy & REST_INLINE_GPRS);
20669   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
20670                          || rs6000_cpu == PROCESSOR_PPC603
20671                          || rs6000_cpu == PROCESSOR_PPC750
20672                          || optimize_size);
20673   /* Restore via the backchain when we have a large frame, since this
20674      is more efficient than an addis, addi pair.  The second condition
20675      here will not trigger at the moment;  We don't actually need a
20676      frame pointer for alloca, but the generic parts of the compiler
20677      give us one anyway.  */
20678   use_backchain_to_restore_sp = (info->total_size > 32767
20679                                  || info->total_size
20680                                      + (info->lr_save_p ? info->lr_save_offset : 0)
20681                                        > 32767
20682                                  || (cfun->calls_alloca
20683                                      && !frame_pointer_needed));
20684   restore_lr = (info->lr_save_p
20685                 && (restoring_FPRs_inline
20686                     || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
20687                 && (restoring_GPRs_inline
20688                     || info->first_fp_reg_save < 64));
20689
20690   if (WORLD_SAVE_P (info))
20691     {
20692       int i, j;
20693       char rname[30];
20694       const char *alloc_rname;
20695       rtvec p;
20696
20697       /* eh_rest_world_r10 will return to the location saved in the LR
20698          stack slot (which is not likely to be our caller.)
20699          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
20700          rest_world is similar, except any R10 parameter is ignored.
20701          The exception-handling stuff that was here in 2.95 is no
20702          longer necessary.  */
20703
20704       p = rtvec_alloc (9
20705                        + 1
20706                        + 32 - info->first_gp_reg_save
20707                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
20708                        + 63 + 1 - info->first_fp_reg_save);
20709
20710       strcpy (rname, ((crtl->calls_eh_return) ?
20711                       "*eh_rest_world_r10" : "*rest_world"));
20712       alloc_rname = ggc_strdup (rname);
20713
20714       j = 0;
20715       RTVEC_ELT (p, j++) = ret_rtx;
20716       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
20717                                         gen_rtx_REG (Pmode,
20718                                                      LR_REGNO));
20719       RTVEC_ELT (p, j++)
20720         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
20721       /* The instruction pattern requires a clobber here;
20722          it is shared with the restVEC helper. */
20723       RTVEC_ELT (p, j++)
20724         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
20725
20726       {
20727         /* CR register traditionally saved as CR2.  */
20728         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20729         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20730                                  GEN_INT (info->cr_save_offset));
20731         rtx mem = gen_frame_mem (reg_mode, addr);
20732
20733         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20734       }
20735
20736       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20737         {
20738           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20739           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20740                                    GEN_INT (info->gp_save_offset
20741                                             + reg_size * i));
20742           rtx mem = gen_frame_mem (reg_mode, addr);
20743
20744           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20745         }
20746       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
20747         {
20748           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
20749           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20750                                    GEN_INT (info->altivec_save_offset
20751                                             + 16 * i));
20752           rtx mem = gen_frame_mem (V4SImode, addr);
20753
20754           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20755         }
20756       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
20757         {
20758           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20759                                    ? DFmode : SFmode), 
20760                                  info->first_fp_reg_save + i);
20761           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20762                                    GEN_INT (info->fp_save_offset
20763                                             + 8 * i));
20764           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20765                                      ? DFmode : SFmode), addr);
20766
20767           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20768         }
20769       RTVEC_ELT (p, j++)
20770         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
20771       RTVEC_ELT (p, j++)
20772         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
20773       RTVEC_ELT (p, j++)
20774         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
20775       RTVEC_ELT (p, j++)
20776         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
20777       RTVEC_ELT (p, j++)
20778         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
20779       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
20780
20781       return;
20782     }
20783
20784   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
20785   if (info->push_p)
20786     sp_offset = info->total_size;
20787
20788   /* Restore AltiVec registers if we must do so before adjusting the
20789      stack.  */
20790   if (TARGET_ALTIVEC_ABI
20791       && info->altivec_size != 0
20792       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20793           || (DEFAULT_ABI != ABI_V4
20794               && offset_below_red_zone_p (info->altivec_save_offset))))
20795     {
20796       int i;
20797
20798       if (use_backchain_to_restore_sp)
20799         {
20800           frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20801           emit_move_insn (frame_reg_rtx,
20802                           gen_rtx_MEM (Pmode, sp_reg_rtx));
20803           sp_offset = 0;
20804         }
20805       else if (frame_pointer_needed)
20806         frame_reg_rtx = hard_frame_pointer_rtx;
20807
20808       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20809         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20810           {
20811             rtx addr, areg, mem, reg;
20812
20813             areg = gen_rtx_REG (Pmode, 0);
20814             emit_move_insn
20815               (areg, GEN_INT (info->altivec_save_offset
20816                               + sp_offset
20817                               + 16 * (i - info->first_altivec_reg_save)));
20818
20819             /* AltiVec addressing mode is [reg+reg].  */
20820             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20821             mem = gen_frame_mem (V4SImode, addr);
20822
20823             reg = gen_rtx_REG (V4SImode, i);
20824             emit_move_insn (reg, mem);
20825             if (offset_below_red_zone_p (info->altivec_save_offset
20826                                          + (i - info->first_altivec_reg_save)
20827                                            * 16))
20828               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20829                                              cfa_restores);
20830           }
20831     }
20832
20833   /* Restore VRSAVE if we must do so before adjusting the stack.  */
20834   if (TARGET_ALTIVEC
20835       && TARGET_ALTIVEC_VRSAVE
20836       && info->vrsave_mask != 0
20837       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20838           || (DEFAULT_ABI != ABI_V4
20839               && offset_below_red_zone_p (info->vrsave_save_offset))))
20840     {
20841       rtx addr, mem, reg;
20842
20843       if (frame_reg_rtx == sp_reg_rtx)
20844         {
20845           if (use_backchain_to_restore_sp)
20846             {
20847               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20848               emit_move_insn (frame_reg_rtx,
20849                               gen_rtx_MEM (Pmode, sp_reg_rtx));
20850               sp_offset = 0;
20851             }
20852           else if (frame_pointer_needed)
20853             frame_reg_rtx = hard_frame_pointer_rtx;
20854         }
20855
20856       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20857                            GEN_INT (info->vrsave_save_offset + sp_offset));
20858       mem = gen_frame_mem (SImode, addr);
20859       reg = gen_rtx_REG (SImode, 12);
20860       emit_move_insn (reg, mem);
20861
20862       emit_insn (generate_set_vrsave (reg, info, 1));
20863     }
20864
20865   insn = NULL_RTX;
20866   /* If we have a large stack frame, restore the old stack pointer
20867      using the backchain.  */
20868   if (use_backchain_to_restore_sp)
20869     {
20870       if (frame_reg_rtx == sp_reg_rtx)
20871         {
20872           /* Under V.4, don't reset the stack pointer until after we're done
20873              loading the saved registers.  */
20874           if (DEFAULT_ABI == ABI_V4)
20875             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20876
20877           insn = emit_move_insn (frame_reg_rtx,
20878                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
20879           sp_offset = 0;
20880         }
20881       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20882                && DEFAULT_ABI == ABI_V4)
20883         /* frame_reg_rtx has been set up by the altivec restore.  */
20884         ;
20885       else
20886         {
20887           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
20888           frame_reg_rtx = sp_reg_rtx;
20889         }
20890     }
20891   /* If we have a frame pointer, we can restore the old stack pointer
20892      from it.  */
20893   else if (frame_pointer_needed)
20894     {
20895       frame_reg_rtx = sp_reg_rtx;
20896       if (DEFAULT_ABI == ABI_V4)
20897         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20898       /* Prevent reordering memory accesses against stack pointer restore.  */
20899       else if (cfun->calls_alloca
20900                || offset_below_red_zone_p (-info->total_size))
20901         {
20902           rtx mem1 = gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx);
20903           rtx mem2 = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20904           MEM_NOTRAP_P (mem1) = 1;
20905           MEM_NOTRAP_P (mem2) = 1;
20906           emit_insn (gen_frame_tie (mem1, mem2));
20907         }
20908
20909       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
20910                                        GEN_INT (info->total_size)));
20911       sp_offset = 0;
20912     }
20913   else if (info->push_p
20914            && DEFAULT_ABI != ABI_V4
20915            && !crtl->calls_eh_return)
20916     {
20917       /* Prevent reordering memory accesses against stack pointer restore.  */
20918       if (cfun->calls_alloca
20919           || offset_below_red_zone_p (-info->total_size))
20920         {
20921           rtx mem = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20922           MEM_NOTRAP_P (mem) = 1;
20923           emit_insn (gen_stack_tie (mem));
20924         }
20925       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
20926                                        GEN_INT (info->total_size)));
20927       sp_offset = 0;
20928     }
20929   if (insn && frame_reg_rtx == sp_reg_rtx)
20930     {
20931       if (cfa_restores)
20932         {
20933           REG_NOTES (insn) = cfa_restores;
20934           cfa_restores = NULL_RTX;
20935         }
20936       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
20937       RTX_FRAME_RELATED_P (insn) = 1;
20938     }
20939
20940   /* Restore AltiVec registers if we have not done so already.  */
20941   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20942       && TARGET_ALTIVEC_ABI
20943       && info->altivec_size != 0
20944       && (DEFAULT_ABI == ABI_V4
20945           || !offset_below_red_zone_p (info->altivec_save_offset)))
20946     {
20947       int i;
20948
20949       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20950         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20951           {
20952             rtx addr, areg, mem, reg;
20953
20954             areg = gen_rtx_REG (Pmode, 0);
20955             emit_move_insn
20956               (areg, GEN_INT (info->altivec_save_offset
20957                               + sp_offset
20958                               + 16 * (i - info->first_altivec_reg_save)));
20959
20960             /* AltiVec addressing mode is [reg+reg].  */
20961             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20962             mem = gen_frame_mem (V4SImode, addr);
20963
20964             reg = gen_rtx_REG (V4SImode, i);
20965             emit_move_insn (reg, mem);
20966             if (DEFAULT_ABI == ABI_V4)
20967               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20968                                              cfa_restores);
20969           }
20970     }
20971
20972   /* Restore VRSAVE if we have not done so already.  */
20973   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20974       && TARGET_ALTIVEC
20975       && TARGET_ALTIVEC_VRSAVE
20976       && info->vrsave_mask != 0
20977       && (DEFAULT_ABI == ABI_V4
20978           || !offset_below_red_zone_p (info->vrsave_save_offset)))
20979     {
20980       rtx addr, mem, reg;
20981
20982       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20983                            GEN_INT (info->vrsave_save_offset + sp_offset));
20984       mem = gen_frame_mem (SImode, addr);
20985       reg = gen_rtx_REG (SImode, 12);
20986       emit_move_insn (reg, mem);
20987
20988       emit_insn (generate_set_vrsave (reg, info, 1));
20989     }
20990
20991   /* Get the old lr if we saved it.  If we are restoring registers
20992      out-of-line, then the out-of-line routines can do this for us.  */
20993   if (restore_lr && restoring_GPRs_inline)
20994     {
20995       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
20996                                       info->lr_save_offset + sp_offset);
20997
20998       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
20999     }
21000
21001   /* Get the old cr if we saved it.  */
21002   if (info->cr_save_p)
21003     {
21004       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21005                                GEN_INT (info->cr_save_offset + sp_offset));
21006       rtx mem = gen_frame_mem (SImode, addr);
21007
21008       cr_save_reg = gen_rtx_REG (SImode,
21009                                  DEFAULT_ABI == ABI_AIX
21010                                  && !restoring_GPRs_inline
21011                                  && info->first_fp_reg_save < 64
21012                                  ? 11 : 12);
21013       emit_move_insn (cr_save_reg, mem);
21014     }
21015
21016   /* Set LR here to try to overlap restores below.  LR is always saved
21017      above incoming stack, so it never needs REG_CFA_RESTORE.  */
21018   if (restore_lr && restoring_GPRs_inline)
21019     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21020                     gen_rtx_REG (Pmode, 0));
21021
21022   /* Load exception handler data registers, if needed.  */
21023   if (crtl->calls_eh_return)
21024     {
21025       unsigned int i, regno;
21026
21027       if (TARGET_AIX)
21028         {
21029           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21030                                    GEN_INT (sp_offset + 5 * reg_size));
21031           rtx mem = gen_frame_mem (reg_mode, addr);
21032
21033           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
21034         }
21035
21036       for (i = 0; ; ++i)
21037         {
21038           rtx mem;
21039
21040           regno = EH_RETURN_DATA_REGNO (i);
21041           if (regno == INVALID_REGNUM)
21042             break;
21043
21044           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
21045                                       info->ehrd_offset + sp_offset
21046                                       + reg_size * (int) i);
21047
21048           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
21049         }
21050     }
21051
21052   /* Restore GPRs.  This is done as a PARALLEL if we are using
21053      the load-multiple instructions.  */
21054   if (TARGET_SPE_ABI
21055       && info->spe_64bit_regs_used != 0
21056       && info->first_gp_reg_save != 32)
21057     {
21058       /* Determine whether we can address all of the registers that need
21059          to be saved with an offset from the stack pointer that fits in
21060          the small const field for SPE memory instructions.  */
21061       int spe_regs_addressable_via_sp
21062         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
21063                                + (32 - info->first_gp_reg_save - 1) * reg_size)
21064            && restoring_GPRs_inline);
21065       int spe_offset;
21066
21067       if (spe_regs_addressable_via_sp)
21068         spe_offset = info->spe_gp_save_offset + sp_offset;
21069       else
21070         {
21071           rtx old_frame_reg_rtx = frame_reg_rtx;
21072           /* Make r11 point to the start of the SPE save area.  We worried about
21073              not clobbering it when we were saving registers in the prologue.
21074              There's no need to worry here because the static chain is passed
21075              anew to every function.  */
21076           int ool_adjust = (restoring_GPRs_inline
21077                             ? 0
21078                             : (info->first_gp_reg_save
21079                                - (FIRST_SAVRES_REGISTER+1))*8);
21080
21081           if (frame_reg_rtx == sp_reg_rtx)
21082             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21083           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
21084                                  GEN_INT (info->spe_gp_save_offset
21085                                           + sp_offset
21086                                           - ool_adjust)));
21087           /* Keep the invariant that frame_reg_rtx + sp_offset points
21088              at the top of the stack frame.  */
21089           sp_offset = -info->spe_gp_save_offset;
21090
21091           spe_offset = 0;
21092         }
21093
21094       if (restoring_GPRs_inline)
21095         {
21096           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21097             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21098               {
21099                 rtx offset, addr, mem, reg;
21100
21101                 /* We're doing all this to ensure that the immediate offset
21102                    fits into the immediate field of 'evldd'.  */
21103                 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
21104
21105                 offset = GEN_INT (spe_offset + reg_size * i);
21106                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
21107                 mem = gen_rtx_MEM (V2SImode, addr);
21108                 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21109
21110                 insn = emit_move_insn (reg, mem);
21111                 if (DEFAULT_ABI == ABI_V4)
21112                   {
21113                     if (frame_pointer_needed
21114                         && info->first_gp_reg_save + i
21115                            == HARD_FRAME_POINTER_REGNUM)
21116                       {
21117                         add_reg_note (insn, REG_CFA_DEF_CFA,
21118                                       plus_constant (frame_reg_rtx,
21119                                                      sp_offset));
21120                         RTX_FRAME_RELATED_P (insn) = 1;
21121                       }
21122
21123                     cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21124                                                    cfa_restores);
21125                   }
21126               }
21127         }
21128       else
21129         {
21130           rtx par;
21131
21132           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
21133                                         0, reg_mode,
21134                                         /*savep=*/false, /*gpr=*/true,
21135                                         /*lr=*/true);
21136           emit_jump_insn (par);
21137           /* We don't want anybody else emitting things after we jumped
21138              back.  */
21139           return;
21140         }
21141     }
21142   else if (!restoring_GPRs_inline)
21143     {
21144       /* We are jumping to an out-of-line function.  */
21145       bool can_use_exit = info->first_fp_reg_save == 64;
21146       rtx par;
21147
21148       /* Emit stack reset code if we need it.  */
21149       if (can_use_exit)
21150         rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21151                                  sp_offset, can_use_exit);
21152       else
21153         {
21154           emit_insn (gen_add3_insn (gen_rtx_REG (Pmode, DEFAULT_ABI == ABI_AIX
21155                                                         ? 12 : 11),
21156                                     frame_reg_rtx,
21157                                     GEN_INT (sp_offset - info->fp_size)));
21158           if (REGNO (frame_reg_rtx) == 11)
21159             sp_offset += info->fp_size;
21160         }
21161
21162       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
21163                                     info->gp_save_offset, reg_mode,
21164                                     /*savep=*/false, /*gpr=*/true,
21165                                     /*lr=*/can_use_exit);
21166
21167       if (can_use_exit)
21168         {
21169           if (info->cr_save_p)
21170             {
21171               rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21172               if (DEFAULT_ABI == ABI_V4)
21173                 cfa_restores
21174                   = alloc_reg_note (REG_CFA_RESTORE,
21175                                     gen_rtx_REG (SImode, CR2_REGNO),
21176                                     cfa_restores);
21177             }
21178
21179           emit_jump_insn (par);
21180
21181           /* We don't want anybody else emitting things after we jumped
21182              back.  */
21183           return;
21184         }
21185
21186       insn = emit_insn (par);
21187       if (DEFAULT_ABI == ABI_V4)
21188         {
21189           if (frame_pointer_needed)
21190             {
21191               add_reg_note (insn, REG_CFA_DEF_CFA,
21192                             plus_constant (frame_reg_rtx, sp_offset));
21193               RTX_FRAME_RELATED_P (insn) = 1;
21194             }
21195
21196           for (i = info->first_gp_reg_save; i < 32; i++)
21197             cfa_restores
21198               = alloc_reg_note (REG_CFA_RESTORE,
21199                                 gen_rtx_REG (reg_mode, i), cfa_restores);
21200         }
21201     }
21202   else if (using_load_multiple)
21203     {
21204       rtvec p;
21205       p = rtvec_alloc (32 - info->first_gp_reg_save);
21206       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21207         {
21208           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21209                                    GEN_INT (info->gp_save_offset
21210                                             + sp_offset
21211                                             + reg_size * i));
21212           rtx mem = gen_frame_mem (reg_mode, addr);
21213           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21214
21215           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, reg, mem);
21216           if (DEFAULT_ABI == ABI_V4)
21217             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21218                                            cfa_restores);
21219         }
21220       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21221       if (DEFAULT_ABI == ABI_V4 && frame_pointer_needed)
21222         {
21223           add_reg_note (insn, REG_CFA_DEF_CFA,
21224                         plus_constant (frame_reg_rtx, sp_offset));
21225           RTX_FRAME_RELATED_P (insn) = 1;
21226         }
21227     }
21228   else
21229     {
21230       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21231         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21232           {
21233             rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21234                                      GEN_INT (info->gp_save_offset
21235                                               + sp_offset
21236                                               + reg_size * i));
21237             rtx mem = gen_frame_mem (reg_mode, addr);
21238             rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21239
21240             insn = emit_move_insn (reg, mem);
21241             if (DEFAULT_ABI == ABI_V4)
21242               {
21243                 if (frame_pointer_needed
21244                     && info->first_gp_reg_save + i
21245                        == HARD_FRAME_POINTER_REGNUM)
21246                   {
21247                     add_reg_note (insn, REG_CFA_DEF_CFA,
21248                                   plus_constant (frame_reg_rtx, sp_offset));
21249                     RTX_FRAME_RELATED_P (insn) = 1;
21250                   }
21251
21252                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21253                                                cfa_restores);
21254               }
21255           }
21256     }
21257
21258   if (restore_lr && !restoring_GPRs_inline)
21259     {
21260       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21261                                      info->lr_save_offset + sp_offset);
21262
21263       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21264       emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21265                       gen_rtx_REG (Pmode, 0));
21266     }
21267
21268   /* Restore fpr's if we need to do it without calling a function.  */
21269   if (restoring_FPRs_inline)
21270     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21271       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
21272            && ! call_used_regs[info->first_fp_reg_save+i]))
21273         {
21274           rtx addr, mem, reg;
21275           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21276                                GEN_INT (info->fp_save_offset
21277                                         + sp_offset
21278                                         + 8 * i));
21279           mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21280                                  ? DFmode : SFmode), addr);
21281           reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21282                                ? DFmode : SFmode),
21283                              info->first_fp_reg_save + i);
21284
21285           emit_move_insn (reg, mem);
21286           if (DEFAULT_ABI == ABI_V4)
21287             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21288                                            cfa_restores);
21289         }
21290
21291   /* If we saved cr, restore it here.  Just those that were used.  */
21292   if (info->cr_save_p)
21293     {
21294       rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21295       if (DEFAULT_ABI == ABI_V4)
21296         cfa_restores
21297           = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, CR2_REGNO),
21298                             cfa_restores);
21299     }
21300
21301   /* If this is V.4, unwind the stack pointer after all of the loads
21302      have been done.  */
21303   insn = rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21304                                   sp_offset, !restoring_FPRs_inline);
21305   if (insn)
21306     {
21307       if (cfa_restores)
21308         {
21309           REG_NOTES (insn) = cfa_restores;
21310           cfa_restores = NULL_RTX;
21311         }
21312       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21313       RTX_FRAME_RELATED_P (insn) = 1;
21314     }
21315
21316   if (crtl->calls_eh_return)
21317     {
21318       rtx sa = EH_RETURN_STACKADJ_RTX;
21319       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
21320     }
21321
21322   if (!sibcall)
21323     {
21324       rtvec p;
21325       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
21326       if (! restoring_FPRs_inline)
21327         p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
21328       else
21329         p = rtvec_alloc (2);
21330
21331       RTVEC_ELT (p, 0) = ret_rtx;
21332       RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
21333                           ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
21334                           : gen_rtx_CLOBBER (VOIDmode,
21335                                              gen_rtx_REG (Pmode, 65)));
21336
21337       /* If we have to restore more than two FP registers, branch to the
21338          restore function.  It will return to our caller.  */
21339       if (! restoring_FPRs_inline)
21340         {
21341           int i;
21342           rtx sym;
21343
21344           sym = rs6000_savres_routine_sym (info,
21345                                            /*savep=*/false,
21346                                            /*gpr=*/false,
21347                                            /*lr=*/lr);
21348           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
21349           RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
21350                                           gen_rtx_REG (Pmode,
21351                                                        DEFAULT_ABI == ABI_AIX
21352                                                        ? 1 : 11));
21353           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21354             {
21355               rtx addr, mem;
21356               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
21357                                    GEN_INT (info->fp_save_offset + 8*i));
21358               mem = gen_frame_mem (DFmode, addr);
21359
21360               RTVEC_ELT (p, i+4) =
21361                 gen_rtx_SET (VOIDmode,
21362                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
21363                              mem);
21364             }
21365         }
21366
21367       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21368     }
21369 }
21370
21371 /* Write function epilogue.  */
21372
21373 static void
21374 rs6000_output_function_epilogue (FILE *file,
21375                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21376 {
21377 #if TARGET_MACHO
21378   macho_branch_islands ();
21379   /* Mach-O doesn't support labels at the end of objects, so if
21380      it looks like we might want one, insert a NOP.  */
21381   {
21382     rtx insn = get_last_insn ();
21383     while (insn
21384            && NOTE_P (insn)
21385            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
21386       insn = PREV_INSN (insn);
21387     if (insn
21388         && (LABEL_P (insn)
21389             || (NOTE_P (insn)
21390                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
21391       fputs ("\tnop\n", file);
21392   }
21393 #endif
21394
21395   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
21396      on its format.
21397
21398      We don't output a traceback table if -finhibit-size-directive was
21399      used.  The documentation for -finhibit-size-directive reads
21400      ``don't output a @code{.size} assembler directive, or anything
21401      else that would cause trouble if the function is split in the
21402      middle, and the two halves are placed at locations far apart in
21403      memory.''  The traceback table has this property, since it
21404      includes the offset from the start of the function to the
21405      traceback table itself.
21406
21407      System V.4 Powerpc's (and the embedded ABI derived from it) use a
21408      different traceback table.  */
21409   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
21410       && rs6000_traceback != traceback_none && !cfun->is_thunk)
21411     {
21412       const char *fname = NULL;
21413       const char *language_string = lang_hooks.name;
21414       int fixed_parms = 0, float_parms = 0, parm_info = 0;
21415       int i;
21416       int optional_tbtab;
21417       rs6000_stack_t *info = rs6000_stack_info ();
21418
21419       if (rs6000_traceback == traceback_full)
21420         optional_tbtab = 1;
21421       else if (rs6000_traceback == traceback_part)
21422         optional_tbtab = 0;
21423       else
21424         optional_tbtab = !optimize_size && !TARGET_ELF;
21425
21426       if (optional_tbtab)
21427         {
21428           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
21429           while (*fname == '.') /* V.4 encodes . in the name */
21430             fname++;
21431
21432           /* Need label immediately before tbtab, so we can compute
21433              its offset from the function start.  */
21434           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21435           ASM_OUTPUT_LABEL (file, fname);
21436         }
21437
21438       /* The .tbtab pseudo-op can only be used for the first eight
21439          expressions, since it can't handle the possibly variable
21440          length fields that follow.  However, if you omit the optional
21441          fields, the assembler outputs zeros for all optional fields
21442          anyways, giving each variable length field is minimum length
21443          (as defined in sys/debug.h).  Thus we can not use the .tbtab
21444          pseudo-op at all.  */
21445
21446       /* An all-zero word flags the start of the tbtab, for debuggers
21447          that have to find it by searching forward from the entry
21448          point or from the current pc.  */
21449       fputs ("\t.long 0\n", file);
21450
21451       /* Tbtab format type.  Use format type 0.  */
21452       fputs ("\t.byte 0,", file);
21453
21454       /* Language type.  Unfortunately, there does not seem to be any
21455          official way to discover the language being compiled, so we
21456          use language_string.
21457          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
21458          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
21459          a number, so for now use 9.  LTO and Go aren't assigned numbers
21460          either, so for now use 0.  */
21461       if (! strcmp (language_string, "GNU C")
21462           || ! strcmp (language_string, "GNU GIMPLE")
21463           || ! strcmp (language_string, "GNU Go"))
21464         i = 0;
21465       else if (! strcmp (language_string, "GNU F77")
21466                || ! strcmp (language_string, "GNU Fortran"))
21467         i = 1;
21468       else if (! strcmp (language_string, "GNU Pascal"))
21469         i = 2;
21470       else if (! strcmp (language_string, "GNU Ada"))
21471         i = 3;
21472       else if (! strcmp (language_string, "GNU C++")
21473                || ! strcmp (language_string, "GNU Objective-C++"))
21474         i = 9;
21475       else if (! strcmp (language_string, "GNU Java"))
21476         i = 13;
21477       else if (! strcmp (language_string, "GNU Objective-C"))
21478         i = 14;
21479       else
21480         gcc_unreachable ();
21481       fprintf (file, "%d,", i);
21482
21483       /* 8 single bit fields: global linkage (not set for C extern linkage,
21484          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
21485          from start of procedure stored in tbtab, internal function, function
21486          has controlled storage, function has no toc, function uses fp,
21487          function logs/aborts fp operations.  */
21488       /* Assume that fp operations are used if any fp reg must be saved.  */
21489       fprintf (file, "%d,",
21490                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
21491
21492       /* 6 bitfields: function is interrupt handler, name present in
21493          proc table, function calls alloca, on condition directives
21494          (controls stack walks, 3 bits), saves condition reg, saves
21495          link reg.  */
21496       /* The `function calls alloca' bit seems to be set whenever reg 31 is
21497          set up as a frame pointer, even when there is no alloca call.  */
21498       fprintf (file, "%d,",
21499                ((optional_tbtab << 6)
21500                 | ((optional_tbtab & frame_pointer_needed) << 5)
21501                 | (info->cr_save_p << 1)
21502                 | (info->lr_save_p)));
21503
21504       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
21505          (6 bits).  */
21506       fprintf (file, "%d,",
21507                (info->push_p << 7) | (64 - info->first_fp_reg_save));
21508
21509       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
21510       fprintf (file, "%d,", (32 - first_reg_to_save ()));
21511
21512       if (optional_tbtab)
21513         {
21514           /* Compute the parameter info from the function decl argument
21515              list.  */
21516           tree decl;
21517           int next_parm_info_bit = 31;
21518
21519           for (decl = DECL_ARGUMENTS (current_function_decl);
21520                decl; decl = DECL_CHAIN (decl))
21521             {
21522               rtx parameter = DECL_INCOMING_RTL (decl);
21523               enum machine_mode mode = GET_MODE (parameter);
21524
21525               if (GET_CODE (parameter) == REG)
21526                 {
21527                   if (SCALAR_FLOAT_MODE_P (mode))
21528                     {
21529                       int bits;
21530
21531                       float_parms++;
21532
21533                       switch (mode)
21534                         {
21535                         case SFmode:
21536                         case SDmode:
21537                           bits = 0x2;
21538                           break;
21539
21540                         case DFmode:
21541                         case DDmode:
21542                         case TFmode:
21543                         case TDmode:
21544                           bits = 0x3;
21545                           break;
21546
21547                         default:
21548                           gcc_unreachable ();
21549                         }
21550
21551                       /* If only one bit will fit, don't or in this entry.  */
21552                       if (next_parm_info_bit > 0)
21553                         parm_info |= (bits << (next_parm_info_bit - 1));
21554                       next_parm_info_bit -= 2;
21555                     }
21556                   else
21557                     {
21558                       fixed_parms += ((GET_MODE_SIZE (mode)
21559                                        + (UNITS_PER_WORD - 1))
21560                                       / UNITS_PER_WORD);
21561                       next_parm_info_bit -= 1;
21562                     }
21563                 }
21564             }
21565         }
21566
21567       /* Number of fixed point parameters.  */
21568       /* This is actually the number of words of fixed point parameters; thus
21569          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
21570       fprintf (file, "%d,", fixed_parms);
21571
21572       /* 2 bitfields: number of floating point parameters (7 bits), parameters
21573          all on stack.  */
21574       /* This is actually the number of fp registers that hold parameters;
21575          and thus the maximum value is 13.  */
21576       /* Set parameters on stack bit if parameters are not in their original
21577          registers, regardless of whether they are on the stack?  Xlc
21578          seems to set the bit when not optimizing.  */
21579       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
21580
21581       if (! optional_tbtab)
21582         return;
21583
21584       /* Optional fields follow.  Some are variable length.  */
21585
21586       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
21587          11 double float.  */
21588       /* There is an entry for each parameter in a register, in the order that
21589          they occur in the parameter list.  Any intervening arguments on the
21590          stack are ignored.  If the list overflows a long (max possible length
21591          34 bits) then completely leave off all elements that don't fit.  */
21592       /* Only emit this long if there was at least one parameter.  */
21593       if (fixed_parms || float_parms)
21594         fprintf (file, "\t.long %d\n", parm_info);
21595
21596       /* Offset from start of code to tb table.  */
21597       fputs ("\t.long ", file);
21598       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21599       RS6000_OUTPUT_BASENAME (file, fname);
21600       putc ('-', file);
21601       rs6000_output_function_entry (file, fname);
21602       putc ('\n', file);
21603
21604       /* Interrupt handler mask.  */
21605       /* Omit this long, since we never set the interrupt handler bit
21606          above.  */
21607
21608       /* Number of CTL (controlled storage) anchors.  */
21609       /* Omit this long, since the has_ctl bit is never set above.  */
21610
21611       /* Displacement into stack of each CTL anchor.  */
21612       /* Omit this list of longs, because there are no CTL anchors.  */
21613
21614       /* Length of function name.  */
21615       if (*fname == '*')
21616         ++fname;
21617       fprintf (file, "\t.short %d\n", (int) strlen (fname));
21618
21619       /* Function name.  */
21620       assemble_string (fname, strlen (fname));
21621
21622       /* Register for alloca automatic storage; this is always reg 31.
21623          Only emit this if the alloca bit was set above.  */
21624       if (frame_pointer_needed)
21625         fputs ("\t.byte 31\n", file);
21626
21627       fputs ("\t.align 2\n", file);
21628     }
21629 }
21630 \f
21631 /* A C compound statement that outputs the assembler code for a thunk
21632    function, used to implement C++ virtual function calls with
21633    multiple inheritance.  The thunk acts as a wrapper around a virtual
21634    function, adjusting the implicit object parameter before handing
21635    control off to the real function.
21636
21637    First, emit code to add the integer DELTA to the location that
21638    contains the incoming first argument.  Assume that this argument
21639    contains a pointer, and is the one used to pass the `this' pointer
21640    in C++.  This is the incoming argument *before* the function
21641    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
21642    values of all other incoming arguments.
21643
21644    After the addition, emit code to jump to FUNCTION, which is a
21645    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
21646    not touch the return address.  Hence returning from FUNCTION will
21647    return to whoever called the current `thunk'.
21648
21649    The effect must be as if FUNCTION had been called directly with the
21650    adjusted first argument.  This macro is responsible for emitting
21651    all of the code for a thunk function; output_function_prologue()
21652    and output_function_epilogue() are not invoked.
21653
21654    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
21655    been extracted from it.)  It might possibly be useful on some
21656    targets, but probably not.
21657
21658    If you do not define this macro, the target-independent code in the
21659    C++ frontend will generate a less efficient heavyweight thunk that
21660    calls FUNCTION instead of jumping to it.  The generic approach does
21661    not support varargs.  */
21662
21663 static void
21664 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
21665                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
21666                         tree function)
21667 {
21668   rtx this_rtx, insn, funexp;
21669
21670   reload_completed = 1;
21671   epilogue_completed = 1;
21672
21673   /* Mark the end of the (empty) prologue.  */
21674   emit_note (NOTE_INSN_PROLOGUE_END);
21675
21676   /* Find the "this" pointer.  If the function returns a structure,
21677      the structure return pointer is in r3.  */
21678   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
21679     this_rtx = gen_rtx_REG (Pmode, 4);
21680   else
21681     this_rtx = gen_rtx_REG (Pmode, 3);
21682
21683   /* Apply the constant offset, if required.  */
21684   if (delta)
21685     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
21686
21687   /* Apply the offset from the vtable, if required.  */
21688   if (vcall_offset)
21689     {
21690       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
21691       rtx tmp = gen_rtx_REG (Pmode, 12);
21692
21693       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
21694       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
21695         {
21696           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
21697           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
21698         }
21699       else
21700         {
21701           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
21702
21703           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
21704         }
21705       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
21706     }
21707
21708   /* Generate a tail call to the target function.  */
21709   if (!TREE_USED (function))
21710     {
21711       assemble_external (function);
21712       TREE_USED (function) = 1;
21713     }
21714   funexp = XEXP (DECL_RTL (function), 0);
21715   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
21716
21717 #if TARGET_MACHO
21718   if (MACHOPIC_INDIRECT)
21719     funexp = machopic_indirect_call_target (funexp);
21720 #endif
21721
21722   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
21723      generate sibcall RTL explicitly.  */
21724   insn = emit_call_insn (
21725            gen_rtx_PARALLEL (VOIDmode,
21726              gen_rtvec (4,
21727                         gen_rtx_CALL (VOIDmode,
21728                                       funexp, const0_rtx),
21729                         gen_rtx_USE (VOIDmode, const0_rtx),
21730                         gen_rtx_USE (VOIDmode,
21731                                      gen_rtx_REG (SImode,
21732                                                   LR_REGNO)),
21733                         ret_rtx)));
21734   SIBLING_CALL_P (insn) = 1;
21735   emit_barrier ();
21736
21737   /* Run just enough of rest_of_compilation to get the insns emitted.
21738      There's not really enough bulk here to make other passes such as
21739      instruction scheduling worth while.  Note that use_thunk calls
21740      assemble_start_function and assemble_end_function.  */
21741   insn = get_insns ();
21742   insn_locators_alloc ();
21743   shorten_branches (insn);
21744   final_start_function (insn, file, 1);
21745   final (insn, file, 1);
21746   final_end_function ();
21747
21748   reload_completed = 0;
21749   epilogue_completed = 0;
21750 }
21751 \f
21752 /* A quick summary of the various types of 'constant-pool tables'
21753    under PowerPC:
21754
21755    Target       Flags           Name            One table per
21756    AIX          (none)          AIX TOC         object file
21757    AIX          -mfull-toc      AIX TOC         object file
21758    AIX          -mminimal-toc   AIX minimal TOC translation unit
21759    SVR4/EABI    (none)          SVR4 SDATA      object file
21760    SVR4/EABI    -fpic           SVR4 pic        object file
21761    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
21762    SVR4/EABI    -mrelocatable   EABI TOC        function
21763    SVR4/EABI    -maix           AIX TOC         object file
21764    SVR4/EABI    -maix -mminimal-toc
21765                                 AIX minimal TOC translation unit
21766
21767    Name                 Reg.    Set by  entries       contains:
21768                                         made by  addrs? fp?     sum?
21769
21770    AIX TOC              2       crt0    as       Y      option  option
21771    AIX minimal TOC      30      prolog  gcc      Y      Y       option
21772    SVR4 SDATA           13      crt0    gcc      N      Y       N
21773    SVR4 pic             30      prolog  ld       Y      not yet N
21774    SVR4 PIC             30      prolog  gcc      Y      option  option
21775    EABI TOC             30      prolog  gcc      Y      option  option
21776
21777 */
21778
21779 /* Hash functions for the hash table.  */
21780
21781 static unsigned
21782 rs6000_hash_constant (rtx k)
21783 {
21784   enum rtx_code code = GET_CODE (k);
21785   enum machine_mode mode = GET_MODE (k);
21786   unsigned result = (code << 3) ^ mode;
21787   const char *format;
21788   int flen, fidx;
21789
21790   format = GET_RTX_FORMAT (code);
21791   flen = strlen (format);
21792   fidx = 0;
21793
21794   switch (code)
21795     {
21796     case LABEL_REF:
21797       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
21798
21799     case CONST_DOUBLE:
21800       if (mode != VOIDmode)
21801         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
21802       flen = 2;
21803       break;
21804
21805     case CODE_LABEL:
21806       fidx = 3;
21807       break;
21808
21809     default:
21810       break;
21811     }
21812
21813   for (; fidx < flen; fidx++)
21814     switch (format[fidx])
21815       {
21816       case 's':
21817         {
21818           unsigned i, len;
21819           const char *str = XSTR (k, fidx);
21820           len = strlen (str);
21821           result = result * 613 + len;
21822           for (i = 0; i < len; i++)
21823             result = result * 613 + (unsigned) str[i];
21824           break;
21825         }
21826       case 'u':
21827       case 'e':
21828         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
21829         break;
21830       case 'i':
21831       case 'n':
21832         result = result * 613 + (unsigned) XINT (k, fidx);
21833         break;
21834       case 'w':
21835         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
21836           result = result * 613 + (unsigned) XWINT (k, fidx);
21837         else
21838           {
21839             size_t i;
21840             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
21841               result = result * 613 + (unsigned) (XWINT (k, fidx)
21842                                                   >> CHAR_BIT * i);
21843           }
21844         break;
21845       case '0':
21846         break;
21847       default:
21848         gcc_unreachable ();
21849       }
21850
21851   return result;
21852 }
21853
21854 static unsigned
21855 toc_hash_function (const void *hash_entry)
21856 {
21857   const struct toc_hash_struct *thc =
21858     (const struct toc_hash_struct *) hash_entry;
21859   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
21860 }
21861
21862 /* Compare H1 and H2 for equivalence.  */
21863
21864 static int
21865 toc_hash_eq (const void *h1, const void *h2)
21866 {
21867   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
21868   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
21869
21870   if (((const struct toc_hash_struct *) h1)->key_mode
21871       != ((const struct toc_hash_struct *) h2)->key_mode)
21872     return 0;
21873
21874   return rtx_equal_p (r1, r2);
21875 }
21876
21877 /* These are the names given by the C++ front-end to vtables, and
21878    vtable-like objects.  Ideally, this logic should not be here;
21879    instead, there should be some programmatic way of inquiring as
21880    to whether or not an object is a vtable.  */
21881
21882 #define VTABLE_NAME_P(NAME)                             \
21883   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
21884   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
21885   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
21886   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
21887   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
21888
21889 #ifdef NO_DOLLAR_IN_LABEL
21890 /* Return a GGC-allocated character string translating dollar signs in
21891    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
21892
21893 const char *
21894 rs6000_xcoff_strip_dollar (const char *name)
21895 {
21896   char *strip, *p;
21897   int len;
21898
21899   p = strchr (name, '$');
21900
21901   if (p == 0 || p == name)
21902     return name;
21903
21904   len = strlen (name);
21905   strip = (char *) alloca (len + 1);
21906   strcpy (strip, name);
21907   p = strchr (strip, '$');
21908   while (p)
21909     {
21910       *p = '_';
21911       p = strchr (p + 1, '$');
21912     }
21913
21914   return ggc_alloc_string (strip, len);
21915 }
21916 #endif
21917
21918 void
21919 rs6000_output_symbol_ref (FILE *file, rtx x)
21920 {
21921   /* Currently C++ toc references to vtables can be emitted before it
21922      is decided whether the vtable is public or private.  If this is
21923      the case, then the linker will eventually complain that there is
21924      a reference to an unknown section.  Thus, for vtables only,
21925      we emit the TOC reference to reference the symbol and not the
21926      section.  */
21927   const char *name = XSTR (x, 0);
21928
21929   if (VTABLE_NAME_P (name))
21930     {
21931       RS6000_OUTPUT_BASENAME (file, name);
21932     }
21933   else
21934     assemble_name (file, name);
21935 }
21936
21937 /* Output a TOC entry.  We derive the entry name from what is being
21938    written.  */
21939
21940 void
21941 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
21942 {
21943   char buf[256];
21944   const char *name = buf;
21945   rtx base = x;
21946   HOST_WIDE_INT offset = 0;
21947
21948   gcc_assert (!TARGET_NO_TOC);
21949
21950   /* When the linker won't eliminate them, don't output duplicate
21951      TOC entries (this happens on AIX if there is any kind of TOC,
21952      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
21953      CODE_LABELs.  */
21954   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
21955     {
21956       struct toc_hash_struct *h;
21957       void * * found;
21958
21959       /* Create toc_hash_table.  This can't be done at TARGET_OPTION_OVERRIDE
21960          time because GGC is not initialized at that point.  */
21961       if (toc_hash_table == NULL)
21962         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
21963                                           toc_hash_eq, NULL);
21964
21965       h = ggc_alloc_toc_hash_struct ();
21966       h->key = x;
21967       h->key_mode = mode;
21968       h->labelno = labelno;
21969
21970       found = htab_find_slot (toc_hash_table, h, INSERT);
21971       if (*found == NULL)
21972         *found = h;
21973       else  /* This is indeed a duplicate.
21974                Set this label equal to that label.  */
21975         {
21976           fputs ("\t.set ", file);
21977           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
21978           fprintf (file, "%d,", labelno);
21979           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
21980           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
21981                                               found)->labelno));
21982           return;
21983         }
21984     }
21985
21986   /* If we're going to put a double constant in the TOC, make sure it's
21987      aligned properly when strict alignment is on.  */
21988   if (GET_CODE (x) == CONST_DOUBLE
21989       && STRICT_ALIGNMENT
21990       && GET_MODE_BITSIZE (mode) >= 64
21991       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
21992     ASM_OUTPUT_ALIGN (file, 3);
21993   }
21994
21995   (*targetm.asm_out.internal_label) (file, "LC", labelno);
21996
21997   /* Handle FP constants specially.  Note that if we have a minimal
21998      TOC, things we put here aren't actually in the TOC, so we can allow
21999      FP constants.  */
22000   if (GET_CODE (x) == CONST_DOUBLE &&
22001       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
22002     {
22003       REAL_VALUE_TYPE rv;
22004       long k[4];
22005
22006       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22007       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22008         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
22009       else
22010         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
22011
22012       if (TARGET_64BIT)
22013         {
22014           if (TARGET_MINIMAL_TOC)
22015             fputs (DOUBLE_INT_ASM_OP, file);
22016           else
22017             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22018                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22019                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22020           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
22021                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22022                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22023           return;
22024         }
22025       else
22026         {
22027           if (TARGET_MINIMAL_TOC)
22028             fputs ("\t.long ", file);
22029           else
22030             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22031                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22032                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22033           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
22034                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22035                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22036           return;
22037         }
22038     }
22039   else if (GET_CODE (x) == CONST_DOUBLE &&
22040            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
22041     {
22042       REAL_VALUE_TYPE rv;
22043       long k[2];
22044
22045       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22046
22047       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22048         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
22049       else
22050         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
22051
22052       if (TARGET_64BIT)
22053         {
22054           if (TARGET_MINIMAL_TOC)
22055             fputs (DOUBLE_INT_ASM_OP, file);
22056           else
22057             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22058                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22059           fprintf (file, "0x%lx%08lx\n",
22060                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22061           return;
22062         }
22063       else
22064         {
22065           if (TARGET_MINIMAL_TOC)
22066             fputs ("\t.long ", file);
22067           else
22068             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22069                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22070           fprintf (file, "0x%lx,0x%lx\n",
22071                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22072           return;
22073         }
22074     }
22075   else if (GET_CODE (x) == CONST_DOUBLE &&
22076            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
22077     {
22078       REAL_VALUE_TYPE rv;
22079       long l;
22080
22081       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22082       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22083         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
22084       else
22085         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
22086
22087       if (TARGET_64BIT)
22088         {
22089           if (TARGET_MINIMAL_TOC)
22090             fputs (DOUBLE_INT_ASM_OP, file);
22091           else
22092             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22093           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
22094           return;
22095         }
22096       else
22097         {
22098           if (TARGET_MINIMAL_TOC)
22099             fputs ("\t.long ", file);
22100           else
22101             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22102           fprintf (file, "0x%lx\n", l & 0xffffffff);
22103           return;
22104         }
22105     }
22106   else if (GET_MODE (x) == VOIDmode
22107            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
22108     {
22109       unsigned HOST_WIDE_INT low;
22110       HOST_WIDE_INT high;
22111
22112       if (GET_CODE (x) == CONST_DOUBLE)
22113         {
22114           low = CONST_DOUBLE_LOW (x);
22115           high = CONST_DOUBLE_HIGH (x);
22116         }
22117       else
22118 #if HOST_BITS_PER_WIDE_INT == 32
22119         {
22120           low = INTVAL (x);
22121           high = (low & 0x80000000) ? ~0 : 0;
22122         }
22123 #else
22124         {
22125           low = INTVAL (x) & 0xffffffff;
22126           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
22127         }
22128 #endif
22129
22130       /* TOC entries are always Pmode-sized, but since this
22131          is a bigendian machine then if we're putting smaller
22132          integer constants in the TOC we have to pad them.
22133          (This is still a win over putting the constants in
22134          a separate constant pool, because then we'd have
22135          to have both a TOC entry _and_ the actual constant.)
22136
22137          For a 32-bit target, CONST_INT values are loaded and shifted
22138          entirely within `low' and can be stored in one TOC entry.  */
22139
22140       /* It would be easy to make this work, but it doesn't now.  */
22141       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
22142
22143       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
22144         {
22145 #if HOST_BITS_PER_WIDE_INT == 32
22146           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
22147                          POINTER_SIZE, &low, &high, 0);
22148 #else
22149           low |= high << 32;
22150           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
22151           high = (HOST_WIDE_INT) low >> 32;
22152           low &= 0xffffffff;
22153 #endif
22154         }
22155
22156       if (TARGET_64BIT)
22157         {
22158           if (TARGET_MINIMAL_TOC)
22159             fputs (DOUBLE_INT_ASM_OP, file);
22160           else
22161             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22162                      (long) high & 0xffffffff, (long) low & 0xffffffff);
22163           fprintf (file, "0x%lx%08lx\n",
22164                    (long) high & 0xffffffff, (long) low & 0xffffffff);
22165           return;
22166         }
22167       else
22168         {
22169           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
22170             {
22171               if (TARGET_MINIMAL_TOC)
22172                 fputs ("\t.long ", file);
22173               else
22174                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22175                          (long) high & 0xffffffff, (long) low & 0xffffffff);
22176               fprintf (file, "0x%lx,0x%lx\n",
22177                        (long) high & 0xffffffff, (long) low & 0xffffffff);
22178             }
22179           else
22180             {
22181               if (TARGET_MINIMAL_TOC)
22182                 fputs ("\t.long ", file);
22183               else
22184                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
22185               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
22186             }
22187           return;
22188         }
22189     }
22190
22191   if (GET_CODE (x) == CONST)
22192     {
22193       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
22194                   && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
22195
22196       base = XEXP (XEXP (x, 0), 0);
22197       offset = INTVAL (XEXP (XEXP (x, 0), 1));
22198     }
22199
22200   switch (GET_CODE (base))
22201     {
22202     case SYMBOL_REF:
22203       name = XSTR (base, 0);
22204       break;
22205
22206     case LABEL_REF:
22207       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
22208                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
22209       break;
22210
22211     case CODE_LABEL:
22212       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
22213       break;
22214
22215     default:
22216       gcc_unreachable ();
22217     }
22218
22219   if (TARGET_MINIMAL_TOC)
22220     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
22221   else
22222     {
22223       fputs ("\t.tc ", file);
22224       RS6000_OUTPUT_BASENAME (file, name);
22225
22226       if (offset < 0)
22227         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
22228       else if (offset)
22229         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
22230
22231       fputs ("[TC],", file);
22232     }
22233
22234   /* Currently C++ toc references to vtables can be emitted before it
22235      is decided whether the vtable is public or private.  If this is
22236      the case, then the linker will eventually complain that there is
22237      a TOC reference to an unknown section.  Thus, for vtables only,
22238      we emit the TOC reference to reference the symbol and not the
22239      section.  */
22240   if (VTABLE_NAME_P (name))
22241     {
22242       RS6000_OUTPUT_BASENAME (file, name);
22243       if (offset < 0)
22244         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
22245       else if (offset > 0)
22246         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
22247     }
22248   else
22249     output_addr_const (file, x);
22250   putc ('\n', file);
22251 }
22252 \f
22253 /* Output an assembler pseudo-op to write an ASCII string of N characters
22254    starting at P to FILE.
22255
22256    On the RS/6000, we have to do this using the .byte operation and
22257    write out special characters outside the quoted string.
22258    Also, the assembler is broken; very long strings are truncated,
22259    so we must artificially break them up early.  */
22260
22261 void
22262 output_ascii (FILE *file, const char *p, int n)
22263 {
22264   char c;
22265   int i, count_string;
22266   const char *for_string = "\t.byte \"";
22267   const char *for_decimal = "\t.byte ";
22268   const char *to_close = NULL;
22269
22270   count_string = 0;
22271   for (i = 0; i < n; i++)
22272     {
22273       c = *p++;
22274       if (c >= ' ' && c < 0177)
22275         {
22276           if (for_string)
22277             fputs (for_string, file);
22278           putc (c, file);
22279
22280           /* Write two quotes to get one.  */
22281           if (c == '"')
22282             {
22283               putc (c, file);
22284               ++count_string;
22285             }
22286
22287           for_string = NULL;
22288           for_decimal = "\"\n\t.byte ";
22289           to_close = "\"\n";
22290           ++count_string;
22291
22292           if (count_string >= 512)
22293             {
22294               fputs (to_close, file);
22295
22296               for_string = "\t.byte \"";
22297               for_decimal = "\t.byte ";
22298               to_close = NULL;
22299               count_string = 0;
22300             }
22301         }
22302       else
22303         {
22304           if (for_decimal)
22305             fputs (for_decimal, file);
22306           fprintf (file, "%d", c);
22307
22308           for_string = "\n\t.byte \"";
22309           for_decimal = ", ";
22310           to_close = "\n";
22311           count_string = 0;
22312         }
22313     }
22314
22315   /* Now close the string if we have written one.  Then end the line.  */
22316   if (to_close)
22317     fputs (to_close, file);
22318 }
22319 \f
22320 /* Generate a unique section name for FILENAME for a section type
22321    represented by SECTION_DESC.  Output goes into BUF.
22322
22323    SECTION_DESC can be any string, as long as it is different for each
22324    possible section type.
22325
22326    We name the section in the same manner as xlc.  The name begins with an
22327    underscore followed by the filename (after stripping any leading directory
22328    names) with the last period replaced by the string SECTION_DESC.  If
22329    FILENAME does not contain a period, SECTION_DESC is appended to the end of
22330    the name.  */
22331
22332 void
22333 rs6000_gen_section_name (char **buf, const char *filename,
22334                          const char *section_desc)
22335 {
22336   const char *q, *after_last_slash, *last_period = 0;
22337   char *p;
22338   int len;
22339
22340   after_last_slash = filename;
22341   for (q = filename; *q; q++)
22342     {
22343       if (*q == '/')
22344         after_last_slash = q + 1;
22345       else if (*q == '.')
22346         last_period = q;
22347     }
22348
22349   len = strlen (after_last_slash) + strlen (section_desc) + 2;
22350   *buf = (char *) xmalloc (len);
22351
22352   p = *buf;
22353   *p++ = '_';
22354
22355   for (q = after_last_slash; *q; q++)
22356     {
22357       if (q == last_period)
22358         {
22359           strcpy (p, section_desc);
22360           p += strlen (section_desc);
22361           break;
22362         }
22363
22364       else if (ISALNUM (*q))
22365         *p++ = *q;
22366     }
22367
22368   if (last_period == 0)
22369     strcpy (p, section_desc);
22370   else
22371     *p = '\0';
22372 }
22373 \f
22374 /* Emit profile function.  */
22375
22376 void
22377 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
22378 {
22379   /* Non-standard profiling for kernels, which just saves LR then calls
22380      _mcount without worrying about arg saves.  The idea is to change
22381      the function prologue as little as possible as it isn't easy to
22382      account for arg save/restore code added just for _mcount.  */
22383   if (TARGET_PROFILE_KERNEL)
22384     return;
22385
22386   if (DEFAULT_ABI == ABI_AIX)
22387     {
22388 #ifndef NO_PROFILE_COUNTERS
22389 # define NO_PROFILE_COUNTERS 0
22390 #endif
22391       if (NO_PROFILE_COUNTERS)
22392         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22393                            LCT_NORMAL, VOIDmode, 0);
22394       else
22395         {
22396           char buf[30];
22397           const char *label_name;
22398           rtx fun;
22399
22400           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22401           label_name = ggc_strdup ((*targetm.strip_name_encoding) (buf));
22402           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
22403
22404           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22405                              LCT_NORMAL, VOIDmode, 1, fun, Pmode);
22406         }
22407     }
22408   else if (DEFAULT_ABI == ABI_DARWIN)
22409     {
22410       const char *mcount_name = RS6000_MCOUNT;
22411       int caller_addr_regno = LR_REGNO;
22412
22413       /* Be conservative and always set this, at least for now.  */
22414       crtl->uses_pic_offset_table = 1;
22415
22416 #if TARGET_MACHO
22417       /* For PIC code, set up a stub and collect the caller's address
22418          from r0, which is where the prologue puts it.  */
22419       if (MACHOPIC_INDIRECT
22420           && crtl->uses_pic_offset_table)
22421         caller_addr_regno = 0;
22422 #endif
22423       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
22424                          LCT_NORMAL, VOIDmode, 1,
22425                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
22426     }
22427 }
22428
22429 /* Write function profiler code.  */
22430
22431 void
22432 output_function_profiler (FILE *file, int labelno)
22433 {
22434   char buf[100];
22435
22436   switch (DEFAULT_ABI)
22437     {
22438     default:
22439       gcc_unreachable ();
22440
22441     case ABI_V4:
22442       if (!TARGET_32BIT)
22443         {
22444           warning (0, "no profiling of 64-bit code for this ABI");
22445           return;
22446         }
22447       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22448       fprintf (file, "\tmflr %s\n", reg_names[0]);
22449       if (NO_PROFILE_COUNTERS)
22450         {
22451           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22452                        reg_names[0], reg_names[1]);
22453         }
22454       else if (TARGET_SECURE_PLT && flag_pic)
22455         {
22456           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
22457                        reg_names[0], reg_names[1]);
22458           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22459           asm_fprintf (file, "\t{cau|addis} %s,%s,",
22460                        reg_names[12], reg_names[12]);
22461           assemble_name (file, buf);
22462           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
22463           assemble_name (file, buf);
22464           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
22465         }
22466       else if (flag_pic == 1)
22467         {
22468           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
22469           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22470                        reg_names[0], reg_names[1]);
22471           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22472           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
22473           assemble_name (file, buf);
22474           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
22475         }
22476       else if (flag_pic > 1)
22477         {
22478           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22479                        reg_names[0], reg_names[1]);
22480           /* Now, we need to get the address of the label.  */
22481           fputs ("\tbcl 20,31,1f\n\t.long ", file);
22482           assemble_name (file, buf);
22483           fputs ("-.\n1:", file);
22484           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
22485           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
22486                        reg_names[0], reg_names[11]);
22487           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
22488                        reg_names[0], reg_names[0], reg_names[11]);
22489         }
22490       else
22491         {
22492           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
22493           assemble_name (file, buf);
22494           fputs ("@ha\n", file);
22495           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22496                        reg_names[0], reg_names[1]);
22497           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
22498           assemble_name (file, buf);
22499           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
22500         }
22501
22502       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
22503       fprintf (file, "\tbl %s%s\n",
22504                RS6000_MCOUNT, flag_pic ? "@plt" : "");
22505       break;
22506
22507     case ABI_AIX:
22508     case ABI_DARWIN:
22509       if (!TARGET_PROFILE_KERNEL)
22510         {
22511           /* Don't do anything, done in output_profile_hook ().  */
22512         }
22513       else
22514         {
22515           gcc_assert (!TARGET_32BIT);
22516
22517           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
22518           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
22519
22520           if (cfun->static_chain_decl != NULL)
22521             {
22522               asm_fprintf (file, "\tstd %s,24(%s)\n",
22523                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22524               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22525               asm_fprintf (file, "\tld %s,24(%s)\n",
22526                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22527             }
22528           else
22529             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22530         }
22531       break;
22532     }
22533 }
22534
22535 \f
22536
22537 /* The following variable value is the last issued insn.  */
22538
22539 static rtx last_scheduled_insn;
22540
22541 /* The following variable helps to balance issuing of load and
22542    store instructions */
22543
22544 static int load_store_pendulum;
22545
22546 /* Power4 load update and store update instructions are cracked into a
22547    load or store and an integer insn which are executed in the same cycle.
22548    Branches have their own dispatch slot which does not count against the
22549    GCC issue rate, but it changes the program flow so there are no other
22550    instructions to issue in this cycle.  */
22551
22552 static int
22553 rs6000_variable_issue_1 (rtx insn, int more)
22554 {
22555   last_scheduled_insn = insn;
22556   if (GET_CODE (PATTERN (insn)) == USE
22557       || GET_CODE (PATTERN (insn)) == CLOBBER)
22558     {
22559       cached_can_issue_more = more;
22560       return cached_can_issue_more;
22561     }
22562
22563   if (insn_terminates_group_p (insn, current_group))
22564     {
22565       cached_can_issue_more = 0;
22566       return cached_can_issue_more;
22567     }
22568
22569   /* If no reservation, but reach here */
22570   if (recog_memoized (insn) < 0)
22571     return more;
22572
22573   if (rs6000_sched_groups)
22574     {
22575       if (is_microcoded_insn (insn))
22576         cached_can_issue_more = 0;
22577       else if (is_cracked_insn (insn))
22578         cached_can_issue_more = more > 2 ? more - 2 : 0;
22579       else
22580         cached_can_issue_more = more - 1;
22581
22582       return cached_can_issue_more;
22583     }
22584
22585   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
22586     return 0;
22587
22588   cached_can_issue_more = more - 1;
22589   return cached_can_issue_more;
22590 }
22591
22592 static int
22593 rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
22594 {
22595   int r = rs6000_variable_issue_1 (insn, more);
22596   if (verbose)
22597     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
22598   return r;
22599 }
22600
22601 /* Adjust the cost of a scheduling dependency.  Return the new cost of
22602    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
22603
22604 static int
22605 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22606 {
22607   enum attr_type attr_type;
22608
22609   if (! recog_memoized (insn))
22610     return 0;
22611
22612   switch (REG_NOTE_KIND (link))
22613     {
22614     case REG_DEP_TRUE:
22615       {
22616         /* Data dependency; DEP_INSN writes a register that INSN reads
22617            some cycles later.  */
22618
22619         /* Separate a load from a narrower, dependent store.  */
22620         if (rs6000_sched_groups
22621             && GET_CODE (PATTERN (insn)) == SET
22622             && GET_CODE (PATTERN (dep_insn)) == SET
22623             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
22624             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
22625             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
22626                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
22627           return cost + 14;
22628
22629         attr_type = get_attr_type (insn);
22630
22631         switch (attr_type)
22632           {
22633           case TYPE_JMPREG:
22634             /* Tell the first scheduling pass about the latency between
22635                a mtctr and bctr (and mtlr and br/blr).  The first
22636                scheduling pass will not know about this latency since
22637                the mtctr instruction, which has the latency associated
22638                to it, will be generated by reload.  */
22639             return TARGET_POWER ? 5 : 4;
22640           case TYPE_BRANCH:
22641             /* Leave some extra cycles between a compare and its
22642                dependent branch, to inhibit expensive mispredicts.  */
22643             if ((rs6000_cpu_attr == CPU_PPC603
22644                  || rs6000_cpu_attr == CPU_PPC604
22645                  || rs6000_cpu_attr == CPU_PPC604E
22646                  || rs6000_cpu_attr == CPU_PPC620
22647                  || rs6000_cpu_attr == CPU_PPC630
22648                  || rs6000_cpu_attr == CPU_PPC750
22649                  || rs6000_cpu_attr == CPU_PPC7400
22650                  || rs6000_cpu_attr == CPU_PPC7450
22651                  || rs6000_cpu_attr == CPU_POWER4
22652                  || rs6000_cpu_attr == CPU_POWER5
22653                  || rs6000_cpu_attr == CPU_POWER7
22654                  || rs6000_cpu_attr == CPU_CELL)
22655                 && recog_memoized (dep_insn)
22656                 && (INSN_CODE (dep_insn) >= 0))
22657
22658               switch (get_attr_type (dep_insn))
22659                 {
22660                 case TYPE_CMP:
22661                 case TYPE_COMPARE:
22662                 case TYPE_DELAYED_COMPARE:
22663                 case TYPE_IMUL_COMPARE:
22664                 case TYPE_LMUL_COMPARE:
22665                 case TYPE_FPCOMPARE:
22666                 case TYPE_CR_LOGICAL:
22667                 case TYPE_DELAYED_CR:
22668                   return cost + 2;
22669                 default:
22670                   break;
22671                 }
22672             break;
22673
22674           case TYPE_STORE:
22675           case TYPE_STORE_U:
22676           case TYPE_STORE_UX:
22677           case TYPE_FPSTORE:
22678           case TYPE_FPSTORE_U:
22679           case TYPE_FPSTORE_UX:
22680             if ((rs6000_cpu == PROCESSOR_POWER6)
22681                 && recog_memoized (dep_insn)
22682                 && (INSN_CODE (dep_insn) >= 0))
22683               {
22684
22685                 if (GET_CODE (PATTERN (insn)) != SET)
22686                   /* If this happens, we have to extend this to schedule
22687                      optimally.  Return default for now.  */
22688                   return cost;
22689
22690                 /* Adjust the cost for the case where the value written
22691                    by a fixed point operation is used as the address
22692                    gen value on a store. */
22693                 switch (get_attr_type (dep_insn))
22694                   {
22695                   case TYPE_LOAD:
22696                   case TYPE_LOAD_U:
22697                   case TYPE_LOAD_UX:
22698                   case TYPE_CNTLZ:
22699                     {
22700                       if (! store_data_bypass_p (dep_insn, insn))
22701                         return 4;
22702                       break;
22703                     }
22704                   case TYPE_LOAD_EXT:
22705                   case TYPE_LOAD_EXT_U:
22706                   case TYPE_LOAD_EXT_UX:
22707                   case TYPE_VAR_SHIFT_ROTATE:
22708                   case TYPE_VAR_DELAYED_COMPARE:
22709                     {
22710                       if (! store_data_bypass_p (dep_insn, insn))
22711                         return 6;
22712                       break;
22713                     }
22714                   case TYPE_INTEGER:
22715                   case TYPE_COMPARE:
22716                   case TYPE_FAST_COMPARE:
22717                   case TYPE_EXTS:
22718                   case TYPE_SHIFT:
22719                   case TYPE_INSERT_WORD:
22720                   case TYPE_INSERT_DWORD:
22721                   case TYPE_FPLOAD_U:
22722                   case TYPE_FPLOAD_UX:
22723                   case TYPE_STORE_U:
22724                   case TYPE_STORE_UX:
22725                   case TYPE_FPSTORE_U:
22726                   case TYPE_FPSTORE_UX:
22727                     {
22728                       if (! store_data_bypass_p (dep_insn, insn))
22729                         return 3;
22730                       break;
22731                     }
22732                   case TYPE_IMUL:
22733                   case TYPE_IMUL2:
22734                   case TYPE_IMUL3:
22735                   case TYPE_LMUL:
22736                   case TYPE_IMUL_COMPARE:
22737                   case TYPE_LMUL_COMPARE:
22738                     {
22739                       if (! store_data_bypass_p (dep_insn, insn))
22740                         return 17;
22741                       break;
22742                     }
22743                   case TYPE_IDIV:
22744                     {
22745                       if (! store_data_bypass_p (dep_insn, insn))
22746                         return 45;
22747                       break;
22748                     }
22749                   case TYPE_LDIV:
22750                     {
22751                       if (! store_data_bypass_p (dep_insn, insn))
22752                         return 57;
22753                       break;
22754                     }
22755                   default:
22756                     break;
22757                   }
22758               }
22759             break;
22760
22761           case TYPE_LOAD:
22762           case TYPE_LOAD_U:
22763           case TYPE_LOAD_UX:
22764           case TYPE_LOAD_EXT:
22765           case TYPE_LOAD_EXT_U:
22766           case TYPE_LOAD_EXT_UX:
22767             if ((rs6000_cpu == PROCESSOR_POWER6)
22768                 && recog_memoized (dep_insn)
22769                 && (INSN_CODE (dep_insn) >= 0))
22770               {
22771
22772                 /* Adjust the cost for the case where the value written
22773                    by a fixed point instruction is used within the address
22774                    gen portion of a subsequent load(u)(x) */
22775                 switch (get_attr_type (dep_insn))
22776                   {
22777                   case TYPE_LOAD:
22778                   case TYPE_LOAD_U:
22779                   case TYPE_LOAD_UX:
22780                   case TYPE_CNTLZ:
22781                     {
22782                       if (set_to_load_agen (dep_insn, insn))
22783                         return 4;
22784                       break;
22785                     }
22786                   case TYPE_LOAD_EXT:
22787                   case TYPE_LOAD_EXT_U:
22788                   case TYPE_LOAD_EXT_UX:
22789                   case TYPE_VAR_SHIFT_ROTATE:
22790                   case TYPE_VAR_DELAYED_COMPARE:
22791                     {
22792                       if (set_to_load_agen (dep_insn, insn))
22793                         return 6;
22794                       break;
22795                     }
22796                   case TYPE_INTEGER:
22797                   case TYPE_COMPARE:
22798                   case TYPE_FAST_COMPARE:
22799                   case TYPE_EXTS:
22800                   case TYPE_SHIFT:
22801                   case TYPE_INSERT_WORD:
22802                   case TYPE_INSERT_DWORD:
22803                   case TYPE_FPLOAD_U:
22804                   case TYPE_FPLOAD_UX:
22805                   case TYPE_STORE_U:
22806                   case TYPE_STORE_UX:
22807                   case TYPE_FPSTORE_U:
22808                   case TYPE_FPSTORE_UX:
22809                     {
22810                       if (set_to_load_agen (dep_insn, insn))
22811                         return 3;
22812                       break;
22813                     }
22814                   case TYPE_IMUL:
22815                   case TYPE_IMUL2:
22816                   case TYPE_IMUL3:
22817                   case TYPE_LMUL:
22818                   case TYPE_IMUL_COMPARE:
22819                   case TYPE_LMUL_COMPARE:
22820                     {
22821                       if (set_to_load_agen (dep_insn, insn))
22822                         return 17;
22823                       break;
22824                     }
22825                   case TYPE_IDIV:
22826                     {
22827                       if (set_to_load_agen (dep_insn, insn))
22828                         return 45;
22829                       break;
22830                     }
22831                   case TYPE_LDIV:
22832                     {
22833                       if (set_to_load_agen (dep_insn, insn))
22834                         return 57;
22835                       break;
22836                     }
22837                   default:
22838                     break;
22839                   }
22840               }
22841             break;
22842
22843           case TYPE_FPLOAD:
22844             if ((rs6000_cpu == PROCESSOR_POWER6)
22845                 && recog_memoized (dep_insn)
22846                 && (INSN_CODE (dep_insn) >= 0)
22847                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
22848               return 2;
22849
22850           default:
22851             break;
22852           }
22853
22854         /* Fall out to return default cost.  */
22855       }
22856       break;
22857
22858     case REG_DEP_OUTPUT:
22859       /* Output dependency; DEP_INSN writes a register that INSN writes some
22860          cycles later.  */
22861       if ((rs6000_cpu == PROCESSOR_POWER6)
22862           && recog_memoized (dep_insn)
22863           && (INSN_CODE (dep_insn) >= 0))
22864         {
22865           attr_type = get_attr_type (insn);
22866
22867           switch (attr_type)
22868             {
22869             case TYPE_FP:
22870               if (get_attr_type (dep_insn) == TYPE_FP)
22871                 return 1;
22872               break;
22873             case TYPE_FPLOAD:
22874               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
22875                 return 2;
22876               break;
22877             default:
22878               break;
22879             }
22880         }
22881     case REG_DEP_ANTI:
22882       /* Anti dependency; DEP_INSN reads a register that INSN writes some
22883          cycles later.  */
22884       return 0;
22885
22886     default:
22887       gcc_unreachable ();
22888     }
22889
22890   return cost;
22891 }
22892
22893 /* Debug version of rs6000_adjust_cost.  */
22894
22895 static int
22896 rs6000_debug_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22897 {
22898   int ret = rs6000_adjust_cost (insn, link, dep_insn, cost);
22899
22900   if (ret != cost)
22901     {
22902       const char *dep;
22903
22904       switch (REG_NOTE_KIND (link))
22905         {
22906         default:             dep = "unknown depencency"; break;
22907         case REG_DEP_TRUE:   dep = "data dependency";    break;
22908         case REG_DEP_OUTPUT: dep = "output dependency";  break;
22909         case REG_DEP_ANTI:   dep = "anti depencency";    break;
22910         }
22911
22912       fprintf (stderr,
22913                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
22914                "%s, insn:\n", ret, cost, dep);
22915
22916       debug_rtx (insn);
22917     }
22918
22919   return ret;
22920 }
22921
22922 /* The function returns a true if INSN is microcoded.
22923    Return false otherwise.  */
22924
22925 static bool
22926 is_microcoded_insn (rtx insn)
22927 {
22928   if (!insn || !NONDEBUG_INSN_P (insn)
22929       || GET_CODE (PATTERN (insn)) == USE
22930       || GET_CODE (PATTERN (insn)) == CLOBBER)
22931     return false;
22932
22933   if (rs6000_cpu_attr == CPU_CELL)
22934     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
22935
22936   if (rs6000_sched_groups)
22937     {
22938       enum attr_type type = get_attr_type (insn);
22939       if (type == TYPE_LOAD_EXT_U
22940           || type == TYPE_LOAD_EXT_UX
22941           || type == TYPE_LOAD_UX
22942           || type == TYPE_STORE_UX
22943           || type == TYPE_MFCR)
22944         return true;
22945     }
22946
22947   return false;
22948 }
22949
22950 /* The function returns true if INSN is cracked into 2 instructions
22951    by the processor (and therefore occupies 2 issue slots).  */
22952
22953 static bool
22954 is_cracked_insn (rtx insn)
22955 {
22956   if (!insn || !NONDEBUG_INSN_P (insn)
22957       || GET_CODE (PATTERN (insn)) == USE
22958       || GET_CODE (PATTERN (insn)) == CLOBBER)
22959     return false;
22960
22961   if (rs6000_sched_groups)
22962     {
22963       enum attr_type type = get_attr_type (insn);
22964       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
22965           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
22966           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
22967           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
22968           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
22969           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
22970           || type == TYPE_IDIV || type == TYPE_LDIV
22971           || type == TYPE_INSERT_WORD)
22972         return true;
22973     }
22974
22975   return false;
22976 }
22977
22978 /* The function returns true if INSN can be issued only from
22979    the branch slot.  */
22980
22981 static bool
22982 is_branch_slot_insn (rtx insn)
22983 {
22984   if (!insn || !NONDEBUG_INSN_P (insn)
22985       || GET_CODE (PATTERN (insn)) == USE
22986       || GET_CODE (PATTERN (insn)) == CLOBBER)
22987     return false;
22988
22989   if (rs6000_sched_groups)
22990     {
22991       enum attr_type type = get_attr_type (insn);
22992       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
22993         return true;
22994       return false;
22995     }
22996
22997   return false;
22998 }
22999
23000 /* The function returns true if out_inst sets a value that is
23001    used in the address generation computation of in_insn */
23002 static bool
23003 set_to_load_agen (rtx out_insn, rtx in_insn)
23004 {
23005   rtx out_set, in_set;
23006
23007   /* For performance reasons, only handle the simple case where
23008      both loads are a single_set. */
23009   out_set = single_set (out_insn);
23010   if (out_set)
23011     {
23012       in_set = single_set (in_insn);
23013       if (in_set)
23014         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
23015     }
23016
23017   return false;
23018 }
23019
23020 /* The function returns true if the target storage location of
23021    out_insn is adjacent to the target storage location of in_insn */
23022 /* Return 1 if memory locations are adjacent.  */
23023
23024 static bool
23025 adjacent_mem_locations (rtx insn1, rtx insn2)
23026 {
23027
23028   rtx a = get_store_dest (PATTERN (insn1));
23029   rtx b = get_store_dest (PATTERN (insn2));
23030
23031   if ((GET_CODE (XEXP (a, 0)) == REG
23032        || (GET_CODE (XEXP (a, 0)) == PLUS
23033            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
23034       && (GET_CODE (XEXP (b, 0)) == REG
23035           || (GET_CODE (XEXP (b, 0)) == PLUS
23036               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
23037     {
23038       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
23039       rtx reg0, reg1;
23040
23041       if (GET_CODE (XEXP (a, 0)) == PLUS)
23042         {
23043           reg0 = XEXP (XEXP (a, 0), 0);
23044           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
23045         }
23046       else
23047         reg0 = XEXP (a, 0);
23048
23049       if (GET_CODE (XEXP (b, 0)) == PLUS)
23050         {
23051           reg1 = XEXP (XEXP (b, 0), 0);
23052           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
23053         }
23054       else
23055         reg1 = XEXP (b, 0);
23056
23057       val_diff = val1 - val0;
23058
23059       return ((REGNO (reg0) == REGNO (reg1))
23060               && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
23061                   || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
23062     }
23063
23064   return false;
23065 }
23066
23067 /* A C statement (sans semicolon) to update the integer scheduling
23068    priority INSN_PRIORITY (INSN). Increase the priority to execute the
23069    INSN earlier, reduce the priority to execute INSN later.  Do not
23070    define this macro if you do not need to adjust the scheduling
23071    priorities of insns.  */
23072
23073 static int
23074 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
23075 {
23076   /* On machines (like the 750) which have asymmetric integer units,
23077      where one integer unit can do multiply and divides and the other
23078      can't, reduce the priority of multiply/divide so it is scheduled
23079      before other integer operations.  */
23080
23081 #if 0
23082   if (! INSN_P (insn))
23083     return priority;
23084
23085   if (GET_CODE (PATTERN (insn)) == USE)
23086     return priority;
23087
23088   switch (rs6000_cpu_attr) {
23089   case CPU_PPC750:
23090     switch (get_attr_type (insn))
23091       {
23092       default:
23093         break;
23094
23095       case TYPE_IMUL:
23096       case TYPE_IDIV:
23097         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
23098                  priority, priority);
23099         if (priority >= 0 && priority < 0x01000000)
23100           priority >>= 3;
23101         break;
23102       }
23103   }
23104 #endif
23105
23106   if (insn_must_be_first_in_group (insn)
23107       && reload_completed
23108       && current_sched_info->sched_max_insns_priority
23109       && rs6000_sched_restricted_insns_priority)
23110     {
23111
23112       /* Prioritize insns that can be dispatched only in the first
23113          dispatch slot.  */
23114       if (rs6000_sched_restricted_insns_priority == 1)
23115         /* Attach highest priority to insn. This means that in
23116            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
23117            precede 'priority' (critical path) considerations.  */
23118         return current_sched_info->sched_max_insns_priority;
23119       else if (rs6000_sched_restricted_insns_priority == 2)
23120         /* Increase priority of insn by a minimal amount. This means that in
23121            haifa-sched.c:ready_sort(), only 'priority' (critical path)
23122            considerations precede dispatch-slot restriction considerations.  */
23123         return (priority + 1);
23124     }
23125
23126   if (rs6000_cpu == PROCESSOR_POWER6
23127       && ((load_store_pendulum == -2 && is_load_insn (insn))
23128           || (load_store_pendulum == 2 && is_store_insn (insn))))
23129     /* Attach highest priority to insn if the scheduler has just issued two
23130        stores and this instruction is a load, or two loads and this instruction
23131        is a store. Power6 wants loads and stores scheduled alternately
23132        when possible */
23133     return current_sched_info->sched_max_insns_priority;
23134
23135   return priority;
23136 }
23137
23138 /* Return true if the instruction is nonpipelined on the Cell. */
23139 static bool
23140 is_nonpipeline_insn (rtx insn)
23141 {
23142   enum attr_type type;
23143   if (!insn || !NONDEBUG_INSN_P (insn)
23144       || GET_CODE (PATTERN (insn)) == USE
23145       || GET_CODE (PATTERN (insn)) == CLOBBER)
23146     return false;
23147
23148   type = get_attr_type (insn);
23149   if (type == TYPE_IMUL
23150       || type == TYPE_IMUL2
23151       || type == TYPE_IMUL3
23152       || type == TYPE_LMUL
23153       || type == TYPE_IDIV
23154       || type == TYPE_LDIV
23155       || type == TYPE_SDIV
23156       || type == TYPE_DDIV
23157       || type == TYPE_SSQRT
23158       || type == TYPE_DSQRT
23159       || type == TYPE_MFCR
23160       || type == TYPE_MFCRF
23161       || type == TYPE_MFJMPR)
23162     {
23163       return true;
23164     }
23165   return false;
23166 }
23167
23168
23169 /* Return how many instructions the machine can issue per cycle.  */
23170
23171 static int
23172 rs6000_issue_rate (void)
23173 {
23174   /* Unless scheduling for register pressure, use issue rate of 1 for
23175      first scheduling pass to decrease degradation.  */
23176   if (!reload_completed && !flag_sched_pressure)
23177     return 1;
23178
23179   switch (rs6000_cpu_attr) {
23180   case CPU_RIOS1:  /* ? */
23181   case CPU_RS64A:
23182   case CPU_PPC601: /* ? */
23183   case CPU_PPC7450:
23184     return 3;
23185   case CPU_PPC440:
23186   case CPU_PPC603:
23187   case CPU_PPC750:
23188   case CPU_PPC7400:
23189   case CPU_PPC8540:
23190   case CPU_CELL:
23191   case CPU_PPCE300C2:
23192   case CPU_PPCE300C3:
23193   case CPU_PPCE500MC:
23194   case CPU_PPCE500MC64:
23195   case CPU_TITAN:
23196     return 2;
23197   case CPU_RIOS2:
23198   case CPU_PPC476:
23199   case CPU_PPC604:
23200   case CPU_PPC604E:
23201   case CPU_PPC620:
23202   case CPU_PPC630:
23203     return 4;
23204   case CPU_POWER4:
23205   case CPU_POWER5:
23206   case CPU_POWER6:
23207   case CPU_POWER7:
23208     return 5;
23209   default:
23210     return 1;
23211   }
23212 }
23213
23214 /* Return how many instructions to look ahead for better insn
23215    scheduling.  */
23216
23217 static int
23218 rs6000_use_sched_lookahead (void)
23219 {
23220   if (rs6000_cpu_attr == CPU_PPC8540)
23221     return 4;
23222   if (rs6000_cpu_attr == CPU_CELL)
23223     return (reload_completed ? 8 : 0);
23224   return 0;
23225 }
23226
23227 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
23228 static int
23229 rs6000_use_sched_lookahead_guard (rtx insn)
23230 {
23231   if (rs6000_cpu_attr != CPU_CELL)
23232     return 1;
23233
23234    if (insn == NULL_RTX || !INSN_P (insn))
23235      abort ();
23236
23237   if (!reload_completed
23238       || is_nonpipeline_insn (insn)
23239       || is_microcoded_insn (insn))
23240     return 0;
23241
23242   return 1;
23243 }
23244
23245 /* Determine is PAT refers to memory.  */
23246
23247 static bool
23248 is_mem_ref (rtx pat)
23249 {
23250   const char * fmt;
23251   int i, j;
23252   bool ret = false;
23253
23254   /* stack_tie does not produce any real memory traffic.  */
23255   if (GET_CODE (pat) == UNSPEC
23256       && XINT (pat, 1) == UNSPEC_TIE)
23257     return false;
23258
23259   if (GET_CODE (pat) == MEM)
23260     return true;
23261
23262   /* Recursively process the pattern.  */
23263   fmt = GET_RTX_FORMAT (GET_CODE (pat));
23264
23265   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
23266     {
23267       if (fmt[i] == 'e')
23268         ret |= is_mem_ref (XEXP (pat, i));
23269       else if (fmt[i] == 'E')
23270         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
23271           ret |= is_mem_ref (XVECEXP (pat, i, j));
23272     }
23273
23274   return ret;
23275 }
23276
23277 /* Determine if PAT is a PATTERN of a load insn.  */
23278
23279 static bool
23280 is_load_insn1 (rtx pat)
23281 {
23282   if (!pat || pat == NULL_RTX)
23283     return false;
23284
23285   if (GET_CODE (pat) == SET)
23286     return is_mem_ref (SET_SRC (pat));
23287
23288   if (GET_CODE (pat) == PARALLEL)
23289     {
23290       int i;
23291
23292       for (i = 0; i < XVECLEN (pat, 0); i++)
23293         if (is_load_insn1 (XVECEXP (pat, 0, i)))
23294           return true;
23295     }
23296
23297   return false;
23298 }
23299
23300 /* Determine if INSN loads from memory.  */
23301
23302 static bool
23303 is_load_insn (rtx insn)
23304 {
23305   if (!insn || !INSN_P (insn))
23306     return false;
23307
23308   if (GET_CODE (insn) == CALL_INSN)
23309     return false;
23310
23311   return is_load_insn1 (PATTERN (insn));
23312 }
23313
23314 /* Determine if PAT is a PATTERN of a store insn.  */
23315
23316 static bool
23317 is_store_insn1 (rtx pat)
23318 {
23319   if (!pat || pat == NULL_RTX)
23320     return false;
23321
23322   if (GET_CODE (pat) == SET)
23323     return is_mem_ref (SET_DEST (pat));
23324
23325   if (GET_CODE (pat) == PARALLEL)
23326     {
23327       int i;
23328
23329       for (i = 0; i < XVECLEN (pat, 0); i++)
23330         if (is_store_insn1 (XVECEXP (pat, 0, i)))
23331           return true;
23332     }
23333
23334   return false;
23335 }
23336
23337 /* Determine if INSN stores to memory.  */
23338
23339 static bool
23340 is_store_insn (rtx insn)
23341 {
23342   if (!insn || !INSN_P (insn))
23343     return false;
23344
23345   return is_store_insn1 (PATTERN (insn));
23346 }
23347
23348 /* Return the dest of a store insn.  */
23349
23350 static rtx
23351 get_store_dest (rtx pat)
23352 {
23353   gcc_assert (is_store_insn1 (pat));
23354
23355   if (GET_CODE (pat) == SET)
23356     return SET_DEST (pat);
23357   else if (GET_CODE (pat) == PARALLEL)
23358     {
23359       int i;
23360
23361       for (i = 0; i < XVECLEN (pat, 0); i++)
23362         {
23363           rtx inner_pat = XVECEXP (pat, 0, i);
23364           if (GET_CODE (inner_pat) == SET
23365               && is_mem_ref (SET_DEST (inner_pat)))
23366             return inner_pat;
23367         }
23368     }
23369   /* We shouldn't get here, because we should have either a simple
23370      store insn or a store with update which are covered above.  */
23371   gcc_unreachable();
23372 }
23373
23374 /* Returns whether the dependence between INSN and NEXT is considered
23375    costly by the given target.  */
23376
23377 static bool
23378 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
23379 {
23380   rtx insn;
23381   rtx next;
23382
23383   /* If the flag is not enabled - no dependence is considered costly;
23384      allow all dependent insns in the same group.
23385      This is the most aggressive option.  */
23386   if (rs6000_sched_costly_dep == no_dep_costly)
23387     return false;
23388
23389   /* If the flag is set to 1 - a dependence is always considered costly;
23390      do not allow dependent instructions in the same group.
23391      This is the most conservative option.  */
23392   if (rs6000_sched_costly_dep == all_deps_costly)
23393     return true;
23394
23395   insn = DEP_PRO (dep);
23396   next = DEP_CON (dep);
23397
23398   if (rs6000_sched_costly_dep == store_to_load_dep_costly
23399       && is_load_insn (next)
23400       && is_store_insn (insn))
23401     /* Prevent load after store in the same group.  */
23402     return true;
23403
23404   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
23405       && is_load_insn (next)
23406       && is_store_insn (insn)
23407       && DEP_TYPE (dep) == REG_DEP_TRUE)
23408      /* Prevent load after store in the same group if it is a true
23409         dependence.  */
23410      return true;
23411
23412   /* The flag is set to X; dependences with latency >= X are considered costly,
23413      and will not be scheduled in the same group.  */
23414   if (rs6000_sched_costly_dep <= max_dep_latency
23415       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
23416     return true;
23417
23418   return false;
23419 }
23420
23421 /* Return the next insn after INSN that is found before TAIL is reached,
23422    skipping any "non-active" insns - insns that will not actually occupy
23423    an issue slot.  Return NULL_RTX if such an insn is not found.  */
23424
23425 static rtx
23426 get_next_active_insn (rtx insn, rtx tail)
23427 {
23428   if (insn == NULL_RTX || insn == tail)
23429     return NULL_RTX;
23430
23431   while (1)
23432     {
23433       insn = NEXT_INSN (insn);
23434       if (insn == NULL_RTX || insn == tail)
23435         return NULL_RTX;
23436
23437       if (CALL_P (insn)
23438           || JUMP_P (insn)
23439           || (NONJUMP_INSN_P (insn)
23440               && GET_CODE (PATTERN (insn)) != USE
23441               && GET_CODE (PATTERN (insn)) != CLOBBER
23442               && INSN_CODE (insn) != CODE_FOR_stack_tie))
23443         break;
23444     }
23445   return insn;
23446 }
23447
23448 /* We are about to begin issuing insns for this clock cycle. */
23449
23450 static int
23451 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
23452                         rtx *ready ATTRIBUTE_UNUSED,
23453                         int *pn_ready ATTRIBUTE_UNUSED,
23454                         int clock_var ATTRIBUTE_UNUSED)
23455 {
23456   int n_ready = *pn_ready;
23457
23458   if (sched_verbose)
23459     fprintf (dump, "// rs6000_sched_reorder :\n");
23460
23461   /* Reorder the ready list, if the second to last ready insn
23462      is a nonepipeline insn.  */
23463   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
23464   {
23465     if (is_nonpipeline_insn (ready[n_ready - 1])
23466         && (recog_memoized (ready[n_ready - 2]) > 0))
23467       /* Simply swap first two insns.  */
23468       {
23469         rtx tmp = ready[n_ready - 1];
23470         ready[n_ready - 1] = ready[n_ready - 2];
23471         ready[n_ready - 2] = tmp;
23472       }
23473   }
23474
23475   if (rs6000_cpu == PROCESSOR_POWER6)
23476     load_store_pendulum = 0;
23477
23478   return rs6000_issue_rate ();
23479 }
23480
23481 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
23482
23483 static int
23484 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
23485                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
23486 {
23487   if (sched_verbose)
23488     fprintf (dump, "// rs6000_sched_reorder2 :\n");
23489
23490   /* For Power6, we need to handle some special cases to try and keep the
23491      store queue from overflowing and triggering expensive flushes.
23492
23493      This code monitors how load and store instructions are being issued
23494      and skews the ready list one way or the other to increase the likelihood
23495      that a desired instruction is issued at the proper time.
23496
23497      A couple of things are done.  First, we maintain a "load_store_pendulum"
23498      to track the current state of load/store issue.
23499
23500        - If the pendulum is at zero, then no loads or stores have been
23501          issued in the current cycle so we do nothing.
23502
23503        - If the pendulum is 1, then a single load has been issued in this
23504          cycle and we attempt to locate another load in the ready list to
23505          issue with it.
23506
23507        - If the pendulum is -2, then two stores have already been
23508          issued in this cycle, so we increase the priority of the first load
23509          in the ready list to increase it's likelihood of being chosen first
23510          in the next cycle.
23511
23512        - If the pendulum is -1, then a single store has been issued in this
23513          cycle and we attempt to locate another store in the ready list to
23514          issue with it, preferring a store to an adjacent memory location to
23515          facilitate store pairing in the store queue.
23516
23517        - If the pendulum is 2, then two loads have already been
23518          issued in this cycle, so we increase the priority of the first store
23519          in the ready list to increase it's likelihood of being chosen first
23520          in the next cycle.
23521
23522        - If the pendulum < -2 or > 2, then do nothing.
23523
23524        Note: This code covers the most common scenarios.  There exist non
23525              load/store instructions which make use of the LSU and which
23526              would need to be accounted for to strictly model the behavior
23527              of the machine.  Those instructions are currently unaccounted
23528              for to help minimize compile time overhead of this code.
23529    */
23530   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
23531     {
23532       int pos;
23533       int i;
23534       rtx tmp;
23535
23536       if (is_store_insn (last_scheduled_insn))
23537         /* Issuing a store, swing the load_store_pendulum to the left */
23538         load_store_pendulum--;
23539       else if (is_load_insn (last_scheduled_insn))
23540         /* Issuing a load, swing the load_store_pendulum to the right */
23541         load_store_pendulum++;
23542       else
23543         return cached_can_issue_more;
23544
23545       /* If the pendulum is balanced, or there is only one instruction on
23546          the ready list, then all is well, so return. */
23547       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
23548         return cached_can_issue_more;
23549
23550       if (load_store_pendulum == 1)
23551         {
23552           /* A load has been issued in this cycle.  Scan the ready list
23553              for another load to issue with it */
23554           pos = *pn_ready-1;
23555
23556           while (pos >= 0)
23557             {
23558               if (is_load_insn (ready[pos]))
23559                 {
23560                   /* Found a load.  Move it to the head of the ready list,
23561                      and adjust it's priority so that it is more likely to
23562                      stay there */
23563                   tmp = ready[pos];
23564                   for (i=pos; i<*pn_ready-1; i++)
23565                     ready[i] = ready[i + 1];
23566                   ready[*pn_ready-1] = tmp;
23567
23568                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23569                     INSN_PRIORITY (tmp)++;
23570                   break;
23571                 }
23572               pos--;
23573             }
23574         }
23575       else if (load_store_pendulum == -2)
23576         {
23577           /* Two stores have been issued in this cycle.  Increase the
23578              priority of the first load in the ready list to favor it for
23579              issuing in the next cycle. */
23580           pos = *pn_ready-1;
23581
23582           while (pos >= 0)
23583             {
23584               if (is_load_insn (ready[pos])
23585                   && !sel_sched_p ()
23586                   && INSN_PRIORITY_KNOWN (ready[pos]))
23587                 {
23588                   INSN_PRIORITY (ready[pos])++;
23589
23590                   /* Adjust the pendulum to account for the fact that a load
23591                      was found and increased in priority.  This is to prevent
23592                      increasing the priority of multiple loads */
23593                   load_store_pendulum--;
23594
23595                   break;
23596                 }
23597               pos--;
23598             }
23599         }
23600       else if (load_store_pendulum == -1)
23601         {
23602           /* A store has been issued in this cycle.  Scan the ready list for
23603              another store to issue with it, preferring a store to an adjacent
23604              memory location */
23605           int first_store_pos = -1;
23606
23607           pos = *pn_ready-1;
23608
23609           while (pos >= 0)
23610             {
23611               if (is_store_insn (ready[pos]))
23612                 {
23613                   /* Maintain the index of the first store found on the
23614                      list */
23615                   if (first_store_pos == -1)
23616                     first_store_pos = pos;
23617
23618                   if (is_store_insn (last_scheduled_insn)
23619                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
23620                     {
23621                       /* Found an adjacent store.  Move it to the head of the
23622                          ready list, and adjust it's priority so that it is
23623                          more likely to stay there */
23624                       tmp = ready[pos];
23625                       for (i=pos; i<*pn_ready-1; i++)
23626                         ready[i] = ready[i + 1];
23627                       ready[*pn_ready-1] = tmp;
23628
23629                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23630                         INSN_PRIORITY (tmp)++;
23631
23632                       first_store_pos = -1;
23633
23634                       break;
23635                     };
23636                 }
23637               pos--;
23638             }
23639
23640           if (first_store_pos >= 0)
23641             {
23642               /* An adjacent store wasn't found, but a non-adjacent store was,
23643                  so move the non-adjacent store to the front of the ready
23644                  list, and adjust its priority so that it is more likely to
23645                  stay there. */
23646               tmp = ready[first_store_pos];
23647               for (i=first_store_pos; i<*pn_ready-1; i++)
23648                 ready[i] = ready[i + 1];
23649               ready[*pn_ready-1] = tmp;
23650               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23651                 INSN_PRIORITY (tmp)++;
23652             }
23653         }
23654       else if (load_store_pendulum == 2)
23655        {
23656            /* Two loads have been issued in this cycle.  Increase the priority
23657               of the first store in the ready list to favor it for issuing in
23658               the next cycle. */
23659           pos = *pn_ready-1;
23660
23661           while (pos >= 0)
23662             {
23663               if (is_store_insn (ready[pos])
23664                   && !sel_sched_p ()
23665                   && INSN_PRIORITY_KNOWN (ready[pos]))
23666                 {
23667                   INSN_PRIORITY (ready[pos])++;
23668
23669                   /* Adjust the pendulum to account for the fact that a store
23670                      was found and increased in priority.  This is to prevent
23671                      increasing the priority of multiple stores */
23672                   load_store_pendulum++;
23673
23674                   break;
23675                 }
23676               pos--;
23677             }
23678         }
23679     }
23680
23681   return cached_can_issue_more;
23682 }
23683
23684 /* Return whether the presence of INSN causes a dispatch group termination
23685    of group WHICH_GROUP.
23686
23687    If WHICH_GROUP == current_group, this function will return true if INSN
23688    causes the termination of the current group (i.e, the dispatch group to
23689    which INSN belongs). This means that INSN will be the last insn in the
23690    group it belongs to.
23691
23692    If WHICH_GROUP == previous_group, this function will return true if INSN
23693    causes the termination of the previous group (i.e, the dispatch group that
23694    precedes the group to which INSN belongs).  This means that INSN will be
23695    the first insn in the group it belongs to).  */
23696
23697 static bool
23698 insn_terminates_group_p (rtx insn, enum group_termination which_group)
23699 {
23700   bool first, last;
23701
23702   if (! insn)
23703     return false;
23704
23705   first = insn_must_be_first_in_group (insn);
23706   last = insn_must_be_last_in_group (insn);
23707
23708   if (first && last)
23709     return true;
23710
23711   if (which_group == current_group)
23712     return last;
23713   else if (which_group == previous_group)
23714     return first;
23715
23716   return false;
23717 }
23718
23719
23720 static bool
23721 insn_must_be_first_in_group (rtx insn)
23722 {
23723   enum attr_type type;
23724
23725   if (!insn
23726       || GET_CODE (insn) == NOTE
23727       || DEBUG_INSN_P (insn)
23728       || GET_CODE (PATTERN (insn)) == USE
23729       || GET_CODE (PATTERN (insn)) == CLOBBER)
23730     return false;
23731
23732   switch (rs6000_cpu)
23733     {
23734     case PROCESSOR_POWER5:
23735       if (is_cracked_insn (insn))
23736         return true;
23737     case PROCESSOR_POWER4:
23738       if (is_microcoded_insn (insn))
23739         return true;
23740
23741       if (!rs6000_sched_groups)
23742         return false;
23743
23744       type = get_attr_type (insn);
23745
23746       switch (type)
23747         {
23748         case TYPE_MFCR:
23749         case TYPE_MFCRF:
23750         case TYPE_MTCR:
23751         case TYPE_DELAYED_CR:
23752         case TYPE_CR_LOGICAL:
23753         case TYPE_MTJMPR:
23754         case TYPE_MFJMPR:
23755         case TYPE_IDIV:
23756         case TYPE_LDIV:
23757         case TYPE_LOAD_L:
23758         case TYPE_STORE_C:
23759         case TYPE_ISYNC:
23760         case TYPE_SYNC:
23761           return true;
23762         default:
23763           break;
23764         }
23765       break;
23766     case PROCESSOR_POWER6:
23767       type = get_attr_type (insn);
23768
23769       switch (type)
23770         {
23771         case TYPE_INSERT_DWORD:
23772         case TYPE_EXTS:
23773         case TYPE_CNTLZ:
23774         case TYPE_SHIFT:
23775         case TYPE_VAR_SHIFT_ROTATE:
23776         case TYPE_TRAP:
23777         case TYPE_IMUL:
23778         case TYPE_IMUL2:
23779         case TYPE_IMUL3:
23780         case TYPE_LMUL:
23781         case TYPE_IDIV:
23782         case TYPE_INSERT_WORD:
23783         case TYPE_DELAYED_COMPARE:
23784         case TYPE_IMUL_COMPARE:
23785         case TYPE_LMUL_COMPARE:
23786         case TYPE_FPCOMPARE:
23787         case TYPE_MFCR:
23788         case TYPE_MTCR:
23789         case TYPE_MFJMPR:
23790         case TYPE_MTJMPR:
23791         case TYPE_ISYNC:
23792         case TYPE_SYNC:
23793         case TYPE_LOAD_L:
23794         case TYPE_STORE_C:
23795         case TYPE_LOAD_U:
23796         case TYPE_LOAD_UX:
23797         case TYPE_LOAD_EXT_UX:
23798         case TYPE_STORE_U:
23799         case TYPE_STORE_UX:
23800         case TYPE_FPLOAD_U:
23801         case TYPE_FPLOAD_UX:
23802         case TYPE_FPSTORE_U:
23803         case TYPE_FPSTORE_UX:
23804           return true;
23805         default:
23806           break;
23807         }
23808       break;
23809     case PROCESSOR_POWER7:
23810       type = get_attr_type (insn);
23811
23812       switch (type)
23813         {
23814         case TYPE_CR_LOGICAL:
23815         case TYPE_MFCR:
23816         case TYPE_MFCRF:
23817         case TYPE_MTCR:
23818         case TYPE_IDIV:
23819         case TYPE_LDIV:
23820         case TYPE_COMPARE:
23821         case TYPE_DELAYED_COMPARE:
23822         case TYPE_VAR_DELAYED_COMPARE:
23823         case TYPE_ISYNC:
23824         case TYPE_LOAD_L:
23825         case TYPE_STORE_C:
23826         case TYPE_LOAD_U:
23827         case TYPE_LOAD_UX:
23828         case TYPE_LOAD_EXT:
23829         case TYPE_LOAD_EXT_U:
23830         case TYPE_LOAD_EXT_UX:
23831         case TYPE_STORE_U:
23832         case TYPE_STORE_UX:
23833         case TYPE_FPLOAD_U:
23834         case TYPE_FPLOAD_UX:
23835         case TYPE_FPSTORE_U:
23836         case TYPE_FPSTORE_UX:
23837         case TYPE_MFJMPR:
23838         case TYPE_MTJMPR:
23839           return true;
23840         default:
23841           break;
23842         }
23843       break;
23844     default:
23845       break;
23846     }
23847
23848   return false;
23849 }
23850
23851 static bool
23852 insn_must_be_last_in_group (rtx insn)
23853 {
23854   enum attr_type type;
23855
23856   if (!insn
23857       || GET_CODE (insn) == NOTE
23858       || DEBUG_INSN_P (insn)
23859       || GET_CODE (PATTERN (insn)) == USE
23860       || GET_CODE (PATTERN (insn)) == CLOBBER)
23861     return false;
23862
23863   switch (rs6000_cpu) {
23864   case PROCESSOR_POWER4:
23865   case PROCESSOR_POWER5:
23866     if (is_microcoded_insn (insn))
23867       return true;
23868
23869     if (is_branch_slot_insn (insn))
23870       return true;
23871
23872     break;
23873   case PROCESSOR_POWER6:
23874     type = get_attr_type (insn);
23875
23876     switch (type)
23877       {
23878       case TYPE_EXTS:
23879       case TYPE_CNTLZ:
23880       case TYPE_SHIFT:
23881       case TYPE_VAR_SHIFT_ROTATE:
23882       case TYPE_TRAP:
23883       case TYPE_IMUL:
23884       case TYPE_IMUL2:
23885       case TYPE_IMUL3:
23886       case TYPE_LMUL:
23887       case TYPE_IDIV:
23888       case TYPE_DELAYED_COMPARE:
23889       case TYPE_IMUL_COMPARE:
23890       case TYPE_LMUL_COMPARE:
23891       case TYPE_FPCOMPARE:
23892       case TYPE_MFCR:
23893       case TYPE_MTCR:
23894       case TYPE_MFJMPR:
23895       case TYPE_MTJMPR:
23896       case TYPE_ISYNC:
23897       case TYPE_SYNC:
23898       case TYPE_LOAD_L:
23899       case TYPE_STORE_C:
23900         return true;
23901       default:
23902         break;
23903     }
23904     break;
23905   case PROCESSOR_POWER7:
23906     type = get_attr_type (insn);
23907
23908     switch (type)
23909       {
23910       case TYPE_ISYNC:
23911       case TYPE_SYNC:
23912       case TYPE_LOAD_L:
23913       case TYPE_STORE_C:
23914       case TYPE_LOAD_EXT_U:
23915       case TYPE_LOAD_EXT_UX:
23916       case TYPE_STORE_UX:
23917         return true;
23918       default:
23919         break;
23920     }
23921     break;
23922   default:
23923     break;
23924   }
23925
23926   return false;
23927 }
23928
23929 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
23930    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
23931
23932 static bool
23933 is_costly_group (rtx *group_insns, rtx next_insn)
23934 {
23935   int i;
23936   int issue_rate = rs6000_issue_rate ();
23937
23938   for (i = 0; i < issue_rate; i++)
23939     {
23940       sd_iterator_def sd_it;
23941       dep_t dep;
23942       rtx insn = group_insns[i];
23943
23944       if (!insn)
23945         continue;
23946
23947       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
23948         {
23949           rtx next = DEP_CON (dep);
23950
23951           if (next == next_insn
23952               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
23953             return true;
23954         }
23955     }
23956
23957   return false;
23958 }
23959
23960 /* Utility of the function redefine_groups.
23961    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
23962    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
23963    to keep it "far" (in a separate group) from GROUP_INSNS, following
23964    one of the following schemes, depending on the value of the flag
23965    -minsert_sched_nops = X:
23966    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
23967        in order to force NEXT_INSN into a separate group.
23968    (2) X < sched_finish_regroup_exact: insert exactly X nops.
23969    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
23970    insertion (has a group just ended, how many vacant issue slots remain in the
23971    last group, and how many dispatch groups were encountered so far).  */
23972
23973 static int
23974 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
23975                  rtx next_insn, bool *group_end, int can_issue_more,
23976                  int *group_count)
23977 {
23978   rtx nop;
23979   bool force;
23980   int issue_rate = rs6000_issue_rate ();
23981   bool end = *group_end;
23982   int i;
23983
23984   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
23985     return can_issue_more;
23986
23987   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
23988     return can_issue_more;
23989
23990   force = is_costly_group (group_insns, next_insn);
23991   if (!force)
23992     return can_issue_more;
23993
23994   if (sched_verbose > 6)
23995     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
23996              *group_count ,can_issue_more);
23997
23998   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
23999     {
24000       if (*group_end)
24001         can_issue_more = 0;
24002
24003       /* Since only a branch can be issued in the last issue_slot, it is
24004          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
24005          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
24006          in this case the last nop will start a new group and the branch
24007          will be forced to the new group.  */
24008       if (can_issue_more && !is_branch_slot_insn (next_insn))
24009         can_issue_more--;
24010
24011       while (can_issue_more > 0)
24012         {
24013           nop = gen_nop ();
24014           emit_insn_before (nop, next_insn);
24015           can_issue_more--;
24016         }
24017
24018       *group_end = true;
24019       return 0;
24020     }
24021
24022   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
24023     {
24024       int n_nops = rs6000_sched_insert_nops;
24025
24026       /* Nops can't be issued from the branch slot, so the effective
24027          issue_rate for nops is 'issue_rate - 1'.  */
24028       if (can_issue_more == 0)
24029         can_issue_more = issue_rate;
24030       can_issue_more--;
24031       if (can_issue_more == 0)
24032         {
24033           can_issue_more = issue_rate - 1;
24034           (*group_count)++;
24035           end = true;
24036           for (i = 0; i < issue_rate; i++)
24037             {
24038               group_insns[i] = 0;
24039             }
24040         }
24041
24042       while (n_nops > 0)
24043         {
24044           nop = gen_nop ();
24045           emit_insn_before (nop, next_insn);
24046           if (can_issue_more == issue_rate - 1) /* new group begins */
24047             end = false;
24048           can_issue_more--;
24049           if (can_issue_more == 0)
24050             {
24051               can_issue_more = issue_rate - 1;
24052               (*group_count)++;
24053               end = true;
24054               for (i = 0; i < issue_rate; i++)
24055                 {
24056                   group_insns[i] = 0;
24057                 }
24058             }
24059           n_nops--;
24060         }
24061
24062       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
24063       can_issue_more++;
24064
24065       /* Is next_insn going to start a new group?  */
24066       *group_end
24067         = (end
24068            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24069            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24070            || (can_issue_more < issue_rate &&
24071                insn_terminates_group_p (next_insn, previous_group)));
24072       if (*group_end && end)
24073         (*group_count)--;
24074
24075       if (sched_verbose > 6)
24076         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
24077                  *group_count, can_issue_more);
24078       return can_issue_more;
24079     }
24080
24081   return can_issue_more;
24082 }
24083
24084 /* This function tries to synch the dispatch groups that the compiler "sees"
24085    with the dispatch groups that the processor dispatcher is expected to
24086    form in practice.  It tries to achieve this synchronization by forcing the
24087    estimated processor grouping on the compiler (as opposed to the function
24088    'pad_goups' which tries to force the scheduler's grouping on the processor).
24089
24090    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
24091    examines the (estimated) dispatch groups that will be formed by the processor
24092    dispatcher.  It marks these group boundaries to reflect the estimated
24093    processor grouping, overriding the grouping that the scheduler had marked.
24094    Depending on the value of the flag '-minsert-sched-nops' this function can
24095    force certain insns into separate groups or force a certain distance between
24096    them by inserting nops, for example, if there exists a "costly dependence"
24097    between the insns.
24098
24099    The function estimates the group boundaries that the processor will form as
24100    follows:  It keeps track of how many vacant issue slots are available after
24101    each insn.  A subsequent insn will start a new group if one of the following
24102    4 cases applies:
24103    - no more vacant issue slots remain in the current dispatch group.
24104    - only the last issue slot, which is the branch slot, is vacant, but the next
24105      insn is not a branch.
24106    - only the last 2 or less issue slots, including the branch slot, are vacant,
24107      which means that a cracked insn (which occupies two issue slots) can't be
24108      issued in this group.
24109    - less than 'issue_rate' slots are vacant, and the next insn always needs to
24110      start a new group.  */
24111
24112 static int
24113 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24114 {
24115   rtx insn, next_insn;
24116   int issue_rate;
24117   int can_issue_more;
24118   int slot, i;
24119   bool group_end;
24120   int group_count = 0;
24121   rtx *group_insns;
24122
24123   /* Initialize.  */
24124   issue_rate = rs6000_issue_rate ();
24125   group_insns = XALLOCAVEC (rtx, issue_rate);
24126   for (i = 0; i < issue_rate; i++)
24127     {
24128       group_insns[i] = 0;
24129     }
24130   can_issue_more = issue_rate;
24131   slot = 0;
24132   insn = get_next_active_insn (prev_head_insn, tail);
24133   group_end = false;
24134
24135   while (insn != NULL_RTX)
24136     {
24137       slot = (issue_rate - can_issue_more);
24138       group_insns[slot] = insn;
24139       can_issue_more =
24140         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24141       if (insn_terminates_group_p (insn, current_group))
24142         can_issue_more = 0;
24143
24144       next_insn = get_next_active_insn (insn, tail);
24145       if (next_insn == NULL_RTX)
24146         return group_count + 1;
24147
24148       /* Is next_insn going to start a new group?  */
24149       group_end
24150         = (can_issue_more == 0
24151            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24152            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24153            || (can_issue_more < issue_rate &&
24154                insn_terminates_group_p (next_insn, previous_group)));
24155
24156       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
24157                                         next_insn, &group_end, can_issue_more,
24158                                         &group_count);
24159
24160       if (group_end)
24161         {
24162           group_count++;
24163           can_issue_more = 0;
24164           for (i = 0; i < issue_rate; i++)
24165             {
24166               group_insns[i] = 0;
24167             }
24168         }
24169
24170       if (GET_MODE (next_insn) == TImode && can_issue_more)
24171         PUT_MODE (next_insn, VOIDmode);
24172       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
24173         PUT_MODE (next_insn, TImode);
24174
24175       insn = next_insn;
24176       if (can_issue_more == 0)
24177         can_issue_more = issue_rate;
24178     } /* while */
24179
24180   return group_count;
24181 }
24182
24183 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
24184    dispatch group boundaries that the scheduler had marked.  Pad with nops
24185    any dispatch groups which have vacant issue slots, in order to force the
24186    scheduler's grouping on the processor dispatcher.  The function
24187    returns the number of dispatch groups found.  */
24188
24189 static int
24190 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24191 {
24192   rtx insn, next_insn;
24193   rtx nop;
24194   int issue_rate;
24195   int can_issue_more;
24196   int group_end;
24197   int group_count = 0;
24198
24199   /* Initialize issue_rate.  */
24200   issue_rate = rs6000_issue_rate ();
24201   can_issue_more = issue_rate;
24202
24203   insn = get_next_active_insn (prev_head_insn, tail);
24204   next_insn = get_next_active_insn (insn, tail);
24205
24206   while (insn != NULL_RTX)
24207     {
24208       can_issue_more =
24209         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24210
24211       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
24212
24213       if (next_insn == NULL_RTX)
24214         break;
24215
24216       if (group_end)
24217         {
24218           /* If the scheduler had marked group termination at this location
24219              (between insn and next_insn), and neither insn nor next_insn will
24220              force group termination, pad the group with nops to force group
24221              termination.  */
24222           if (can_issue_more
24223               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
24224               && !insn_terminates_group_p (insn, current_group)
24225               && !insn_terminates_group_p (next_insn, previous_group))
24226             {
24227               if (!is_branch_slot_insn (next_insn))
24228                 can_issue_more--;
24229
24230               while (can_issue_more)
24231                 {
24232                   nop = gen_nop ();
24233                   emit_insn_before (nop, next_insn);
24234                   can_issue_more--;
24235                 }
24236             }
24237
24238           can_issue_more = issue_rate;
24239           group_count++;
24240         }
24241
24242       insn = next_insn;
24243       next_insn = get_next_active_insn (insn, tail);
24244     }
24245
24246   return group_count;
24247 }
24248
24249 /* We're beginning a new block.  Initialize data structures as necessary.  */
24250
24251 static void
24252 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
24253                      int sched_verbose ATTRIBUTE_UNUSED,
24254                      int max_ready ATTRIBUTE_UNUSED)
24255 {
24256   last_scheduled_insn = NULL_RTX;
24257   load_store_pendulum = 0;
24258 }
24259
24260 /* The following function is called at the end of scheduling BB.
24261    After reload, it inserts nops at insn group bundling.  */
24262
24263 static void
24264 rs6000_sched_finish (FILE *dump, int sched_verbose)
24265 {
24266   int n_groups;
24267
24268   if (sched_verbose)
24269     fprintf (dump, "=== Finishing schedule.\n");
24270
24271   if (reload_completed && rs6000_sched_groups)
24272     {
24273       /* Do not run sched_finish hook when selective scheduling enabled.  */
24274       if (sel_sched_p ())
24275         return;
24276
24277       if (rs6000_sched_insert_nops == sched_finish_none)
24278         return;
24279
24280       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
24281         n_groups = pad_groups (dump, sched_verbose,
24282                                current_sched_info->prev_head,
24283                                current_sched_info->next_tail);
24284       else
24285         n_groups = redefine_groups (dump, sched_verbose,
24286                                     current_sched_info->prev_head,
24287                                     current_sched_info->next_tail);
24288
24289       if (sched_verbose >= 6)
24290         {
24291           fprintf (dump, "ngroups = %d\n", n_groups);
24292           print_rtl (dump, current_sched_info->prev_head);
24293           fprintf (dump, "Done finish_sched\n");
24294         }
24295     }
24296 }
24297
24298 struct _rs6000_sched_context
24299 {
24300   short cached_can_issue_more;
24301   rtx last_scheduled_insn;
24302   int load_store_pendulum;
24303 };
24304
24305 typedef struct _rs6000_sched_context rs6000_sched_context_def;
24306 typedef rs6000_sched_context_def *rs6000_sched_context_t;
24307
24308 /* Allocate store for new scheduling context.  */
24309 static void *
24310 rs6000_alloc_sched_context (void)
24311 {
24312   return xmalloc (sizeof (rs6000_sched_context_def));
24313 }
24314
24315 /* If CLEAN_P is true then initializes _SC with clean data,
24316    and from the global context otherwise.  */
24317 static void
24318 rs6000_init_sched_context (void *_sc, bool clean_p)
24319 {
24320   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24321
24322   if (clean_p)
24323     {
24324       sc->cached_can_issue_more = 0;
24325       sc->last_scheduled_insn = NULL_RTX;
24326       sc->load_store_pendulum = 0;
24327     }
24328   else
24329     {
24330       sc->cached_can_issue_more = cached_can_issue_more;
24331       sc->last_scheduled_insn = last_scheduled_insn;
24332       sc->load_store_pendulum = load_store_pendulum;
24333     }
24334 }
24335
24336 /* Sets the global scheduling context to the one pointed to by _SC.  */
24337 static void
24338 rs6000_set_sched_context (void *_sc)
24339 {
24340   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24341
24342   gcc_assert (sc != NULL);
24343
24344   cached_can_issue_more = sc->cached_can_issue_more;
24345   last_scheduled_insn = sc->last_scheduled_insn;
24346   load_store_pendulum = sc->load_store_pendulum;
24347 }
24348
24349 /* Free _SC.  */
24350 static void
24351 rs6000_free_sched_context (void *_sc)
24352 {
24353   gcc_assert (_sc != NULL);
24354
24355   free (_sc);
24356 }
24357
24358 \f
24359 /* Length in units of the trampoline for entering a nested function.  */
24360
24361 int
24362 rs6000_trampoline_size (void)
24363 {
24364   int ret = 0;
24365
24366   switch (DEFAULT_ABI)
24367     {
24368     default:
24369       gcc_unreachable ();
24370
24371     case ABI_AIX:
24372       ret = (TARGET_32BIT) ? 12 : 24;
24373       break;
24374
24375     case ABI_DARWIN:
24376     case ABI_V4:
24377       ret = (TARGET_32BIT) ? 40 : 48;
24378       break;
24379     }
24380
24381   return ret;
24382 }
24383
24384 /* Emit RTL insns to initialize the variable parts of a trampoline.
24385    FNADDR is an RTX for the address of the function's pure code.
24386    CXT is an RTX for the static chain value for the function.  */
24387
24388 static void
24389 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
24390 {
24391   int regsize = (TARGET_32BIT) ? 4 : 8;
24392   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
24393   rtx ctx_reg = force_reg (Pmode, cxt);
24394   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
24395
24396   switch (DEFAULT_ABI)
24397     {
24398     default:
24399       gcc_unreachable ();
24400
24401     /* Under AIX, just build the 3 word function descriptor */
24402     case ABI_AIX:
24403       {
24404         rtx fnmem, fn_reg, toc_reg;
24405
24406         if (!TARGET_POINTERS_TO_NESTED_FUNCTIONS)
24407           error ("-mno-r11 must not be used if you have trampolines");
24408
24409         fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
24410         fn_reg = gen_reg_rtx (Pmode);
24411         toc_reg = gen_reg_rtx (Pmode);
24412
24413   /* Macro to shorten the code expansions below.  */
24414 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
24415
24416         m_tramp = replace_equiv_address (m_tramp, addr);
24417
24418         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
24419         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
24420         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
24421         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
24422         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
24423
24424 # undef MEM_PLUS
24425       }
24426       break;
24427
24428     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
24429     case ABI_DARWIN:
24430     case ABI_V4:
24431       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
24432                          LCT_NORMAL, VOIDmode, 4,
24433                          addr, Pmode,
24434                          GEN_INT (rs6000_trampoline_size ()), SImode,
24435                          fnaddr, Pmode,
24436                          ctx_reg, Pmode);
24437       break;
24438     }
24439 }
24440
24441 \f
24442 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
24443    identifier as an argument, so the front end shouldn't look it up.  */
24444
24445 static bool
24446 rs6000_attribute_takes_identifier_p (const_tree attr_id)
24447 {
24448   return is_attribute_p ("altivec", attr_id);
24449 }
24450
24451 /* Handle the "altivec" attribute.  The attribute may have
24452    arguments as follows:
24453
24454         __attribute__((altivec(vector__)))
24455         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
24456         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
24457
24458   and may appear more than once (e.g., 'vector bool char') in a
24459   given declaration.  */
24460
24461 static tree
24462 rs6000_handle_altivec_attribute (tree *node,
24463                                  tree name ATTRIBUTE_UNUSED,
24464                                  tree args,
24465                                  int flags ATTRIBUTE_UNUSED,
24466                                  bool *no_add_attrs)
24467 {
24468   tree type = *node, result = NULL_TREE;
24469   enum machine_mode mode;
24470   int unsigned_p;
24471   char altivec_type
24472     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
24473         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
24474        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
24475        : '?');
24476
24477   while (POINTER_TYPE_P (type)
24478          || TREE_CODE (type) == FUNCTION_TYPE
24479          || TREE_CODE (type) == METHOD_TYPE
24480          || TREE_CODE (type) == ARRAY_TYPE)
24481     type = TREE_TYPE (type);
24482
24483   mode = TYPE_MODE (type);
24484
24485   /* Check for invalid AltiVec type qualifiers.  */
24486   if (type == long_double_type_node)
24487     error ("use of %<long double%> in AltiVec types is invalid");
24488   else if (type == boolean_type_node)
24489     error ("use of boolean types in AltiVec types is invalid");
24490   else if (TREE_CODE (type) == COMPLEX_TYPE)
24491     error ("use of %<complex%> in AltiVec types is invalid");
24492   else if (DECIMAL_FLOAT_MODE_P (mode))
24493     error ("use of decimal floating point types in AltiVec types is invalid");
24494   else if (!TARGET_VSX)
24495     {
24496       if (type == long_unsigned_type_node || type == long_integer_type_node)
24497         {
24498           if (TARGET_64BIT)
24499             error ("use of %<long%> in AltiVec types is invalid for "
24500                    "64-bit code without -mvsx");
24501           else if (rs6000_warn_altivec_long)
24502             warning (0, "use of %<long%> in AltiVec types is deprecated; "
24503                      "use %<int%>");
24504         }
24505       else if (type == long_long_unsigned_type_node
24506                || type == long_long_integer_type_node)
24507         error ("use of %<long long%> in AltiVec types is invalid without "
24508                "-mvsx");
24509       else if (type == double_type_node)
24510         error ("use of %<double%> in AltiVec types is invalid without -mvsx");
24511     }
24512
24513   switch (altivec_type)
24514     {
24515     case 'v':
24516       unsigned_p = TYPE_UNSIGNED (type);
24517       switch (mode)
24518         {
24519         case DImode:
24520           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
24521           break;
24522         case SImode:
24523           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
24524           break;
24525         case HImode:
24526           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
24527           break;
24528         case QImode:
24529           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
24530           break;
24531         case SFmode: result = V4SF_type_node; break;
24532         case DFmode: result = V2DF_type_node; break;
24533           /* If the user says 'vector int bool', we may be handed the 'bool'
24534              attribute _before_ the 'vector' attribute, and so select the
24535              proper type in the 'b' case below.  */
24536         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
24537         case V2DImode: case V2DFmode:
24538           result = type;
24539         default: break;
24540         }
24541       break;
24542     case 'b':
24543       switch (mode)
24544         {
24545         case DImode: case V2DImode: result = bool_V2DI_type_node; break;
24546         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
24547         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
24548         case QImode: case V16QImode: result = bool_V16QI_type_node;
24549         default: break;
24550         }
24551       break;
24552     case 'p':
24553       switch (mode)
24554         {
24555         case V8HImode: result = pixel_V8HI_type_node;
24556         default: break;
24557         }
24558     default: break;
24559     }
24560
24561   /* Propagate qualifiers attached to the element type
24562      onto the vector type.  */
24563   if (result && result != type && TYPE_QUALS (type))
24564     result = build_qualified_type (result, TYPE_QUALS (type));
24565
24566   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
24567
24568   if (result)
24569     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
24570
24571   return NULL_TREE;
24572 }
24573
24574 /* AltiVec defines four built-in scalar types that serve as vector
24575    elements; we must teach the compiler how to mangle them.  */
24576
24577 static const char *
24578 rs6000_mangle_type (const_tree type)
24579 {
24580   type = TYPE_MAIN_VARIANT (type);
24581
24582   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
24583       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
24584     return NULL;
24585
24586   if (type == bool_char_type_node) return "U6__boolc";
24587   if (type == bool_short_type_node) return "U6__bools";
24588   if (type == pixel_type_node) return "u7__pixel";
24589   if (type == bool_int_type_node) return "U6__booli";
24590   if (type == bool_long_type_node) return "U6__booll";
24591
24592   /* Mangle IBM extended float long double as `g' (__float128) on
24593      powerpc*-linux where long-double-64 previously was the default.  */
24594   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
24595       && TARGET_ELF
24596       && TARGET_LONG_DOUBLE_128
24597       && !TARGET_IEEEQUAD)
24598     return "g";
24599
24600   /* For all other types, use normal C++ mangling.  */
24601   return NULL;
24602 }
24603
24604 /* Handle a "longcall" or "shortcall" attribute; arguments as in
24605    struct attribute_spec.handler.  */
24606
24607 static tree
24608 rs6000_handle_longcall_attribute (tree *node, tree name,
24609                                   tree args ATTRIBUTE_UNUSED,
24610                                   int flags ATTRIBUTE_UNUSED,
24611                                   bool *no_add_attrs)
24612 {
24613   if (TREE_CODE (*node) != FUNCTION_TYPE
24614       && TREE_CODE (*node) != FIELD_DECL
24615       && TREE_CODE (*node) != TYPE_DECL)
24616     {
24617       warning (OPT_Wattributes, "%qE attribute only applies to functions",
24618                name);
24619       *no_add_attrs = true;
24620     }
24621
24622   return NULL_TREE;
24623 }
24624
24625 /* Set longcall attributes on all functions declared when
24626    rs6000_default_long_calls is true.  */
24627 static void
24628 rs6000_set_default_type_attributes (tree type)
24629 {
24630   if (rs6000_default_long_calls
24631       && (TREE_CODE (type) == FUNCTION_TYPE
24632           || TREE_CODE (type) == METHOD_TYPE))
24633     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
24634                                         NULL_TREE,
24635                                         TYPE_ATTRIBUTES (type));
24636
24637 #if TARGET_MACHO
24638   darwin_set_default_type_attributes (type);
24639 #endif
24640 }
24641
24642 /* Return a reference suitable for calling a function with the
24643    longcall attribute.  */
24644
24645 rtx
24646 rs6000_longcall_ref (rtx call_ref)
24647 {
24648   const char *call_name;
24649   tree node;
24650
24651   if (GET_CODE (call_ref) != SYMBOL_REF)
24652     return call_ref;
24653
24654   /* System V adds '.' to the internal name, so skip them.  */
24655   call_name = XSTR (call_ref, 0);
24656   if (*call_name == '.')
24657     {
24658       while (*call_name == '.')
24659         call_name++;
24660
24661       node = get_identifier (call_name);
24662       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
24663     }
24664
24665   return force_reg (Pmode, call_ref);
24666 }
24667 \f
24668 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
24669 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
24670 #endif
24671
24672 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
24673    struct attribute_spec.handler.  */
24674 static tree
24675 rs6000_handle_struct_attribute (tree *node, tree name,
24676                                 tree args ATTRIBUTE_UNUSED,
24677                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
24678 {
24679   tree *type = NULL;
24680   if (DECL_P (*node))
24681     {
24682       if (TREE_CODE (*node) == TYPE_DECL)
24683         type = &TREE_TYPE (*node);
24684     }
24685   else
24686     type = node;
24687
24688   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
24689                  || TREE_CODE (*type) == UNION_TYPE)))
24690     {
24691       warning (OPT_Wattributes, "%qE attribute ignored", name);
24692       *no_add_attrs = true;
24693     }
24694
24695   else if ((is_attribute_p ("ms_struct", name)
24696             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
24697            || ((is_attribute_p ("gcc_struct", name)
24698                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
24699     {
24700       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
24701                name);
24702       *no_add_attrs = true;
24703     }
24704
24705   return NULL_TREE;
24706 }
24707
24708 static bool
24709 rs6000_ms_bitfield_layout_p (const_tree record_type)
24710 {
24711   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
24712           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
24713     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
24714 }
24715 \f
24716 #ifdef USING_ELFOS_H
24717
24718 /* A get_unnamed_section callback, used for switching to toc_section.  */
24719
24720 static void
24721 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
24722 {
24723   if (DEFAULT_ABI == ABI_AIX
24724       && TARGET_MINIMAL_TOC
24725       && !TARGET_RELOCATABLE)
24726     {
24727       if (!toc_initialized)
24728         {
24729           toc_initialized = 1;
24730           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24731           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
24732           fprintf (asm_out_file, "\t.tc ");
24733           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
24734           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24735           fprintf (asm_out_file, "\n");
24736
24737           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24738           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24739           fprintf (asm_out_file, " = .+32768\n");
24740         }
24741       else
24742         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24743     }
24744   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
24745     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24746   else
24747     {
24748       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24749       if (!toc_initialized)
24750         {
24751           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24752           fprintf (asm_out_file, " = .+32768\n");
24753           toc_initialized = 1;
24754         }
24755     }
24756 }
24757
24758 /* Implement TARGET_ASM_INIT_SECTIONS.  */
24759
24760 static void
24761 rs6000_elf_asm_init_sections (void)
24762 {
24763   toc_section
24764     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
24765
24766   sdata2_section
24767     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
24768                            SDATA2_SECTION_ASM_OP);
24769 }
24770
24771 /* Implement TARGET_SELECT_RTX_SECTION.  */
24772
24773 static section *
24774 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
24775                                unsigned HOST_WIDE_INT align)
24776 {
24777   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
24778     return toc_section;
24779   else
24780     return default_elf_select_rtx_section (mode, x, align);
24781 }
24782 \f
24783 /* For a SYMBOL_REF, set generic flags and then perform some
24784    target-specific processing.
24785
24786    When the AIX ABI is requested on a non-AIX system, replace the
24787    function name with the real name (with a leading .) rather than the
24788    function descriptor name.  This saves a lot of overriding code to
24789    read the prefixes.  */
24790
24791 static void
24792 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
24793 {
24794   default_encode_section_info (decl, rtl, first);
24795
24796   if (first
24797       && TREE_CODE (decl) == FUNCTION_DECL
24798       && !TARGET_AIX
24799       && DEFAULT_ABI == ABI_AIX)
24800     {
24801       rtx sym_ref = XEXP (rtl, 0);
24802       size_t len = strlen (XSTR (sym_ref, 0));
24803       char *str = XALLOCAVEC (char, len + 2);
24804       str[0] = '.';
24805       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
24806       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
24807     }
24808 }
24809
24810 static inline bool
24811 compare_section_name (const char *section, const char *templ)
24812 {
24813   int len;
24814
24815   len = strlen (templ);
24816   return (strncmp (section, templ, len) == 0
24817           && (section[len] == 0 || section[len] == '.'));
24818 }
24819
24820 bool
24821 rs6000_elf_in_small_data_p (const_tree decl)
24822 {
24823   if (rs6000_sdata == SDATA_NONE)
24824     return false;
24825
24826   /* We want to merge strings, so we never consider them small data.  */
24827   if (TREE_CODE (decl) == STRING_CST)
24828     return false;
24829
24830   /* Functions are never in the small data area.  */
24831   if (TREE_CODE (decl) == FUNCTION_DECL)
24832     return false;
24833
24834   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
24835     {
24836       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
24837       if (compare_section_name (section, ".sdata")
24838           || compare_section_name (section, ".sdata2")
24839           || compare_section_name (section, ".gnu.linkonce.s")
24840           || compare_section_name (section, ".sbss")
24841           || compare_section_name (section, ".sbss2")
24842           || compare_section_name (section, ".gnu.linkonce.sb")
24843           || strcmp (section, ".PPC.EMB.sdata0") == 0
24844           || strcmp (section, ".PPC.EMB.sbss0") == 0)
24845         return true;
24846     }
24847   else
24848     {
24849       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
24850
24851       if (size > 0
24852           && size <= g_switch_value
24853           /* If it's not public, and we're not going to reference it there,
24854              there's no need to put it in the small data section.  */
24855           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
24856         return true;
24857     }
24858
24859   return false;
24860 }
24861
24862 #endif /* USING_ELFOS_H */
24863 \f
24864 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
24865
24866 static bool
24867 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
24868 {
24869   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
24870 }
24871 \f
24872 /* Return a REG that occurs in ADDR with coefficient 1.
24873    ADDR can be effectively incremented by incrementing REG.
24874
24875    r0 is special and we must not select it as an address
24876    register by this routine since our caller will try to
24877    increment the returned register via an "la" instruction.  */
24878
24879 rtx
24880 find_addr_reg (rtx addr)
24881 {
24882   while (GET_CODE (addr) == PLUS)
24883     {
24884       if (GET_CODE (XEXP (addr, 0)) == REG
24885           && REGNO (XEXP (addr, 0)) != 0)
24886         addr = XEXP (addr, 0);
24887       else if (GET_CODE (XEXP (addr, 1)) == REG
24888                && REGNO (XEXP (addr, 1)) != 0)
24889         addr = XEXP (addr, 1);
24890       else if (CONSTANT_P (XEXP (addr, 0)))
24891         addr = XEXP (addr, 1);
24892       else if (CONSTANT_P (XEXP (addr, 1)))
24893         addr = XEXP (addr, 0);
24894       else
24895         gcc_unreachable ();
24896     }
24897   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
24898   return addr;
24899 }
24900
24901 void
24902 rs6000_fatal_bad_address (rtx op)
24903 {
24904   fatal_insn ("bad address", op);
24905 }
24906
24907 #if TARGET_MACHO
24908
24909 typedef struct branch_island_d {
24910   tree function_name;
24911   tree label_name;
24912   int line_number;
24913 } branch_island;
24914
24915 DEF_VEC_O(branch_island);
24916 DEF_VEC_ALLOC_O(branch_island,gc);
24917
24918 static VEC(branch_island,gc) *branch_islands;
24919
24920 /* Remember to generate a branch island for far calls to the given
24921    function.  */
24922
24923 static void
24924 add_compiler_branch_island (tree label_name, tree function_name,
24925                             int line_number)
24926 {
24927   branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
24928
24929   bi->function_name = function_name;
24930   bi->label_name = label_name;
24931   bi->line_number = line_number;
24932 }
24933
24934 /* Generate far-jump branch islands for everything recorded in
24935    branch_islands.  Invoked immediately after the last instruction of
24936    the epilogue has been emitted; the branch islands must be appended
24937    to, and contiguous with, the function body.  Mach-O stubs are
24938    generated in machopic_output_stub().  */
24939
24940 static void
24941 macho_branch_islands (void)
24942 {
24943   char tmp_buf[512];
24944
24945   while (!VEC_empty (branch_island, branch_islands))
24946     {
24947       branch_island *bi = VEC_last (branch_island, branch_islands);
24948       const char *label = IDENTIFIER_POINTER (bi->label_name);
24949       const char *name = IDENTIFIER_POINTER (bi->function_name);
24950       char name_buf[512];
24951       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
24952       if (name[0] == '*' || name[0] == '&')
24953         strcpy (name_buf, name+1);
24954       else
24955         {
24956           name_buf[0] = '_';
24957           strcpy (name_buf+1, name);
24958         }
24959       strcpy (tmp_buf, "\n");
24960       strcat (tmp_buf, label);
24961 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
24962       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
24963         dbxout_stabd (N_SLINE, bi->line_number);
24964 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
24965       if (flag_pic)
24966         {
24967           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
24968           strcat (tmp_buf, label);
24969           strcat (tmp_buf, "_pic\n");
24970           strcat (tmp_buf, label);
24971           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
24972
24973           strcat (tmp_buf, "\taddis r11,r11,ha16(");
24974           strcat (tmp_buf, name_buf);
24975           strcat (tmp_buf, " - ");
24976           strcat (tmp_buf, label);
24977           strcat (tmp_buf, "_pic)\n");
24978
24979           strcat (tmp_buf, "\tmtlr r0\n");
24980
24981           strcat (tmp_buf, "\taddi r12,r11,lo16(");
24982           strcat (tmp_buf, name_buf);
24983           strcat (tmp_buf, " - ");
24984           strcat (tmp_buf, label);
24985           strcat (tmp_buf, "_pic)\n");
24986
24987           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
24988         }
24989       else
24990         {
24991           strcat (tmp_buf, ":\nlis r12,hi16(");
24992           strcat (tmp_buf, name_buf);
24993           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
24994           strcat (tmp_buf, name_buf);
24995           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
24996         }
24997       output_asm_insn (tmp_buf, 0);
24998 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
24999       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25000         dbxout_stabd (N_SLINE, bi->line_number);
25001 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25002       VEC_pop (branch_island, branch_islands);
25003     }
25004 }
25005
25006 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
25007    already there or not.  */
25008
25009 static int
25010 no_previous_def (tree function_name)
25011 {
25012   branch_island *bi;
25013   unsigned ix;
25014
25015   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25016     if (function_name == bi->function_name)
25017       return 0;
25018   return 1;
25019 }
25020
25021 /* GET_PREV_LABEL gets the label name from the previous definition of
25022    the function.  */
25023
25024 static tree
25025 get_prev_label (tree function_name)
25026 {
25027   branch_island *bi;
25028   unsigned ix;
25029
25030   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25031     if (function_name == bi->function_name)
25032       return bi->label_name;
25033   return NULL_TREE;
25034 }
25035
25036 /* INSN is either a function call or a millicode call.  It may have an
25037    unconditional jump in its delay slot.
25038
25039    CALL_DEST is the routine we are calling.  */
25040
25041 char *
25042 output_call (rtx insn, rtx *operands, int dest_operand_number,
25043              int cookie_operand_number)
25044 {
25045   static char buf[256];
25046   if (darwin_emit_branch_islands
25047       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
25048       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
25049     {
25050       tree labelname;
25051       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
25052
25053       if (no_previous_def (funname))
25054         {
25055           rtx label_rtx = gen_label_rtx ();
25056           char *label_buf, temp_buf[256];
25057           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
25058                                        CODE_LABEL_NUMBER (label_rtx));
25059           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
25060           labelname = get_identifier (label_buf);
25061           add_compiler_branch_island (labelname, funname, insn_line (insn));
25062         }
25063       else
25064         labelname = get_prev_label (funname);
25065
25066       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
25067          instruction will reach 'foo', otherwise link as 'bl L42'".
25068          "L42" should be a 'branch island', that will do a far jump to
25069          'foo'.  Branch islands are generated in
25070          macho_branch_islands().  */
25071       sprintf (buf, "jbsr %%z%d,%.246s",
25072                dest_operand_number, IDENTIFIER_POINTER (labelname));
25073     }
25074   else
25075     sprintf (buf, "bl %%z%d", dest_operand_number);
25076   return buf;
25077 }
25078
25079 /* Generate PIC and indirect symbol stubs.  */
25080
25081 void
25082 machopic_output_stub (FILE *file, const char *symb, const char *stub)
25083 {
25084   unsigned int length;
25085   char *symbol_name, *lazy_ptr_name;
25086   char *local_label_0;
25087   static int label = 0;
25088
25089   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
25090   symb = (*targetm.strip_name_encoding) (symb);
25091
25092
25093   length = strlen (symb);
25094   symbol_name = XALLOCAVEC (char, length + 32);
25095   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
25096
25097   lazy_ptr_name = XALLOCAVEC (char, length + 32);
25098   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
25099
25100   if (flag_pic == 2)
25101     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
25102   else
25103     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
25104
25105   if (flag_pic == 2)
25106     {
25107       fprintf (file, "\t.align 5\n");
25108
25109       fprintf (file, "%s:\n", stub);
25110       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25111
25112       label++;
25113       local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
25114       sprintf (local_label_0, "\"L%011d$spb\"", label);
25115
25116       fprintf (file, "\tmflr r0\n");
25117       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
25118       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
25119       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
25120                lazy_ptr_name, local_label_0);
25121       fprintf (file, "\tmtlr r0\n");
25122       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
25123                (TARGET_64BIT ? "ldu" : "lwzu"),
25124                lazy_ptr_name, local_label_0);
25125       fprintf (file, "\tmtctr r12\n");
25126       fprintf (file, "\tbctr\n");
25127     }
25128   else
25129     {
25130       fprintf (file, "\t.align 4\n");
25131
25132       fprintf (file, "%s:\n", stub);
25133       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25134
25135       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
25136       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
25137                (TARGET_64BIT ? "ldu" : "lwzu"),
25138                lazy_ptr_name);
25139       fprintf (file, "\tmtctr r12\n");
25140       fprintf (file, "\tbctr\n");
25141     }
25142
25143   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
25144   fprintf (file, "%s:\n", lazy_ptr_name);
25145   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25146   fprintf (file, "%sdyld_stub_binding_helper\n",
25147            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
25148 }
25149
25150 /* Legitimize PIC addresses.  If the address is already
25151    position-independent, we return ORIG.  Newly generated
25152    position-independent addresses go into a reg.  This is REG if non
25153    zero, otherwise we allocate register(s) as necessary.  */
25154
25155 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
25156
25157 rtx
25158 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
25159                                         rtx reg)
25160 {
25161   rtx base, offset;
25162
25163   if (reg == NULL && ! reload_in_progress && ! reload_completed)
25164     reg = gen_reg_rtx (Pmode);
25165
25166   if (GET_CODE (orig) == CONST)
25167     {
25168       rtx reg_temp;
25169
25170       if (GET_CODE (XEXP (orig, 0)) == PLUS
25171           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
25172         return orig;
25173
25174       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
25175
25176       /* Use a different reg for the intermediate value, as
25177          it will be marked UNCHANGING.  */
25178       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
25179       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
25180                                                      Pmode, reg_temp);
25181       offset =
25182         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
25183                                                 Pmode, reg);
25184
25185       if (GET_CODE (offset) == CONST_INT)
25186         {
25187           if (SMALL_INT (offset))
25188             return plus_constant (base, INTVAL (offset));
25189           else if (! reload_in_progress && ! reload_completed)
25190             offset = force_reg (Pmode, offset);
25191           else
25192             {
25193               rtx mem = force_const_mem (Pmode, orig);
25194               return machopic_legitimize_pic_address (mem, Pmode, reg);
25195             }
25196         }
25197       return gen_rtx_PLUS (Pmode, base, offset);
25198     }
25199
25200   /* Fall back on generic machopic code.  */
25201   return machopic_legitimize_pic_address (orig, mode, reg);
25202 }
25203
25204 /* Output a .machine directive for the Darwin assembler, and call
25205    the generic start_file routine.  */
25206
25207 static void
25208 rs6000_darwin_file_start (void)
25209 {
25210   static const struct
25211   {
25212     const char *arg;
25213     const char *name;
25214     int if_set;
25215   } mapping[] = {
25216     { "ppc64", "ppc64", MASK_64BIT },
25217     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
25218     { "power4", "ppc970", 0 },
25219     { "G5", "ppc970", 0 },
25220     { "7450", "ppc7450", 0 },
25221     { "7400", "ppc7400", MASK_ALTIVEC },
25222     { "G4", "ppc7400", 0 },
25223     { "750", "ppc750", 0 },
25224     { "740", "ppc750", 0 },
25225     { "G3", "ppc750", 0 },
25226     { "604e", "ppc604e", 0 },
25227     { "604", "ppc604", 0 },
25228     { "603e", "ppc603", 0 },
25229     { "603", "ppc603", 0 },
25230     { "601", "ppc601", 0 },
25231     { NULL, "ppc", 0 } };
25232   const char *cpu_id = "";
25233   size_t i;
25234
25235   rs6000_file_start ();
25236   darwin_file_start ();
25237
25238   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
25239   
25240   if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
25241     cpu_id = rs6000_default_cpu;
25242
25243   if (global_options_set.x_rs6000_cpu_index)
25244     cpu_id = processor_target_table[rs6000_cpu_index].name;
25245
25246   /* Look through the mapping array.  Pick the first name that either
25247      matches the argument, has a bit set in IF_SET that is also set
25248      in the target flags, or has a NULL name.  */
25249
25250   i = 0;
25251   while (mapping[i].arg != NULL
25252          && strcmp (mapping[i].arg, cpu_id) != 0
25253          && (mapping[i].if_set & target_flags) == 0)
25254     i++;
25255
25256   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
25257 }
25258
25259 #endif /* TARGET_MACHO */
25260
25261 #if TARGET_ELF
25262 static int
25263 rs6000_elf_reloc_rw_mask (void)
25264 {
25265   if (flag_pic)
25266     return 3;
25267   else if (DEFAULT_ABI == ABI_AIX)
25268     return 2;
25269   else
25270     return 0;
25271 }
25272
25273 /* Record an element in the table of global constructors.  SYMBOL is
25274    a SYMBOL_REF of the function to be called; PRIORITY is a number
25275    between 0 and MAX_INIT_PRIORITY.
25276
25277    This differs from default_named_section_asm_out_constructor in
25278    that we have special handling for -mrelocatable.  */
25279
25280 static void
25281 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
25282 {
25283   const char *section = ".ctors";
25284   char buf[16];
25285
25286   if (priority != DEFAULT_INIT_PRIORITY)
25287     {
25288       sprintf (buf, ".ctors.%.5u",
25289                /* Invert the numbering so the linker puts us in the proper
25290                   order; constructors are run from right to left, and the
25291                   linker sorts in increasing order.  */
25292                MAX_INIT_PRIORITY - priority);
25293       section = buf;
25294     }
25295
25296   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25297   assemble_align (POINTER_SIZE);
25298
25299   if (TARGET_RELOCATABLE)
25300     {
25301       fputs ("\t.long (", asm_out_file);
25302       output_addr_const (asm_out_file, symbol);
25303       fputs (")@fixup\n", asm_out_file);
25304     }
25305   else
25306     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25307 }
25308
25309 static void
25310 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
25311 {
25312   const char *section = ".dtors";
25313   char buf[16];
25314
25315   if (priority != DEFAULT_INIT_PRIORITY)
25316     {
25317       sprintf (buf, ".dtors.%.5u",
25318                /* Invert the numbering so the linker puts us in the proper
25319                   order; constructors are run from right to left, and the
25320                   linker sorts in increasing order.  */
25321                MAX_INIT_PRIORITY - priority);
25322       section = buf;
25323     }
25324
25325   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25326   assemble_align (POINTER_SIZE);
25327
25328   if (TARGET_RELOCATABLE)
25329     {
25330       fputs ("\t.long (", asm_out_file);
25331       output_addr_const (asm_out_file, symbol);
25332       fputs (")@fixup\n", asm_out_file);
25333     }
25334   else
25335     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25336 }
25337
25338 void
25339 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
25340 {
25341   if (TARGET_64BIT)
25342     {
25343       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
25344       ASM_OUTPUT_LABEL (file, name);
25345       fputs (DOUBLE_INT_ASM_OP, file);
25346       rs6000_output_function_entry (file, name);
25347       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
25348       if (DOT_SYMBOLS)
25349         {
25350           fputs ("\t.size\t", file);
25351           assemble_name (file, name);
25352           fputs (",24\n\t.type\t.", file);
25353           assemble_name (file, name);
25354           fputs (",@function\n", file);
25355           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
25356             {
25357               fputs ("\t.globl\t.", file);
25358               assemble_name (file, name);
25359               putc ('\n', file);
25360             }
25361         }
25362       else
25363         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25364       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25365       rs6000_output_function_entry (file, name);
25366       fputs (":\n", file);
25367       return;
25368     }
25369
25370   if (TARGET_RELOCATABLE
25371       && !TARGET_SECURE_PLT
25372       && (get_pool_size () != 0 || crtl->profile)
25373       && uses_TOC ())
25374     {
25375       char buf[256];
25376
25377       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
25378
25379       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
25380       fprintf (file, "\t.long ");
25381       assemble_name (file, buf);
25382       putc ('-', file);
25383       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
25384       assemble_name (file, buf);
25385       putc ('\n', file);
25386     }
25387
25388   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25389   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25390
25391   if (DEFAULT_ABI == ABI_AIX)
25392     {
25393       const char *desc_name, *orig_name;
25394
25395       orig_name = (*targetm.strip_name_encoding) (name);
25396       desc_name = orig_name;
25397       while (*desc_name == '.')
25398         desc_name++;
25399
25400       if (TREE_PUBLIC (decl))
25401         fprintf (file, "\t.globl %s\n", desc_name);
25402
25403       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25404       fprintf (file, "%s:\n", desc_name);
25405       fprintf (file, "\t.long %s\n", orig_name);
25406       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
25407       if (DEFAULT_ABI == ABI_AIX)
25408         fputs ("\t.long 0\n", file);
25409       fprintf (file, "\t.previous\n");
25410     }
25411   ASM_OUTPUT_LABEL (file, name);
25412 }
25413
25414 static void
25415 rs6000_elf_file_end (void)
25416 {
25417 #ifdef HAVE_AS_GNU_ATTRIBUTE
25418   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
25419     {
25420       if (rs6000_passes_float)
25421         fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
25422                  ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1 
25423                   : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3 
25424                   : 2));
25425       if (rs6000_passes_vector)
25426         fprintf (asm_out_file, "\t.gnu_attribute 8, %d\n",
25427                  (TARGET_ALTIVEC_ABI ? 2
25428                   : TARGET_SPE_ABI ? 3
25429                   : 1));
25430       if (rs6000_returns_struct)
25431         fprintf (asm_out_file, "\t.gnu_attribute 12, %d\n",
25432                  aix_struct_return ? 2 : 1);
25433     }
25434 #endif
25435 #ifdef POWERPC_LINUX
25436   if (TARGET_32BIT)
25437     file_end_indicate_exec_stack ();
25438 #endif
25439 }
25440 #endif
25441
25442 #if TARGET_XCOFF
25443 static void
25444 rs6000_xcoff_asm_output_anchor (rtx symbol)
25445 {
25446   char buffer[100];
25447
25448   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
25449            SYMBOL_REF_BLOCK_OFFSET (symbol));
25450   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
25451 }
25452
25453 static void
25454 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
25455 {
25456   fputs (GLOBAL_ASM_OP, stream);
25457   RS6000_OUTPUT_BASENAME (stream, name);
25458   putc ('\n', stream);
25459 }
25460
25461 /* A get_unnamed_decl callback, used for read-only sections.  PTR
25462    points to the section string variable.  */
25463
25464 static void
25465 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
25466 {
25467   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
25468            *(const char *const *) directive,
25469            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25470 }
25471
25472 /* Likewise for read-write sections.  */
25473
25474 static void
25475 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
25476 {
25477   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
25478            *(const char *const *) directive,
25479            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25480 }
25481
25482 /* A get_unnamed_section callback, used for switching to toc_section.  */
25483
25484 static void
25485 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
25486 {
25487   if (TARGET_MINIMAL_TOC)
25488     {
25489       /* toc_section is always selected at least once from
25490          rs6000_xcoff_file_start, so this is guaranteed to
25491          always be defined once and only once in each file.  */
25492       if (!toc_initialized)
25493         {
25494           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
25495           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
25496           toc_initialized = 1;
25497         }
25498       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
25499                (TARGET_32BIT ? "" : ",3"));
25500     }
25501   else
25502     fputs ("\t.toc\n", asm_out_file);
25503 }
25504
25505 /* Implement TARGET_ASM_INIT_SECTIONS.  */
25506
25507 static void
25508 rs6000_xcoff_asm_init_sections (void)
25509 {
25510   read_only_data_section
25511     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25512                            &xcoff_read_only_section_name);
25513
25514   private_data_section
25515     = get_unnamed_section (SECTION_WRITE,
25516                            rs6000_xcoff_output_readwrite_section_asm_op,
25517                            &xcoff_private_data_section_name);
25518
25519   read_only_private_data_section
25520     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25521                            &xcoff_private_data_section_name);
25522
25523   toc_section
25524     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
25525
25526   readonly_data_section = read_only_data_section;
25527   exception_section = data_section;
25528 }
25529
25530 static int
25531 rs6000_xcoff_reloc_rw_mask (void)
25532 {
25533   return 3;
25534 }
25535
25536 static void
25537 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
25538                                 tree decl ATTRIBUTE_UNUSED)
25539 {
25540   int smclass;
25541   static const char * const suffix[3] = { "PR", "RO", "RW" };
25542
25543   if (flags & SECTION_CODE)
25544     smclass = 0;
25545   else if (flags & SECTION_WRITE)
25546     smclass = 2;
25547   else
25548     smclass = 1;
25549
25550   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
25551            (flags & SECTION_CODE) ? "." : "",
25552            name, suffix[smclass], flags & SECTION_ENTSIZE);
25553 }
25554
25555 static section *
25556 rs6000_xcoff_select_section (tree decl, int reloc,
25557                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25558 {
25559   if (decl_readonly_section (decl, reloc))
25560     {
25561       if (TREE_PUBLIC (decl))
25562         return read_only_data_section;
25563       else
25564         return read_only_private_data_section;
25565     }
25566   else
25567     {
25568       if (TREE_PUBLIC (decl))
25569         return data_section;
25570       else
25571         return private_data_section;
25572     }
25573 }
25574
25575 static void
25576 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
25577 {
25578   const char *name;
25579
25580   /* Use select_section for private and uninitialized data.  */
25581   if (!TREE_PUBLIC (decl)
25582       || DECL_COMMON (decl)
25583       || DECL_INITIAL (decl) == NULL_TREE
25584       || DECL_INITIAL (decl) == error_mark_node
25585       || (flag_zero_initialized_in_bss
25586           && initializer_zerop (DECL_INITIAL (decl))))
25587     return;
25588
25589   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
25590   name = (*targetm.strip_name_encoding) (name);
25591   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
25592 }
25593
25594 /* Select section for constant in constant pool.
25595
25596    On RS/6000, all constants are in the private read-only data area.
25597    However, if this is being placed in the TOC it must be output as a
25598    toc entry.  */
25599
25600 static section *
25601 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
25602                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25603 {
25604   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
25605     return toc_section;
25606   else
25607     return read_only_private_data_section;
25608 }
25609
25610 /* Remove any trailing [DS] or the like from the symbol name.  */
25611
25612 static const char *
25613 rs6000_xcoff_strip_name_encoding (const char *name)
25614 {
25615   size_t len;
25616   if (*name == '*')
25617     name++;
25618   len = strlen (name);
25619   if (name[len - 1] == ']')
25620     return ggc_alloc_string (name, len - 4);
25621   else
25622     return name;
25623 }
25624
25625 /* Section attributes.  AIX is always PIC.  */
25626
25627 static unsigned int
25628 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
25629 {
25630   unsigned int align;
25631   unsigned int flags = default_section_type_flags (decl, name, reloc);
25632
25633   /* Align to at least UNIT size.  */
25634   if (flags & SECTION_CODE)
25635     align = MIN_UNITS_PER_WORD;
25636   else
25637     /* Increase alignment of large objects if not already stricter.  */
25638     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
25639                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
25640                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
25641
25642   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
25643 }
25644
25645 /* Output at beginning of assembler file.
25646
25647    Initialize the section names for the RS/6000 at this point.
25648
25649    Specify filename, including full path, to assembler.
25650
25651    We want to go into the TOC section so at least one .toc will be emitted.
25652    Also, in order to output proper .bs/.es pairs, we need at least one static
25653    [RW] section emitted.
25654
25655    Finally, declare mcount when profiling to make the assembler happy.  */
25656
25657 static void
25658 rs6000_xcoff_file_start (void)
25659 {
25660   rs6000_gen_section_name (&xcoff_bss_section_name,
25661                            main_input_filename, ".bss_");
25662   rs6000_gen_section_name (&xcoff_private_data_section_name,
25663                            main_input_filename, ".rw_");
25664   rs6000_gen_section_name (&xcoff_read_only_section_name,
25665                            main_input_filename, ".ro_");
25666
25667   fputs ("\t.file\t", asm_out_file);
25668   output_quoted_string (asm_out_file, main_input_filename);
25669   fputc ('\n', asm_out_file);
25670   if (write_symbols != NO_DEBUG)
25671     switch_to_section (private_data_section);
25672   switch_to_section (text_section);
25673   if (profile_flag)
25674     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
25675   rs6000_file_start ();
25676 }
25677
25678 /* Output at end of assembler file.
25679    On the RS/6000, referencing data should automatically pull in text.  */
25680
25681 static void
25682 rs6000_xcoff_file_end (void)
25683 {
25684   switch_to_section (text_section);
25685   fputs ("_section_.text:\n", asm_out_file);
25686   switch_to_section (data_section);
25687   fputs (TARGET_32BIT
25688          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
25689          asm_out_file);
25690 }
25691 #endif /* TARGET_XCOFF */
25692
25693 /* Compute a (partial) cost for rtx X.  Return true if the complete
25694    cost has been computed, and false if subexpressions should be
25695    scanned.  In either case, *TOTAL contains the cost result.  */
25696
25697 static bool
25698 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
25699                   bool speed)
25700 {
25701   enum machine_mode mode = GET_MODE (x);
25702
25703   switch (code)
25704     {
25705       /* On the RS/6000, if it is valid in the insn, it is free.  */
25706     case CONST_INT:
25707       if (((outer_code == SET
25708             || outer_code == PLUS
25709             || outer_code == MINUS)
25710            && (satisfies_constraint_I (x)
25711                || satisfies_constraint_L (x)))
25712           || (outer_code == AND
25713               && (satisfies_constraint_K (x)
25714                   || (mode == SImode
25715                       ? satisfies_constraint_L (x)
25716                       : satisfies_constraint_J (x))
25717                   || mask_operand (x, mode)
25718                   || (mode == DImode
25719                       && mask64_operand (x, DImode))))
25720           || ((outer_code == IOR || outer_code == XOR)
25721               && (satisfies_constraint_K (x)
25722                   || (mode == SImode
25723                       ? satisfies_constraint_L (x)
25724                       : satisfies_constraint_J (x))))
25725           || outer_code == ASHIFT
25726           || outer_code == ASHIFTRT
25727           || outer_code == LSHIFTRT
25728           || outer_code == ROTATE
25729           || outer_code == ROTATERT
25730           || outer_code == ZERO_EXTRACT
25731           || (outer_code == MULT
25732               && satisfies_constraint_I (x))
25733           || ((outer_code == DIV || outer_code == UDIV
25734                || outer_code == MOD || outer_code == UMOD)
25735               && exact_log2 (INTVAL (x)) >= 0)
25736           || (outer_code == COMPARE
25737               && (satisfies_constraint_I (x)
25738                   || satisfies_constraint_K (x)))
25739           || ((outer_code == EQ || outer_code == NE)
25740               && (satisfies_constraint_I (x)
25741                   || satisfies_constraint_K (x)
25742                   || (mode == SImode
25743                       ? satisfies_constraint_L (x)
25744                       : satisfies_constraint_J (x))))
25745           || (outer_code == GTU
25746               && satisfies_constraint_I (x))
25747           || (outer_code == LTU
25748               && satisfies_constraint_P (x)))
25749         {
25750           *total = 0;
25751           return true;
25752         }
25753       else if ((outer_code == PLUS
25754                 && reg_or_add_cint_operand (x, VOIDmode))
25755                || (outer_code == MINUS
25756                    && reg_or_sub_cint_operand (x, VOIDmode))
25757                || ((outer_code == SET
25758                     || outer_code == IOR
25759                     || outer_code == XOR)
25760                    && (INTVAL (x)
25761                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
25762         {
25763           *total = COSTS_N_INSNS (1);
25764           return true;
25765         }
25766       /* FALLTHRU */
25767
25768     case CONST_DOUBLE:
25769       if (mode == DImode && code == CONST_DOUBLE)
25770         {
25771           if ((outer_code == IOR || outer_code == XOR)
25772               && CONST_DOUBLE_HIGH (x) == 0
25773               && (CONST_DOUBLE_LOW (x)
25774                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
25775             {
25776               *total = 0;
25777               return true;
25778             }
25779           else if ((outer_code == AND && and64_2_operand (x, DImode))
25780                    || ((outer_code == SET
25781                         || outer_code == IOR
25782                         || outer_code == XOR)
25783                        && CONST_DOUBLE_HIGH (x) == 0))
25784             {
25785               *total = COSTS_N_INSNS (1);
25786               return true;
25787             }
25788         }
25789       /* FALLTHRU */
25790
25791     case CONST:
25792     case HIGH:
25793     case SYMBOL_REF:
25794     case MEM:
25795       /* When optimizing for size, MEM should be slightly more expensive
25796          than generating address, e.g., (plus (reg) (const)).
25797          L1 cache latency is about two instructions.  */
25798       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
25799       return true;
25800
25801     case LABEL_REF:
25802       *total = 0;
25803       return true;
25804
25805     case PLUS:
25806     case MINUS:
25807       if (FLOAT_MODE_P (mode))
25808         *total = rs6000_cost->fp;
25809       else
25810         *total = COSTS_N_INSNS (1);
25811       return false;
25812
25813     case MULT:
25814       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25815           && satisfies_constraint_I (XEXP (x, 1)))
25816         {
25817           if (INTVAL (XEXP (x, 1)) >= -256
25818               && INTVAL (XEXP (x, 1)) <= 255)
25819             *total = rs6000_cost->mulsi_const9;
25820           else
25821             *total = rs6000_cost->mulsi_const;
25822         }
25823       else if (mode == SFmode)
25824         *total = rs6000_cost->fp;
25825       else if (FLOAT_MODE_P (mode))
25826         *total = rs6000_cost->dmul;
25827       else if (mode == DImode)
25828         *total = rs6000_cost->muldi;
25829       else
25830         *total = rs6000_cost->mulsi;
25831       return false;
25832
25833     case FMA:
25834       if (mode == SFmode)
25835         *total = rs6000_cost->fp;
25836       else
25837         *total = rs6000_cost->dmul;
25838       break;
25839
25840     case DIV:
25841     case MOD:
25842       if (FLOAT_MODE_P (mode))
25843         {
25844           *total = mode == DFmode ? rs6000_cost->ddiv
25845                                   : rs6000_cost->sdiv;
25846           return false;
25847         }
25848       /* FALLTHRU */
25849
25850     case UDIV:
25851     case UMOD:
25852       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25853           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
25854         {
25855           if (code == DIV || code == MOD)
25856             /* Shift, addze */
25857             *total = COSTS_N_INSNS (2);
25858           else
25859             /* Shift */
25860             *total = COSTS_N_INSNS (1);
25861         }
25862       else
25863         {
25864           if (GET_MODE (XEXP (x, 1)) == DImode)
25865             *total = rs6000_cost->divdi;
25866           else
25867             *total = rs6000_cost->divsi;
25868         }
25869       /* Add in shift and subtract for MOD. */
25870       if (code == MOD || code == UMOD)
25871         *total += COSTS_N_INSNS (2);
25872       return false;
25873
25874     case CTZ:
25875     case FFS:
25876       *total = COSTS_N_INSNS (4);
25877       return false;
25878
25879     case POPCOUNT:
25880       *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
25881       return false;
25882
25883     case PARITY:
25884       *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
25885       return false;
25886
25887     case NOT:
25888       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
25889         {
25890           *total = 0;
25891           return false;
25892         }
25893       /* FALLTHRU */
25894
25895     case AND:
25896     case CLZ:
25897     case IOR:
25898     case XOR:
25899     case ZERO_EXTRACT:
25900       *total = COSTS_N_INSNS (1);
25901       return false;
25902
25903     case ASHIFT:
25904     case ASHIFTRT:
25905     case LSHIFTRT:
25906     case ROTATE:
25907     case ROTATERT:
25908       /* Handle mul_highpart.  */
25909       if (outer_code == TRUNCATE
25910           && GET_CODE (XEXP (x, 0)) == MULT)
25911         {
25912           if (mode == DImode)
25913             *total = rs6000_cost->muldi;
25914           else
25915             *total = rs6000_cost->mulsi;
25916           return true;
25917         }
25918       else if (outer_code == AND)
25919         *total = 0;
25920       else
25921         *total = COSTS_N_INSNS (1);
25922       return false;
25923
25924     case SIGN_EXTEND:
25925     case ZERO_EXTEND:
25926       if (GET_CODE (XEXP (x, 0)) == MEM)
25927         *total = 0;
25928       else
25929         *total = COSTS_N_INSNS (1);
25930       return false;
25931
25932     case COMPARE:
25933     case NEG:
25934     case ABS:
25935       if (!FLOAT_MODE_P (mode))
25936         {
25937           *total = COSTS_N_INSNS (1);
25938           return false;
25939         }
25940       /* FALLTHRU */
25941
25942     case FLOAT:
25943     case UNSIGNED_FLOAT:
25944     case FIX:
25945     case UNSIGNED_FIX:
25946     case FLOAT_TRUNCATE:
25947       *total = rs6000_cost->fp;
25948       return false;
25949
25950     case FLOAT_EXTEND:
25951       if (mode == DFmode)
25952         *total = 0;
25953       else
25954         *total = rs6000_cost->fp;
25955       return false;
25956
25957     case UNSPEC:
25958       switch (XINT (x, 1))
25959         {
25960         case UNSPEC_FRSP:
25961           *total = rs6000_cost->fp;
25962           return true;
25963
25964         default:
25965           break;
25966         }
25967       break;
25968
25969     case CALL:
25970     case IF_THEN_ELSE:
25971       if (!speed)
25972         {
25973           *total = COSTS_N_INSNS (1);
25974           return true;
25975         }
25976       else if (FLOAT_MODE_P (mode)
25977                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
25978         {
25979           *total = rs6000_cost->fp;
25980           return false;
25981         }
25982       break;
25983
25984     case EQ:
25985     case GTU:
25986     case LTU:
25987       /* Carry bit requires mode == Pmode.
25988          NEG or PLUS already counted so only add one.  */
25989       if (mode == Pmode
25990           && (outer_code == NEG || outer_code == PLUS))
25991         {
25992           *total = COSTS_N_INSNS (1);
25993           return true;
25994         }
25995       if (outer_code == SET)
25996         {
25997           if (XEXP (x, 1) == const0_rtx)
25998             {
25999               if (TARGET_ISEL && !TARGET_MFCRF)
26000                 *total = COSTS_N_INSNS (8);
26001               else
26002                 *total = COSTS_N_INSNS (2);
26003               return true;
26004             }
26005           else if (mode == Pmode)
26006             {
26007               *total = COSTS_N_INSNS (3);
26008               return false;
26009             }
26010         }
26011       /* FALLTHRU */
26012
26013     case GT:
26014     case LT:
26015     case UNORDERED:
26016       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
26017         {
26018           if (TARGET_ISEL && !TARGET_MFCRF)
26019             *total = COSTS_N_INSNS (8);
26020           else
26021             *total = COSTS_N_INSNS (2);
26022           return true;
26023         }
26024       /* CC COMPARE.  */
26025       if (outer_code == COMPARE)
26026         {
26027           *total = 0;
26028           return true;
26029         }
26030       break;
26031
26032     default:
26033       break;
26034     }
26035
26036   return false;
26037 }
26038
26039 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
26040
26041 static bool
26042 rs6000_debug_rtx_costs (rtx x, int code, int outer_code, int *total,
26043                         bool speed)
26044 {
26045   bool ret = rs6000_rtx_costs (x, code, outer_code, total, speed);
26046
26047   fprintf (stderr,
26048            "\nrs6000_rtx_costs, return = %s, code = %s, outer_code = %s, "
26049            "total = %d, speed = %s, x:\n",
26050            ret ? "complete" : "scan inner",
26051            GET_RTX_NAME (code),
26052            GET_RTX_NAME (outer_code),
26053            *total,
26054            speed ? "true" : "false");
26055
26056   debug_rtx (x);
26057
26058   return ret;
26059 }
26060
26061 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
26062
26063 static int
26064 rs6000_debug_address_cost (rtx x, bool speed)
26065 {
26066   int ret = TARGET_ADDRESS_COST (x, speed);
26067
26068   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
26069            ret, speed ? "true" : "false");
26070   debug_rtx (x);
26071
26072   return ret;
26073 }
26074
26075
26076 /* A C expression returning the cost of moving data from a register of class
26077    CLASS1 to one of CLASS2.  */
26078
26079 static int
26080 rs6000_register_move_cost (enum machine_mode mode,
26081                            reg_class_t from, reg_class_t to)
26082 {
26083   int ret;
26084
26085   if (TARGET_DEBUG_COST)
26086     dbg_cost_ctrl++;
26087
26088   /*  Moves from/to GENERAL_REGS.  */
26089   if (reg_classes_intersect_p (to, GENERAL_REGS)
26090       || reg_classes_intersect_p (from, GENERAL_REGS))
26091     {
26092       reg_class_t rclass = from;
26093
26094       if (! reg_classes_intersect_p (to, GENERAL_REGS))
26095         rclass = to;
26096
26097       if (rclass == FLOAT_REGS || rclass == ALTIVEC_REGS || rclass == VSX_REGS)
26098         ret = (rs6000_memory_move_cost (mode, rclass, false)
26099                + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
26100
26101       /* It's more expensive to move CR_REGS than CR0_REGS because of the
26102          shift.  */
26103       else if (rclass == CR_REGS)
26104         ret = 4;
26105
26106       /* For those processors that have slow LR/CTR moves, make them more
26107          expensive than memory in order to bias spills to memory .*/
26108       else if ((rs6000_cpu == PROCESSOR_POWER6
26109                 || rs6000_cpu == PROCESSOR_POWER7)
26110                && reg_classes_intersect_p (rclass, LINK_OR_CTR_REGS))
26111         ret = 6 * hard_regno_nregs[0][mode];
26112
26113       else
26114         /* A move will cost one instruction per GPR moved.  */
26115         ret = 2 * hard_regno_nregs[0][mode];
26116     }
26117
26118   /* If we have VSX, we can easily move between FPR or Altivec registers.  */
26119   else if (VECTOR_UNIT_VSX_P (mode)
26120            && reg_classes_intersect_p (to, VSX_REGS)
26121            && reg_classes_intersect_p (from, VSX_REGS))
26122     ret = 2 * hard_regno_nregs[32][mode];
26123
26124   /* Moving between two similar registers is just one instruction.  */
26125   else if (reg_classes_intersect_p (to, from))
26126     ret = (mode == TFmode || mode == TDmode) ? 4 : 2;
26127
26128   /* Everything else has to go through GENERAL_REGS.  */
26129   else
26130     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
26131            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
26132
26133   if (TARGET_DEBUG_COST)
26134     {
26135       if (dbg_cost_ctrl == 1)
26136         fprintf (stderr,
26137                  "rs6000_register_move_cost:, ret=%d, mode=%s, from=%s, to=%s\n",
26138                  ret, GET_MODE_NAME (mode), reg_class_names[from],
26139                  reg_class_names[to]);
26140       dbg_cost_ctrl--;
26141     }
26142
26143   return ret;
26144 }
26145
26146 /* A C expressions returning the cost of moving data of MODE from a register to
26147    or from memory.  */
26148
26149 static int
26150 rs6000_memory_move_cost (enum machine_mode mode, reg_class_t rclass,
26151                          bool in ATTRIBUTE_UNUSED)
26152 {
26153   int ret;
26154
26155   if (TARGET_DEBUG_COST)
26156     dbg_cost_ctrl++;
26157
26158   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
26159     ret = 4 * hard_regno_nregs[0][mode];
26160   else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
26161     ret = 4 * hard_regno_nregs[32][mode];
26162   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
26163     ret = 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
26164   else
26165     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
26166
26167   if (TARGET_DEBUG_COST)
26168     {
26169       if (dbg_cost_ctrl == 1)
26170         fprintf (stderr,
26171                  "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
26172                  ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
26173       dbg_cost_ctrl--;
26174     }
26175
26176   return ret;
26177 }
26178
26179 /* Returns a code for a target-specific builtin that implements
26180    reciprocal of the function, or NULL_TREE if not available.  */
26181
26182 static tree
26183 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
26184                            bool sqrt ATTRIBUTE_UNUSED)
26185 {
26186   if (optimize_insn_for_size_p ())
26187     return NULL_TREE;
26188
26189   if (md_fn)
26190     switch (fn)
26191       {
26192       case VSX_BUILTIN_XVSQRTDP:
26193         if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
26194           return NULL_TREE;
26195
26196         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
26197
26198       case VSX_BUILTIN_XVSQRTSP:
26199         if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
26200           return NULL_TREE;
26201
26202         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V4SF];
26203
26204       default:
26205         return NULL_TREE;
26206       }
26207
26208   else
26209     switch (fn)
26210       {
26211       case BUILT_IN_SQRT:
26212         if (!RS6000_RECIP_AUTO_RSQRTE_P (DFmode))
26213           return NULL_TREE;
26214
26215         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRT];
26216
26217       case BUILT_IN_SQRTF:
26218         if (!RS6000_RECIP_AUTO_RSQRTE_P (SFmode))
26219           return NULL_TREE;
26220
26221         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
26222
26223       default:
26224         return NULL_TREE;
26225       }
26226 }
26227
26228 /* Load up a constant.  If the mode is a vector mode, splat the value across
26229    all of the vector elements.  */
26230
26231 static rtx
26232 rs6000_load_constant_and_splat (enum machine_mode mode, REAL_VALUE_TYPE dconst)
26233 {
26234   rtx reg;
26235
26236   if (mode == SFmode || mode == DFmode)
26237     {
26238       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, mode);
26239       reg = force_reg (mode, d);
26240     }
26241   else if (mode == V4SFmode)
26242     {
26243       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, SFmode);
26244       rtvec v = gen_rtvec (4, d, d, d, d);
26245       reg = gen_reg_rtx (mode);
26246       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26247     }
26248   else if (mode == V2DFmode)
26249     {
26250       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, DFmode);
26251       rtvec v = gen_rtvec (2, d, d);
26252       reg = gen_reg_rtx (mode);
26253       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26254     }
26255   else
26256     gcc_unreachable ();
26257
26258   return reg;
26259 }
26260
26261 /* Generate an FMA instruction.  */
26262
26263 static void
26264 rs6000_emit_madd (rtx target, rtx m1, rtx m2, rtx a)
26265 {
26266   enum machine_mode mode = GET_MODE (target);
26267   rtx dst;
26268
26269   dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26270   gcc_assert (dst != NULL);
26271
26272   if (dst != target)
26273     emit_move_insn (target, dst);
26274 }
26275
26276 /* Generate a FMSUB instruction: dst = fma(m1, m2, -a).  */
26277
26278 static void
26279 rs6000_emit_msub (rtx target, rtx m1, rtx m2, rtx a)
26280 {
26281   enum machine_mode mode = GET_MODE (target);
26282   rtx dst;
26283
26284   /* Altivec does not support fms directly;
26285      generate in terms of fma in that case.  */
26286   if (optab_handler (fms_optab, mode) != CODE_FOR_nothing)
26287     dst = expand_ternary_op (mode, fms_optab, m1, m2, a, target, 0);
26288   else
26289     {
26290       a = expand_unop (mode, neg_optab, a, NULL_RTX, 0);
26291       dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26292     }
26293   gcc_assert (dst != NULL);
26294
26295   if (dst != target)
26296     emit_move_insn (target, dst);
26297 }
26298     
26299 /* Generate a FNMSUB instruction: dst = -fma(m1, m2, -a).  */
26300
26301 static void
26302 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
26303 {
26304   enum machine_mode mode = GET_MODE (dst);
26305   rtx r;
26306
26307   /* This is a tad more complicated, since the fnma_optab is for
26308      a different expression: fma(-m1, m2, a), which is the same
26309      thing except in the case of signed zeros.
26310
26311      Fortunately we know that if FMA is supported that FNMSUB is
26312      also supported in the ISA.  Just expand it directly.  */
26313
26314   gcc_assert (optab_handler (fma_optab, mode) != CODE_FOR_nothing);
26315
26316   r = gen_rtx_NEG (mode, a);
26317   r = gen_rtx_FMA (mode, m1, m2, r);
26318   r = gen_rtx_NEG (mode, r);
26319   emit_insn (gen_rtx_SET (VOIDmode, dst, r));
26320 }
26321
26322 /* Newton-Raphson approximation of floating point divide with just 2 passes
26323    (either single precision floating point, or newer machines with higher
26324    accuracy estimates).  Support both scalar and vector divide.  Assumes no
26325    trapping math and finite arguments.  */
26326
26327 static void
26328 rs6000_emit_swdiv_high_precision (rtx dst, rtx n, rtx d)
26329 {
26330   enum machine_mode mode = GET_MODE (dst);
26331   rtx x0, e0, e1, y1, u0, v0;
26332   enum insn_code code = optab_handler (smul_optab, mode);
26333   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26334   rtx one = rs6000_load_constant_and_splat (mode, dconst1);
26335
26336   gcc_assert (code != CODE_FOR_nothing);
26337
26338   /* x0 = 1./d estimate */
26339   x0 = gen_reg_rtx (mode);
26340   emit_insn (gen_rtx_SET (VOIDmode, x0,
26341                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26342                                           UNSPEC_FRES)));
26343
26344   e0 = gen_reg_rtx (mode);
26345   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - (d * x0) */
26346
26347   e1 = gen_reg_rtx (mode);
26348   rs6000_emit_madd (e1, e0, e0, e0);            /* e1 = (e0 * e0) + e0 */
26349
26350   y1 = gen_reg_rtx (mode);
26351   rs6000_emit_madd (y1, e1, x0, x0);            /* y1 = (e1 * x0) + x0 */
26352
26353   u0 = gen_reg_rtx (mode);
26354   emit_insn (gen_mul (u0, n, y1));              /* u0 = n * y1 */
26355
26356   v0 = gen_reg_rtx (mode);
26357   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - (d * u0) */
26358
26359   rs6000_emit_madd (dst, v0, y1, u0);           /* dst = (v0 * y1) + u0 */
26360 }
26361
26362 /* Newton-Raphson approximation of floating point divide that has a low
26363    precision estimate.  Assumes no trapping math and finite arguments.  */
26364
26365 static void
26366 rs6000_emit_swdiv_low_precision (rtx dst, rtx n, rtx d)
26367 {
26368   enum machine_mode mode = GET_MODE (dst);
26369   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
26370   enum insn_code code = optab_handler (smul_optab, mode);
26371   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26372
26373   gcc_assert (code != CODE_FOR_nothing);
26374
26375   one = rs6000_load_constant_and_splat (mode, dconst1);
26376
26377   /* x0 = 1./d estimate */
26378   x0 = gen_reg_rtx (mode);
26379   emit_insn (gen_rtx_SET (VOIDmode, x0,
26380                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26381                                           UNSPEC_FRES)));
26382
26383   e0 = gen_reg_rtx (mode);
26384   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - d * x0 */
26385
26386   y1 = gen_reg_rtx (mode);
26387   rs6000_emit_madd (y1, e0, x0, x0);            /* y1 = x0 + e0 * x0 */
26388
26389   e1 = gen_reg_rtx (mode);
26390   emit_insn (gen_mul (e1, e0, e0));             /* e1 = e0 * e0 */
26391
26392   y2 = gen_reg_rtx (mode);
26393   rs6000_emit_madd (y2, e1, y1, y1);            /* y2 = y1 + e1 * y1 */
26394
26395   e2 = gen_reg_rtx (mode);
26396   emit_insn (gen_mul (e2, e1, e1));             /* e2 = e1 * e1 */
26397
26398   y3 = gen_reg_rtx (mode);
26399   rs6000_emit_madd (y3, e2, y2, y2);            /* y3 = y2 + e2 * y2 */
26400
26401   u0 = gen_reg_rtx (mode);
26402   emit_insn (gen_mul (u0, n, y3));              /* u0 = n * y3 */
26403
26404   v0 = gen_reg_rtx (mode);
26405   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - d * u0 */
26406
26407   rs6000_emit_madd (dst, v0, y3, u0);           /* dst = u0 + v0 * y3 */
26408 }
26409
26410 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
26411    add a reg_note saying that this was a division.  Support both scalar and
26412    vector divide.  Assumes no trapping math and finite arguments.  */
26413
26414 void
26415 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
26416 {
26417   enum machine_mode mode = GET_MODE (dst);
26418
26419   if (RS6000_RECIP_HIGH_PRECISION_P (mode))
26420     rs6000_emit_swdiv_high_precision (dst, n, d);
26421   else
26422     rs6000_emit_swdiv_low_precision (dst, n, d);
26423
26424   if (note_p)
26425     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
26426 }
26427
26428 /* Newton-Raphson approximation of single/double-precision floating point
26429    rsqrt.  Assumes no trapping math and finite arguments.  */
26430
26431 void
26432 rs6000_emit_swrsqrt (rtx dst, rtx src)
26433 {
26434   enum machine_mode mode = GET_MODE (src);
26435   rtx x0 = gen_reg_rtx (mode);
26436   rtx y = gen_reg_rtx (mode);
26437   int passes = (TARGET_RECIP_PRECISION) ? 2 : 3;
26438   REAL_VALUE_TYPE dconst3_2;
26439   int i;
26440   rtx halfthree;
26441   enum insn_code code = optab_handler (smul_optab, mode);
26442   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26443
26444   gcc_assert (code != CODE_FOR_nothing);
26445
26446   /* Load up the constant 1.5 either as a scalar, or as a vector.  */
26447   real_from_integer (&dconst3_2, VOIDmode, 3, 0, 0);
26448   SET_REAL_EXP (&dconst3_2, REAL_EXP (&dconst3_2) - 1);
26449
26450   halfthree = rs6000_load_constant_and_splat (mode, dconst3_2);
26451
26452   /* x0 = rsqrt estimate */
26453   emit_insn (gen_rtx_SET (VOIDmode, x0,
26454                           gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
26455                                           UNSPEC_RSQRT)));
26456
26457   /* y = 0.5 * src = 1.5 * src - src -> fewer constants */
26458   rs6000_emit_msub (y, src, halfthree, src);
26459
26460   for (i = 0; i < passes; i++)
26461     {
26462       rtx x1 = gen_reg_rtx (mode);
26463       rtx u = gen_reg_rtx (mode);
26464       rtx v = gen_reg_rtx (mode);
26465
26466       /* x1 = x0 * (1.5 - y * (x0 * x0)) */
26467       emit_insn (gen_mul (u, x0, x0));
26468       rs6000_emit_nmsub (v, y, u, halfthree);
26469       emit_insn (gen_mul (x1, x0, v));
26470       x0 = x1;
26471     }
26472
26473   emit_move_insn (dst, x0);
26474   return;
26475 }
26476
26477 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
26478    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
26479
26480 void
26481 rs6000_emit_popcount (rtx dst, rtx src)
26482 {
26483   enum machine_mode mode = GET_MODE (dst);
26484   rtx tmp1, tmp2;
26485
26486   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
26487   if (TARGET_POPCNTD)
26488     {
26489       if (mode == SImode)
26490         emit_insn (gen_popcntdsi2 (dst, src));
26491       else
26492         emit_insn (gen_popcntddi2 (dst, src));
26493       return;
26494     }
26495
26496   tmp1 = gen_reg_rtx (mode);
26497
26498   if (mode == SImode)
26499     {
26500       emit_insn (gen_popcntbsi2 (tmp1, src));
26501       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
26502                            NULL_RTX, 0);
26503       tmp2 = force_reg (SImode, tmp2);
26504       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
26505     }
26506   else
26507     {
26508       emit_insn (gen_popcntbdi2 (tmp1, src));
26509       tmp2 = expand_mult (DImode, tmp1,
26510                           GEN_INT ((HOST_WIDE_INT)
26511                                    0x01010101 << 32 | 0x01010101),
26512                           NULL_RTX, 0);
26513       tmp2 = force_reg (DImode, tmp2);
26514       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
26515     }
26516 }
26517
26518
26519 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
26520    target, and SRC is the argument operand.  */
26521
26522 void
26523 rs6000_emit_parity (rtx dst, rtx src)
26524 {
26525   enum machine_mode mode = GET_MODE (dst);
26526   rtx tmp;
26527
26528   tmp = gen_reg_rtx (mode);
26529
26530   /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can.  */
26531   if (TARGET_CMPB)
26532     {
26533       if (mode == SImode)
26534         {
26535           emit_insn (gen_popcntbsi2 (tmp, src));
26536           emit_insn (gen_paritysi2_cmpb (dst, tmp));
26537         }
26538       else
26539         {
26540           emit_insn (gen_popcntbdi2 (tmp, src));
26541           emit_insn (gen_paritydi2_cmpb (dst, tmp));
26542         }
26543       return;
26544     }
26545
26546   if (mode == SImode)
26547     {
26548       /* Is mult+shift >= shift+xor+shift+xor?  */
26549       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
26550         {
26551           rtx tmp1, tmp2, tmp3, tmp4;
26552
26553           tmp1 = gen_reg_rtx (SImode);
26554           emit_insn (gen_popcntbsi2 (tmp1, src));
26555
26556           tmp2 = gen_reg_rtx (SImode);
26557           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
26558           tmp3 = gen_reg_rtx (SImode);
26559           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
26560
26561           tmp4 = gen_reg_rtx (SImode);
26562           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
26563           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
26564         }
26565       else
26566         rs6000_emit_popcount (tmp, src);
26567       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
26568     }
26569   else
26570     {
26571       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
26572       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
26573         {
26574           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
26575
26576           tmp1 = gen_reg_rtx (DImode);
26577           emit_insn (gen_popcntbdi2 (tmp1, src));
26578
26579           tmp2 = gen_reg_rtx (DImode);
26580           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
26581           tmp3 = gen_reg_rtx (DImode);
26582           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
26583
26584           tmp4 = gen_reg_rtx (DImode);
26585           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
26586           tmp5 = gen_reg_rtx (DImode);
26587           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
26588
26589           tmp6 = gen_reg_rtx (DImode);
26590           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
26591           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
26592         }
26593       else
26594         rs6000_emit_popcount (tmp, src);
26595       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
26596     }
26597 }
26598
26599 /* Return an RTX representing where to find the function value of a
26600    function returning MODE.  */
26601 static rtx
26602 rs6000_complex_function_value (enum machine_mode mode)
26603 {
26604   unsigned int regno;
26605   rtx r1, r2;
26606   enum machine_mode inner = GET_MODE_INNER (mode);
26607   unsigned int inner_bytes = GET_MODE_SIZE (inner);
26608
26609   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26610     regno = FP_ARG_RETURN;
26611   else
26612     {
26613       regno = GP_ARG_RETURN;
26614
26615       /* 32-bit is OK since it'll go in r3/r4.  */
26616       if (TARGET_32BIT && inner_bytes >= 4)
26617         return gen_rtx_REG (mode, regno);
26618     }
26619
26620   if (inner_bytes >= 8)
26621     return gen_rtx_REG (mode, regno);
26622
26623   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
26624                           const0_rtx);
26625   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
26626                           GEN_INT (inner_bytes));
26627   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
26628 }
26629
26630 /* Target hook for TARGET_FUNCTION_VALUE.
26631
26632    On the SPE, both FPs and vectors are returned in r3.
26633
26634    On RS/6000 an integer value is in r3 and a floating-point value is in
26635    fp1, unless -msoft-float.  */
26636
26637 rtx
26638 rs6000_function_value (const_tree valtype,
26639                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
26640                        bool outgoing ATTRIBUTE_UNUSED)
26641 {
26642   enum machine_mode mode;
26643   unsigned int regno;
26644
26645   /* Special handling for structs in darwin64.  */
26646   if (TARGET_MACHO 
26647       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
26648     {
26649       CUMULATIVE_ARGS valcum;
26650       rtx valret;
26651
26652       valcum.words = 0;
26653       valcum.fregno = FP_ARG_MIN_REG;
26654       valcum.vregno = ALTIVEC_ARG_MIN_REG;
26655       /* Do a trial code generation as if this were going to be passed as
26656          an argument; if any part goes in memory, we return NULL.  */
26657       valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true);
26658       if (valret)
26659         return valret;
26660       /* Otherwise fall through to standard ABI rules.  */
26661     }
26662
26663   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
26664     {
26665       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26666       return gen_rtx_PARALLEL (DImode,
26667         gen_rtvec (2,
26668                    gen_rtx_EXPR_LIST (VOIDmode,
26669                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26670                                       const0_rtx),
26671                    gen_rtx_EXPR_LIST (VOIDmode,
26672                                       gen_rtx_REG (SImode,
26673                                                    GP_ARG_RETURN + 1),
26674                                       GEN_INT (4))));
26675     }
26676   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
26677     {
26678       return gen_rtx_PARALLEL (DCmode,
26679         gen_rtvec (4,
26680                    gen_rtx_EXPR_LIST (VOIDmode,
26681                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26682                                       const0_rtx),
26683                    gen_rtx_EXPR_LIST (VOIDmode,
26684                                       gen_rtx_REG (SImode,
26685                                                    GP_ARG_RETURN + 1),
26686                                       GEN_INT (4)),
26687                    gen_rtx_EXPR_LIST (VOIDmode,
26688                                       gen_rtx_REG (SImode,
26689                                                    GP_ARG_RETURN + 2),
26690                                       GEN_INT (8)),
26691                    gen_rtx_EXPR_LIST (VOIDmode,
26692                                       gen_rtx_REG (SImode,
26693                                                    GP_ARG_RETURN + 3),
26694                                       GEN_INT (12))));
26695     }
26696
26697   mode = TYPE_MODE (valtype);
26698   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
26699       || POINTER_TYPE_P (valtype))
26700     mode = TARGET_32BIT ? SImode : DImode;
26701
26702   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26703     /* _Decimal128 must use an even/odd register pair.  */
26704     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26705   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
26706            && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
26707     regno = FP_ARG_RETURN;
26708   else if (TREE_CODE (valtype) == COMPLEX_TYPE
26709            && targetm.calls.split_complex_arg)
26710     return rs6000_complex_function_value (mode);
26711   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
26712      return register is used in both cases, and we won't see V2DImode/V2DFmode
26713      for pure altivec, combine the two cases.  */
26714   else if (TREE_CODE (valtype) == VECTOR_TYPE
26715            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
26716            && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
26717     regno = ALTIVEC_ARG_RETURN;
26718   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26719            && (mode == DFmode || mode == DCmode
26720                || mode == TFmode || mode == TCmode))
26721     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26722   else
26723     regno = GP_ARG_RETURN;
26724
26725   return gen_rtx_REG (mode, regno);
26726 }
26727
26728 /* Define how to find the value returned by a library function
26729    assuming the value has mode MODE.  */
26730 rtx
26731 rs6000_libcall_value (enum machine_mode mode)
26732 {
26733   unsigned int regno;
26734
26735   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
26736     {
26737       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26738       return gen_rtx_PARALLEL (DImode,
26739         gen_rtvec (2,
26740                    gen_rtx_EXPR_LIST (VOIDmode,
26741                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26742                                       const0_rtx),
26743                    gen_rtx_EXPR_LIST (VOIDmode,
26744                                       gen_rtx_REG (SImode,
26745                                                    GP_ARG_RETURN + 1),
26746                                       GEN_INT (4))));
26747     }
26748
26749   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26750     /* _Decimal128 must use an even/odd register pair.  */
26751     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26752   else if (SCALAR_FLOAT_MODE_P (mode)
26753            && TARGET_HARD_FLOAT && TARGET_FPRS
26754            && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
26755     regno = FP_ARG_RETURN;
26756   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
26757      return register is used in both cases, and we won't see V2DImode/V2DFmode
26758      for pure altivec, combine the two cases.  */
26759   else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
26760            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
26761     regno = ALTIVEC_ARG_RETURN;
26762   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
26763     return rs6000_complex_function_value (mode);
26764   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26765            && (mode == DFmode || mode == DCmode
26766                || mode == TFmode || mode == TCmode))
26767     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26768   else
26769     regno = GP_ARG_RETURN;
26770
26771   return gen_rtx_REG (mode, regno);
26772 }
26773
26774
26775 /* Given FROM and TO register numbers, say whether this elimination is allowed.
26776    Frame pointer elimination is automatically handled.
26777
26778    For the RS/6000, if frame pointer elimination is being done, we would like
26779    to convert ap into fp, not sp.
26780
26781    We need r30 if -mminimal-toc was specified, and there are constant pool
26782    references.  */
26783
26784 bool
26785 rs6000_can_eliminate (const int from, const int to)
26786 {
26787   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
26788           ? ! frame_pointer_needed
26789           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
26790             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0
26791             : true);
26792 }
26793
26794 /* Define the offset between two registers, FROM to be eliminated and its
26795    replacement TO, at the start of a routine.  */
26796 HOST_WIDE_INT
26797 rs6000_initial_elimination_offset (int from, int to)
26798 {
26799   rs6000_stack_t *info = rs6000_stack_info ();
26800   HOST_WIDE_INT offset;
26801
26802   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26803     offset = info->push_p ? 0 : -info->total_size;
26804   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26805     {
26806       offset = info->push_p ? 0 : -info->total_size;
26807       if (FRAME_GROWS_DOWNWARD)
26808         offset += info->fixed_size + info->vars_size + info->parm_size;
26809     }
26810   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26811     offset = FRAME_GROWS_DOWNWARD
26812              ? info->fixed_size + info->vars_size + info->parm_size
26813              : 0;
26814   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26815     offset = info->total_size;
26816   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26817     offset = info->push_p ? info->total_size : 0;
26818   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
26819     offset = 0;
26820   else
26821     gcc_unreachable ();
26822
26823   return offset;
26824 }
26825
26826 static rtx
26827 rs6000_dwarf_register_span (rtx reg)
26828 {
26829   rtx parts[8];
26830   int i, words;
26831   unsigned regno = REGNO (reg);
26832   enum machine_mode mode = GET_MODE (reg);
26833
26834   if (TARGET_SPE
26835       && regno < 32
26836       && (SPE_VECTOR_MODE (GET_MODE (reg))
26837           || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
26838               && mode != SFmode && mode != SDmode && mode != SCmode)))
26839     ;
26840   else
26841     return NULL_RTX;
26842
26843   regno = REGNO (reg);
26844
26845   /* The duality of the SPE register size wreaks all kinds of havoc.
26846      This is a way of distinguishing r0 in 32-bits from r0 in
26847      64-bits.  */
26848   words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
26849   gcc_assert (words <= 4);
26850   for (i = 0; i < words; i++, regno++)
26851     {
26852       if (BYTES_BIG_ENDIAN)
26853         {
26854           parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
26855           parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
26856         }
26857       else
26858         {
26859           parts[2 * i] = gen_rtx_REG (SImode, regno);
26860           parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
26861         }
26862     }
26863
26864   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
26865 }
26866
26867 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
26868
26869 static void
26870 rs6000_init_dwarf_reg_sizes_extra (tree address)
26871 {
26872   if (TARGET_SPE)
26873     {
26874       int i;
26875       enum machine_mode mode = TYPE_MODE (char_type_node);
26876       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
26877       rtx mem = gen_rtx_MEM (BLKmode, addr);
26878       rtx value = gen_int_mode (4, mode);
26879
26880       for (i = 1201; i < 1232; i++)
26881         {
26882           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
26883           HOST_WIDE_INT offset
26884             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
26885
26886           emit_move_insn (adjust_address (mem, mode, offset), value);
26887         }
26888     }
26889 }
26890
26891 /* Map internal gcc register numbers to DWARF2 register numbers.  */
26892
26893 unsigned int
26894 rs6000_dbx_register_number (unsigned int regno)
26895 {
26896   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
26897     return regno;
26898   if (regno == MQ_REGNO)
26899     return 100;
26900   if (regno == LR_REGNO)
26901     return 108;
26902   if (regno == CTR_REGNO)
26903     return 109;
26904   if (CR_REGNO_P (regno))
26905     return regno - CR0_REGNO + 86;
26906   if (regno == CA_REGNO)
26907     return 101;  /* XER */
26908   if (ALTIVEC_REGNO_P (regno))
26909     return regno - FIRST_ALTIVEC_REGNO + 1124;
26910   if (regno == VRSAVE_REGNO)
26911     return 356;
26912   if (regno == VSCR_REGNO)
26913     return 67;
26914   if (regno == SPE_ACC_REGNO)
26915     return 99;
26916   if (regno == SPEFSCR_REGNO)
26917     return 612;
26918   /* SPE high reg number.  We get these values of regno from
26919      rs6000_dwarf_register_span.  */
26920   gcc_assert (regno >= 1200 && regno < 1232);
26921   return regno;
26922 }
26923
26924 /* target hook eh_return_filter_mode */
26925 static enum machine_mode
26926 rs6000_eh_return_filter_mode (void)
26927 {
26928   return TARGET_32BIT ? SImode : word_mode;
26929 }
26930
26931 /* Target hook for scalar_mode_supported_p.  */
26932 static bool
26933 rs6000_scalar_mode_supported_p (enum machine_mode mode)
26934 {
26935   if (DECIMAL_FLOAT_MODE_P (mode))
26936     return default_decimal_float_supported_p ();
26937   else
26938     return default_scalar_mode_supported_p (mode);
26939 }
26940
26941 /* Target hook for vector_mode_supported_p.  */
26942 static bool
26943 rs6000_vector_mode_supported_p (enum machine_mode mode)
26944 {
26945
26946   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
26947     return true;
26948
26949   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
26950     return true;
26951
26952   else if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
26953     return true;
26954
26955   else
26956     return false;
26957 }
26958
26959 /* Target hook for invalid_arg_for_unprototyped_fn. */
26960 static const char *
26961 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
26962 {
26963   return (!rs6000_darwin64_abi
26964           && typelist == 0
26965           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
26966           && (funcdecl == NULL_TREE
26967               || (TREE_CODE (funcdecl) == FUNCTION_DECL
26968                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
26969           ? N_("AltiVec argument passed to unprototyped function")
26970           : NULL;
26971 }
26972
26973 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
26974    setup by using __stack_chk_fail_local hidden function instead of
26975    calling __stack_chk_fail directly.  Otherwise it is better to call
26976    __stack_chk_fail directly.  */
26977
26978 static tree ATTRIBUTE_UNUSED
26979 rs6000_stack_protect_fail (void)
26980 {
26981   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
26982          ? default_hidden_stack_protect_fail ()
26983          : default_external_stack_protect_fail ();
26984 }
26985
26986 void
26987 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
26988                            int num_operands ATTRIBUTE_UNUSED)
26989 {
26990   if (rs6000_warn_cell_microcode)
26991     {
26992       const char *temp;
26993       int insn_code_number = recog_memoized (insn);
26994       location_t location = locator_location (INSN_LOCATOR (insn));
26995
26996       /* Punt on insns we cannot recognize.  */
26997       if (insn_code_number < 0)
26998         return;
26999
27000       temp = get_insn_template (insn_code_number, insn);
27001
27002       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
27003         warning_at (location, OPT_mwarn_cell_microcode,
27004                     "emitting microcode insn %s\t[%s] #%d",
27005                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn)); 
27006       else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
27007         warning_at (location, OPT_mwarn_cell_microcode,
27008                     "emitting conditional microcode insn %s\t[%s] #%d",
27009                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
27010     }
27011 }
27012
27013 \f
27014 /* Mask options that we want to support inside of attribute((target)) and
27015    #pragma GCC target operations.  Note, we do not include things like
27016    64/32-bit, endianess, hard/soft floating point, etc. that would have
27017    different calling sequences.  */
27018
27019 struct rs6000_opt_mask {
27020   const char *name;             /* option name */
27021   int mask;                     /* mask to set */
27022   bool invert;                  /* invert sense of mask */
27023   bool valid_target;            /* option is a target option */
27024 };
27025
27026 static struct rs6000_opt_mask const rs6000_opt_masks[] =
27027 {
27028   { "altivec",          MASK_ALTIVEC,           false, true  },
27029   { "cmpb",             MASK_CMPB,              false, true  },
27030   { "dlmzb",            MASK_DLMZB,             false, true  },
27031   { "fprnd",            MASK_FPRND,             false, true  },
27032   { "hard-dfp",         MASK_DFP,               false, true  },
27033   { "isel",             MASK_ISEL,              false, true  },
27034   { "mfcrf",            MASK_MFCRF,             false, true  },
27035   { "mfpgpr",           MASK_MFPGPR,            false, true  },
27036   { "mulhw",            MASK_MULHW,             false, true  },
27037   { "multiple",         MASK_MULTIPLE,          false, true  },
27038   { "update",           MASK_NO_UPDATE,         true , true  },
27039   { "popcntb",          MASK_POPCNTB,           false, true  },
27040   { "popcntd",          MASK_POPCNTD,           false, true  },
27041   { "powerpc-gfxopt",   MASK_PPC_GFXOPT,        false, true  },
27042   { "powerpc-gpopt",    MASK_PPC_GPOPT,         false, true  },
27043   { "recip-precision",  MASK_RECIP_PRECISION,   false, true  },
27044   { "string",           MASK_STRING,            false, true  },
27045   { "vsx",              MASK_VSX,               false, true  },
27046 #ifdef MASK_64BIT
27047 #if TARGET_AIX_OS
27048   { "aix64",            MASK_64BIT,             false, false },
27049   { "aix32",            MASK_64BIT,             true,  false },
27050 #else
27051   { "64",               MASK_64BIT,             false, false },
27052   { "32",               MASK_64BIT,             true,  false },
27053 #endif
27054 #endif
27055 #ifdef MASK_EABI
27056   { "eabi",             MASK_EABI,              false, false },
27057 #endif
27058 #ifdef MASK_LITTLE_ENDIAN
27059   { "little",           MASK_LITTLE_ENDIAN,     false, false },
27060   { "big",              MASK_LITTLE_ENDIAN,     true,  false },
27061 #endif
27062 #ifdef MASK_RELOCATABLE
27063   { "relocatable",      MASK_RELOCATABLE,       false, false },
27064 #endif
27065 #ifdef MASK_STRICT_ALIGN
27066   { "strict-align",     MASK_STRICT_ALIGN,      false, false },
27067 #endif
27068   { "power",            MASK_POWER,             false, false },
27069   { "power2",           MASK_POWER2,            false, false },
27070   { "powerpc",          MASK_POWERPC,           false, false },
27071   { "soft-float",       MASK_SOFT_FLOAT,        false, false },
27072   { "string",           MASK_STRING,            false, false },
27073 };
27074
27075 /* Option variables that we want to support inside attribute((target)) and
27076    #pragma GCC target operations.  */
27077
27078 struct rs6000_opt_var {
27079   const char *name;             /* option name */
27080   size_t global_offset;         /* offset of the option in global_options.  */
27081   size_t target_offset;         /* offset of the option in target optiosn.  */
27082 };
27083
27084 static struct rs6000_opt_var const rs6000_opt_vars[] =
27085 {
27086   { "friz",
27087     offsetof (struct gcc_options, x_TARGET_FRIZ),
27088     offsetof (struct cl_target_option, x_TARGET_FRIZ), },
27089   { "avoid-indexed-addresses",
27090     offsetof (struct gcc_options, x_TARGET_AVOID_XFORM),
27091     offsetof (struct cl_target_option, x_TARGET_AVOID_XFORM) },
27092   { "paired",
27093     offsetof (struct gcc_options, x_rs6000_paired_float),
27094     offsetof (struct cl_target_option, x_rs6000_paired_float), },
27095   { "longcall",
27096     offsetof (struct gcc_options, x_rs6000_default_long_calls),
27097     offsetof (struct cl_target_option, x_rs6000_default_long_calls), },
27098 };
27099
27100 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
27101    parsing.  Return true if there were no errors.  */
27102
27103 static bool
27104 rs6000_inner_target_options (tree args, bool attr_p)
27105 {
27106   bool ret = true;
27107
27108   if (args == NULL_TREE)
27109     ;
27110
27111   else if (TREE_CODE (args) == STRING_CST)
27112     {
27113       char *p = ASTRDUP (TREE_STRING_POINTER (args));
27114       char *q;
27115
27116       while ((q = strtok (p, ",")) != NULL)
27117         {
27118           bool error_p = false;
27119           bool not_valid_p = false;
27120           const char *cpu_opt = NULL;
27121
27122           p = NULL;
27123           if (strncmp (q, "cpu=", 4) == 0)
27124             {
27125               int cpu_index = rs6000_cpu_name_lookup (q+4);
27126               if (cpu_index >= 0)
27127                 rs6000_cpu_index = cpu_index;
27128               else
27129                 {
27130                   error_p = true;
27131                   cpu_opt = q+4;
27132                 }
27133             }
27134           else if (strncmp (q, "tune=", 5) == 0)
27135             {
27136               int tune_index = rs6000_cpu_name_lookup (q+5);
27137               if (tune_index >= 0)
27138                 rs6000_tune_index = tune_index;
27139               else
27140                 {
27141                   error_p = true;
27142                   cpu_opt = q+5;
27143                 }
27144             }
27145           else
27146             {
27147               size_t i;
27148               bool invert = false;
27149               char *r = q;
27150
27151               error_p = true;
27152               if (strncmp (r, "no-", 3) == 0)
27153                 {
27154                   invert = true;
27155                   r += 3;
27156                 }
27157
27158               for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
27159                 if (strcmp (r, rs6000_opt_masks[i].name) == 0)
27160                   {
27161                     int mask = rs6000_opt_masks[i].mask;
27162
27163                     if (!rs6000_opt_masks[i].valid_target)
27164                       not_valid_p = true;
27165                     else
27166                       {
27167                         error_p = false;
27168                         target_flags_explicit |= mask;
27169
27170                         if (rs6000_opt_masks[i].invert)
27171                           invert = !invert;
27172
27173                         if (invert)
27174                           target_flags &= ~mask;
27175                         else
27176                           target_flags |= mask;
27177                       }
27178                     break;
27179                   }
27180
27181               if (error_p && !not_valid_p)
27182                 {
27183                   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
27184                     if (strcmp (r, rs6000_opt_vars[i].name) == 0)
27185                       {
27186                         size_t j = rs6000_opt_vars[i].global_offset;
27187                         ((int *) &global_options)[j] = !invert;
27188                         error_p = false;
27189                         break;
27190                       }
27191                 }
27192             }
27193
27194           if (error_p)
27195             {
27196               const char *eprefix, *esuffix;
27197
27198               ret = false;
27199               if (attr_p)
27200                 {
27201                   eprefix = "__attribute__((__target__(";
27202                   esuffix = ")))";
27203                 }
27204               else
27205                 {
27206                   eprefix = "#pragma GCC target ";
27207                   esuffix = "";
27208                 }
27209
27210               if (cpu_opt)
27211                 error ("invalid cpu \"%s\" for %s\"%s\"%s", cpu_opt, eprefix,
27212                        q, esuffix);
27213               else if (not_valid_p)
27214                 error ("%s\"%s\"%s is not allowed", eprefix, q, esuffix);
27215               else
27216                 error ("%s\"%s\"%s is invalid", eprefix, q, esuffix);
27217             }
27218         }
27219     }
27220
27221   else if (TREE_CODE (args) == TREE_LIST)
27222     {
27223       do
27224         {
27225           tree value = TREE_VALUE (args);
27226           if (value)
27227             {
27228               bool ret2 = rs6000_inner_target_options (value, attr_p);
27229               if (!ret2)
27230                 ret = false;
27231             }
27232           args = TREE_CHAIN (args);
27233         }
27234       while (args != NULL_TREE);
27235     }
27236
27237   else
27238     gcc_unreachable ();
27239
27240   return ret;
27241 }
27242
27243 /* Print out the target options as a list for -mdebug=target.  */
27244
27245 static void
27246 rs6000_debug_target_options (tree args, const char *prefix)
27247 {
27248   if (args == NULL_TREE)
27249     fprintf (stderr, "%s<NULL>", prefix);
27250
27251   else if (TREE_CODE (args) == STRING_CST)
27252     {
27253       char *p = ASTRDUP (TREE_STRING_POINTER (args));
27254       char *q;
27255
27256       while ((q = strtok (p, ",")) != NULL)
27257         {
27258           p = NULL;
27259           fprintf (stderr, "%s\"%s\"", prefix, q);
27260           prefix = ", ";
27261         }
27262     }
27263
27264   else if (TREE_CODE (args) == TREE_LIST)
27265     {
27266       do
27267         {
27268           tree value = TREE_VALUE (args);
27269           if (value)
27270             {
27271               rs6000_debug_target_options (value, prefix);
27272               prefix = ", ";
27273             }
27274           args = TREE_CHAIN (args);
27275         }
27276       while (args != NULL_TREE);
27277     }
27278
27279   else
27280     gcc_unreachable ();
27281
27282   return;
27283 }
27284
27285 \f
27286 /* Hook to validate attribute((target("..."))).  */
27287
27288 static bool
27289 rs6000_valid_attribute_p (tree fndecl,
27290                           tree ARG_UNUSED (name),
27291                           tree args,
27292                           int flags)
27293 {
27294   struct cl_target_option cur_target;
27295   bool ret;
27296   tree old_optimize = build_optimization_node ();
27297   tree new_target, new_optimize;
27298   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27299
27300   gcc_assert ((fndecl != NULL_TREE) && (args != NULL_TREE));
27301
27302   if (TARGET_DEBUG_TARGET)
27303     {
27304       tree tname = DECL_NAME (fndecl);
27305       fprintf (stderr, "\n==================== rs6000_valid_attribute_p:\n");
27306       if (tname)
27307         fprintf (stderr, "function: %.*s\n",
27308                  (int) IDENTIFIER_LENGTH (tname),
27309                  IDENTIFIER_POINTER (tname));
27310       else
27311         fprintf (stderr, "function: unknown\n");
27312   
27313       fprintf (stderr, "args:");
27314       rs6000_debug_target_options (args, " ");
27315       fprintf (stderr, "\n");
27316
27317       if (flags)
27318         fprintf (stderr, "flags: 0x%x\n", flags);
27319
27320       fprintf (stderr, "--------------------\n");
27321     }
27322
27323   old_optimize = build_optimization_node ();
27324   func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27325
27326   /* If the function changed the optimization levels as well as setting target
27327      options, start with the optimizations specified.  */
27328   if (func_optimize && func_optimize != old_optimize)
27329     cl_optimization_restore (&global_options,
27330                              TREE_OPTIMIZATION (func_optimize));
27331
27332   /* The target attributes may also change some optimization flags, so update
27333      the optimization options if necessary.  */
27334   cl_target_option_save (&cur_target, &global_options);
27335   rs6000_cpu_index = rs6000_tune_index = -1;
27336   ret = rs6000_inner_target_options (args, true);
27337
27338   /* Set up any additional state.  */
27339   if (ret)
27340     {
27341       ret = rs6000_option_override_internal (false);
27342       new_target = build_target_option_node ();
27343     }
27344   else
27345     new_target = NULL;
27346
27347   new_optimize = build_optimization_node ();
27348
27349   if (!new_target)
27350     ret = false;
27351
27352   else if (fndecl)
27353     {
27354       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
27355
27356       if (old_optimize != new_optimize)
27357         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
27358     }
27359
27360   cl_target_option_restore (&global_options, &cur_target);
27361
27362   if (old_optimize != new_optimize)
27363     cl_optimization_restore (&global_options,
27364                              TREE_OPTIMIZATION (old_optimize));
27365
27366   return ret;
27367 }
27368
27369 \f
27370 /* Hook to validate the current #pragma GCC target and set the state, and
27371    update the macros based on what was changed.  If ARGS is NULL, then
27372    POP_TARGET is used to reset the options.  */
27373
27374 bool
27375 rs6000_pragma_target_parse (tree args, tree pop_target)
27376 {
27377   tree cur_tree;
27378   bool ret;
27379
27380   if (TARGET_DEBUG_TARGET)
27381     {
27382       fprintf (stderr, "\n==================== rs6000_pragma_target_parse\n");
27383       fprintf (stderr, "args:");
27384       rs6000_debug_target_options (args, " ");
27385       fprintf (stderr, "\n");
27386
27387       if (pop_target)
27388         {
27389           fprintf (stderr, "pop_target:\n");
27390           debug_tree (pop_target);
27391         }
27392       else
27393         fprintf (stderr, "pop_target: <NULL>\n");
27394
27395       fprintf (stderr, "--------------------\n");
27396     }
27397
27398   if (! args)
27399     {
27400       ret = true;
27401       cur_tree = ((pop_target)
27402                   ? pop_target
27403                   : target_option_default_node);
27404       cl_target_option_restore (&global_options,
27405                                 TREE_TARGET_OPTION (cur_tree));
27406     }
27407   else
27408     {
27409       rs6000_cpu_index = rs6000_tune_index = -1;
27410       ret = rs6000_inner_target_options (args, false);
27411       cur_tree = build_target_option_node ();
27412
27413       if (!cur_tree)
27414         ret = false;
27415     }
27416
27417   if (cur_tree)
27418     target_option_current_node = cur_tree;
27419
27420   return ret;
27421 }
27422
27423 \f
27424 /* Remember the last target of rs6000_set_current_function.  */
27425 static GTY(()) tree rs6000_previous_fndecl;
27426
27427 /* Establish appropriate back-end context for processing the function
27428    FNDECL.  The argument might be NULL to indicate processing at top
27429    level, outside of any function scope.  */
27430 static void
27431 rs6000_set_current_function (tree fndecl)
27432 {
27433   tree old_tree = (rs6000_previous_fndecl
27434                    ? DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl)
27435                    : NULL_TREE);
27436
27437   tree new_tree = (fndecl
27438                    ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
27439                    : NULL_TREE);
27440
27441   if (TARGET_DEBUG_TARGET)
27442     {
27443       bool print_final = false;
27444       fprintf (stderr, "\n==================== rs6000_set_current_function");
27445
27446       if (fndecl)
27447         fprintf (stderr, ", fndecl %s (%p)",
27448                  (DECL_NAME (fndecl)
27449                   ? IDENTIFIER_POINTER (DECL_NAME (fndecl))
27450                   : "<unknown>"), (void *)fndecl);
27451
27452       if (rs6000_previous_fndecl)
27453         fprintf (stderr, ", prev_fndecl (%p)", (void *)rs6000_previous_fndecl);
27454
27455       fprintf (stderr, "\n");
27456       if (new_tree)
27457         {
27458           fprintf (stderr, "\nnew fndecl target specific options:\n");
27459           debug_tree (new_tree);
27460           print_final = true;
27461         }
27462
27463       if (old_tree)
27464         {
27465           fprintf (stderr, "\nold fndecl target specific options:\n");
27466           debug_tree (old_tree);
27467           print_final = true;
27468         }
27469
27470       if (print_final)
27471         fprintf (stderr, "--------------------\n");
27472     }
27473
27474   /* Only change the context if the function changes.  This hook is called
27475      several times in the course of compiling a function, and we don't want to
27476      slow things down too much or call target_reinit when it isn't safe.  */
27477   if (fndecl && fndecl != rs6000_previous_fndecl)
27478     {
27479       rs6000_previous_fndecl = fndecl;
27480       if (old_tree == new_tree)
27481         ;
27482
27483       else if (new_tree)
27484         {
27485           cl_target_option_restore (&global_options,
27486                                     TREE_TARGET_OPTION (new_tree));
27487           target_reinit ();
27488         }
27489
27490       else if (old_tree)
27491         {
27492           struct cl_target_option *def
27493             = TREE_TARGET_OPTION (target_option_current_node);
27494
27495           cl_target_option_restore (&global_options, def);
27496           target_reinit ();
27497         }
27498     }
27499 }
27500
27501 \f
27502 /* Save the current options */
27503
27504 static void
27505 rs6000_function_specific_save (struct cl_target_option *ptr)
27506 {
27507   ptr->rs6000_target_flags_explicit = target_flags_explicit;
27508 }
27509
27510 /* Restore the current options */
27511
27512 static void
27513 rs6000_function_specific_restore (struct cl_target_option *ptr)
27514 {
27515   target_flags_explicit = ptr->rs6000_target_flags_explicit;
27516   (void) rs6000_option_override_internal (false);
27517 }
27518
27519 /* Print the current options */
27520
27521 static void
27522 rs6000_function_specific_print (FILE *file, int indent,
27523                                 struct cl_target_option *ptr)
27524 {
27525   size_t i;
27526   int flags = ptr->x_target_flags;
27527
27528   /* Print the various mask options.  */
27529   for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
27530     if ((flags & rs6000_opt_masks[i].mask) != 0)
27531       {
27532         flags &= ~ rs6000_opt_masks[i].mask;
27533         fprintf (file, "%*s-m%s%s\n", indent, "",
27534                  rs6000_opt_masks[i].invert ? "no-" : "",
27535                  rs6000_opt_masks[i].name);
27536       }
27537
27538   /* Print the various options that are variables.  */
27539   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
27540     {
27541       size_t j = rs6000_opt_vars[i].target_offset;
27542       if (((signed char *) ptr)[j])
27543         fprintf (file, "%*s-m%s\n", indent, "",
27544                  rs6000_opt_vars[i].name);
27545     }
27546 }
27547
27548 \f
27549 /* Hook to determine if one function can safely inline another.  */
27550
27551 static bool
27552 rs6000_can_inline_p (tree caller, tree callee)
27553 {
27554   bool ret = false;
27555   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
27556   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
27557
27558   /* If callee has no option attributes, then it is ok to inline.  */
27559   if (!callee_tree)
27560     ret = true;
27561
27562   /* If caller has no option attributes, but callee does then it is not ok to
27563      inline.  */
27564   else if (!caller_tree)
27565     ret = false;
27566
27567   else
27568     {
27569       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
27570       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
27571
27572       /* Callee's options should a subset of the caller's, i.e. a vsx function
27573          can inline an altivec function but a non-vsx function can't inline a
27574          vsx function.  */
27575       if ((caller_opts->x_target_flags & callee_opts->x_target_flags)
27576           == callee_opts->x_target_flags)
27577         ret = true;
27578     }
27579
27580   if (TARGET_DEBUG_TARGET)
27581     fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
27582              (DECL_NAME (caller)
27583               ? IDENTIFIER_POINTER (DECL_NAME (caller))
27584               : "<unknown>"),
27585              (DECL_NAME (callee)
27586               ? IDENTIFIER_POINTER (DECL_NAME (callee))
27587               : "<unknown>"),
27588              (ret ? "can" : "cannot"));
27589
27590   return ret;
27591 }
27592 \f
27593 /* Allocate a stack temp and fixup the address so it meets the particular
27594    memory requirements (either offetable or REG+REG addressing).  */
27595
27596 rtx
27597 rs6000_allocate_stack_temp (enum machine_mode mode,
27598                             bool offsettable_p,
27599                             bool reg_reg_p)
27600 {
27601   rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
27602   rtx addr = XEXP (stack, 0);
27603   int strict_p = (reload_in_progress || reload_completed);
27604
27605   if (!legitimate_indirect_address_p (addr, strict_p))
27606     {
27607       if (offsettable_p
27608           && !rs6000_legitimate_offset_address_p (mode, addr, strict_p))
27609         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
27610
27611       else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
27612         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
27613     }
27614
27615   return stack;
27616 }
27617
27618 /* Given a memory reference, if it is not a reg or reg+reg addressing, convert
27619    to such a form to deal with memory reference instructions like STFIWX that
27620    only take reg+reg addressing.  */
27621
27622 rtx
27623 rs6000_address_for_fpconvert (rtx x)
27624 {
27625   int strict_p = (reload_in_progress || reload_completed);
27626   rtx addr;
27627
27628   gcc_assert (MEM_P (x));
27629   addr = XEXP (x, 0);
27630   if (! legitimate_indirect_address_p (addr, strict_p)
27631       && ! legitimate_indexed_address_p (addr, strict_p))
27632     {
27633       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
27634         {
27635           rtx reg = XEXP (addr, 0);
27636           HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (x));
27637           rtx size_rtx = GEN_INT ((GET_CODE (addr) == PRE_DEC) ? -size : size);
27638           gcc_assert (REG_P (reg));
27639           emit_insn (gen_add3_insn (reg, reg, size_rtx));
27640           addr = reg;
27641         }
27642       else if (GET_CODE (addr) == PRE_MODIFY)
27643         {
27644           rtx reg = XEXP (addr, 0);
27645           rtx expr = XEXP (addr, 1);
27646           gcc_assert (REG_P (reg));
27647           gcc_assert (GET_CODE (expr) == PLUS);
27648           emit_insn (gen_add3_insn (reg, XEXP (expr, 0), XEXP (expr, 1)));
27649           addr = reg;
27650         }
27651
27652       x = replace_equiv_address (x, copy_addr_to_reg (addr));
27653     }
27654
27655   return x;
27656 }
27657
27658 /* Given a memory reference, if it is not in the form for altivec memory
27659    reference instructions (i.e. reg or reg+reg addressing with AND of -16),
27660    convert to the altivec format.  */
27661
27662 rtx
27663 rs6000_address_for_altivec (rtx x)
27664 {
27665   gcc_assert (MEM_P (x));
27666   if (!altivec_indexed_or_indirect_operand (x, GET_MODE (x)))
27667     {
27668       rtx addr = XEXP (x, 0);
27669       int strict_p = (reload_in_progress || reload_completed);
27670
27671       if (!legitimate_indexed_address_p (addr, strict_p)
27672           && !legitimate_indirect_address_p (addr, strict_p))
27673         addr = copy_to_mode_reg (Pmode, addr);
27674
27675       addr = gen_rtx_AND (Pmode, addr, GEN_INT (-16));
27676       x = change_address (x, GET_MODE (x), addr);
27677     }
27678
27679   return x;
27680 }
27681
27682 /* Implement TARGET_LEGITIMATE_CONSTANT_P.
27683
27684    On the RS/6000, all integer constants are acceptable, most won't be valid
27685    for particular insns, though.  Only easy FP constants are acceptable.  */
27686
27687 static bool
27688 rs6000_legitimate_constant_p (enum machine_mode mode, rtx x)
27689 {
27690   if (rs6000_tls_referenced_p (x))
27691     return false;
27692
27693   return ((GET_CODE (x) != CONST_DOUBLE && GET_CODE (x) != CONST_VECTOR)
27694           || GET_MODE (x) == VOIDmode
27695           || (TARGET_POWERPC64 && mode == DImode)
27696           || easy_fp_constant (x, mode)
27697           || easy_vector_constant (x, mode));
27698 }
27699
27700 \f
27701 /* A function pointer under AIX is a pointer to a data area whose first word
27702    contains the actual address of the function, whose second word contains a
27703    pointer to its TOC, and whose third word contains a value to place in the
27704    static chain register (r11).  Note that if we load the static chain, our
27705    "trampoline" need not have any executable code.  */
27706
27707 void
27708 rs6000_call_indirect_aix (rtx value, rtx func_desc, rtx flag)
27709 {
27710   rtx func_addr;
27711   rtx toc_reg;
27712   rtx sc_reg;
27713   rtx stack_ptr;
27714   rtx stack_toc_offset;
27715   rtx stack_toc_mem;
27716   rtx func_toc_offset;
27717   rtx func_toc_mem;
27718   rtx func_sc_offset;
27719   rtx func_sc_mem;
27720   rtx insn;
27721   rtx (*call_func) (rtx, rtx, rtx, rtx);
27722   rtx (*call_value_func) (rtx, rtx, rtx, rtx, rtx);
27723
27724   stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
27725   toc_reg = gen_rtx_REG (Pmode, TOC_REGNUM);
27726
27727   /* Load up address of the actual function.  */
27728   func_desc = force_reg (Pmode, func_desc);
27729   func_addr = gen_reg_rtx (Pmode);
27730   emit_move_insn (func_addr, gen_rtx_MEM (Pmode, func_desc));
27731
27732   if (TARGET_32BIT)
27733     {
27734
27735       stack_toc_offset = GEN_INT (TOC_SAVE_OFFSET_32BIT);
27736       func_toc_offset = GEN_INT (AIX_FUNC_DESC_TOC_32BIT);
27737       func_sc_offset = GEN_INT (AIX_FUNC_DESC_SC_32BIT);
27738       if (TARGET_POINTERS_TO_NESTED_FUNCTIONS)
27739         {
27740           call_func = gen_call_indirect_aix32bit;
27741           call_value_func = gen_call_value_indirect_aix32bit;
27742         }
27743       else
27744         {
27745           call_func = gen_call_indirect_aix32bit_nor11;
27746           call_value_func = gen_call_value_indirect_aix32bit_nor11;
27747         }
27748     }
27749   else
27750     {
27751       stack_toc_offset = GEN_INT (TOC_SAVE_OFFSET_64BIT);
27752       func_toc_offset = GEN_INT (AIX_FUNC_DESC_TOC_64BIT);
27753       func_sc_offset = GEN_INT (AIX_FUNC_DESC_SC_64BIT);
27754       if (TARGET_POINTERS_TO_NESTED_FUNCTIONS)
27755         {
27756           call_func = gen_call_indirect_aix64bit;
27757           call_value_func = gen_call_value_indirect_aix64bit;
27758         }
27759       else
27760         {
27761           call_func = gen_call_indirect_aix64bit_nor11;
27762           call_value_func = gen_call_value_indirect_aix64bit_nor11;
27763         }
27764     }
27765
27766   /* Reserved spot to store the TOC.  */
27767   stack_toc_mem = gen_frame_mem (Pmode,
27768                                  gen_rtx_PLUS (Pmode,
27769                                                stack_ptr,
27770                                                stack_toc_offset));
27771
27772   gcc_assert (cfun);
27773   gcc_assert (cfun->machine);
27774
27775   /* Can we optimize saving the TOC in the prologue or do we need to do it at
27776      every call?  */
27777   if (TARGET_SAVE_TOC_INDIRECT && !cfun->calls_alloca
27778       && !cfun->calls_setjmp && !cfun->has_nonlocal_label
27779       && !cfun->can_throw_non_call_exceptions
27780       && ((flags_from_decl_or_type (cfun->decl) & ECF_NOTHROW) == ECF_NOTHROW))
27781     cfun->machine->save_toc_in_prologue = true;
27782
27783   else
27784     {
27785       MEM_VOLATILE_P (stack_toc_mem) = 1;
27786       emit_move_insn (stack_toc_mem, toc_reg);
27787     }
27788
27789   /* Calculate the address to load the TOC of the called function.  We don't
27790      actually load this until the split after reload.  */
27791   func_toc_mem = gen_rtx_MEM (Pmode,
27792                               gen_rtx_PLUS (Pmode,
27793                                             func_desc,
27794                                             func_toc_offset));
27795
27796   /* If we have a static chain, load it up.  */
27797   if (TARGET_POINTERS_TO_NESTED_FUNCTIONS)
27798     {
27799       func_sc_mem = gen_rtx_MEM (Pmode,
27800                                  gen_rtx_PLUS (Pmode,
27801                                                func_desc,
27802                                                func_sc_offset));
27803
27804       sc_reg = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
27805       emit_move_insn (sc_reg, func_sc_mem);
27806     }
27807
27808   /* Create the call.  */
27809   if (value)
27810     insn = call_value_func (value, func_addr, flag, func_toc_mem,
27811                             stack_toc_mem);
27812   else
27813     insn = call_func (func_addr, flag, func_toc_mem, stack_toc_mem);
27814
27815   emit_call_insn (insn);
27816   return;
27817 }
27818
27819 /* Return whether we need to always update the saved TOC pointer when we update
27820    the stack pointer.  */
27821
27822 bool
27823 rs6000_save_toc_in_prologue_p (void)
27824 {
27825   return (cfun && cfun->machine && cfun->machine->save_toc_in_prologue);
27826 }
27827
27828 #include "gt-rs6000.h"