OSDN Git Service

abd09e16d625f38eee3a0d9919bd8f67184696b1
[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 "langhooks.h"
52 #include "reload.h"
53 #include "cfglayout.h"
54 #include "cfgloop.h"
55 #include "sched-int.h"
56 #include "gimple.h"
57 #include "tree-flow.h"
58 #include "intl.h"
59 #include "params.h"
60 #include "tm-constrs.h"
61 #include "opts.h"
62 #if TARGET_XCOFF
63 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
64 #endif
65 #if TARGET_MACHO
66 #include "gstab.h"  /* for N_SLINE */
67 #endif
68
69 #ifndef TARGET_NO_PROTOTYPE
70 #define TARGET_NO_PROTOTYPE 0
71 #endif
72
73 #define min(A,B)        ((A) < (B) ? (A) : (B))
74 #define max(A,B)        ((A) > (B) ? (A) : (B))
75
76 /* Structure used to define the rs6000 stack */
77 typedef struct rs6000_stack {
78   int reload_completed;         /* stack info won't change from here on */
79   int first_gp_reg_save;        /* first callee saved GP register used */
80   int first_fp_reg_save;        /* first callee saved FP register used */
81   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
82   int lr_save_p;                /* true if the link reg needs to be saved */
83   int cr_save_p;                /* true if the CR reg needs to be saved */
84   unsigned int vrsave_mask;     /* mask of vec registers to save */
85   int push_p;                   /* true if we need to allocate stack space */
86   int calls_p;                  /* true if the function makes any calls */
87   int world_save_p;             /* true if we're saving *everything*:
88                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
89   enum rs6000_abi abi;          /* which ABI to use */
90   int gp_save_offset;           /* offset to save GP regs from initial SP */
91   int fp_save_offset;           /* offset to save FP regs from initial SP */
92   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
93   int lr_save_offset;           /* offset to save LR from initial SP */
94   int cr_save_offset;           /* offset to save CR from initial SP */
95   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
96   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
97   int varargs_save_offset;      /* offset to save the varargs registers */
98   int ehrd_offset;              /* offset to EH return data */
99   int reg_size;                 /* register size (4 or 8) */
100   HOST_WIDE_INT vars_size;      /* variable save area size */
101   int parm_size;                /* outgoing parameter size */
102   int save_size;                /* save area size */
103   int fixed_size;               /* fixed size of stack frame */
104   int gp_size;                  /* size of saved GP registers */
105   int fp_size;                  /* size of saved FP registers */
106   int altivec_size;             /* size of saved AltiVec registers */
107   int cr_size;                  /* size to hold CR if not in save_size */
108   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
109   int altivec_padding_size;     /* size of altivec alignment padding if
110                                    not in save_size */
111   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
112   int spe_padding_size;
113   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
114   int spe_64bit_regs_used;
115   int savres_strategy;
116 } rs6000_stack_t;
117
118 /* A C structure for machine-specific, per-function data.
119    This is added to the cfun structure.  */
120 typedef struct GTY(()) machine_function
121 {
122   /* Some local-dynamic symbol.  */
123   const char *some_ld_name;
124   /* Whether the instruction chain has been scanned already.  */
125   int insn_chain_scanned_p;
126   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
127   int ra_needs_full_frame;
128   /* Flags if __builtin_return_address (0) was used.  */
129   int ra_need_lr;
130   /* Cache lr_save_p after expansion of builtin_eh_return.  */
131   int lr_save_state;
132   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
133      varargs save area.  */
134   HOST_WIDE_INT varargs_save_offset;
135   /* Temporary stack slot to use for SDmode copies.  This slot is
136      64-bits wide and is allocated early enough so that the offset
137      does not overflow the 16-bit load/store offset field.  */
138   rtx sdmode_stack_slot;
139 } machine_function;
140
141 /* Target cpu type */
142
143 struct rs6000_cpu_select rs6000_select[3] =
144 {
145   /* switch             name,                   tune    arch */
146   { (const char *)0,    "--with-cpu=",          1,      1 },
147   { (const char *)0,    "-mcpu=",               1,      1 },
148   { (const char *)0,    "-mtune=",              1,      0 },
149 };
150
151 /* String variables to hold the various options.  */
152 static const char *rs6000_sched_insert_nops_str;
153 static const char *rs6000_sched_costly_dep_str;
154 static const char *rs6000_recip_name;
155
156 #ifdef USING_ELFOS_H
157 static const char *rs6000_abi_name;
158 static const char *rs6000_sdata_name;
159 #endif
160
161 /* Support targetm.vectorize.builtin_mask_for_load.  */
162 static GTY(()) tree altivec_builtin_mask_for_load;
163
164 /* Set to nonzero once AIX common-mode calls have been defined.  */
165 static GTY(()) int common_mode_defined;
166
167 /* Label number of label created for -mrelocatable, to call to so we can
168    get the address of the GOT section */
169 static int rs6000_pic_labelno;
170
171 #ifdef USING_ELFOS_H
172 /* Counter for labels which are to be placed in .fixup.  */
173 int fixuplabelno = 0;
174 #endif
175
176 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
177 int dot_symbols;
178
179 /* Specify the machine mode that pointers have.  After generation of rtl, the
180    compiler makes no further distinction between pointers and any other objects
181    of this machine mode.  The type is unsigned since not all things that
182    include rs6000.h also include machmode.h.  */
183 unsigned rs6000_pmode;
184
185 /* Width in bits of a pointer.  */
186 unsigned rs6000_pointer_size;
187
188 #ifdef HAVE_AS_GNU_ATTRIBUTE
189 /* Flag whether floating point values have been passed/returned.  */
190 static bool rs6000_passes_float;
191 /* Flag whether vector values have been passed/returned.  */
192 static bool rs6000_passes_vector;
193 /* Flag whether small (<= 8 byte) structures have been returned.  */
194 static bool rs6000_returns_struct;
195 #endif
196
197 /* Value is TRUE if register/mode pair is acceptable.  */
198 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
199
200 /* Maximum number of registers needed for a given register class and mode.  */
201 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
202
203 /* How many registers are needed for a given register and mode.  */
204 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
205
206 /* Map register number to register class.  */
207 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
208
209 /* Reload functions based on the type and the vector unit.  */
210 static enum insn_code rs6000_vector_reload[NUM_MACHINE_MODES][2];
211
212 /* Built in types.  */
213 tree rs6000_builtin_types[RS6000_BTI_MAX];
214 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
215
216 /* Flag to say the TOC is initialized */
217 int toc_initialized;
218 char toc_label_name[10];
219
220 /* Cached value of rs6000_variable_issue. This is cached in
221    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
222 static short cached_can_issue_more;
223
224 static GTY(()) section *read_only_data_section;
225 static GTY(()) section *private_data_section;
226 static GTY(()) section *read_only_private_data_section;
227 static GTY(()) section *sdata2_section;
228 static GTY(()) section *toc_section;
229
230 /* True for any options that were explicitly set.  */
231 static struct {
232   bool aix_struct_ret;          /* True if -maix-struct-ret was used.  */
233   bool alignment;               /* True if -malign- was used.  */
234   bool spe_abi;                 /* True if -mabi=spe/no-spe was used.  */
235   bool altivec_abi;             /* True if -mabi=altivec/no-altivec used.  */
236   bool spe;                     /* True if -mspe= was used.  */
237   bool float_gprs;              /* True if -mfloat-gprs= was used.  */
238   bool long_double;             /* True if -mlong-double- was used.  */
239   bool ieee;                    /* True if -mabi=ieee/ibmlongdouble used.  */
240   bool vrsave;                  /* True if -mvrsave was used.  */
241   bool cmodel;                  /* True if -mcmodel was used.  */
242 } rs6000_explicit_options;
243
244 struct builtin_description
245 {
246   /* mask is not const because we're going to alter it below.  This
247      nonsense will go away when we rewrite the -march infrastructure
248      to give us more target flag bits.  */
249   unsigned int mask;
250   const enum insn_code icode;
251   const char *const name;
252   const enum rs6000_builtins code;
253 };
254
255 /* Describe the vector unit used for modes.  */
256 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
257 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
258
259 /* Register classes for various constraints that are based on the target
260    switches.  */
261 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
262
263 /* Describe the alignment of a vector.  */
264 int rs6000_vector_align[NUM_MACHINE_MODES];
265
266 /* Map selected modes to types for builtins.  */
267 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
268
269 /* What modes to automatically generate reciprocal divide estimate (fre) and
270    reciprocal sqrt (frsqrte) for.  */
271 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
272
273 /* Masks to determine which reciprocal esitmate instructions to generate
274    automatically.  */
275 enum rs6000_recip_mask {
276   RECIP_SF_DIV          = 0x001,        /* Use divide estimate */
277   RECIP_DF_DIV          = 0x002,
278   RECIP_V4SF_DIV        = 0x004,
279   RECIP_V2DF_DIV        = 0x008,
280
281   RECIP_SF_RSQRT        = 0x010,        /* Use reciprocal sqrt estimate.  */
282   RECIP_DF_RSQRT        = 0x020,
283   RECIP_V4SF_RSQRT      = 0x040,
284   RECIP_V2DF_RSQRT      = 0x080,
285
286   /* Various combination of flags for -mrecip=xxx.  */
287   RECIP_NONE            = 0,
288   RECIP_ALL             = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
289                            | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
290                            | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
291
292   RECIP_HIGH_PRECISION  = RECIP_ALL,
293
294   /* On low precision machines like the power5, don't enable double precision
295      reciprocal square root estimate, since it isn't accurate enough.  */
296   RECIP_LOW_PRECISION   = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
297 };
298
299 /* -mrecip options.  */
300 static struct
301 {
302   const char *string;           /* option name */
303   unsigned int mask;            /* mask bits to set */
304 } recip_options[] = {
305   { "all",       RECIP_ALL },
306   { "none",      RECIP_NONE },
307   { "div",       (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
308                   | RECIP_V2DF_DIV) },
309   { "divf",      (RECIP_SF_DIV | RECIP_V4SF_DIV) },
310   { "divd",      (RECIP_DF_DIV | RECIP_V2DF_DIV) },
311   { "rsqrt",     (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
312                   | RECIP_V2DF_RSQRT) },
313   { "rsqrtf",    (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
314   { "rsqrtd",    (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
315 };
316
317 /* 2 argument gen function typedef.  */
318 typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
319
320 \f
321 /* Target cpu costs.  */
322
323 struct processor_costs {
324   const int mulsi;        /* cost of SImode multiplication.  */
325   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
326   const int mulsi_const9; /* cost of SImode mult by short constant.  */
327   const int muldi;        /* cost of DImode multiplication.  */
328   const int divsi;        /* cost of SImode division.  */
329   const int divdi;        /* cost of DImode division.  */
330   const int fp;           /* cost of simple SFmode and DFmode insns.  */
331   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
332   const int sdiv;         /* cost of SFmode division (fdivs).  */
333   const int ddiv;         /* cost of DFmode division (fdiv).  */
334   const int cache_line_size;    /* cache line size in bytes. */
335   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
336   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
337   const int simultaneous_prefetches; /* number of parallel prefetch
338                                         operations.  */
339 };
340
341 const struct processor_costs *rs6000_cost;
342
343 /* Processor costs (relative to an add) */
344
345 /* Instruction size costs on 32bit processors.  */
346 static const
347 struct processor_costs size32_cost = {
348   COSTS_N_INSNS (1),    /* mulsi */
349   COSTS_N_INSNS (1),    /* mulsi_const */
350   COSTS_N_INSNS (1),    /* mulsi_const9 */
351   COSTS_N_INSNS (1),    /* muldi */
352   COSTS_N_INSNS (1),    /* divsi */
353   COSTS_N_INSNS (1),    /* divdi */
354   COSTS_N_INSNS (1),    /* fp */
355   COSTS_N_INSNS (1),    /* dmul */
356   COSTS_N_INSNS (1),    /* sdiv */
357   COSTS_N_INSNS (1),    /* ddiv */
358   32,
359   0,
360   0,
361   0,
362 };
363
364 /* Instruction size costs on 64bit processors.  */
365 static const
366 struct processor_costs size64_cost = {
367   COSTS_N_INSNS (1),    /* mulsi */
368   COSTS_N_INSNS (1),    /* mulsi_const */
369   COSTS_N_INSNS (1),    /* mulsi_const9 */
370   COSTS_N_INSNS (1),    /* muldi */
371   COSTS_N_INSNS (1),    /* divsi */
372   COSTS_N_INSNS (1),    /* divdi */
373   COSTS_N_INSNS (1),    /* fp */
374   COSTS_N_INSNS (1),    /* dmul */
375   COSTS_N_INSNS (1),    /* sdiv */
376   COSTS_N_INSNS (1),    /* ddiv */
377   128,
378   0,
379   0,
380   0,
381 };
382
383 /* Instruction costs on RIOS1 processors.  */
384 static const
385 struct processor_costs rios1_cost = {
386   COSTS_N_INSNS (5),    /* mulsi */
387   COSTS_N_INSNS (4),    /* mulsi_const */
388   COSTS_N_INSNS (3),    /* mulsi_const9 */
389   COSTS_N_INSNS (5),    /* muldi */
390   COSTS_N_INSNS (19),   /* divsi */
391   COSTS_N_INSNS (19),   /* divdi */
392   COSTS_N_INSNS (2),    /* fp */
393   COSTS_N_INSNS (2),    /* dmul */
394   COSTS_N_INSNS (19),   /* sdiv */
395   COSTS_N_INSNS (19),   /* ddiv */
396   128,                  /* cache line size */
397   64,                   /* l1 cache */
398   512,                  /* l2 cache */
399   0,                    /* streams */
400 };
401
402 /* Instruction costs on RIOS2 processors.  */
403 static const
404 struct processor_costs rios2_cost = {
405   COSTS_N_INSNS (2),    /* mulsi */
406   COSTS_N_INSNS (2),    /* mulsi_const */
407   COSTS_N_INSNS (2),    /* mulsi_const9 */
408   COSTS_N_INSNS (2),    /* muldi */
409   COSTS_N_INSNS (13),   /* divsi */
410   COSTS_N_INSNS (13),   /* divdi */
411   COSTS_N_INSNS (2),    /* fp */
412   COSTS_N_INSNS (2),    /* dmul */
413   COSTS_N_INSNS (17),   /* sdiv */
414   COSTS_N_INSNS (17),   /* ddiv */
415   256,                  /* cache line size */
416   256,                  /* l1 cache */
417   1024,                 /* l2 cache */
418   0,                    /* streams */
419 };
420
421 /* Instruction costs on RS64A processors.  */
422 static const
423 struct processor_costs rs64a_cost = {
424   COSTS_N_INSNS (20),   /* mulsi */
425   COSTS_N_INSNS (12),   /* mulsi_const */
426   COSTS_N_INSNS (8),    /* mulsi_const9 */
427   COSTS_N_INSNS (34),   /* muldi */
428   COSTS_N_INSNS (65),   /* divsi */
429   COSTS_N_INSNS (67),   /* divdi */
430   COSTS_N_INSNS (4),    /* fp */
431   COSTS_N_INSNS (4),    /* dmul */
432   COSTS_N_INSNS (31),   /* sdiv */
433   COSTS_N_INSNS (31),   /* ddiv */
434   128,                  /* cache line size */
435   128,                  /* l1 cache */
436   2048,                 /* l2 cache */
437   1,                    /* streams */
438 };
439
440 /* Instruction costs on MPCCORE processors.  */
441 static const
442 struct processor_costs mpccore_cost = {
443   COSTS_N_INSNS (2),    /* mulsi */
444   COSTS_N_INSNS (2),    /* mulsi_const */
445   COSTS_N_INSNS (2),    /* mulsi_const9 */
446   COSTS_N_INSNS (2),    /* muldi */
447   COSTS_N_INSNS (6),    /* divsi */
448   COSTS_N_INSNS (6),    /* divdi */
449   COSTS_N_INSNS (4),    /* fp */
450   COSTS_N_INSNS (5),    /* dmul */
451   COSTS_N_INSNS (10),   /* sdiv */
452   COSTS_N_INSNS (17),   /* ddiv */
453   32,                   /* cache line size */
454   4,                    /* l1 cache */
455   16,                   /* l2 cache */
456   1,                    /* streams */
457 };
458
459 /* Instruction costs on PPC403 processors.  */
460 static const
461 struct processor_costs ppc403_cost = {
462   COSTS_N_INSNS (4),    /* mulsi */
463   COSTS_N_INSNS (4),    /* mulsi_const */
464   COSTS_N_INSNS (4),    /* mulsi_const9 */
465   COSTS_N_INSNS (4),    /* muldi */
466   COSTS_N_INSNS (33),   /* divsi */
467   COSTS_N_INSNS (33),   /* divdi */
468   COSTS_N_INSNS (11),   /* fp */
469   COSTS_N_INSNS (11),   /* dmul */
470   COSTS_N_INSNS (11),   /* sdiv */
471   COSTS_N_INSNS (11),   /* ddiv */
472   32,                   /* cache line size */
473   4,                    /* l1 cache */
474   16,                   /* l2 cache */
475   1,                    /* streams */
476 };
477
478 /* Instruction costs on PPC405 processors.  */
479 static const
480 struct processor_costs ppc405_cost = {
481   COSTS_N_INSNS (5),    /* mulsi */
482   COSTS_N_INSNS (4),    /* mulsi_const */
483   COSTS_N_INSNS (3),    /* mulsi_const9 */
484   COSTS_N_INSNS (5),    /* muldi */
485   COSTS_N_INSNS (35),   /* divsi */
486   COSTS_N_INSNS (35),   /* divdi */
487   COSTS_N_INSNS (11),   /* fp */
488   COSTS_N_INSNS (11),   /* dmul */
489   COSTS_N_INSNS (11),   /* sdiv */
490   COSTS_N_INSNS (11),   /* ddiv */
491   32,                   /* cache line size */
492   16,                   /* l1 cache */
493   128,                  /* l2 cache */
494   1,                    /* streams */
495 };
496
497 /* Instruction costs on PPC440 processors.  */
498 static const
499 struct processor_costs ppc440_cost = {
500   COSTS_N_INSNS (3),    /* mulsi */
501   COSTS_N_INSNS (2),    /* mulsi_const */
502   COSTS_N_INSNS (2),    /* mulsi_const9 */
503   COSTS_N_INSNS (3),    /* muldi */
504   COSTS_N_INSNS (34),   /* divsi */
505   COSTS_N_INSNS (34),   /* divdi */
506   COSTS_N_INSNS (5),    /* fp */
507   COSTS_N_INSNS (5),    /* dmul */
508   COSTS_N_INSNS (19),   /* sdiv */
509   COSTS_N_INSNS (33),   /* ddiv */
510   32,                   /* cache line size */
511   32,                   /* l1 cache */
512   256,                  /* l2 cache */
513   1,                    /* streams */
514 };
515
516 /* Instruction costs on PPC476 processors.  */
517 static const
518 struct processor_costs ppc476_cost = {
519   COSTS_N_INSNS (4),    /* mulsi */
520   COSTS_N_INSNS (4),    /* mulsi_const */
521   COSTS_N_INSNS (4),    /* mulsi_const9 */
522   COSTS_N_INSNS (4),    /* muldi */
523   COSTS_N_INSNS (11),   /* divsi */
524   COSTS_N_INSNS (11),   /* divdi */
525   COSTS_N_INSNS (6),    /* fp */
526   COSTS_N_INSNS (6),    /* dmul */
527   COSTS_N_INSNS (19),   /* sdiv */
528   COSTS_N_INSNS (33),   /* ddiv */
529   32,                   /* l1 cache line size */
530   32,                   /* l1 cache */
531   512,                  /* l2 cache */
532   1,                    /* streams */
533 };
534
535 /* Instruction costs on PPC601 processors.  */
536 static const
537 struct processor_costs ppc601_cost = {
538   COSTS_N_INSNS (5),    /* mulsi */
539   COSTS_N_INSNS (5),    /* mulsi_const */
540   COSTS_N_INSNS (5),    /* mulsi_const9 */
541   COSTS_N_INSNS (5),    /* muldi */
542   COSTS_N_INSNS (36),   /* divsi */
543   COSTS_N_INSNS (36),   /* divdi */
544   COSTS_N_INSNS (4),    /* fp */
545   COSTS_N_INSNS (5),    /* dmul */
546   COSTS_N_INSNS (17),   /* sdiv */
547   COSTS_N_INSNS (31),   /* ddiv */
548   32,                   /* cache line size */
549   32,                   /* l1 cache */
550   256,                  /* l2 cache */
551   1,                    /* streams */
552 };
553
554 /* Instruction costs on PPC603 processors.  */
555 static const
556 struct processor_costs ppc603_cost = {
557   COSTS_N_INSNS (5),    /* mulsi */
558   COSTS_N_INSNS (3),    /* mulsi_const */
559   COSTS_N_INSNS (2),    /* mulsi_const9 */
560   COSTS_N_INSNS (5),    /* muldi */
561   COSTS_N_INSNS (37),   /* divsi */
562   COSTS_N_INSNS (37),   /* divdi */
563   COSTS_N_INSNS (3),    /* fp */
564   COSTS_N_INSNS (4),    /* dmul */
565   COSTS_N_INSNS (18),   /* sdiv */
566   COSTS_N_INSNS (33),   /* ddiv */
567   32,                   /* cache line size */
568   8,                    /* l1 cache */
569   64,                   /* l2 cache */
570   1,                    /* streams */
571 };
572
573 /* Instruction costs on PPC604 processors.  */
574 static const
575 struct processor_costs ppc604_cost = {
576   COSTS_N_INSNS (4),    /* mulsi */
577   COSTS_N_INSNS (4),    /* mulsi_const */
578   COSTS_N_INSNS (4),    /* mulsi_const9 */
579   COSTS_N_INSNS (4),    /* muldi */
580   COSTS_N_INSNS (20),   /* divsi */
581   COSTS_N_INSNS (20),   /* divdi */
582   COSTS_N_INSNS (3),    /* fp */
583   COSTS_N_INSNS (3),    /* dmul */
584   COSTS_N_INSNS (18),   /* sdiv */
585   COSTS_N_INSNS (32),   /* ddiv */
586   32,                   /* cache line size */
587   16,                   /* l1 cache */
588   512,                  /* l2 cache */
589   1,                    /* streams */
590 };
591
592 /* Instruction costs on PPC604e processors.  */
593 static const
594 struct processor_costs ppc604e_cost = {
595   COSTS_N_INSNS (2),    /* mulsi */
596   COSTS_N_INSNS (2),    /* mulsi_const */
597   COSTS_N_INSNS (2),    /* mulsi_const9 */
598   COSTS_N_INSNS (2),    /* muldi */
599   COSTS_N_INSNS (20),   /* divsi */
600   COSTS_N_INSNS (20),   /* divdi */
601   COSTS_N_INSNS (3),    /* fp */
602   COSTS_N_INSNS (3),    /* dmul */
603   COSTS_N_INSNS (18),   /* sdiv */
604   COSTS_N_INSNS (32),   /* ddiv */
605   32,                   /* cache line size */
606   32,                   /* l1 cache */
607   1024,                 /* l2 cache */
608   1,                    /* streams */
609 };
610
611 /* Instruction costs on PPC620 processors.  */
612 static const
613 struct processor_costs ppc620_cost = {
614   COSTS_N_INSNS (5),    /* mulsi */
615   COSTS_N_INSNS (4),    /* mulsi_const */
616   COSTS_N_INSNS (3),    /* mulsi_const9 */
617   COSTS_N_INSNS (7),    /* muldi */
618   COSTS_N_INSNS (21),   /* divsi */
619   COSTS_N_INSNS (37),   /* divdi */
620   COSTS_N_INSNS (3),    /* fp */
621   COSTS_N_INSNS (3),    /* dmul */
622   COSTS_N_INSNS (18),   /* sdiv */
623   COSTS_N_INSNS (32),   /* ddiv */
624   128,                  /* cache line size */
625   32,                   /* l1 cache */
626   1024,                 /* l2 cache */
627   1,                    /* streams */
628 };
629
630 /* Instruction costs on PPC630 processors.  */
631 static const
632 struct processor_costs ppc630_cost = {
633   COSTS_N_INSNS (5),    /* mulsi */
634   COSTS_N_INSNS (4),    /* mulsi_const */
635   COSTS_N_INSNS (3),    /* mulsi_const9 */
636   COSTS_N_INSNS (7),    /* muldi */
637   COSTS_N_INSNS (21),   /* divsi */
638   COSTS_N_INSNS (37),   /* divdi */
639   COSTS_N_INSNS (3),    /* fp */
640   COSTS_N_INSNS (3),    /* dmul */
641   COSTS_N_INSNS (17),   /* sdiv */
642   COSTS_N_INSNS (21),   /* ddiv */
643   128,                  /* cache line size */
644   64,                   /* l1 cache */
645   1024,                 /* l2 cache */
646   1,                    /* streams */
647 };
648
649 /* Instruction costs on Cell processor.  */
650 /* COSTS_N_INSNS (1) ~ one add.  */
651 static const
652 struct processor_costs ppccell_cost = {
653   COSTS_N_INSNS (9/2)+2,    /* mulsi */
654   COSTS_N_INSNS (6/2),    /* mulsi_const */
655   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
656   COSTS_N_INSNS (15/2)+2,   /* muldi */
657   COSTS_N_INSNS (38/2),   /* divsi */
658   COSTS_N_INSNS (70/2),   /* divdi */
659   COSTS_N_INSNS (10/2),   /* fp */
660   COSTS_N_INSNS (10/2),   /* dmul */
661   COSTS_N_INSNS (74/2),   /* sdiv */
662   COSTS_N_INSNS (74/2),   /* ddiv */
663   128,                  /* cache line size */
664   32,                   /* l1 cache */
665   512,                  /* l2 cache */
666   6,                    /* streams */
667 };
668
669 /* Instruction costs on PPC750 and PPC7400 processors.  */
670 static const
671 struct processor_costs ppc750_cost = {
672   COSTS_N_INSNS (5),    /* mulsi */
673   COSTS_N_INSNS (3),    /* mulsi_const */
674   COSTS_N_INSNS (2),    /* mulsi_const9 */
675   COSTS_N_INSNS (5),    /* muldi */
676   COSTS_N_INSNS (17),   /* divsi */
677   COSTS_N_INSNS (17),   /* divdi */
678   COSTS_N_INSNS (3),    /* fp */
679   COSTS_N_INSNS (3),    /* dmul */
680   COSTS_N_INSNS (17),   /* sdiv */
681   COSTS_N_INSNS (31),   /* ddiv */
682   32,                   /* cache line size */
683   32,                   /* l1 cache */
684   512,                  /* l2 cache */
685   1,                    /* streams */
686 };
687
688 /* Instruction costs on PPC7450 processors.  */
689 static const
690 struct processor_costs ppc7450_cost = {
691   COSTS_N_INSNS (4),    /* mulsi */
692   COSTS_N_INSNS (3),    /* mulsi_const */
693   COSTS_N_INSNS (3),    /* mulsi_const9 */
694   COSTS_N_INSNS (4),    /* muldi */
695   COSTS_N_INSNS (23),   /* divsi */
696   COSTS_N_INSNS (23),   /* divdi */
697   COSTS_N_INSNS (5),    /* fp */
698   COSTS_N_INSNS (5),    /* dmul */
699   COSTS_N_INSNS (21),   /* sdiv */
700   COSTS_N_INSNS (35),   /* ddiv */
701   32,                   /* cache line size */
702   32,                   /* l1 cache */
703   1024,                 /* l2 cache */
704   1,                    /* streams */
705 };
706
707 /* Instruction costs on PPC8540 processors.  */
708 static const
709 struct processor_costs ppc8540_cost = {
710   COSTS_N_INSNS (4),    /* mulsi */
711   COSTS_N_INSNS (4),    /* mulsi_const */
712   COSTS_N_INSNS (4),    /* mulsi_const9 */
713   COSTS_N_INSNS (4),    /* muldi */
714   COSTS_N_INSNS (19),   /* divsi */
715   COSTS_N_INSNS (19),   /* divdi */
716   COSTS_N_INSNS (4),    /* fp */
717   COSTS_N_INSNS (4),    /* dmul */
718   COSTS_N_INSNS (29),   /* sdiv */
719   COSTS_N_INSNS (29),   /* ddiv */
720   32,                   /* cache line size */
721   32,                   /* l1 cache */
722   256,                  /* l2 cache */
723   1,                    /* prefetch streams /*/
724 };
725
726 /* Instruction costs on E300C2 and E300C3 cores.  */
727 static const
728 struct processor_costs ppce300c2c3_cost = {
729   COSTS_N_INSNS (4),    /* mulsi */
730   COSTS_N_INSNS (4),    /* mulsi_const */
731   COSTS_N_INSNS (4),    /* mulsi_const9 */
732   COSTS_N_INSNS (4),    /* muldi */
733   COSTS_N_INSNS (19),   /* divsi */
734   COSTS_N_INSNS (19),   /* divdi */
735   COSTS_N_INSNS (3),    /* fp */
736   COSTS_N_INSNS (4),    /* dmul */
737   COSTS_N_INSNS (18),   /* sdiv */
738   COSTS_N_INSNS (33),   /* ddiv */
739   32,
740   16,                   /* l1 cache */
741   16,                   /* l2 cache */
742   1,                    /* prefetch streams /*/
743 };
744
745 /* Instruction costs on PPCE500MC processors.  */
746 static const
747 struct processor_costs ppce500mc_cost = {
748   COSTS_N_INSNS (4),    /* mulsi */
749   COSTS_N_INSNS (4),    /* mulsi_const */
750   COSTS_N_INSNS (4),    /* mulsi_const9 */
751   COSTS_N_INSNS (4),    /* muldi */
752   COSTS_N_INSNS (14),   /* divsi */
753   COSTS_N_INSNS (14),   /* divdi */
754   COSTS_N_INSNS (8),    /* fp */
755   COSTS_N_INSNS (10),   /* dmul */
756   COSTS_N_INSNS (36),   /* sdiv */
757   COSTS_N_INSNS (66),   /* ddiv */
758   64,                   /* cache line size */
759   32,                   /* l1 cache */
760   128,                  /* l2 cache */
761   1,                    /* prefetch streams /*/
762 };
763
764 /* Instruction costs on PPCE500MC64 processors.  */
765 static const
766 struct processor_costs ppce500mc64_cost = {
767   COSTS_N_INSNS (4),    /* mulsi */
768   COSTS_N_INSNS (4),    /* mulsi_const */
769   COSTS_N_INSNS (4),    /* mulsi_const9 */
770   COSTS_N_INSNS (4),    /* muldi */
771   COSTS_N_INSNS (14),   /* divsi */
772   COSTS_N_INSNS (14),   /* divdi */
773   COSTS_N_INSNS (4),    /* fp */
774   COSTS_N_INSNS (10),   /* dmul */
775   COSTS_N_INSNS (36),   /* sdiv */
776   COSTS_N_INSNS (66),   /* ddiv */
777   64,                   /* cache line size */
778   32,                   /* l1 cache */
779   128,                  /* l2 cache */
780   1,                    /* prefetch streams /*/
781 };
782
783 /* Instruction costs on AppliedMicro Titan processors.  */
784 static const
785 struct processor_costs titan_cost = {
786   COSTS_N_INSNS (5),    /* mulsi */
787   COSTS_N_INSNS (5),    /* mulsi_const */
788   COSTS_N_INSNS (5),    /* mulsi_const9 */
789   COSTS_N_INSNS (5),    /* muldi */
790   COSTS_N_INSNS (18),   /* divsi */
791   COSTS_N_INSNS (18),   /* divdi */
792   COSTS_N_INSNS (10),   /* fp */
793   COSTS_N_INSNS (10),   /* dmul */
794   COSTS_N_INSNS (46),   /* sdiv */
795   COSTS_N_INSNS (72),   /* ddiv */
796   32,                   /* cache line size */
797   32,                   /* l1 cache */
798   512,                  /* l2 cache */
799   1,                    /* prefetch streams /*/
800 };
801
802 /* Instruction costs on POWER4 and POWER5 processors.  */
803 static const
804 struct processor_costs power4_cost = {
805   COSTS_N_INSNS (3),    /* mulsi */
806   COSTS_N_INSNS (2),    /* mulsi_const */
807   COSTS_N_INSNS (2),    /* mulsi_const9 */
808   COSTS_N_INSNS (4),    /* muldi */
809   COSTS_N_INSNS (18),   /* divsi */
810   COSTS_N_INSNS (34),   /* divdi */
811   COSTS_N_INSNS (3),    /* fp */
812   COSTS_N_INSNS (3),    /* dmul */
813   COSTS_N_INSNS (17),   /* sdiv */
814   COSTS_N_INSNS (17),   /* ddiv */
815   128,                  /* cache line size */
816   32,                   /* l1 cache */
817   1024,                 /* l2 cache */
818   8,                    /* prefetch streams /*/
819 };
820
821 /* Instruction costs on POWER6 processors.  */
822 static const
823 struct processor_costs power6_cost = {
824   COSTS_N_INSNS (8),    /* mulsi */
825   COSTS_N_INSNS (8),    /* mulsi_const */
826   COSTS_N_INSNS (8),    /* mulsi_const9 */
827   COSTS_N_INSNS (8),    /* muldi */
828   COSTS_N_INSNS (22),   /* divsi */
829   COSTS_N_INSNS (28),   /* divdi */
830   COSTS_N_INSNS (3),    /* fp */
831   COSTS_N_INSNS (3),    /* dmul */
832   COSTS_N_INSNS (13),   /* sdiv */
833   COSTS_N_INSNS (16),   /* ddiv */
834   128,                  /* cache line size */
835   64,                   /* l1 cache */
836   2048,                 /* l2 cache */
837   16,                   /* prefetch streams */
838 };
839
840 /* Instruction costs on POWER7 processors.  */
841 static const
842 struct processor_costs power7_cost = {
843   COSTS_N_INSNS (2),    /* mulsi */
844   COSTS_N_INSNS (2),    /* mulsi_const */
845   COSTS_N_INSNS (2),    /* mulsi_const9 */
846   COSTS_N_INSNS (2),    /* muldi */
847   COSTS_N_INSNS (18),   /* divsi */
848   COSTS_N_INSNS (34),   /* divdi */
849   COSTS_N_INSNS (3),    /* fp */
850   COSTS_N_INSNS (3),    /* dmul */
851   COSTS_N_INSNS (13),   /* sdiv */
852   COSTS_N_INSNS (16),   /* ddiv */
853   128,                  /* cache line size */
854   32,                   /* l1 cache */
855   256,                  /* l2 cache */
856   12,                   /* prefetch streams */
857 };
858
859 /* Instruction costs on POWER A2 processors.  */
860 static const
861 struct processor_costs ppca2_cost = {
862   COSTS_N_INSNS (16),    /* mulsi */
863   COSTS_N_INSNS (16),    /* mulsi_const */
864   COSTS_N_INSNS (16),    /* mulsi_const9 */
865   COSTS_N_INSNS (16),   /* muldi */
866   COSTS_N_INSNS (22),   /* divsi */
867   COSTS_N_INSNS (28),   /* divdi */
868   COSTS_N_INSNS (3),    /* fp */
869   COSTS_N_INSNS (3),    /* dmul */
870   COSTS_N_INSNS (59),   /* sdiv */
871   COSTS_N_INSNS (72),   /* ddiv */
872   64,
873   16,                   /* l1 cache */
874   2048,                 /* l2 cache */
875   16,                   /* prefetch streams */
876 };
877
878 \f
879 /* Table that classifies rs6000 builtin functions (pure, const, etc.).  */
880 #undef RS6000_BUILTIN
881 #undef RS6000_BUILTIN_EQUATE
882 #define RS6000_BUILTIN(NAME, TYPE) TYPE,
883 #define RS6000_BUILTIN_EQUATE(NAME, VALUE)
884
885 static const enum rs6000_btc builtin_classify[(int)RS6000_BUILTIN_COUNT] =
886 {
887 #include "rs6000-builtin.def"
888 };
889
890 #undef RS6000_BUILTIN
891 #undef RS6000_BUILTIN_EQUATE
892
893 /* Support for -mveclibabi=<xxx> to control which vector library to use.  */
894 static tree (*rs6000_veclib_handler) (tree, tree, tree);
895
896 \f
897 static bool rs6000_function_ok_for_sibcall (tree, tree);
898 static const char *rs6000_invalid_within_doloop (const_rtx);
899 static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
900 static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
901 static rtx rs6000_generate_compare (rtx, enum machine_mode);
902 static void rs6000_emit_stack_tie (void);
903 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
904 static bool spe_func_has_64bit_regs_p (void);
905 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
906                              int, HOST_WIDE_INT);
907 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
908 static unsigned rs6000_hash_constant (rtx);
909 static unsigned toc_hash_function (const void *);
910 static int toc_hash_eq (const void *, const void *);
911 static bool reg_offset_addressing_ok_p (enum machine_mode);
912 static bool virtual_stack_registers_memory_p (rtx);
913 static bool constant_pool_expr_p (rtx);
914 static bool legitimate_small_data_p (enum machine_mode, rtx);
915 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
916 static struct machine_function * rs6000_init_machine_status (void);
917 static bool rs6000_assemble_integer (rtx, unsigned int, int);
918 static bool no_global_regs_above (int, bool);
919 #ifdef HAVE_GAS_HIDDEN
920 static void rs6000_assemble_visibility (tree, int);
921 #endif
922 static int rs6000_ra_ever_killed (void);
923 static bool rs6000_attribute_takes_identifier_p (const_tree);
924 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
925 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
926 static bool rs6000_ms_bitfield_layout_p (const_tree);
927 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
928 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
929 static const char *rs6000_mangle_type (const_tree);
930 static void rs6000_set_default_type_attributes (tree);
931 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
932 static rtx rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
933 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
934                                    enum machine_mode, bool, bool, bool);
935 static bool rs6000_reg_live_or_pic_offset_p (int);
936 static tree rs6000_builtin_vectorized_libmass (tree, tree, tree);
937 static tree rs6000_builtin_vectorized_function (tree, tree, tree);
938 static void rs6000_restore_saved_cr (rtx, int);
939 static bool rs6000_output_addr_const_extra (FILE *, rtx);
940 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
941 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
942 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
943                                     tree);
944 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
945 static bool rs6000_return_in_memory (const_tree, const_tree);
946 static rtx rs6000_function_value (const_tree, const_tree, bool);
947 static void rs6000_file_start (void);
948 #if TARGET_ELF
949 static int rs6000_elf_reloc_rw_mask (void);
950 static void rs6000_elf_asm_out_constructor (rtx, int) ATTRIBUTE_UNUSED;
951 static void rs6000_elf_asm_out_destructor (rtx, int) ATTRIBUTE_UNUSED;
952 static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
953 static void rs6000_elf_asm_init_sections (void);
954 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
955                                                unsigned HOST_WIDE_INT);
956 static void rs6000_elf_encode_section_info (tree, rtx, int)
957      ATTRIBUTE_UNUSED;
958 #endif
959 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
960 static void rs6000_alloc_sdmode_stack_slot (void);
961 static void rs6000_instantiate_decls (void);
962 #if TARGET_XCOFF
963 static void rs6000_xcoff_asm_output_anchor (rtx);
964 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
965 static void rs6000_xcoff_asm_init_sections (void);
966 static int rs6000_xcoff_reloc_rw_mask (void);
967 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
968 static section *rs6000_xcoff_select_section (tree, int,
969                                              unsigned HOST_WIDE_INT);
970 static void rs6000_xcoff_unique_section (tree, int);
971 static section *rs6000_xcoff_select_rtx_section
972   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
973 static const char * rs6000_xcoff_strip_name_encoding (const char *);
974 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
975 static void rs6000_xcoff_file_start (void);
976 static void rs6000_xcoff_file_end (void);
977 #endif
978 static int rs6000_variable_issue (FILE *, int, rtx, int);
979 static int rs6000_register_move_cost (enum machine_mode,
980                                       reg_class_t, reg_class_t);
981 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
982 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
983 static bool rs6000_debug_rtx_costs (rtx, int, int, int *, bool);
984 static int rs6000_debug_address_cost (rtx, bool);
985 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
986 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
987 static void rs6000_sched_init (FILE *, int, int);
988 static bool is_microcoded_insn (rtx);
989 static bool is_nonpipeline_insn (rtx);
990 static bool is_cracked_insn (rtx);
991 static bool is_branch_slot_insn (rtx);
992 static bool is_load_insn (rtx);
993 static rtx get_store_dest (rtx pat);
994 static bool is_store_insn (rtx);
995 static bool set_to_load_agen (rtx,rtx);
996 static bool adjacent_mem_locations (rtx,rtx);
997 static int rs6000_adjust_priority (rtx, int);
998 static int rs6000_issue_rate (void);
999 static bool rs6000_is_costly_dependence (dep_t, int, int);
1000 static rtx get_next_active_insn (rtx, rtx);
1001 static bool insn_terminates_group_p (rtx , enum group_termination);
1002 static bool insn_must_be_first_in_group (rtx);
1003 static bool insn_must_be_last_in_group (rtx);
1004 static bool is_costly_group (rtx *, rtx);
1005 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
1006 static int redefine_groups (FILE *, int, rtx, rtx);
1007 static int pad_groups (FILE *, int, rtx, rtx);
1008 static void rs6000_sched_finish (FILE *, int);
1009 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
1010 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
1011 static int rs6000_use_sched_lookahead (void);
1012 static int rs6000_use_sched_lookahead_guard (rtx);
1013 static void * rs6000_alloc_sched_context (void);
1014 static void rs6000_init_sched_context (void *, bool);
1015 static void rs6000_set_sched_context (void *);
1016 static void rs6000_free_sched_context (void *);
1017 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
1018 static tree rs6000_builtin_mask_for_load (void);
1019 static tree rs6000_builtin_mul_widen_even (tree);
1020 static tree rs6000_builtin_mul_widen_odd (tree);
1021 static tree rs6000_builtin_conversion (unsigned int, tree, tree);
1022 static tree rs6000_builtin_vec_perm (tree, tree *);
1023 static bool rs6000_builtin_support_vector_misalignment (enum
1024                                                         machine_mode,
1025                                                         const_tree,
1026                                                         int, bool);
1027 static int rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt,
1028                                               tree, int);
1029 static enum machine_mode rs6000_preferred_simd_mode (enum machine_mode);
1030
1031 static void def_builtin (int, const char *, tree, int);
1032 static bool rs6000_vector_alignment_reachable (const_tree, bool);
1033 static void rs6000_init_builtins (void);
1034 static tree rs6000_builtin_decl (unsigned, bool);
1035
1036 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
1037 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
1038 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
1039 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1040 static void altivec_init_builtins (void);
1041 static unsigned builtin_hash_function (const void *);
1042 static int builtin_hash_eq (const void *, const void *);
1043 static tree builtin_function_type (enum machine_mode, enum machine_mode,
1044                                    enum machine_mode, enum machine_mode,
1045                                    enum rs6000_builtins, const char *name);
1046 static void rs6000_common_init_builtins (void);
1047 static void rs6000_init_libfuncs (void);
1048
1049 static void paired_init_builtins (void);
1050 static rtx paired_expand_builtin (tree, rtx, bool *);
1051 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
1052 static rtx paired_expand_stv_builtin (enum insn_code, tree);
1053 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
1054
1055 static void enable_mask_for_builtins (struct builtin_description *, int,
1056                                       enum rs6000_builtins,
1057                                       enum rs6000_builtins);
1058 static void spe_init_builtins (void);
1059 static rtx spe_expand_builtin (tree, rtx, bool *);
1060 static rtx spe_expand_stv_builtin (enum insn_code, tree);
1061 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
1062 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
1063 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
1064 static rs6000_stack_t *rs6000_stack_info (void);
1065 static void debug_stack_info (rs6000_stack_t *);
1066
1067 static rtx altivec_expand_builtin (tree, rtx, bool *);
1068 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
1069 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
1070 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
1071 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
1072 static rtx altivec_expand_predicate_builtin (enum insn_code, tree, rtx);
1073 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
1074 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
1075 static rtx altivec_expand_vec_set_builtin (tree);
1076 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
1077 static int get_element_number (tree, tree);
1078 static void rs6000_option_override (void);
1079 static void rs6000_option_init_struct (struct gcc_options *);
1080 static void rs6000_option_default_params (void);
1081 static bool rs6000_handle_option (struct gcc_options *, struct gcc_options *,
1082                                   const struct cl_decoded_option *,
1083                                   location_t);
1084 static int rs6000_loop_align_max_skip (rtx);
1085 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
1086 static int first_altivec_reg_to_save (void);
1087 static unsigned int compute_vrsave_mask (void);
1088 static void compute_save_world_info (rs6000_stack_t *info_ptr);
1089 static void is_altivec_return_reg (rtx, void *);
1090 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
1091 int easy_vector_constant (rtx, enum machine_mode);
1092 static rtx rs6000_dwarf_register_span (rtx);
1093 static void rs6000_init_dwarf_reg_sizes_extra (tree);
1094 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
1095 static rtx rs6000_debug_legitimize_address (rtx, rtx, enum machine_mode);
1096 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1097 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
1098 static rtx rs6000_delegitimize_address (rtx);
1099 static rtx rs6000_tls_get_addr (void);
1100 static rtx rs6000_got_sym (void);
1101 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
1102 static const char *rs6000_get_some_local_dynamic_name (void);
1103 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
1104 static rtx rs6000_complex_function_value (enum machine_mode);
1105 static rtx rs6000_spe_function_arg (const CUMULATIVE_ARGS *,
1106                                     enum machine_mode, const_tree);
1107 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
1108                                                       HOST_WIDE_INT, int);
1109 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
1110                                                         const_tree,
1111                                                         HOST_WIDE_INT);
1112 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
1113                                               HOST_WIDE_INT,
1114                                               rtx[], int *);
1115 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
1116                                                 const_tree, HOST_WIDE_INT,
1117                                                 rtx[], int *);
1118 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, bool, bool);
1119 static rtx rs6000_mixed_function_arg (enum machine_mode, const_tree, int);
1120 static void rs6000_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
1121                                          const_tree, bool);
1122 static rtx rs6000_function_arg (CUMULATIVE_ARGS *, enum machine_mode,
1123                                 const_tree, bool);
1124 static unsigned int rs6000_function_arg_boundary (enum machine_mode,
1125                                                   const_tree);
1126 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
1127 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
1128                                     enum machine_mode, tree,
1129                                     int *, int);
1130 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
1131                                       const_tree, bool);
1132 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
1133                                      tree, bool);
1134 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
1135 #if TARGET_MACHO
1136 static void macho_branch_islands (void);
1137 static int no_previous_def (tree function_name);
1138 static tree get_prev_label (tree function_name);
1139 static void rs6000_darwin_file_start (void);
1140 #endif
1141
1142 static tree rs6000_build_builtin_va_list (void);
1143 static void rs6000_va_start (tree, rtx);
1144 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
1145 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
1146 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
1147 static bool rs6000_vector_mode_supported_p (enum machine_mode);
1148 static rtx rs6000_emit_vector_compare_inner (enum rtx_code, rtx, rtx);
1149 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
1150                                        enum machine_mode);
1151 static tree rs6000_stack_protect_fail (void);
1152
1153 static rtx rs6000_legitimize_reload_address (rtx, enum machine_mode, int, int,
1154                                              int, int *);
1155
1156 static rtx rs6000_debug_legitimize_reload_address (rtx, enum machine_mode, int,
1157                                                    int, int, int *);
1158
1159 rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode, int, int,
1160                                              int, int *)
1161   = rs6000_legitimize_reload_address;
1162
1163 static bool rs6000_mode_dependent_address_p (const_rtx);
1164 static bool rs6000_mode_dependent_address (const_rtx);
1165 static bool rs6000_debug_mode_dependent_address (const_rtx);
1166 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1167   = rs6000_mode_dependent_address;
1168
1169 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1170                                                      enum machine_mode, rtx);
1171 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1172                                                            enum machine_mode,
1173                                                            rtx);
1174 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1175                                                      enum machine_mode, rtx)
1176   = rs6000_secondary_reload_class;
1177
1178 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1179 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1180                                                            enum reg_class);
1181 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1182   = rs6000_preferred_reload_class;
1183
1184 static bool rs6000_secondary_memory_needed (enum reg_class, enum reg_class,
1185                                             enum machine_mode);
1186
1187 static bool rs6000_debug_secondary_memory_needed (enum reg_class,
1188                                                   enum reg_class,
1189                                                   enum machine_mode);
1190
1191 bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class, enum reg_class,
1192                                             enum machine_mode)
1193   = rs6000_secondary_memory_needed;
1194
1195 static bool rs6000_cannot_change_mode_class (enum machine_mode,
1196                                              enum machine_mode,
1197                                              enum reg_class);
1198 static bool rs6000_debug_cannot_change_mode_class (enum machine_mode,
1199                                                    enum machine_mode,
1200                                                    enum reg_class);
1201
1202 bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
1203                                              enum machine_mode,
1204                                              enum reg_class)
1205   = rs6000_cannot_change_mode_class;
1206
1207 static reg_class_t rs6000_secondary_reload (bool, rtx, reg_class_t,
1208                                             enum machine_mode,
1209                                             struct secondary_reload_info *);
1210
1211 static const reg_class_t *rs6000_ira_cover_classes (void);
1212
1213 const int INSN_NOT_AVAILABLE = -1;
1214 static enum machine_mode rs6000_eh_return_filter_mode (void);
1215 static bool rs6000_can_eliminate (const int, const int);
1216 static void rs6000_conditional_register_usage (void);
1217 static void rs6000_trampoline_init (rtx, tree, rtx);
1218
1219 /* Hash table stuff for keeping track of TOC entries.  */
1220
1221 struct GTY(()) toc_hash_struct
1222 {
1223   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1224      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
1225   rtx key;
1226   enum machine_mode key_mode;
1227   int labelno;
1228 };
1229
1230 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
1231
1232 /* Hash table to keep track of the argument types for builtin functions.  */
1233
1234 struct GTY(()) builtin_hash_struct
1235 {
1236   tree type;
1237   enum machine_mode mode[4];    /* return value + 3 arguments.  */
1238   unsigned char uns_p[4];       /* and whether the types are unsigned.  */
1239 };
1240
1241 static GTY ((param_is (struct builtin_hash_struct))) htab_t builtin_hash_table;
1242
1243 static bool rs6000_valid_attribute_p (tree, tree, tree, int);
1244 static void rs6000_function_specific_save (struct cl_target_option *);
1245 static void rs6000_function_specific_restore (struct cl_target_option *);
1246 static void rs6000_function_specific_print (FILE *, int,
1247                                             struct cl_target_option *);
1248 static bool rs6000_can_inline_p (tree, tree);
1249 static void rs6000_set_current_function (tree);
1250
1251 \f
1252 /* Default register names.  */
1253 char rs6000_reg_names[][8] =
1254 {
1255       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1256       "8",  "9", "10", "11", "12", "13", "14", "15",
1257      "16", "17", "18", "19", "20", "21", "22", "23",
1258      "24", "25", "26", "27", "28", "29", "30", "31",
1259       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1260       "8",  "9", "10", "11", "12", "13", "14", "15",
1261      "16", "17", "18", "19", "20", "21", "22", "23",
1262      "24", "25", "26", "27", "28", "29", "30", "31",
1263      "mq", "lr", "ctr","ap",
1264       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1265       "ca",
1266       /* AltiVec registers.  */
1267       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
1268       "8",  "9",  "10", "11", "12", "13", "14", "15",
1269       "16", "17", "18", "19", "20", "21", "22", "23",
1270       "24", "25", "26", "27", "28", "29", "30", "31",
1271       "vrsave", "vscr",
1272       /* SPE registers.  */
1273       "spe_acc", "spefscr",
1274       /* Soft frame pointer.  */
1275       "sfp"
1276 };
1277
1278 #ifdef TARGET_REGNAMES
1279 static const char alt_reg_names[][8] =
1280 {
1281    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1282    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1283   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1284   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1285    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1286    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1287   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1288   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1289     "mq",    "lr",  "ctr",   "ap",
1290   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1291    "ca",
1292   /* AltiVec registers.  */
1293    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1294    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1295   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1296   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1297   "vrsave", "vscr",
1298   /* SPE registers.  */
1299   "spe_acc", "spefscr",
1300   /* Soft frame pointer.  */
1301   "sfp"
1302 };
1303 #endif
1304
1305 /* Table of valid machine attributes.  */
1306
1307 static const struct attribute_spec rs6000_attribute_table[] =
1308 {
1309   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
1310        affects_type_identity } */
1311   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
1312     false },
1313   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
1314     false },
1315   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
1316     false },
1317   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1318     false },
1319   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1320     false },
1321 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1322   SUBTARGET_ATTRIBUTE_TABLE,
1323 #endif
1324   { NULL,        0, 0, false, false, false, NULL, false }
1325 };
1326
1327 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
1328 static const struct default_options rs6000_option_optimization_table[] =
1329   {
1330     { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
1331     { OPT_LEVELS_NONE, 0, NULL, 0 }
1332   };
1333 \f
1334 #ifndef MASK_STRICT_ALIGN
1335 #define MASK_STRICT_ALIGN 0
1336 #endif
1337 #ifndef TARGET_PROFILE_KERNEL
1338 #define TARGET_PROFILE_KERNEL 0
1339 #endif
1340
1341 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1342 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1343 \f
1344 /* Initialize the GCC target structure.  */
1345 #undef TARGET_ATTRIBUTE_TABLE
1346 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1347 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1348 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1349 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1350 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1351
1352 #undef TARGET_ASM_ALIGNED_DI_OP
1353 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1354
1355 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1356    for non-ELF systems.  */
1357 #ifndef OBJECT_FORMAT_ELF
1358 #if TARGET_XCOFF
1359 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1360    64-bit targets.  */
1361 #undef TARGET_ASM_UNALIGNED_HI_OP
1362 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1363 #undef TARGET_ASM_UNALIGNED_SI_OP
1364 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1365 #undef TARGET_ASM_UNALIGNED_DI_OP
1366 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1367 #else
1368 /* For Darwin.  */
1369 #undef TARGET_ASM_UNALIGNED_HI_OP
1370 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1371 #undef TARGET_ASM_UNALIGNED_SI_OP
1372 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1373 #undef TARGET_ASM_UNALIGNED_DI_OP
1374 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1375 #undef TARGET_ASM_ALIGNED_DI_OP
1376 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1377 #endif
1378 #endif
1379
1380 /* This hook deals with fixups for relocatable code and DI-mode objects
1381    in 64-bit code.  */
1382 #undef TARGET_ASM_INTEGER
1383 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1384
1385 #ifdef HAVE_GAS_HIDDEN
1386 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1387 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1388 #endif
1389
1390 #undef TARGET_HAVE_TLS
1391 #define TARGET_HAVE_TLS HAVE_AS_TLS
1392
1393 #undef TARGET_CANNOT_FORCE_CONST_MEM
1394 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
1395
1396 #undef TARGET_DELEGITIMIZE_ADDRESS
1397 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1398
1399 #undef TARGET_ASM_FUNCTION_PROLOGUE
1400 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1401 #undef TARGET_ASM_FUNCTION_EPILOGUE
1402 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1403
1404 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
1405 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA rs6000_output_addr_const_extra
1406
1407 #undef TARGET_LEGITIMIZE_ADDRESS
1408 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1409
1410 #undef  TARGET_SCHED_VARIABLE_ISSUE
1411 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1412
1413 #undef TARGET_SCHED_ISSUE_RATE
1414 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1415 #undef TARGET_SCHED_ADJUST_COST
1416 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1417 #undef TARGET_SCHED_ADJUST_PRIORITY
1418 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1419 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1420 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1421 #undef TARGET_SCHED_INIT
1422 #define TARGET_SCHED_INIT rs6000_sched_init
1423 #undef TARGET_SCHED_FINISH
1424 #define TARGET_SCHED_FINISH rs6000_sched_finish
1425 #undef TARGET_SCHED_REORDER
1426 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1427 #undef TARGET_SCHED_REORDER2
1428 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1429
1430 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1431 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1432
1433 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1434 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1435
1436 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1437 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1438 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1439 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1440 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1441 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1442 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1443 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1444
1445 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1446 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1447 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1448 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1449 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1450 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1451 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1452 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1453 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1454 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1455 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1456 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT            \
1457   rs6000_builtin_support_vector_misalignment
1458 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1459 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1460 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1461 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1462   rs6000_builtin_vectorization_cost
1463 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
1464 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
1465   rs6000_preferred_simd_mode
1466
1467 #undef TARGET_INIT_BUILTINS
1468 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1469 #undef TARGET_BUILTIN_DECL
1470 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1471
1472 #undef TARGET_EXPAND_BUILTIN
1473 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1474
1475 #undef TARGET_MANGLE_TYPE
1476 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1477
1478 #undef TARGET_INIT_LIBFUNCS
1479 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1480
1481 #if TARGET_MACHO
1482 #undef TARGET_BINDS_LOCAL_P
1483 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1484 #endif
1485
1486 #undef TARGET_MS_BITFIELD_LAYOUT_P
1487 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1488
1489 #undef TARGET_ASM_OUTPUT_MI_THUNK
1490 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1491
1492 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1493 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1494
1495 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1496 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1497
1498 #undef TARGET_INVALID_WITHIN_DOLOOP
1499 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1500
1501 #undef TARGET_REGISTER_MOVE_COST
1502 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1503 #undef TARGET_MEMORY_MOVE_COST
1504 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1505 #undef TARGET_RTX_COSTS
1506 #define TARGET_RTX_COSTS rs6000_rtx_costs
1507 #undef TARGET_ADDRESS_COST
1508 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1509
1510 #undef TARGET_DWARF_REGISTER_SPAN
1511 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1512
1513 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1514 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1515
1516 /* On rs6000, function arguments are promoted, as are function return
1517    values.  */
1518 #undef TARGET_PROMOTE_FUNCTION_MODE
1519 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
1520
1521 #undef TARGET_RETURN_IN_MEMORY
1522 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1523
1524 #undef TARGET_SETUP_INCOMING_VARARGS
1525 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1526
1527 /* Always strict argument naming on rs6000.  */
1528 #undef TARGET_STRICT_ARGUMENT_NAMING
1529 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1530 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1531 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1532 #undef TARGET_SPLIT_COMPLEX_ARG
1533 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1534 #undef TARGET_MUST_PASS_IN_STACK
1535 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1536 #undef TARGET_PASS_BY_REFERENCE
1537 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1538 #undef TARGET_ARG_PARTIAL_BYTES
1539 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1540 #undef TARGET_FUNCTION_ARG_ADVANCE
1541 #define TARGET_FUNCTION_ARG_ADVANCE rs6000_function_arg_advance
1542 #undef TARGET_FUNCTION_ARG
1543 #define TARGET_FUNCTION_ARG rs6000_function_arg
1544 #undef TARGET_FUNCTION_ARG_BOUNDARY
1545 #define TARGET_FUNCTION_ARG_BOUNDARY rs6000_function_arg_boundary
1546
1547 #undef TARGET_BUILD_BUILTIN_VA_LIST
1548 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1549
1550 #undef TARGET_EXPAND_BUILTIN_VA_START
1551 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1552
1553 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1554 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1555
1556 #undef TARGET_EH_RETURN_FILTER_MODE
1557 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1558
1559 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1560 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1561
1562 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1563 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1564
1565 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1566 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1567
1568 #undef TARGET_HANDLE_OPTION
1569 #define TARGET_HANDLE_OPTION rs6000_handle_option
1570
1571 #undef TARGET_ASM_LOOP_ALIGN_MAX_SKIP
1572 #define TARGET_ASM_LOOP_ALIGN_MAX_SKIP rs6000_loop_align_max_skip
1573
1574 #undef TARGET_OPTION_OVERRIDE
1575 #define TARGET_OPTION_OVERRIDE rs6000_option_override
1576
1577 #undef TARGET_OPTION_INIT_STRUCT
1578 #define TARGET_OPTION_INIT_STRUCT rs6000_option_init_struct
1579
1580 #undef TARGET_OPTION_DEFAULT_PARAMS
1581 #define TARGET_OPTION_DEFAULT_PARAMS rs6000_option_default_params
1582
1583 #undef TARGET_OPTION_OPTIMIZATION_TABLE
1584 #define TARGET_OPTION_OPTIMIZATION_TABLE rs6000_option_optimization_table
1585
1586 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1587 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1588   rs6000_builtin_vectorized_function
1589
1590 #undef TARGET_DEFAULT_TARGET_FLAGS
1591 #define TARGET_DEFAULT_TARGET_FLAGS \
1592   (TARGET_DEFAULT)
1593
1594 #undef TARGET_STACK_PROTECT_FAIL
1595 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1596
1597 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1598    The PowerPC architecture requires only weak consistency among
1599    processors--that is, memory accesses between processors need not be
1600    sequentially consistent and memory accesses among processors can occur
1601    in any order. The ability to order memory accesses weakly provides
1602    opportunities for more efficient use of the system bus. Unless a
1603    dependency exists, the 604e allows read operations to precede store
1604    operations.  */
1605 #undef TARGET_RELAXED_ORDERING
1606 #define TARGET_RELAXED_ORDERING true
1607
1608 #ifdef HAVE_AS_TLS
1609 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1610 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1611 #endif
1612
1613 /* Use a 32-bit anchor range.  This leads to sequences like:
1614
1615         addis   tmp,anchor,high
1616         add     dest,tmp,low
1617
1618    where tmp itself acts as an anchor, and can be shared between
1619    accesses to the same 64k page.  */
1620 #undef TARGET_MIN_ANCHOR_OFFSET
1621 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1622 #undef TARGET_MAX_ANCHOR_OFFSET
1623 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1624 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1625 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1626
1627 #undef TARGET_BUILTIN_RECIPROCAL
1628 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1629
1630 #undef TARGET_EXPAND_TO_RTL_HOOK
1631 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1632
1633 #undef TARGET_INSTANTIATE_DECLS
1634 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1635
1636 #undef TARGET_SECONDARY_RELOAD
1637 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1638
1639 #undef TARGET_IRA_COVER_CLASSES
1640 #define TARGET_IRA_COVER_CLASSES rs6000_ira_cover_classes
1641
1642 #undef TARGET_LEGITIMATE_ADDRESS_P
1643 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1644
1645 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1646 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1647
1648 #undef TARGET_CAN_ELIMINATE
1649 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1650
1651 #undef TARGET_CONDITIONAL_REGISTER_USAGE
1652 #define TARGET_CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage
1653
1654 #undef TARGET_TRAMPOLINE_INIT
1655 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1656
1657 #undef TARGET_FUNCTION_VALUE
1658 #define TARGET_FUNCTION_VALUE rs6000_function_value
1659
1660 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
1661 #define TARGET_OPTION_VALID_ATTRIBUTE_P rs6000_valid_attribute_p
1662
1663 #undef TARGET_OPTION_SAVE
1664 #define TARGET_OPTION_SAVE rs6000_function_specific_save
1665
1666 #undef TARGET_OPTION_RESTORE
1667 #define TARGET_OPTION_RESTORE rs6000_function_specific_restore
1668
1669 #undef TARGET_OPTION_PRINT
1670 #define TARGET_OPTION_PRINT rs6000_function_specific_print
1671
1672 #undef TARGET_CAN_INLINE_P
1673 #define TARGET_CAN_INLINE_P rs6000_can_inline_p
1674
1675 #undef TARGET_SET_CURRENT_FUNCTION
1676 #define TARGET_SET_CURRENT_FUNCTION rs6000_set_current_function
1677
1678 struct gcc_target targetm = TARGET_INITIALIZER;
1679 \f
1680
1681 /* Simplifications for entries below.  */
1682
1683 enum {
1684   POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1685   POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1686 };
1687
1688 /* Some OSs don't support saving the high part of 64-bit registers on context
1689    switch.  Other OSs don't support saving Altivec registers.  On those OSs, we
1690    don't touch the MASK_POWERPC64 or MASK_ALTIVEC settings; if the user wants
1691    either, the user must explicitly specify them and we won't interfere with
1692    the user's specification.  */
1693
1694 enum {
1695   POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1696   POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1697                    | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1698                    | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1699                    | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP
1700                    | MASK_POPCNTD | MASK_VSX | MASK_ISEL | MASK_NO_UPDATE
1701                    | MASK_RECIP_PRECISION)
1702 };
1703
1704 /* Masks for instructions set at various powerpc ISAs.  */
1705 enum {
1706   ISA_2_1_MASKS = MASK_MFCRF,
1707   ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB),
1708   ISA_2_4_MASKS = (ISA_2_2_MASKS | MASK_FPRND),
1709
1710   /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and don't add
1711      ALTIVEC, since in general it isn't a win on power6.  In ISA 2.04, fsel,
1712      fre, fsqrt, etc. were no longer documented as optional.  Group masks by
1713      server and embedded. */
1714   ISA_2_5_MASKS_EMBEDDED = (ISA_2_2_MASKS | MASK_CMPB | MASK_RECIP_PRECISION
1715                             | MASK_PPC_GFXOPT | MASK_PPC_GPOPT),
1716   ISA_2_5_MASKS_SERVER = (ISA_2_5_MASKS_EMBEDDED | MASK_DFP),
1717
1718   /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but
1719      altivec is a win so enable it.  */
1720   ISA_2_6_MASKS_EMBEDDED = (ISA_2_5_MASKS_EMBEDDED | MASK_POPCNTD),
1721   ISA_2_6_MASKS_SERVER = (ISA_2_5_MASKS_SERVER | MASK_POPCNTD | MASK_ALTIVEC
1722                           | MASK_VSX)
1723 };
1724
1725 /* This table occasionally claims that a processor does not support a
1726    particular feature even though it does, but the feature is slower than the
1727    alternative.  Thus, it shouldn't be relied on as a complete description of
1728    the processor's support.
1729
1730    Please keep this list in order, and don't forget to update the documentation
1731    in invoke.texi when adding a new processor or flag.  */
1732
1733 struct rs6000_ptt
1734 {
1735   const char *const name;               /* Canonical processor name.  */
1736   const enum processor_type processor;  /* Processor type enum value.  */
1737   const int target_enable;              /* Target flags to enable.  */
1738 };
1739
1740 static struct rs6000_ptt const processor_target_table[] =
1741 {
1742   {"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1743   {"403", PROCESSOR_PPC403,
1744    POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1745   {"405", PROCESSOR_PPC405,
1746    POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1747   {"405fp", PROCESSOR_PPC405,
1748    POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1749   {"440", PROCESSOR_PPC440,
1750    POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1751   {"440fp", PROCESSOR_PPC440,
1752    POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1753   {"464", PROCESSOR_PPC440,
1754    POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1755   {"464fp", PROCESSOR_PPC440,
1756    POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1757   {"476", PROCESSOR_PPC476,
1758    POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_PPC_GFXOPT | MASK_MFCRF
1759    | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
1760   {"476fp", PROCESSOR_PPC476,
1761    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB
1762    | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
1763   {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
1764   {"601", PROCESSOR_PPC601,
1765    MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1766   {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1767   {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1768   {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1769   {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1770   {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1771   {"620", PROCESSOR_PPC620,
1772    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1773   {"630", PROCESSOR_PPC630,
1774    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1775   {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1776   {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1777   {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1778   {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1779   {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1780   {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1781   {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1782   {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
1783    | MASK_ISEL},
1784   /* 8548 has a dummy entry for now.  */
1785   {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
1786    | MASK_ISEL},
1787   {"a2", PROCESSOR_PPCA2,
1788    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_POPCNTB
1789    | MASK_CMPB | MASK_NO_UPDATE },
1790   {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1791   {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK},
1792   {"e500mc", PROCESSOR_PPCE500MC, POWERPC_BASE_MASK | MASK_PPC_GFXOPT
1793    | MASK_ISEL},
1794   {"e500mc64", PROCESSOR_PPCE500MC64, POWERPC_BASE_MASK | MASK_POWERPC64
1795    | MASK_PPC_GFXOPT | MASK_ISEL},
1796   {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1797   {"970", PROCESSOR_POWER4,
1798    POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1799   {"cell", PROCESSOR_CELL,
1800    POWERPC_7400_MASK  | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1801   {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1802   {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1803   {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1804   {"G4",  PROCESSOR_PPC7450, POWERPC_7400_MASK},
1805   {"G5", PROCESSOR_POWER4,
1806    POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1807   {"titan", PROCESSOR_TITAN,
1808    POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1809   {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1810   {"power2", PROCESSOR_POWER,
1811    MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1812   {"power3", PROCESSOR_PPC630,
1813    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1814   {"power4", PROCESSOR_POWER4,
1815    POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1816    | MASK_MFCRF},
1817   {"power5", PROCESSOR_POWER5,
1818    POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1819    | MASK_MFCRF | MASK_POPCNTB},
1820   {"power5+", PROCESSOR_POWER5,
1821    POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1822    | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
1823   {"power6", PROCESSOR_POWER6,
1824    POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1825    | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
1826    | MASK_RECIP_PRECISION},
1827   {"power6x", PROCESSOR_POWER6,
1828    POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1829    | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
1830    | MASK_MFPGPR | MASK_RECIP_PRECISION},
1831   {"power7", PROCESSOR_POWER7,   /* Don't add MASK_ISEL by default */
1832    POWERPC_7400_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_MFCRF
1833    | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP | MASK_POPCNTD
1834    | MASK_VSX | MASK_RECIP_PRECISION},
1835   {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1836   {"powerpc64", PROCESSOR_POWERPC64,
1837    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1838   {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1839   {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1840   {"rios2", PROCESSOR_RIOS2,
1841    MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1842   {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1843   {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1844   {"rs64", PROCESSOR_RS64A,
1845    POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
1846 };
1847
1848 /* Look up a processor name for -mcpu=xxx and -mtune=xxx.  Return -1 if the
1849    name is invalid.  */
1850
1851 static int
1852 rs6000_cpu_name_lookup (const char *name)
1853 {
1854   size_t i;
1855
1856   if (name != NULL)
1857     {
1858       for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
1859         if (! strcmp (name, processor_target_table[i].name))
1860           return (int)i;
1861     }
1862
1863   return -1;
1864 }
1865
1866 \f
1867 /* Return number of consecutive hard regs needed starting at reg REGNO
1868    to hold something of mode MODE.
1869    This is ordinarily the length in words of a value of mode MODE
1870    but can be less for certain modes in special long registers.
1871
1872    For the SPE, GPRs are 64 bits but only 32 bits are visible in
1873    scalar instructions.  The upper 32 bits are only available to the
1874    SIMD instructions.
1875
1876    POWER and PowerPC GPRs hold 32 bits worth;
1877    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
1878
1879 static int
1880 rs6000_hard_regno_nregs_internal (int regno, enum machine_mode mode)
1881 {
1882   unsigned HOST_WIDE_INT reg_size;
1883
1884   if (FP_REGNO_P (regno))
1885     reg_size = (VECTOR_MEM_VSX_P (mode)
1886                 ? UNITS_PER_VSX_WORD
1887                 : UNITS_PER_FP_WORD);
1888
1889   else if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1890     reg_size = UNITS_PER_SPE_WORD;
1891
1892   else if (ALTIVEC_REGNO_P (regno))
1893     reg_size = UNITS_PER_ALTIVEC_WORD;
1894
1895   /* The value returned for SCmode in the E500 double case is 2 for
1896      ABI compatibility; storing an SCmode value in a single register
1897      would require function_arg and rs6000_spe_function_arg to handle
1898      SCmode so as to pass the value correctly in a pair of
1899      registers.  */
1900   else if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
1901            && !DECIMAL_FLOAT_MODE_P (mode))
1902     reg_size = UNITS_PER_FP_WORD;
1903
1904   else
1905     reg_size = UNITS_PER_WORD;
1906
1907   return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
1908 }
1909
1910 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1911    MODE.  */
1912 static int
1913 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1914 {
1915   int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
1916
1917   /* VSX registers that overlap the FPR registers are larger than for non-VSX
1918      implementations.  Don't allow an item to be split between a FP register
1919      and an Altivec register.  */
1920   if (VECTOR_MEM_VSX_P (mode))
1921     {
1922       if (FP_REGNO_P (regno))
1923         return FP_REGNO_P (last_regno);
1924
1925       if (ALTIVEC_REGNO_P (regno))
1926         return ALTIVEC_REGNO_P (last_regno);
1927     }
1928
1929   /* The GPRs can hold any mode, but values bigger than one register
1930      cannot go past R31.  */
1931   if (INT_REGNO_P (regno))
1932     return INT_REGNO_P (last_regno);
1933
1934   /* The float registers (except for VSX vector modes) can only hold floating
1935      modes and DImode.  This excludes the 32-bit decimal float mode for
1936      now.  */
1937   if (FP_REGNO_P (regno))
1938     {
1939       if (SCALAR_FLOAT_MODE_P (mode)
1940           && (mode != TDmode || (regno % 2) == 0)
1941           && FP_REGNO_P (last_regno))
1942         return 1;
1943
1944       if (GET_MODE_CLASS (mode) == MODE_INT
1945           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1946         return 1;
1947
1948       if (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1949           && PAIRED_VECTOR_MODE (mode))
1950         return 1;
1951
1952       return 0;
1953     }
1954
1955   /* The CR register can only hold CC modes.  */
1956   if (CR_REGNO_P (regno))
1957     return GET_MODE_CLASS (mode) == MODE_CC;
1958
1959   if (CA_REGNO_P (regno))
1960     return mode == BImode;
1961
1962   /* AltiVec only in AldyVec registers.  */
1963   if (ALTIVEC_REGNO_P (regno))
1964     return VECTOR_MEM_ALTIVEC_OR_VSX_P (mode);
1965
1966   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1967   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1968     return 1;
1969
1970   /* We cannot put TImode anywhere except general register and it must be able
1971      to fit within the register set.  In the future, allow TImode in the
1972      Altivec or VSX registers.  */
1973
1974   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1975 }
1976
1977 /* Print interesting facts about registers.  */
1978 static void
1979 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
1980 {
1981   int r, m;
1982
1983   for (r = first_regno; r <= last_regno; ++r)
1984     {
1985       const char *comma = "";
1986       int len;
1987
1988       if (first_regno == last_regno)
1989         fprintf (stderr, "%s:\t", reg_name);
1990       else
1991         fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
1992
1993       len = 8;
1994       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1995         if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
1996           {
1997             if (len > 70)
1998               {
1999                 fprintf (stderr, ",\n\t");
2000                 len = 8;
2001                 comma = "";
2002               }
2003
2004             if (rs6000_hard_regno_nregs[m][r] > 1)
2005               len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
2006                              rs6000_hard_regno_nregs[m][r]);
2007             else
2008               len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
2009
2010             comma = ", ";
2011           }
2012
2013       if (call_used_regs[r])
2014         {
2015           if (len > 70)
2016             {
2017               fprintf (stderr, ",\n\t");
2018               len = 8;
2019               comma = "";
2020             }
2021
2022           len += fprintf (stderr, "%s%s", comma, "call-used");
2023           comma = ", ";
2024         }
2025
2026       if (fixed_regs[r])
2027         {
2028           if (len > 70)
2029             {
2030               fprintf (stderr, ",\n\t");
2031               len = 8;
2032               comma = "";
2033             }
2034
2035           len += fprintf (stderr, "%s%s", comma, "fixed");
2036           comma = ", ";
2037         }
2038
2039       if (len > 70)
2040         {
2041           fprintf (stderr, ",\n\t");
2042           comma = "";
2043         }
2044
2045       fprintf (stderr, "%sregno = %d\n", comma, r);
2046     }
2047 }
2048
2049 #define DEBUG_FMT_D "%-32s= %d\n"
2050 #define DEBUG_FMT_S "%-32s= %s\n"
2051
2052 /* Print various interesting information with -mdebug=reg.  */
2053 static void
2054 rs6000_debug_reg_global (void)
2055 {
2056   static const char *const tf[2] = { "false", "true" };
2057   const char *nl = (const char *)0;
2058   int m;
2059   char costly_num[20];
2060   char nop_num[20];
2061   const char *costly_str;
2062   const char *nop_str;
2063   const char *trace_str;
2064   const char *abi_str;
2065   const char *cmodel_str;
2066
2067   /* Map enum rs6000_vector to string.  */
2068   static const char *rs6000_debug_vector_unit[] = {
2069     "none",
2070     "altivec",
2071     "vsx",
2072     "paired",
2073     "spe",
2074     "other"
2075   };
2076
2077   fprintf (stderr, "Register information: (last virtual reg = %d)\n",
2078            LAST_VIRTUAL_REGISTER);
2079   rs6000_debug_reg_print (0, 31, "gr");
2080   rs6000_debug_reg_print (32, 63, "fp");
2081   rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
2082                           LAST_ALTIVEC_REGNO,
2083                           "vs");
2084   rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
2085   rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
2086   rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
2087   rs6000_debug_reg_print (MQ_REGNO, MQ_REGNO, "mq");
2088   rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
2089   rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
2090   rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
2091   rs6000_debug_reg_print (SPE_ACC_REGNO, SPE_ACC_REGNO, "spe_a");
2092   rs6000_debug_reg_print (SPEFSCR_REGNO, SPEFSCR_REGNO, "spe_f");
2093
2094   fprintf (stderr,
2095            "\n"
2096            "d  reg_class = %s\n"
2097            "f  reg_class = %s\n"
2098            "v  reg_class = %s\n"
2099            "wa reg_class = %s\n"
2100            "wd reg_class = %s\n"
2101            "wf reg_class = %s\n"
2102            "ws reg_class = %s\n\n",
2103            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
2104            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
2105            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
2106            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
2107            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
2108            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
2109            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]]);
2110
2111   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2112     if (rs6000_vector_unit[m] || rs6000_vector_mem[m])
2113       {
2114         nl = "\n";
2115         fprintf (stderr, "Vector mode: %-5s arithmetic: %-8s move: %-8s\n",
2116                  GET_MODE_NAME (m),
2117                  rs6000_debug_vector_unit[ rs6000_vector_unit[m] ],
2118                  rs6000_debug_vector_unit[ rs6000_vector_mem[m] ]);
2119       }
2120
2121   if (nl)
2122     fputs (nl, stderr);
2123
2124   if (rs6000_recip_control)
2125     {
2126       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
2127
2128       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2129         if (rs6000_recip_bits[m])
2130           {
2131             fprintf (stderr,
2132                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
2133                      GET_MODE_NAME (m),
2134                      (RS6000_RECIP_AUTO_RE_P (m)
2135                       ? "auto"
2136                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
2137                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
2138                       ? "auto"
2139                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
2140           }
2141
2142       fputs ("\n", stderr);
2143     }
2144
2145   if (rs6000_cpu_index >= 0)
2146     fprintf (stderr, DEBUG_FMT_S, "cpu",
2147              processor_target_table[rs6000_cpu_index].name);
2148
2149   if (rs6000_tune_index >= 0)
2150     fprintf (stderr, DEBUG_FMT_S, "tune",
2151              processor_target_table[rs6000_tune_index].name);
2152
2153   switch (rs6000_sched_costly_dep)
2154     {
2155     case max_dep_latency:
2156       costly_str = "max_dep_latency";
2157       break;
2158
2159     case no_dep_costly:
2160       costly_str = "no_dep_costly";
2161       break;
2162
2163     case all_deps_costly:
2164       costly_str = "all_deps_costly";
2165       break;
2166
2167     case true_store_to_load_dep_costly:
2168       costly_str = "true_store_to_load_dep_costly";
2169       break;
2170
2171     case store_to_load_dep_costly:
2172       costly_str = "store_to_load_dep_costly";
2173       break;
2174
2175     default:
2176       costly_str = costly_num;
2177       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
2178       break;
2179     }
2180
2181   fprintf (stderr, DEBUG_FMT_S, "sched_costly_dep", costly_str);
2182
2183   switch (rs6000_sched_insert_nops)
2184     {
2185     case sched_finish_regroup_exact:
2186       nop_str = "sched_finish_regroup_exact";
2187       break;
2188
2189     case sched_finish_pad_groups:
2190       nop_str = "sched_finish_pad_groups";
2191       break;
2192
2193     case sched_finish_none:
2194       nop_str = "sched_finish_none";
2195       break;
2196
2197     default:
2198       nop_str = nop_num;
2199       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2200       break;
2201     }
2202
2203   fprintf (stderr, DEBUG_FMT_S, "sched_insert_nops", nop_str);
2204
2205   switch (rs6000_sdata)
2206     {
2207     default:
2208     case SDATA_NONE:
2209       break;
2210
2211     case SDATA_DATA:
2212       fprintf (stderr, DEBUG_FMT_S, "sdata", "data");
2213       break;
2214
2215     case SDATA_SYSV:
2216       fprintf (stderr, DEBUG_FMT_S, "sdata", "sysv");
2217       break;
2218
2219     case SDATA_EABI:
2220       fprintf (stderr, DEBUG_FMT_S, "sdata", "eabi");
2221       break;
2222
2223     }
2224
2225   switch (rs6000_traceback)
2226     {
2227     case traceback_default:     trace_str = "default";  break;
2228     case traceback_none:        trace_str = "none";     break;
2229     case traceback_part:        trace_str = "part";     break;
2230     case traceback_full:        trace_str = "full";     break;
2231     default:                    trace_str = "unknown";  break;
2232     }
2233
2234   fprintf (stderr, DEBUG_FMT_S, "traceback", trace_str);
2235
2236   switch (rs6000_current_cmodel)
2237     {
2238     case CMODEL_SMALL:  cmodel_str = "small";   break;
2239     case CMODEL_MEDIUM: cmodel_str = "medium";  break;
2240     case CMODEL_LARGE:  cmodel_str = "large";   break;
2241     default:            cmodel_str = "unknown"; break;
2242     }
2243
2244   fprintf (stderr, DEBUG_FMT_S, "cmodel", cmodel_str);
2245
2246   switch (rs6000_current_abi)
2247     {
2248     case ABI_NONE:      abi_str = "none";       break;
2249     case ABI_AIX:       abi_str = "aix";        break;
2250     case ABI_V4:        abi_str = "V4";         break;
2251     case ABI_DARWIN:    abi_str = "darwin";     break;
2252     default:            abi_str = "unknown";    break;
2253     }
2254
2255   fprintf (stderr, DEBUG_FMT_S, "abi", abi_str);
2256
2257   if (rs6000_altivec_abi)
2258     fprintf (stderr, DEBUG_FMT_S, "altivec_abi", "true");
2259
2260   if (rs6000_spe_abi)
2261     fprintf (stderr, DEBUG_FMT_S, "spe_abi", "true");
2262
2263   if (rs6000_darwin64_abi)
2264     fprintf (stderr, DEBUG_FMT_S, "darwin64_abi", "true");
2265
2266   if (rs6000_float_gprs)
2267     fprintf (stderr, DEBUG_FMT_S, "float_gprs", "true");
2268
2269   fprintf (stderr, DEBUG_FMT_S, "always_hint", tf[!!rs6000_always_hint]);
2270   fprintf (stderr, DEBUG_FMT_S, "align_branch",
2271            tf[!!rs6000_align_branch_targets]);
2272   fprintf (stderr, DEBUG_FMT_D, "tls_size", rs6000_tls_size);
2273   fprintf (stderr, DEBUG_FMT_D, "long_double_size",
2274            rs6000_long_double_type_size);
2275   fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
2276            (int)rs6000_sched_restricted_insns_priority);
2277 }
2278
2279 /* Initialize the various global tables that are based on register size.  */
2280 static void
2281 rs6000_init_hard_regno_mode_ok (bool global_init_p)
2282 {
2283   int r, m, c;
2284   int align64;
2285   int align32;
2286
2287   /* Precalculate REGNO_REG_CLASS.  */
2288   rs6000_regno_regclass[0] = GENERAL_REGS;
2289   for (r = 1; r < 32; ++r)
2290     rs6000_regno_regclass[r] = BASE_REGS;
2291
2292   for (r = 32; r < 64; ++r)
2293     rs6000_regno_regclass[r] = FLOAT_REGS;
2294
2295   for (r = 64; r < FIRST_PSEUDO_REGISTER; ++r)
2296     rs6000_regno_regclass[r] = NO_REGS;
2297
2298   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2299     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2300
2301   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2302   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2303     rs6000_regno_regclass[r] = CR_REGS;
2304
2305   rs6000_regno_regclass[MQ_REGNO] = MQ_REGS;
2306   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2307   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2308   rs6000_regno_regclass[CA_REGNO] = CA_REGS;
2309   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2310   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2311   rs6000_regno_regclass[SPE_ACC_REGNO] = SPE_ACC_REGS;
2312   rs6000_regno_regclass[SPEFSCR_REGNO] = SPEFSCR_REGS;
2313   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2314   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2315
2316   /* Precalculate vector information, this must be set up before the
2317      rs6000_hard_regno_nregs_internal below.  */
2318   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2319     {
2320       rs6000_vector_unit[m] = rs6000_vector_mem[m] = VECTOR_NONE;
2321       rs6000_vector_reload[m][0] = CODE_FOR_nothing;
2322       rs6000_vector_reload[m][1] = CODE_FOR_nothing;
2323     }
2324
2325   for (c = 0; c < (int)(int)RS6000_CONSTRAINT_MAX; c++)
2326     rs6000_constraints[c] = NO_REGS;
2327
2328   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
2329      believes it can use native alignment or still uses 128-bit alignment.  */
2330   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
2331     {
2332       align64 = 64;
2333       align32 = 32;
2334     }
2335   else
2336     {
2337       align64 = 128;
2338       align32 = 128;
2339     }
2340
2341   /* V2DF mode, VSX only.  */
2342   if (TARGET_VSX)
2343     {
2344       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
2345       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
2346       rs6000_vector_align[V2DFmode] = align64;
2347     }
2348
2349   /* V4SF mode, either VSX or Altivec.  */
2350   if (TARGET_VSX)
2351     {
2352       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
2353       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
2354       rs6000_vector_align[V4SFmode] = align32;
2355     }
2356   else if (TARGET_ALTIVEC)
2357     {
2358       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
2359       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
2360       rs6000_vector_align[V4SFmode] = align32;
2361     }
2362
2363   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
2364      and stores. */
2365   if (TARGET_ALTIVEC)
2366     {
2367       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
2368       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
2369       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
2370       rs6000_vector_align[V4SImode] = align32;
2371       rs6000_vector_align[V8HImode] = align32;
2372       rs6000_vector_align[V16QImode] = align32;
2373
2374       if (TARGET_VSX)
2375         {
2376           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
2377           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
2378           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
2379         }
2380       else
2381         {
2382           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
2383           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
2384           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
2385         }
2386     }
2387
2388   /* V2DImode, only allow under VSX, which can do V2DI insert/splat/extract.
2389      Altivec doesn't have 64-bit support.  */
2390   if (TARGET_VSX)
2391     {
2392       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
2393       rs6000_vector_unit[V2DImode] = VECTOR_NONE;
2394       rs6000_vector_align[V2DImode] = align64;
2395     }
2396
2397   /* DFmode, see if we want to use the VSX unit.  */
2398   if (TARGET_VSX && TARGET_VSX_SCALAR_DOUBLE)
2399     {
2400       rs6000_vector_unit[DFmode] = VECTOR_VSX;
2401       rs6000_vector_mem[DFmode]
2402         = (TARGET_VSX_SCALAR_MEMORY ? VECTOR_VSX : VECTOR_NONE);
2403       rs6000_vector_align[DFmode] = align64;
2404     }
2405
2406   /* TODO add SPE and paired floating point vector support.  */
2407
2408   /* Register class constaints for the constraints that depend on compile
2409      switches.  */
2410   if (TARGET_HARD_FLOAT && TARGET_FPRS)
2411     rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
2412
2413   if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
2414     rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
2415
2416   if (TARGET_VSX)
2417     {
2418       /* At present, we just use VSX_REGS, but we have different constraints
2419          based on the use, in case we want to fine tune the default register
2420          class used.  wa = any VSX register, wf = register class to use for
2421          V4SF, wd = register class to use for V2DF, and ws = register classs to
2422          use for DF scalars.  */
2423       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
2424       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
2425       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
2426       rs6000_constraints[RS6000_CONSTRAINT_ws] = (TARGET_VSX_SCALAR_MEMORY
2427                                                   ? VSX_REGS
2428                                                   : FLOAT_REGS);
2429     }
2430
2431   if (TARGET_ALTIVEC)
2432     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
2433
2434   /* Set up the reload helper functions.  */
2435   if (TARGET_VSX || TARGET_ALTIVEC)
2436     {
2437       if (TARGET_64BIT)
2438         {
2439           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_di_store;
2440           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_di_load;
2441           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_di_store;
2442           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_di_load;
2443           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_di_store;
2444           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_di_load;
2445           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_di_store;
2446           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_di_load;
2447           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_di_store;
2448           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_di_load;
2449           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_di_store;
2450           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_di_load;
2451         }
2452       else
2453         {
2454           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_si_store;
2455           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_si_load;
2456           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_si_store;
2457           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_si_load;
2458           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_si_store;
2459           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_si_load;
2460           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_si_store;
2461           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_si_load;
2462           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_si_store;
2463           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_si_load;
2464           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_si_store;
2465           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_si_load;
2466         }
2467     }
2468
2469   /* Precalculate HARD_REGNO_NREGS.  */
2470   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2471     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2472       rs6000_hard_regno_nregs[m][r]
2473         = rs6000_hard_regno_nregs_internal (r, (enum machine_mode)m);
2474
2475   /* Precalculate HARD_REGNO_MODE_OK.  */
2476   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2477     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2478       if (rs6000_hard_regno_mode_ok (r, (enum machine_mode)m))
2479         rs6000_hard_regno_mode_ok_p[m][r] = true;
2480
2481   /* Precalculate CLASS_MAX_NREGS sizes.  */
2482   for (c = 0; c < LIM_REG_CLASSES; ++c)
2483     {
2484       int reg_size;
2485
2486       if (TARGET_VSX && VSX_REG_CLASS_P (c))
2487         reg_size = UNITS_PER_VSX_WORD;
2488
2489       else if (c == ALTIVEC_REGS)
2490         reg_size = UNITS_PER_ALTIVEC_WORD;
2491
2492       else if (c == FLOAT_REGS)
2493         reg_size = UNITS_PER_FP_WORD;
2494
2495       else
2496         reg_size = UNITS_PER_WORD;
2497
2498       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2499         rs6000_class_max_nregs[m][c]
2500           = (GET_MODE_SIZE (m) + reg_size - 1) / reg_size;
2501     }
2502
2503   if (TARGET_E500_DOUBLE)
2504     rs6000_class_max_nregs[DFmode][GENERAL_REGS] = 1;
2505
2506   /* Calculate which modes to automatically generate code to use a the
2507      reciprocal divide and square root instructions.  In the future, possibly
2508      automatically generate the instructions even if the user did not specify
2509      -mrecip.  The older machines double precision reciprocal sqrt estimate is
2510      not accurate enough.  */
2511   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
2512   if (TARGET_FRES)
2513     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2514   if (TARGET_FRE)
2515     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2516   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2517     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2518   if (VECTOR_UNIT_VSX_P (V2DFmode))
2519     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2520
2521   if (TARGET_FRSQRTES)
2522     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2523   if (TARGET_FRSQRTE)
2524     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2525   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2526     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2527   if (VECTOR_UNIT_VSX_P (V2DFmode))
2528     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2529
2530   if (rs6000_recip_control)
2531     {
2532       if (!flag_finite_math_only)
2533         warning (0, "-mrecip requires -ffinite-math or -ffast-math");
2534       if (flag_trapping_math)
2535         warning (0, "-mrecip requires -fno-trapping-math or -ffast-math");
2536       if (!flag_reciprocal_math)
2537         warning (0, "-mrecip requires -freciprocal-math or -ffast-math");
2538       if (flag_finite_math_only && !flag_trapping_math && flag_reciprocal_math)
2539         {
2540           if (RS6000_RECIP_HAVE_RE_P (SFmode)
2541               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
2542             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2543
2544           if (RS6000_RECIP_HAVE_RE_P (DFmode)
2545               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
2546             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2547
2548           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
2549               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
2550             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2551
2552           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
2553               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
2554             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2555
2556           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
2557               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
2558             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2559
2560           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
2561               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
2562             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2563
2564           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
2565               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
2566             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2567
2568           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
2569               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
2570             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2571         }
2572     }
2573
2574   if (global_init_p || TARGET_DEBUG_TARGET)
2575     {
2576       if (TARGET_DEBUG_REG)
2577         rs6000_debug_reg_global ();
2578
2579       if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
2580         fprintf (stderr,
2581                  "SImode variable mult cost       = %d\n"
2582                  "SImode constant mult cost       = %d\n"
2583                  "SImode short constant mult cost = %d\n"
2584                  "DImode multipliciation cost     = %d\n"
2585                  "SImode division cost            = %d\n"
2586                  "DImode division cost            = %d\n"
2587                  "Simple fp operation cost        = %d\n"
2588                  "DFmode multiplication cost      = %d\n"
2589                  "SFmode division cost            = %d\n"
2590                  "DFmode division cost            = %d\n"
2591                  "cache line size                 = %d\n"
2592                  "l1 cache size                   = %d\n"
2593                  "l2 cache size                   = %d\n"
2594                  "simultaneous prefetches         = %d\n"
2595                  "\n",
2596                  rs6000_cost->mulsi,
2597                  rs6000_cost->mulsi_const,
2598                  rs6000_cost->mulsi_const9,
2599                  rs6000_cost->muldi,
2600                  rs6000_cost->divsi,
2601                  rs6000_cost->divdi,
2602                  rs6000_cost->fp,
2603                  rs6000_cost->dmul,
2604                  rs6000_cost->sdiv,
2605                  rs6000_cost->ddiv,
2606                  rs6000_cost->cache_line_size,
2607                  rs6000_cost->l1_cache_size,
2608                  rs6000_cost->l2_cache_size,
2609                  rs6000_cost->simultaneous_prefetches);
2610     }
2611 }
2612
2613 #if TARGET_MACHO
2614 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
2615
2616 static void
2617 darwin_rs6000_override_options (void)
2618 {
2619   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
2620      off.  */
2621   rs6000_altivec_abi = 1;
2622   TARGET_ALTIVEC_VRSAVE = 1;
2623
2624   if (DEFAULT_ABI == ABI_DARWIN
2625       && TARGET_64BIT)
2626       darwin_one_byte_bool = 1;
2627
2628   if (TARGET_64BIT && ! TARGET_POWERPC64)
2629     {
2630       target_flags |= MASK_POWERPC64;
2631       warning (0, "-m64 requires PowerPC64 architecture, enabling");
2632     }
2633   if (flag_mkernel)
2634     {
2635       rs6000_default_long_calls = 1;
2636       target_flags |= MASK_SOFT_FLOAT;
2637     }
2638
2639   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
2640      Altivec.  */
2641   if (!flag_mkernel && !flag_apple_kext
2642       && TARGET_64BIT
2643       && ! (target_flags_explicit & MASK_ALTIVEC))
2644     target_flags |= MASK_ALTIVEC;
2645
2646   /* Unless the user (not the configurer) has explicitly overridden
2647      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
2648      G4 unless targetting the kernel.  */
2649   if (!flag_mkernel
2650       && !flag_apple_kext
2651       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
2652       && ! (target_flags_explicit & MASK_ALTIVEC)
2653       && ! rs6000_select[1].string)
2654     {
2655       target_flags |= MASK_ALTIVEC;
2656     }
2657 }
2658 #endif
2659
2660 /* If not otherwise specified by a target, make 'long double' equivalent to
2661    'double'.  */
2662
2663 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
2664 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
2665 #endif
2666
2667 /* Override command line options.  Mostly we process the processor type and
2668    sometimes adjust other TARGET_ options.  */
2669
2670 static bool
2671 rs6000_option_override_internal (bool global_init_p)
2672 {
2673   bool ret = true;
2674   const char *default_cpu = OPTION_TARGET_CPU_DEFAULT;
2675   int set_masks;
2676   int cpu_index;
2677   int tune_index;
2678   struct cl_target_option *main_target_opt
2679     = ((global_init_p || target_option_default_node == NULL)
2680        ? NULL : TREE_TARGET_OPTION (target_option_default_node));
2681
2682   /* Numerous experiment shows that IRA based loop pressure
2683      calculation works better for RTL loop invariant motion on targets
2684      with enough (>= 32) registers.  It is an expensive optimization.
2685      So it is on only for peak performance.  */
2686   if (optimize >= 3 && global_init_p)
2687     flag_ira_loop_pressure = 1;
2688
2689   /* Set the pointer size.  */
2690   if (TARGET_64BIT)
2691     {
2692       rs6000_pmode = (int)DImode;
2693       rs6000_pointer_size = 64;
2694     }
2695   else
2696     {
2697       rs6000_pmode = (int)SImode;
2698       rs6000_pointer_size = 32;
2699     }
2700
2701   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
2702 #ifdef OS_MISSING_POWERPC64
2703   if (OS_MISSING_POWERPC64)
2704     set_masks &= ~MASK_POWERPC64;
2705 #endif
2706 #ifdef OS_MISSING_ALTIVEC
2707   if (OS_MISSING_ALTIVEC)
2708     set_masks &= ~MASK_ALTIVEC;
2709 #endif
2710
2711   /* Don't override by the processor default if given explicitly.  */
2712   set_masks &= ~target_flags_explicit;
2713
2714   /* Identify the processor type.  */
2715   if (!default_cpu)
2716     {
2717       if (TARGET_POWERPC64)
2718         default_cpu = "powerpc64";
2719       else if (TARGET_POWERPC)
2720         default_cpu = "powerpc";
2721     }
2722
2723   /* Process the -mcpu=<xxx> and -mtune=<xxx> argument.  If the user changed
2724      the cpu in a target attribute or pragma, but did not specify a tuning
2725      option, use the cpu for the tuning option rather than the option specified
2726      with -mtune on the command line.  */
2727   if (rs6000_cpu_index > 0)
2728     cpu_index = rs6000_cpu_index;
2729   else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index > 0)
2730     rs6000_cpu_index = cpu_index = main_target_opt->x_rs6000_cpu_index;
2731   else
2732     rs6000_cpu_index = cpu_index = rs6000_cpu_name_lookup (default_cpu);
2733
2734   if (rs6000_tune_index > 0)
2735     tune_index = rs6000_tune_index;
2736   else
2737     rs6000_tune_index = tune_index = cpu_index;
2738
2739   if (cpu_index >= 0)
2740     {
2741       target_flags &= ~set_masks;
2742       target_flags |= (processor_target_table[cpu_index].target_enable
2743                        & set_masks);
2744     }
2745
2746   rs6000_cpu = ((tune_index >= 0)
2747                 ? processor_target_table[tune_index].processor
2748                 : (TARGET_POWERPC64
2749                    ? PROCESSOR_DEFAULT64
2750                    : PROCESSOR_DEFAULT));
2751
2752   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
2753       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64)
2754     {
2755       if (TARGET_ALTIVEC)
2756         error ("AltiVec not supported in this target");
2757       if (TARGET_SPE)
2758         error ("SPE not supported in this target");
2759     }
2760
2761   /* Disable Cell microcode if we are optimizing for the Cell
2762      and not optimizing for size.  */
2763   if (rs6000_gen_cell_microcode == -1)
2764     rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
2765                                   && !optimize_size);
2766
2767   /* If we are optimizing big endian systems for space and it's OK to
2768      use instructions that would be microcoded on the Cell, use the
2769      load/store multiple and string instructions.  */
2770   if (BYTES_BIG_ENDIAN && optimize_size && rs6000_gen_cell_microcode)
2771     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
2772
2773   /* Don't allow -mmultiple or -mstring on little endian systems
2774      unless the cpu is a 750, because the hardware doesn't support the
2775      instructions used in little endian mode, and causes an alignment
2776      trap.  The 750 does not cause an alignment trap (except when the
2777      target is unaligned).  */
2778
2779   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
2780     {
2781       if (TARGET_MULTIPLE)
2782         {
2783           target_flags &= ~MASK_MULTIPLE;
2784           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
2785             warning (0, "-mmultiple is not supported on little endian systems");
2786         }
2787
2788       if (TARGET_STRING)
2789         {
2790           target_flags &= ~MASK_STRING;
2791           if ((target_flags_explicit & MASK_STRING) != 0)
2792             warning (0, "-mstring is not supported on little endian systems");
2793         }
2794     }
2795
2796   /* Add some warnings for VSX.  */
2797   if (TARGET_VSX)
2798     {
2799       const char *msg = NULL;
2800       if (!TARGET_HARD_FLOAT || !TARGET_FPRS
2801           || !TARGET_SINGLE_FLOAT || !TARGET_DOUBLE_FLOAT)
2802         {
2803           if (target_flags_explicit & MASK_VSX)
2804             msg = N_("-mvsx requires hardware floating point");
2805           else
2806             target_flags &= ~ MASK_VSX;
2807         }
2808       else if (TARGET_PAIRED_FLOAT)
2809         msg = N_("-mvsx and -mpaired are incompatible");
2810       /* The hardware will allow VSX and little endian, but until we make sure
2811          things like vector select, etc. work don't allow VSX on little endian
2812          systems at this point.  */
2813       else if (!BYTES_BIG_ENDIAN)
2814         msg = N_("-mvsx used with little endian code");
2815       else if (TARGET_AVOID_XFORM > 0)
2816         msg = N_("-mvsx needs indexed addressing");
2817       else if (!TARGET_ALTIVEC && (target_flags_explicit & MASK_ALTIVEC))
2818         {
2819           if (target_flags_explicit & MASK_VSX)
2820             msg = N_("-mvsx and -mno-altivec are incompatible");
2821           else
2822             msg = N_("-mno-altivec disables vsx");
2823         }
2824
2825       if (msg)
2826         {
2827           warning (0, msg);
2828           target_flags &= ~ MASK_VSX;
2829           target_flags_explicit |= MASK_VSX;
2830         }
2831     }
2832
2833   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
2834      unless the user explicitly used the -mno-<option> to disable the code.  */
2835   if (TARGET_VSX)
2836     target_flags |= (ISA_2_6_MASKS_SERVER & ~target_flags_explicit);
2837   else if (TARGET_POPCNTD)
2838     target_flags |= (ISA_2_6_MASKS_EMBEDDED & ~target_flags_explicit);
2839   else if (TARGET_DFP)
2840     target_flags |= (ISA_2_5_MASKS_SERVER & ~target_flags_explicit);
2841   else if (TARGET_CMPB)
2842     target_flags |= (ISA_2_5_MASKS_EMBEDDED & ~target_flags_explicit);
2843   else if (TARGET_FPRND)
2844     target_flags |= (ISA_2_4_MASKS & ~target_flags_explicit);
2845   else if (TARGET_POPCNTB)
2846     target_flags |= (ISA_2_2_MASKS & ~target_flags_explicit);
2847   else if (TARGET_ALTIVEC)
2848     target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
2849
2850   /* E500mc does "better" if we inline more aggressively.  Respect the
2851      user's opinion, though.  */
2852   if (rs6000_block_move_inline_limit == 0
2853       && (rs6000_cpu == PROCESSOR_PPCE500MC
2854           || rs6000_cpu == PROCESSOR_PPCE500MC64))
2855     rs6000_block_move_inline_limit = 128;
2856
2857   /* store_one_arg depends on expand_block_move to handle at least the
2858      size of reg_parm_stack_space.  */
2859   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
2860     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
2861
2862   if (global_init_p)
2863     {
2864       /* If the appropriate debug option is enabled, replace the target hooks
2865          with debug versions that call the real version and then prints
2866          debugging information.  */
2867       if (TARGET_DEBUG_COST)
2868         {
2869           targetm.rtx_costs = rs6000_debug_rtx_costs;
2870           targetm.address_cost = rs6000_debug_address_cost;
2871           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
2872         }
2873
2874       if (TARGET_DEBUG_ADDR)
2875         {
2876           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
2877           targetm.legitimize_address = rs6000_debug_legitimize_address;
2878           rs6000_secondary_reload_class_ptr
2879             = rs6000_debug_secondary_reload_class;
2880           rs6000_secondary_memory_needed_ptr
2881             = rs6000_debug_secondary_memory_needed;
2882           rs6000_cannot_change_mode_class_ptr
2883             = rs6000_debug_cannot_change_mode_class;
2884           rs6000_preferred_reload_class_ptr
2885             = rs6000_debug_preferred_reload_class;
2886           rs6000_legitimize_reload_address_ptr
2887             = rs6000_debug_legitimize_reload_address;
2888           rs6000_mode_dependent_address_ptr
2889             = rs6000_debug_mode_dependent_address;
2890         }
2891
2892       if (rs6000_veclibabi_name)
2893         {
2894           if (strcmp (rs6000_veclibabi_name, "mass") == 0)
2895             rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
2896           else
2897             {
2898               error ("unknown vectorization library ABI type (%s) for "
2899                      "-mveclibabi= switch", rs6000_veclibabi_name);
2900               ret = false;
2901             }
2902         }
2903     }
2904
2905   if (!rs6000_explicit_options.long_double)
2906     {
2907       if (main_target_opt != NULL
2908           && (main_target_opt->x_rs6000_long_double_type_size
2909               != RS6000_DEFAULT_LONG_DOUBLE_SIZE))
2910         error ("target attribute or pragma changes long double size");
2911       else
2912         rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2913     }
2914
2915 #ifndef POWERPC_LINUX
2916   if (!rs6000_explicit_options.ieee)
2917     rs6000_ieeequad = 1;
2918 #endif
2919
2920   /* Disable VSX and Altivec silently if the user switched cpus to power7 in a
2921      target attribute or pragma which automatically enables both options,
2922      unless the altivec ABI was set.  This is set by default for 64-bit, but
2923      not for 32-bit.  */
2924   if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2925     target_flags &= ~((MASK_VSX | MASK_ALTIVEC) & ~target_flags_explicit);
2926
2927   /* Enable Altivec ABI for AIX -maltivec.  */
2928   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
2929     {
2930       if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2931         error ("target attribute or pragma changes AltiVec ABI");
2932       else
2933         rs6000_altivec_abi = 1;
2934     }
2935
2936   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
2937      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
2938      be explicitly overridden in either case.  */
2939   if (TARGET_ELF)
2940     {
2941       if (!rs6000_explicit_options.altivec_abi
2942           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
2943         {
2944           if (main_target_opt != NULL &&
2945               !main_target_opt->x_rs6000_altivec_abi)
2946             error ("target attribute or pragma changes AltiVec ABI");
2947           else
2948             rs6000_altivec_abi = 1;
2949         }
2950
2951       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
2952       if (!rs6000_explicit_options.vrsave)
2953         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
2954     }
2955
2956   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
2957      So far, the only darwin64 targets are also MACH-O.  */
2958   if (TARGET_MACHO
2959       && DEFAULT_ABI == ABI_DARWIN 
2960       && TARGET_64BIT)
2961     {
2962       if (main_target_opt != NULL && !main_target_opt->x_rs6000_darwin64_abi)
2963         error ("target attribute or pragma changes darwin64 ABI");
2964       else
2965         {
2966           rs6000_darwin64_abi = 1;
2967           /* Default to natural alignment, for better performance.  */
2968           rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2969         }
2970     }
2971
2972   /* Place FP constants in the constant pool instead of TOC
2973      if section anchors enabled.  */
2974   if (flag_section_anchors)
2975     TARGET_NO_FP_IN_TOC = 1;
2976
2977 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2978   SUBTARGET_OVERRIDE_OPTIONS;
2979 #endif
2980 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2981   SUBSUBTARGET_OVERRIDE_OPTIONS;
2982 #endif
2983 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
2984   SUB3TARGET_OVERRIDE_OPTIONS;
2985 #endif
2986
2987   if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC
2988       || rs6000_cpu == PROCESSOR_PPCE500MC64)
2989     {
2990       /* The e500 and e500mc do not have string instructions, and we set
2991          MASK_STRING above when optimizing for size.  */
2992       if ((target_flags & MASK_STRING) != 0)
2993         target_flags = target_flags & ~MASK_STRING;
2994     }
2995   else if (rs6000_select[1].string != NULL)
2996     {
2997       /* For the powerpc-eabispe configuration, we set all these by
2998          default, so let's unset them if we manually set another
2999          CPU that is not the E500.  */
3000       if (main_target_opt != NULL
3001           && ((main_target_opt->x_rs6000_spe_abi != rs6000_spe_abi)
3002               || (main_target_opt->x_rs6000_spe != rs6000_spe)
3003               || (main_target_opt->x_rs6000_float_gprs != rs6000_float_gprs)))
3004         error ("target attribute or pragma changes SPE ABI");
3005       else
3006         {
3007           if (!rs6000_explicit_options.spe_abi)
3008             rs6000_spe_abi = 0;
3009           if (!rs6000_explicit_options.spe)
3010             rs6000_spe = 0;
3011           if (!rs6000_explicit_options.float_gprs)
3012             rs6000_float_gprs = 0;
3013         }
3014       if (!(target_flags_explicit & MASK_ISEL))
3015         target_flags &= ~MASK_ISEL;
3016     }
3017
3018   /* Detect invalid option combinations with E500.  */
3019   CHECK_E500_OPTIONS;
3020
3021   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
3022                         && rs6000_cpu != PROCESSOR_POWER5
3023                         && rs6000_cpu != PROCESSOR_POWER6
3024                         && rs6000_cpu != PROCESSOR_POWER7
3025                         && rs6000_cpu != PROCESSOR_PPCA2
3026                         && rs6000_cpu != PROCESSOR_CELL);
3027   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
3028                          || rs6000_cpu == PROCESSOR_POWER5
3029                          || rs6000_cpu == PROCESSOR_POWER7);
3030   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
3031                                  || rs6000_cpu == PROCESSOR_POWER5
3032                                  || rs6000_cpu == PROCESSOR_POWER6
3033                                  || rs6000_cpu == PROCESSOR_POWER7
3034                                  || rs6000_cpu == PROCESSOR_PPCE500MC
3035                                  || rs6000_cpu == PROCESSOR_PPCE500MC64);
3036
3037   /* Allow debug switches to override the above settings.  These are set to -1
3038      in rs6000.opt to indicate the user hasn't directly set the switch.  */
3039   if (TARGET_ALWAYS_HINT >= 0)
3040     rs6000_always_hint = TARGET_ALWAYS_HINT;
3041
3042   if (TARGET_SCHED_GROUPS >= 0)
3043     rs6000_sched_groups = TARGET_SCHED_GROUPS;
3044
3045   if (TARGET_ALIGN_BRANCH_TARGETS >= 0)
3046     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
3047
3048   rs6000_sched_restricted_insns_priority
3049     = (rs6000_sched_groups ? 1 : 0);
3050
3051   /* Handle -msched-costly-dep option.  */
3052   rs6000_sched_costly_dep
3053     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
3054
3055   if (rs6000_sched_costly_dep_str)
3056     {
3057       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
3058         rs6000_sched_costly_dep = no_dep_costly;
3059       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
3060         rs6000_sched_costly_dep = all_deps_costly;
3061       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
3062         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
3063       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
3064         rs6000_sched_costly_dep = store_to_load_dep_costly;
3065       else
3066         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
3067                                    atoi (rs6000_sched_costly_dep_str));
3068     }
3069
3070   /* Handle -minsert-sched-nops option.  */
3071   rs6000_sched_insert_nops
3072     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
3073
3074   if (rs6000_sched_insert_nops_str)
3075     {
3076       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
3077         rs6000_sched_insert_nops = sched_finish_none;
3078       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
3079         rs6000_sched_insert_nops = sched_finish_pad_groups;
3080       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
3081         rs6000_sched_insert_nops = sched_finish_regroup_exact;
3082       else
3083         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
3084                                     atoi (rs6000_sched_insert_nops_str));
3085     }
3086
3087   if (global_init_p)
3088     {
3089 #ifdef TARGET_REGNAMES
3090       /* If the user desires alternate register names, copy in the
3091          alternate names now.  */
3092       if (TARGET_REGNAMES)
3093         memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
3094 #endif
3095
3096       /* Set aix_struct_return last, after the ABI is determined.
3097          If -maix-struct-return or -msvr4-struct-return was explicitly
3098          used, don't override with the ABI default.  */
3099       if (!rs6000_explicit_options.aix_struct_ret)
3100         aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
3101
3102 #if 0
3103       /* IBM XL compiler defaults to unsigned bitfields.  */
3104       if (TARGET_XL_COMPAT)
3105         flag_signed_bitfields = 0;
3106 #endif
3107
3108       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
3109         REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
3110
3111       if (TARGET_TOC)
3112         ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
3113
3114       /* We can only guarantee the availability of DI pseudo-ops when
3115          assembling for 64-bit targets.  */
3116       if (!TARGET_64BIT)
3117         {
3118           targetm.asm_out.aligned_op.di = NULL;
3119           targetm.asm_out.unaligned_op.di = NULL;
3120         }
3121
3122
3123       /* Set branch target alignment, if not optimizing for size.  */
3124       if (!optimize_size)
3125         {
3126           /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
3127              aligned 8byte to avoid misprediction by the branch predictor.  */
3128           if (rs6000_cpu == PROCESSOR_TITAN
3129               || rs6000_cpu == PROCESSOR_CELL)
3130             {
3131               if (align_functions <= 0)
3132                 align_functions = 8;
3133               if (align_jumps <= 0)
3134                 align_jumps = 8;
3135               if (align_loops <= 0)
3136                 align_loops = 8;
3137             }
3138           if (rs6000_align_branch_targets)
3139             {
3140               if (align_functions <= 0)
3141                 align_functions = 16;
3142               if (align_jumps <= 0)
3143                 align_jumps = 16;
3144               if (align_loops <= 0)
3145                 {
3146                   can_override_loop_align = 1;
3147                   align_loops = 16;
3148                 }
3149             }
3150           if (align_jumps_max_skip <= 0)
3151             align_jumps_max_skip = 15;
3152           if (align_loops_max_skip <= 0)
3153             align_loops_max_skip = 15;
3154         }
3155
3156       /* Arrange to save and restore machine status around nested functions.  */
3157       init_machine_status = rs6000_init_machine_status;
3158
3159       /* We should always be splitting complex arguments, but we can't break
3160          Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
3161       if (DEFAULT_ABI != ABI_AIX)
3162         targetm.calls.split_complex_arg = NULL;
3163     }
3164
3165   /* Initialize rs6000_cost with the appropriate target costs.  */
3166   if (optimize_size)
3167     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
3168   else
3169     switch (rs6000_cpu)
3170       {
3171       case PROCESSOR_RIOS1:
3172         rs6000_cost = &rios1_cost;
3173         break;
3174
3175       case PROCESSOR_RIOS2:
3176         rs6000_cost = &rios2_cost;
3177         break;
3178
3179       case PROCESSOR_RS64A:
3180         rs6000_cost = &rs64a_cost;
3181         break;
3182
3183       case PROCESSOR_MPCCORE:
3184         rs6000_cost = &mpccore_cost;
3185         break;
3186
3187       case PROCESSOR_PPC403:
3188         rs6000_cost = &ppc403_cost;
3189         break;
3190
3191       case PROCESSOR_PPC405:
3192         rs6000_cost = &ppc405_cost;
3193         break;
3194
3195       case PROCESSOR_PPC440:
3196         rs6000_cost = &ppc440_cost;
3197         break;
3198
3199       case PROCESSOR_PPC476:
3200         rs6000_cost = &ppc476_cost;
3201         break;
3202
3203       case PROCESSOR_PPC601:
3204         rs6000_cost = &ppc601_cost;
3205         break;
3206
3207       case PROCESSOR_PPC603:
3208         rs6000_cost = &ppc603_cost;
3209         break;
3210
3211       case PROCESSOR_PPC604:
3212         rs6000_cost = &ppc604_cost;
3213         break;
3214
3215       case PROCESSOR_PPC604e:
3216         rs6000_cost = &ppc604e_cost;
3217         break;
3218
3219       case PROCESSOR_PPC620:
3220         rs6000_cost = &ppc620_cost;
3221         break;
3222
3223       case PROCESSOR_PPC630:
3224         rs6000_cost = &ppc630_cost;
3225         break;
3226
3227       case PROCESSOR_CELL:
3228         rs6000_cost = &ppccell_cost;
3229         break;
3230
3231       case PROCESSOR_PPC750:
3232       case PROCESSOR_PPC7400:
3233         rs6000_cost = &ppc750_cost;
3234         break;
3235
3236       case PROCESSOR_PPC7450:
3237         rs6000_cost = &ppc7450_cost;
3238         break;
3239
3240       case PROCESSOR_PPC8540:
3241         rs6000_cost = &ppc8540_cost;
3242         break;
3243
3244       case PROCESSOR_PPCE300C2:
3245       case PROCESSOR_PPCE300C3:
3246         rs6000_cost = &ppce300c2c3_cost;
3247         break;
3248
3249       case PROCESSOR_PPCE500MC:
3250         rs6000_cost = &ppce500mc_cost;
3251         break;
3252
3253       case PROCESSOR_PPCE500MC64:
3254         rs6000_cost = &ppce500mc64_cost;
3255         break;
3256
3257       case PROCESSOR_TITAN:
3258         rs6000_cost = &titan_cost;
3259         break;
3260
3261       case PROCESSOR_POWER4:
3262       case PROCESSOR_POWER5:
3263         rs6000_cost = &power4_cost;
3264         break;
3265
3266       case PROCESSOR_POWER6:
3267         rs6000_cost = &power6_cost;
3268         break;
3269
3270       case PROCESSOR_POWER7:
3271         rs6000_cost = &power7_cost;
3272         break;
3273
3274       case PROCESSOR_PPCA2:
3275         rs6000_cost = &ppca2_cost;
3276         break;
3277
3278       default:
3279         gcc_unreachable ();
3280       }
3281
3282   if (global_init_p)
3283     {
3284       maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
3285                              rs6000_cost->simultaneous_prefetches,
3286                              global_options.x_param_values,
3287                              global_options_set.x_param_values);
3288       maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
3289                              global_options.x_param_values,
3290                              global_options_set.x_param_values);
3291       maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
3292                              rs6000_cost->cache_line_size,
3293                              global_options.x_param_values,
3294                              global_options_set.x_param_values);
3295       maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
3296                              global_options.x_param_values,
3297                              global_options_set.x_param_values);
3298
3299       /* If using typedef char *va_list, signal that
3300          __builtin_va_start (&ap, 0) can be optimized to
3301          ap = __builtin_next_arg (0).  */
3302       if (DEFAULT_ABI != ABI_V4)
3303         targetm.expand_builtin_va_start = NULL;
3304     }
3305
3306   /* Set up single/double float flags.  
3307      If TARGET_HARD_FLOAT is set, but neither single or double is set, 
3308      then set both flags. */
3309   if (TARGET_HARD_FLOAT && TARGET_FPRS 
3310       && rs6000_single_float == 0 && rs6000_double_float == 0)
3311     rs6000_single_float = rs6000_double_float = 1;
3312
3313   /* Reset single and double FP flags if target is E500. */
3314   if (TARGET_E500) 
3315   {
3316     rs6000_single_float = rs6000_double_float = 0;
3317     if (TARGET_E500_SINGLE)
3318       rs6000_single_float = 1; 
3319     if (TARGET_E500_DOUBLE)
3320       rs6000_single_float = rs6000_double_float = 1;
3321   }
3322
3323   if (main_target_opt)
3324     {
3325       if (main_target_opt->x_rs6000_single_float != rs6000_single_float)
3326         error ("target attribute or pragma changes single precision floating "
3327                "point");
3328       if (main_target_opt->x_rs6000_double_float != rs6000_double_float)
3329         error ("target attribute or pragma changes double precision floating "
3330                "point");
3331     }
3332
3333   /* If not explicitly specified via option, decide whether to generate indexed
3334      load/store instructions.  */
3335   if (TARGET_AVOID_XFORM == -1)
3336     /* Avoid indexed addressing when targeting Power6 in order to avoid the
3337      DERAT mispredict penalty.  However the LVE and STVE altivec instructions
3338      need indexed accesses and the type used is the scalar type of the element
3339      being loaded or stored.  */
3340     TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB
3341                           && !TARGET_ALTIVEC);
3342
3343   /* Set the -mrecip options.  */
3344   if (rs6000_recip_name)
3345     {
3346       char *p = ASTRDUP (rs6000_recip_name);
3347       char *q;
3348       unsigned int mask, i;
3349       bool invert;
3350
3351       while ((q = strtok (p, ",")) != NULL)
3352         {
3353           p = NULL;
3354           if (*q == '!')
3355             {
3356               invert = true;
3357               q++;
3358             }
3359           else
3360             invert = false;
3361
3362           if (!strcmp (q, "default"))
3363             mask = ((TARGET_RECIP_PRECISION)
3364                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
3365           else
3366             {
3367               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
3368                 if (!strcmp (q, recip_options[i].string))
3369                   {
3370                     mask = recip_options[i].mask;
3371                     break;
3372                   }
3373
3374               if (i == ARRAY_SIZE (recip_options))
3375                 {
3376                   error ("unknown option for -mrecip=%s", q);
3377                   invert = false;
3378                   mask = 0;
3379                   ret = false;
3380                 }
3381             }
3382
3383           if (invert)
3384             rs6000_recip_control &= ~mask;
3385           else
3386             rs6000_recip_control |= mask;
3387         }
3388     }
3389
3390   rs6000_init_hard_regno_mode_ok (global_init_p);
3391
3392   /* Save the initial options in case the user does function specific options */
3393   if (global_init_p)
3394     target_option_default_node = target_option_current_node
3395       = build_target_option_node ();
3396
3397   return ret;
3398 }
3399
3400 /* Implement TARGET_OPTION_OVERRIDE.  On the RS/6000 this is used to
3401    define the target cpu type.  */
3402
3403 static void
3404 rs6000_option_override (void)
3405 {
3406   (void) rs6000_option_override_internal (true);
3407 }
3408
3409 \f
3410 /* Implement targetm.vectorize.builtin_mask_for_load.  */
3411 static tree
3412 rs6000_builtin_mask_for_load (void)
3413 {
3414   if (TARGET_ALTIVEC || TARGET_VSX)
3415     return altivec_builtin_mask_for_load;
3416   else
3417     return 0;
3418 }
3419
3420 /* Implement LOOP_ALIGN. */
3421 int
3422 rs6000_loop_align (rtx label)
3423 {
3424   basic_block bb;
3425   int ninsns;
3426
3427   /* Don't override loop alignment if -falign-loops was specified. */
3428   if (!can_override_loop_align)
3429     return align_loops_log;
3430
3431   bb = BLOCK_FOR_INSN (label);
3432   ninsns = num_loop_insns(bb->loop_father);
3433
3434   /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
3435   if (ninsns > 4 && ninsns <= 8
3436       && (rs6000_cpu == PROCESSOR_POWER4
3437           || rs6000_cpu == PROCESSOR_POWER5
3438           || rs6000_cpu == PROCESSOR_POWER6
3439           || rs6000_cpu == PROCESSOR_POWER7))
3440     return 5;
3441   else
3442     return align_loops_log;
3443 }
3444
3445 /* Implement TARGET_LOOP_ALIGN_MAX_SKIP. */
3446 static int
3447 rs6000_loop_align_max_skip (rtx label)
3448 {
3449   return (1 << rs6000_loop_align (label)) - 1;
3450 }
3451
3452 /* Implement targetm.vectorize.builtin_conversion.
3453    Returns a decl of a function that implements conversion of an integer vector
3454    into a floating-point vector, or vice-versa.  DEST_TYPE is the
3455    destination type and SRC_TYPE the source type of the conversion.
3456    Return NULL_TREE if it is not available.  */
3457 static tree
3458 rs6000_builtin_conversion (unsigned int tcode, tree dest_type, tree src_type)
3459 {
3460   enum tree_code code = (enum tree_code) tcode;
3461
3462   switch (code)
3463     {
3464     case FIX_TRUNC_EXPR:
3465       switch (TYPE_MODE (dest_type))
3466         {
3467         case V2DImode:
3468           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3469             return NULL_TREE;
3470
3471           return TYPE_UNSIGNED (dest_type)
3472             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVDPUXDS_UNS]
3473             : rs6000_builtin_decls[VSX_BUILTIN_XVCVDPSXDS];
3474
3475         case V4SImode:
3476           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3477             return NULL_TREE;
3478
3479           return TYPE_UNSIGNED (dest_type)
3480             ? rs6000_builtin_decls[VECTOR_BUILTIN_FIXUNS_V4SF_V4SI]
3481             : rs6000_builtin_decls[VECTOR_BUILTIN_FIX_V4SF_V4SI];
3482
3483         default:
3484           return NULL_TREE;
3485         }
3486
3487     case FLOAT_EXPR:
3488       switch (TYPE_MODE (src_type))
3489         {
3490         case V2DImode:
3491           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3492             return NULL_TREE;
3493
3494           return TYPE_UNSIGNED (src_type)
3495             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVUXDDP]
3496             : rs6000_builtin_decls[VSX_BUILTIN_XVCVSXDDP];
3497
3498         case V4SImode:
3499           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3500             return NULL_TREE;
3501
3502           return TYPE_UNSIGNED (src_type)
3503             ? rs6000_builtin_decls[VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF]
3504             : rs6000_builtin_decls[VECTOR_BUILTIN_FLOAT_V4SI_V4SF];
3505
3506         default:
3507           return NULL_TREE;
3508         }
3509
3510     default:
3511       return NULL_TREE;
3512     }
3513 }
3514
3515 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
3516 static tree
3517 rs6000_builtin_mul_widen_even (tree type)
3518 {
3519   if (!TARGET_ALTIVEC)
3520     return NULL_TREE;
3521
3522   switch (TYPE_MODE (type))
3523     {
3524     case V8HImode:
3525       return TYPE_UNSIGNED (type)
3526             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH_UNS]
3527             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
3528
3529     case V16QImode:
3530       return TYPE_UNSIGNED (type)
3531             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB_UNS]
3532             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
3533     default:
3534       return NULL_TREE;
3535     }
3536 }
3537
3538 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
3539 static tree
3540 rs6000_builtin_mul_widen_odd (tree type)
3541 {
3542   if (!TARGET_ALTIVEC)
3543     return NULL_TREE;
3544
3545   switch (TYPE_MODE (type))
3546     {
3547     case V8HImode:
3548       return TYPE_UNSIGNED (type)
3549             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH_UNS]
3550             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
3551
3552     case V16QImode:
3553       return TYPE_UNSIGNED (type)
3554             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB_UNS]
3555             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
3556     default:
3557       return NULL_TREE;
3558     }
3559 }
3560
3561
3562 /* Return true iff, data reference of TYPE can reach vector alignment (16)
3563    after applying N number of iterations.  This routine does not determine
3564    how may iterations are required to reach desired alignment.  */
3565
3566 static bool
3567 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
3568 {
3569   if (is_packed)
3570     return false;
3571
3572   if (TARGET_32BIT)
3573     {
3574       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
3575         return true;
3576
3577       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
3578         return true;
3579
3580       return false;
3581     }
3582   else
3583     {
3584       if (TARGET_MACHO)
3585         return false;
3586
3587       /* Assuming that all other types are naturally aligned. CHECKME!  */
3588       return true;
3589     }
3590 }
3591
3592 /* Return true if the vector misalignment factor is supported by the
3593    target.  */ 
3594 bool
3595 rs6000_builtin_support_vector_misalignment (enum machine_mode mode,
3596                                             const_tree type,
3597                                             int misalignment,
3598                                             bool is_packed)
3599 {
3600   if (TARGET_VSX)
3601     {
3602       /* Return if movmisalign pattern is not supported for this mode.  */
3603       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
3604         return false;
3605
3606       if (misalignment == -1)
3607         {
3608           /* Misalignment factor is unknown at compile time but we know
3609              it's word aligned.  */
3610           if (rs6000_vector_alignment_reachable (type, is_packed))
3611             {
3612               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
3613
3614               if (element_size == 64 || element_size == 32)
3615                return true;
3616             }
3617
3618           return false;
3619         }
3620
3621       /* VSX supports word-aligned vector.  */
3622       if (misalignment % 4 == 0)
3623         return true;
3624     }
3625   return false;
3626 }
3627
3628 /* Implement targetm.vectorize.builtin_vec_perm.  */
3629 tree
3630 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
3631 {
3632   tree inner_type = TREE_TYPE (type);
3633   bool uns_p = TYPE_UNSIGNED (inner_type);
3634   tree d;
3635
3636   *mask_element_type = unsigned_char_type_node;
3637
3638   switch (TYPE_MODE (type))
3639     {
3640     case V16QImode:
3641       d = (uns_p
3642            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI_UNS]
3643            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI]);
3644       break;
3645
3646     case V8HImode:
3647       d = (uns_p
3648            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI_UNS]
3649            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI]);
3650       break;
3651
3652     case V4SImode:
3653       d = (uns_p
3654            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI_UNS]
3655            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI]);
3656       break;
3657
3658     case V4SFmode:
3659       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
3660       break;
3661
3662     case V2DFmode:
3663       if (!TARGET_ALLOW_DF_PERMUTE)
3664         return NULL_TREE;
3665
3666       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DF];
3667       break;
3668
3669     case V2DImode:
3670       if (!TARGET_ALLOW_DF_PERMUTE)
3671         return NULL_TREE;
3672
3673       d = (uns_p
3674            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI_UNS]
3675            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI]);
3676       break;
3677
3678     default:
3679       return NULL_TREE;
3680     }
3681
3682   gcc_assert (d);
3683   return d;
3684 }
3685
3686
3687 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
3688 static int
3689 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
3690                                    tree vectype, int misalign)
3691 {
3692   unsigned elements;
3693
3694   switch (type_of_cost)
3695     {
3696       case scalar_stmt:
3697       case scalar_load:
3698       case scalar_store:
3699       case vector_stmt:
3700       case vector_load:
3701       case vector_store:
3702       case vec_to_scalar:
3703       case scalar_to_vec:
3704       case cond_branch_not_taken:
3705       case vec_perm:
3706         return 1;
3707
3708       case cond_branch_taken:
3709         return 3;
3710
3711       case unaligned_load:
3712         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3713           {
3714             elements = TYPE_VECTOR_SUBPARTS (vectype);
3715             if (elements == 2)
3716               /* Double word aligned.  */
3717               return 2;
3718
3719             if (elements == 4)
3720               {
3721                 switch (misalign)
3722                   {
3723                     case 8:
3724                       /* Double word aligned.  */
3725                       return 2;
3726
3727                     case -1:
3728                       /* Unknown misalignment.  */
3729                     case 4:
3730                     case 12:
3731                       /* Word aligned.  */
3732                       return 22;
3733
3734                     default:
3735                       gcc_unreachable ();
3736                   }
3737               }
3738           }
3739
3740         if (TARGET_ALTIVEC)
3741           /* Misaligned loads are not supported.  */
3742           gcc_unreachable ();
3743
3744         return 2;
3745
3746       case unaligned_store:
3747         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3748           {
3749             elements = TYPE_VECTOR_SUBPARTS (vectype);
3750             if (elements == 2)
3751               /* Double word aligned.  */
3752               return 2;
3753
3754             if (elements == 4)
3755               {
3756                 switch (misalign)
3757                   {
3758                     case 8:
3759                       /* Double word aligned.  */
3760                       return 2;
3761
3762                     case -1:
3763                       /* Unknown misalignment.  */
3764                     case 4:
3765                     case 12:
3766                       /* Word aligned.  */
3767                       return 23;
3768
3769                     default:
3770                       gcc_unreachable ();
3771                   }
3772               }
3773           }
3774
3775         if (TARGET_ALTIVEC)
3776           /* Misaligned stores are not supported.  */
3777           gcc_unreachable ();
3778
3779         return 2;
3780
3781       default:
3782         gcc_unreachable ();
3783     }
3784 }
3785
3786 /* Implement targetm.vectorize.preferred_simd_mode.  */
3787
3788 static enum machine_mode
3789 rs6000_preferred_simd_mode (enum machine_mode mode)
3790 {
3791   if (TARGET_VSX)
3792     switch (mode)
3793       {
3794       case DFmode:
3795         return V2DFmode;
3796       default:;
3797       }
3798   if (TARGET_ALTIVEC || TARGET_VSX)
3799     switch (mode)
3800       {
3801       case SFmode:
3802         return V4SFmode;
3803       case DImode:
3804         return V2DImode;
3805       case SImode:
3806         return V4SImode;
3807       case HImode:
3808         return V8HImode;
3809       case QImode:
3810         return V16QImode;
3811       default:;
3812       }
3813   if (TARGET_SPE)
3814     switch (mode)
3815       {
3816       case SFmode:
3817         return V2SFmode;
3818       case SImode:
3819         return V2SImode;
3820       default:;
3821       }
3822   if (TARGET_PAIRED_FLOAT
3823       && mode == SFmode)
3824     return V2SFmode;
3825   return word_mode;
3826 }
3827
3828 /* Handle generic options of the form -mfoo=yes/no.
3829    NAME is the option name.
3830    VALUE is the option value.
3831    FLAG is the pointer to the flag where to store a 1 or 0, depending on
3832    whether the option value is 'yes' or 'no' respectively.  */
3833 static void
3834 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
3835 {
3836   if (value == 0)
3837     return;
3838   else if (!strcmp (value, "yes"))
3839     *flag = 1;
3840   else if (!strcmp (value, "no"))
3841     *flag = 0;
3842   else
3843     error ("unknown -m%s= option specified: '%s'", name, value);
3844 }
3845
3846 /* Implement TARGET_OPTION_INIT_STRUCT.  */
3847
3848 static void
3849 rs6000_option_init_struct (struct gcc_options *opts)
3850 {
3851   if (DEFAULT_ABI == ABI_DARWIN)
3852     /* The Darwin libraries never set errno, so we might as well
3853        avoid calling them when that's the only reason we would.  */
3854     opts->x_flag_errno_math = 0;
3855
3856   /* Enable section anchors by default.  */
3857   if (!TARGET_MACHO)
3858     opts->x_flag_section_anchors = 1;
3859 }
3860
3861 /* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
3862
3863 static void
3864 rs6000_option_default_params (void)
3865 {
3866   /* Double growth factor to counter reduced min jump length.  */
3867   set_default_param_value (PARAM_MAX_GROW_COPY_BB_INSNS, 16);
3868 }
3869
3870 static enum fpu_type_t
3871 rs6000_parse_fpu_option (const char *option)
3872 {
3873   if (!strcmp("none", option)) return FPU_NONE;
3874   if (!strcmp("sp_lite", option)) return FPU_SF_LITE;
3875   if (!strcmp("dp_lite", option)) return FPU_DF_LITE;
3876   if (!strcmp("sp_full", option)) return FPU_SF_FULL;
3877   if (!strcmp("dp_full", option)) return FPU_DF_FULL;
3878   error("unknown value %s for -mfpu", option);
3879   return FPU_NONE;
3880 }
3881
3882
3883 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
3884    library with vectorized intrinsics.  */
3885
3886 static tree
3887 rs6000_builtin_vectorized_libmass (tree fndecl, tree type_out, tree type_in)
3888 {
3889   char name[32];
3890   const char *suffix = NULL;
3891   tree fntype, new_fndecl, bdecl = NULL_TREE;
3892   int n_args = 1;
3893   const char *bname;
3894   enum machine_mode el_mode, in_mode;
3895   int n, in_n;
3896
3897   /* Libmass is suitable for unsafe math only as it does not correctly support
3898      parts of IEEE with the required precision such as denormals.  Only support
3899      it if we have VSX to use the simd d2 or f4 functions.
3900      XXX: Add variable length support.  */
3901   if (!flag_unsafe_math_optimizations || !TARGET_VSX)
3902     return NULL_TREE;
3903
3904   el_mode = TYPE_MODE (TREE_TYPE (type_out));
3905   n = TYPE_VECTOR_SUBPARTS (type_out);
3906   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3907   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3908   if (el_mode != in_mode
3909       || n != in_n)
3910     return NULL_TREE;
3911
3912   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3913     {
3914       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3915       switch (fn)
3916         {
3917         case BUILT_IN_ATAN2:
3918         case BUILT_IN_HYPOT:
3919         case BUILT_IN_POW:
3920           n_args = 2;
3921           /* fall through */
3922
3923         case BUILT_IN_ACOS:
3924         case BUILT_IN_ACOSH:
3925         case BUILT_IN_ASIN:
3926         case BUILT_IN_ASINH:
3927         case BUILT_IN_ATAN:
3928         case BUILT_IN_ATANH:
3929         case BUILT_IN_CBRT:
3930         case BUILT_IN_COS:
3931         case BUILT_IN_COSH:
3932         case BUILT_IN_ERF:
3933         case BUILT_IN_ERFC:
3934         case BUILT_IN_EXP2:
3935         case BUILT_IN_EXP:
3936         case BUILT_IN_EXPM1:
3937         case BUILT_IN_LGAMMA:
3938         case BUILT_IN_LOG10:
3939         case BUILT_IN_LOG1P:
3940         case BUILT_IN_LOG2:
3941         case BUILT_IN_LOG:
3942         case BUILT_IN_SIN:
3943         case BUILT_IN_SINH:
3944         case BUILT_IN_SQRT:
3945         case BUILT_IN_TAN:
3946         case BUILT_IN_TANH:
3947           bdecl = implicit_built_in_decls[fn];
3948           suffix = "d2";                                /* pow -> powd2 */
3949           if (el_mode != DFmode
3950               || n != 2)
3951             return NULL_TREE;
3952           break;
3953
3954         case BUILT_IN_ATAN2F:
3955         case BUILT_IN_HYPOTF:
3956         case BUILT_IN_POWF:
3957           n_args = 2;
3958           /* fall through */
3959
3960         case BUILT_IN_ACOSF:
3961         case BUILT_IN_ACOSHF:
3962         case BUILT_IN_ASINF:
3963         case BUILT_IN_ASINHF:
3964         case BUILT_IN_ATANF:
3965         case BUILT_IN_ATANHF:
3966         case BUILT_IN_CBRTF:
3967         case BUILT_IN_COSF:
3968         case BUILT_IN_COSHF:
3969         case BUILT_IN_ERFF:
3970         case BUILT_IN_ERFCF:
3971         case BUILT_IN_EXP2F:
3972         case BUILT_IN_EXPF:
3973         case BUILT_IN_EXPM1F:
3974         case BUILT_IN_LGAMMAF:
3975         case BUILT_IN_LOG10F:
3976         case BUILT_IN_LOG1PF:
3977         case BUILT_IN_LOG2F:
3978         case BUILT_IN_LOGF:
3979         case BUILT_IN_SINF:
3980         case BUILT_IN_SINHF:
3981         case BUILT_IN_SQRTF:
3982         case BUILT_IN_TANF:
3983         case BUILT_IN_TANHF:
3984           bdecl = implicit_built_in_decls[fn];
3985           suffix = "4";                                 /* powf -> powf4 */
3986           if (el_mode != SFmode
3987               || n != 4)
3988             return NULL_TREE;
3989           break;
3990
3991         default:
3992           return NULL_TREE;
3993         }
3994     }
3995   else
3996     return NULL_TREE;
3997
3998   gcc_assert (suffix != NULL);
3999   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
4000   strcpy (name, bname + sizeof ("__builtin_") - 1);
4001   strcat (name, suffix);
4002
4003   if (n_args == 1)
4004     fntype = build_function_type_list (type_out, type_in, NULL);
4005   else if (n_args == 2)
4006     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
4007   else
4008     gcc_unreachable ();
4009
4010   /* Build a function declaration for the vectorized function.  */
4011   new_fndecl = build_decl (BUILTINS_LOCATION,
4012                            FUNCTION_DECL, get_identifier (name), fntype);
4013   TREE_PUBLIC (new_fndecl) = 1;
4014   DECL_EXTERNAL (new_fndecl) = 1;
4015   DECL_IS_NOVOPS (new_fndecl) = 1;
4016   TREE_READONLY (new_fndecl) = 1;
4017
4018   return new_fndecl;
4019 }
4020
4021 /* Returns a function decl for a vectorized version of the builtin function
4022    with builtin function code FN and the result vector type TYPE, or NULL_TREE
4023    if it is not available.  */
4024
4025 static tree
4026 rs6000_builtin_vectorized_function (tree fndecl, tree type_out,
4027                                     tree type_in)
4028 {
4029   enum machine_mode in_mode, out_mode;
4030   int in_n, out_n;
4031
4032   if (TREE_CODE (type_out) != VECTOR_TYPE
4033       || TREE_CODE (type_in) != VECTOR_TYPE
4034       || !TARGET_VECTORIZE_BUILTINS)
4035     return NULL_TREE;
4036
4037   out_mode = TYPE_MODE (TREE_TYPE (type_out));
4038   out_n = TYPE_VECTOR_SUBPARTS (type_out);
4039   in_mode = TYPE_MODE (TREE_TYPE (type_in));
4040   in_n = TYPE_VECTOR_SUBPARTS (type_in);
4041
4042   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
4043     {
4044       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
4045       switch (fn)
4046         {
4047         case BUILT_IN_COPYSIGN:
4048           if (VECTOR_UNIT_VSX_P (V2DFmode)
4049               && out_mode == DFmode && out_n == 2
4050               && in_mode == DFmode && in_n == 2)
4051             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
4052           break;
4053         case BUILT_IN_COPYSIGNF:
4054           if (out_mode != SFmode || out_n != 4
4055               || in_mode != SFmode || in_n != 4)
4056             break;
4057           if (VECTOR_UNIT_VSX_P (V4SFmode))
4058             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
4059           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4060             return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
4061           break;
4062         case BUILT_IN_SQRT:
4063           if (VECTOR_UNIT_VSX_P (V2DFmode)
4064               && out_mode == DFmode && out_n == 2
4065               && in_mode == DFmode && in_n == 2)
4066             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTDP];
4067           break;
4068         case BUILT_IN_SQRTF:
4069           if (VECTOR_UNIT_VSX_P (V4SFmode)
4070               && out_mode == SFmode && out_n == 4
4071               && in_mode == SFmode && in_n == 4)
4072             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTSP];
4073           break;
4074         case BUILT_IN_CEIL:
4075           if (VECTOR_UNIT_VSX_P (V2DFmode)
4076               && out_mode == DFmode && out_n == 2
4077               && in_mode == DFmode && in_n == 2)
4078             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
4079           break;
4080         case BUILT_IN_CEILF:
4081           if (out_mode != SFmode || out_n != 4
4082               || in_mode != SFmode || in_n != 4)
4083             break;
4084           if (VECTOR_UNIT_VSX_P (V4SFmode))
4085             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
4086           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4087             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
4088           break;
4089         case BUILT_IN_FLOOR:
4090           if (VECTOR_UNIT_VSX_P (V2DFmode)
4091               && out_mode == DFmode && out_n == 2
4092               && in_mode == DFmode && in_n == 2)
4093             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
4094           break;
4095         case BUILT_IN_FLOORF:
4096           if (out_mode != SFmode || out_n != 4
4097               || in_mode != SFmode || in_n != 4)
4098             break;
4099           if (VECTOR_UNIT_VSX_P (V4SFmode))
4100             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
4101           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4102             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
4103           break;
4104         case BUILT_IN_FMA:
4105           if (VECTOR_UNIT_VSX_P (V2DFmode)
4106               && out_mode == DFmode && out_n == 2
4107               && in_mode == DFmode && in_n == 2)
4108             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
4109           break;
4110         case BUILT_IN_FMAF:
4111           if (VECTOR_UNIT_VSX_P (V4SFmode)
4112               && out_mode == SFmode && out_n == 4
4113               && in_mode == SFmode && in_n == 4)
4114             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
4115           else if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
4116               && out_mode == SFmode && out_n == 4
4117               && in_mode == SFmode && in_n == 4)
4118             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
4119           break;
4120         case BUILT_IN_TRUNC:
4121           if (VECTOR_UNIT_VSX_P (V2DFmode)
4122               && out_mode == DFmode && out_n == 2
4123               && in_mode == DFmode && in_n == 2)
4124             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
4125           break;
4126         case BUILT_IN_TRUNCF:
4127           if (out_mode != SFmode || out_n != 4
4128               || in_mode != SFmode || in_n != 4)
4129             break;
4130           if (VECTOR_UNIT_VSX_P (V4SFmode))
4131             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
4132           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4133             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
4134           break;
4135         case BUILT_IN_NEARBYINT:
4136           if (VECTOR_UNIT_VSX_P (V2DFmode)
4137               && flag_unsafe_math_optimizations
4138               && out_mode == DFmode && out_n == 2
4139               && in_mode == DFmode && in_n == 2)
4140             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
4141           break;
4142         case BUILT_IN_NEARBYINTF:
4143           if (VECTOR_UNIT_VSX_P (V4SFmode)
4144               && flag_unsafe_math_optimizations
4145               && out_mode == SFmode && out_n == 4
4146               && in_mode == SFmode && in_n == 4)
4147             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
4148           break;
4149         case BUILT_IN_RINT:
4150           if (VECTOR_UNIT_VSX_P (V2DFmode)
4151               && !flag_trapping_math
4152               && out_mode == DFmode && out_n == 2
4153               && in_mode == DFmode && in_n == 2)
4154             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
4155           break;
4156         case BUILT_IN_RINTF:
4157           if (VECTOR_UNIT_VSX_P (V4SFmode)
4158               && !flag_trapping_math
4159               && out_mode == SFmode && out_n == 4
4160               && in_mode == SFmode && in_n == 4)
4161             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
4162           break;
4163         default:
4164           break;
4165         }
4166     }
4167
4168   else if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
4169     {
4170       enum rs6000_builtins fn
4171         = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
4172       switch (fn)
4173         {
4174         case RS6000_BUILTIN_RSQRTF:
4175           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
4176               && out_mode == SFmode && out_n == 4
4177               && in_mode == SFmode && in_n == 4)
4178             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
4179           break;
4180         case RS6000_BUILTIN_RSQRT:
4181           if (VECTOR_UNIT_VSX_P (V2DFmode)
4182               && out_mode == DFmode && out_n == 2
4183               && in_mode == DFmode && in_n == 2)
4184             return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
4185           break;
4186         case RS6000_BUILTIN_RECIPF:
4187           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
4188               && out_mode == SFmode && out_n == 4
4189               && in_mode == SFmode && in_n == 4)
4190             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
4191           break;
4192         case RS6000_BUILTIN_RECIP:
4193           if (VECTOR_UNIT_VSX_P (V2DFmode)
4194               && out_mode == DFmode && out_n == 2
4195               && in_mode == DFmode && in_n == 2)
4196             return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
4197           break;
4198         default:
4199           break;
4200         }
4201     }
4202
4203   /* Generate calls to libmass if appropriate.  */
4204   if (rs6000_veclib_handler)
4205     return rs6000_veclib_handler (fndecl, type_out, type_in);
4206
4207   return NULL_TREE;
4208 }
4209
4210
4211 /* Implement TARGET_HANDLE_OPTION.  */
4212
4213 static bool
4214 rs6000_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
4215                       const struct cl_decoded_option *decoded,
4216                       location_t loc ATTRIBUTE_UNUSED)
4217 {
4218   enum fpu_type_t fpu_type = FPU_NONE;
4219   int isel;
4220   char *p, *q;
4221   size_t code = decoded->opt_index;
4222   const char *arg = decoded->arg;
4223   int value = decoded->value;
4224
4225   gcc_assert (opts == &global_options);
4226   gcc_assert (opts_set == &global_options_set);
4227
4228   switch (code)
4229     {
4230     case OPT_mno_power:
4231       target_flags &= ~(MASK_POWER | MASK_POWER2
4232                         | MASK_MULTIPLE | MASK_STRING);
4233       target_flags_explicit |= (MASK_POWER | MASK_POWER2
4234                                 | MASK_MULTIPLE | MASK_STRING);
4235       break;
4236     case OPT_mno_powerpc:
4237       target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
4238                         | MASK_PPC_GFXOPT | MASK_POWERPC64);
4239       target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
4240                                 | MASK_PPC_GFXOPT | MASK_POWERPC64);
4241       break;
4242     case OPT_mfull_toc:
4243       target_flags &= ~MASK_MINIMAL_TOC;
4244       TARGET_NO_FP_IN_TOC = 0;
4245       TARGET_NO_SUM_IN_TOC = 0;
4246       target_flags_explicit |= MASK_MINIMAL_TOC;
4247 #ifdef TARGET_USES_SYSV4_OPT
4248       /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
4249          just the same as -mminimal-toc.  */
4250       target_flags |= MASK_MINIMAL_TOC;
4251       target_flags_explicit |= MASK_MINIMAL_TOC;
4252 #endif
4253       break;
4254
4255 #ifdef TARGET_USES_SYSV4_OPT
4256     case OPT_mtoc:
4257       /* Make -mtoc behave like -mminimal-toc.  */
4258       target_flags |= MASK_MINIMAL_TOC;
4259       target_flags_explicit |= MASK_MINIMAL_TOC;
4260       break;
4261 #endif
4262
4263 #if defined (HAVE_LD_LARGE_TOC) && defined (TARGET_USES_LINUX64_OPT)
4264     case OPT_mcmodel_:
4265       if (strcmp (arg, "small") == 0)
4266         rs6000_current_cmodel = CMODEL_SMALL;
4267       else if (strcmp (arg, "medium") == 0)
4268         rs6000_current_cmodel = CMODEL_MEDIUM;
4269       else if (strcmp (arg, "large") == 0)
4270         rs6000_current_cmodel = CMODEL_LARGE;
4271       else
4272         {
4273           error ("invalid option for -mcmodel: '%s'", arg);
4274           return false;
4275         }
4276       rs6000_explicit_options.cmodel = true;
4277 #endif
4278
4279 #ifdef TARGET_USES_AIX64_OPT
4280     case OPT_maix64:
4281 #else
4282     case OPT_m64:
4283 #endif
4284       target_flags |= MASK_POWERPC64 | MASK_POWERPC;
4285       target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
4286       target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
4287       break;
4288
4289 #ifdef TARGET_USES_AIX64_OPT
4290     case OPT_maix32:
4291 #else
4292     case OPT_m32:
4293 #endif
4294       target_flags &= ~MASK_POWERPC64;
4295       target_flags_explicit |= MASK_POWERPC64;
4296       break;
4297
4298     case OPT_minsert_sched_nops_:
4299       rs6000_sched_insert_nops_str = arg;
4300       break;
4301
4302     case OPT_mminimal_toc:
4303       if (value == 1)
4304         {
4305           TARGET_NO_FP_IN_TOC = 0;
4306           TARGET_NO_SUM_IN_TOC = 0;
4307         }
4308       break;
4309
4310     case OPT_mpower:
4311       if (value == 1)
4312         {
4313           target_flags |= (MASK_MULTIPLE | MASK_STRING);
4314           target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
4315         }
4316       break;
4317
4318     case OPT_mpower2:
4319       if (value == 1)
4320         {
4321           target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
4322           target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
4323         }
4324       break;
4325
4326     case OPT_mpowerpc_gpopt:
4327     case OPT_mpowerpc_gfxopt:
4328       if (value == 1)
4329         {
4330           target_flags |= MASK_POWERPC;
4331           target_flags_explicit |= MASK_POWERPC;
4332         }
4333       break;
4334
4335     case OPT_maix_struct_return:
4336     case OPT_msvr4_struct_return:
4337       rs6000_explicit_options.aix_struct_ret = true;
4338       break;
4339
4340     case OPT_mvrsave:
4341       rs6000_explicit_options.vrsave = true;
4342       TARGET_ALTIVEC_VRSAVE = value;
4343       break;
4344
4345     case OPT_mvrsave_:
4346       rs6000_explicit_options.vrsave = true;
4347       rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
4348       break;
4349
4350     case OPT_misel_:
4351       target_flags_explicit |= MASK_ISEL;
4352       isel = 0;
4353       rs6000_parse_yes_no_option ("isel", arg, &isel);
4354       if (isel)
4355         target_flags |= MASK_ISEL;
4356       else
4357         target_flags &= ~MASK_ISEL;
4358       break;
4359
4360     case OPT_mspe:
4361       rs6000_explicit_options.spe = true;
4362       rs6000_spe = value;
4363       break;
4364
4365     case OPT_mspe_:
4366       rs6000_explicit_options.spe = true;
4367       rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
4368       break;
4369
4370     case OPT_mdebug_:
4371       p = ASTRDUP (arg);
4372       rs6000_debug = 0;
4373
4374       while ((q = strtok (p, ",")) != NULL)
4375         {
4376           unsigned mask = 0;
4377           bool invert;
4378
4379           p = NULL;
4380           if (*q == '!')
4381             {
4382               invert = true;
4383               q++;
4384             }
4385           else
4386             invert = false;
4387
4388           if (! strcmp (q, "all"))
4389             mask = MASK_DEBUG_ALL;
4390           else if (! strcmp (q, "stack"))
4391             mask = MASK_DEBUG_STACK;
4392           else if (! strcmp (q, "arg"))
4393             mask = MASK_DEBUG_ARG;
4394           else if (! strcmp (q, "reg"))
4395             mask = MASK_DEBUG_REG;
4396           else if (! strcmp (q, "addr"))
4397             mask = MASK_DEBUG_ADDR;
4398           else if (! strcmp (q, "cost"))
4399             mask = MASK_DEBUG_COST;
4400           else if (! strcmp (q, "target"))
4401             mask = MASK_DEBUG_TARGET;
4402           else
4403             error ("unknown -mdebug-%s switch", q);
4404
4405           if (invert)
4406             rs6000_debug &= ~mask;
4407           else  
4408             rs6000_debug |= mask;
4409         }
4410       break;
4411
4412 #ifdef TARGET_USES_SYSV4_OPT
4413     case OPT_mcall_:
4414       rs6000_abi_name = arg;
4415       break;
4416
4417     case OPT_msdata_:
4418       rs6000_sdata_name = arg;
4419       break;
4420
4421     case OPT_mtls_size_:
4422       if (strcmp (arg, "16") == 0)
4423         rs6000_tls_size = 16;
4424       else if (strcmp (arg, "32") == 0)
4425         rs6000_tls_size = 32;
4426       else if (strcmp (arg, "64") == 0)
4427         rs6000_tls_size = 64;
4428       else
4429         error ("bad value %qs for -mtls-size switch", arg);
4430       break;
4431
4432     case OPT_mrelocatable:
4433       if (value == 1)
4434         {
4435           target_flags |= MASK_MINIMAL_TOC;
4436           target_flags_explicit |= MASK_MINIMAL_TOC;
4437           TARGET_NO_FP_IN_TOC = 1;
4438         }
4439       break;
4440
4441     case OPT_mrelocatable_lib:
4442       if (value == 1)
4443         {
4444           target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
4445           target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
4446           TARGET_NO_FP_IN_TOC = 1;
4447         }
4448       else
4449         {
4450           target_flags &= ~MASK_RELOCATABLE;
4451           target_flags_explicit |= MASK_RELOCATABLE;
4452         }
4453       break;
4454 #endif
4455
4456     case OPT_mabi_:
4457       if (!strcmp (arg, "altivec"))
4458         {
4459           rs6000_explicit_options.altivec_abi = true;
4460           rs6000_altivec_abi = 1;
4461
4462           /* Enabling the AltiVec ABI turns off the SPE ABI.  */
4463           rs6000_spe_abi = 0;
4464         }
4465       else if (! strcmp (arg, "no-altivec"))
4466         {
4467           rs6000_explicit_options.altivec_abi = true;
4468           rs6000_altivec_abi = 0;
4469         }
4470       else if (! strcmp (arg, "spe"))
4471         {
4472           rs6000_explicit_options.spe_abi = true;
4473           rs6000_spe_abi = 1;
4474           rs6000_altivec_abi = 0;
4475           if (!TARGET_SPE_ABI)
4476             error ("not configured for ABI: '%s'", arg);
4477         }
4478       else if (! strcmp (arg, "no-spe"))
4479         {
4480           rs6000_explicit_options.spe_abi = true;
4481           rs6000_spe_abi = 0;
4482         }
4483
4484       /* These are here for testing during development only, do not
4485          document in the manual please.  */
4486       else if (! strcmp (arg, "d64"))
4487         {
4488           rs6000_darwin64_abi = 1;
4489           warning (0, "using darwin64 ABI");
4490         }
4491       else if (! strcmp (arg, "d32"))
4492         {
4493           rs6000_darwin64_abi = 0;
4494           warning (0, "using old darwin ABI");
4495         }
4496
4497       else if (! strcmp (arg, "ibmlongdouble"))
4498         {
4499           rs6000_explicit_options.ieee = true;
4500           rs6000_ieeequad = 0;
4501           warning (0, "using IBM extended precision long double");
4502         }
4503       else if (! strcmp (arg, "ieeelongdouble"))
4504         {
4505           rs6000_explicit_options.ieee = true;
4506           rs6000_ieeequad = 1;
4507           warning (0, "using IEEE extended precision long double");
4508         }
4509
4510       else
4511         {
4512           error ("unknown ABI specified: '%s'", arg);
4513           return false;
4514         }
4515       break;
4516
4517     case OPT_mcpu_:
4518       rs6000_select[1].string = arg;
4519       rs6000_cpu_index = rs6000_cpu_name_lookup (arg);
4520       if (rs6000_cpu_index < 0)
4521         error ("bad value (%s) for -mcpu", arg);
4522       break;
4523
4524     case OPT_mtune_:
4525       rs6000_select[2].string = arg;
4526       rs6000_tune_index = rs6000_cpu_name_lookup (arg);
4527       if (rs6000_tune_index < 0)
4528         error ("bad value (%s) for -mtune", arg);
4529       break;
4530
4531     case OPT_mtraceback_:
4532       if (! strncmp (arg, "full", 4))
4533         rs6000_traceback = traceback_full;
4534       else if (! strncmp (arg, "part", 4))
4535         rs6000_traceback = traceback_part;
4536       else if (! strncmp (arg, "no", 2))
4537         rs6000_traceback = traceback_none;
4538       else
4539         error ("unknown -mtraceback arg %qs; expecting %<full%>, "
4540                "%<partial%> or %<none%>", arg);
4541       break;
4542
4543     case OPT_mfloat_gprs_:
4544       rs6000_explicit_options.float_gprs = true;
4545       if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
4546         rs6000_float_gprs = 1;
4547       else if (! strcmp (arg, "double"))
4548         rs6000_float_gprs = 2;
4549       else if (! strcmp (arg, "no"))
4550         rs6000_float_gprs = 0;
4551       else
4552         {
4553           error ("invalid option for -mfloat-gprs: '%s'", arg);
4554           return false;
4555         }
4556       break;
4557
4558     case OPT_mlong_double_:
4559       rs6000_explicit_options.long_double = true;
4560       rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4561       if (value != 64 && value != 128)
4562         {
4563           error ("unknown switch -mlong-double-%s", arg);
4564           rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4565           return false;
4566         }
4567       else
4568         rs6000_long_double_type_size = value;
4569       break;
4570
4571     case OPT_msched_costly_dep_:
4572       rs6000_sched_costly_dep_str = arg;
4573       break;
4574
4575     case OPT_malign_:
4576       rs6000_explicit_options.alignment = true;
4577       if (! strcmp (arg, "power"))
4578         {
4579           /* On 64-bit Darwin, power alignment is ABI-incompatible with
4580              some C library functions, so warn about it. The flag may be
4581              useful for performance studies from time to time though, so
4582              don't disable it entirely.  */
4583           if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
4584             warning (0, "-malign-power is not supported for 64-bit Darwin;"
4585                      " it is incompatible with the installed C and C++ libraries");
4586           rs6000_alignment_flags = MASK_ALIGN_POWER;
4587         }
4588       else if (! strcmp (arg, "natural"))
4589         rs6000_alignment_flags = MASK_ALIGN_NATURAL;
4590       else
4591         {
4592           error ("unknown -malign-XXXXX option specified: '%s'", arg);
4593           return false;
4594         }
4595       break;
4596
4597     case OPT_msingle_float:
4598       if (!TARGET_SINGLE_FPU) 
4599         warning (0, "-msingle-float option equivalent to -mhard-float");
4600       /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
4601       rs6000_double_float = 0;
4602       target_flags &= ~MASK_SOFT_FLOAT;
4603       target_flags_explicit |= MASK_SOFT_FLOAT;
4604       break;
4605
4606     case OPT_mdouble_float:
4607       /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
4608       rs6000_single_float = 1;
4609       target_flags &= ~MASK_SOFT_FLOAT;
4610       target_flags_explicit |= MASK_SOFT_FLOAT;
4611       break;
4612
4613     case OPT_msimple_fpu:
4614       if (!TARGET_SINGLE_FPU) 
4615         warning (0, "-msimple-fpu option ignored");
4616       break;
4617
4618     case OPT_mhard_float:
4619       /* -mhard_float implies -msingle-float and -mdouble-float. */
4620       rs6000_single_float = rs6000_double_float = 1;
4621       break;
4622
4623     case OPT_msoft_float:
4624       /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
4625       rs6000_single_float = rs6000_double_float = 0;
4626       break;
4627
4628     case OPT_mfpu_:
4629       fpu_type = rs6000_parse_fpu_option(arg);
4630       if (fpu_type != FPU_NONE) 
4631       /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on HARD_FLOAT. */
4632       {
4633         target_flags &= ~MASK_SOFT_FLOAT;
4634         target_flags_explicit |= MASK_SOFT_FLOAT;
4635         rs6000_xilinx_fpu = 1;
4636         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_SF_FULL) 
4637         rs6000_single_float = 1;
4638         if (fpu_type == FPU_DF_LITE || fpu_type == FPU_DF_FULL) 
4639           rs6000_single_float = rs6000_double_float = 1;
4640         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_DF_LITE) 
4641           rs6000_simple_fpu = 1;
4642       }
4643       else
4644       {
4645         /* -mfpu=none is equivalent to -msoft-float */
4646         target_flags |= MASK_SOFT_FLOAT;
4647         target_flags_explicit |= MASK_SOFT_FLOAT;
4648         rs6000_single_float = rs6000_double_float = 0;
4649       }
4650
4651     case OPT_mrecip:
4652       rs6000_recip_name = (value) ? "default" : "none";
4653       break;
4654
4655     case OPT_mrecip_:
4656       rs6000_recip_name = arg;
4657       break;
4658     }
4659   return true;
4660 }
4661 \f
4662 /* Do anything needed at the start of the asm file.  */
4663
4664 static void
4665 rs6000_file_start (void)
4666 {
4667   size_t i;
4668   char buffer[80];
4669   const char *start = buffer;
4670   struct rs6000_cpu_select *ptr;
4671   const char *default_cpu = TARGET_CPU_DEFAULT;
4672   FILE *file = asm_out_file;
4673
4674   default_file_start ();
4675
4676 #ifdef TARGET_BI_ARCH
4677   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
4678     default_cpu = 0;
4679 #endif
4680
4681   if (flag_verbose_asm)
4682     {
4683       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
4684       rs6000_select[0].string = default_cpu;
4685
4686       for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
4687         {
4688           ptr = &rs6000_select[i];
4689           if (ptr->string != (char *)0 && ptr->string[0] != '\0')
4690             {
4691               fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
4692               start = "";
4693             }
4694         }
4695
4696       if (PPC405_ERRATUM77)
4697         {
4698           fprintf (file, "%s PPC405CR_ERRATUM77", start);
4699           start = "";
4700         }
4701
4702 #ifdef USING_ELFOS_H
4703       switch (rs6000_sdata)
4704         {
4705         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
4706         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
4707         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
4708         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
4709         }
4710
4711       if (rs6000_sdata && g_switch_value)
4712         {
4713           fprintf (file, "%s -G %d", start,
4714                    g_switch_value);
4715           start = "";
4716         }
4717 #endif
4718
4719       if (*start == '\0')
4720         putc ('\n', file);
4721     }
4722
4723   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
4724     {
4725       switch_to_section (toc_section);
4726       switch_to_section (text_section);
4727     }
4728 }
4729
4730 \f
4731 /* Return nonzero if this function is known to have a null epilogue.  */
4732
4733 int
4734 direct_return (void)
4735 {
4736   if (reload_completed)
4737     {
4738       rs6000_stack_t *info = rs6000_stack_info ();
4739
4740       if (info->first_gp_reg_save == 32
4741           && info->first_fp_reg_save == 64
4742           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
4743           && ! info->lr_save_p
4744           && ! info->cr_save_p
4745           && info->vrsave_mask == 0
4746           && ! info->push_p)
4747         return 1;
4748     }
4749
4750   return 0;
4751 }
4752
4753 /* Return the number of instructions it takes to form a constant in an
4754    integer register.  */
4755
4756 int
4757 num_insns_constant_wide (HOST_WIDE_INT value)
4758 {
4759   /* signed constant loadable with {cal|addi} */
4760   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
4761     return 1;
4762
4763   /* constant loadable with {cau|addis} */
4764   else if ((value & 0xffff) == 0
4765            && (value >> 31 == -1 || value >> 31 == 0))
4766     return 1;
4767
4768 #if HOST_BITS_PER_WIDE_INT == 64
4769   else if (TARGET_POWERPC64)
4770     {
4771       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
4772       HOST_WIDE_INT high = value >> 31;
4773
4774       if (high == 0 || high == -1)
4775         return 2;
4776
4777       high >>= 1;
4778
4779       if (low == 0)
4780         return num_insns_constant_wide (high) + 1;
4781       else if (high == 0)
4782         return num_insns_constant_wide (low) + 1;
4783       else
4784         return (num_insns_constant_wide (high)
4785                 + num_insns_constant_wide (low) + 1);
4786     }
4787 #endif
4788
4789   else
4790     return 2;
4791 }
4792
4793 int
4794 num_insns_constant (rtx op, enum machine_mode mode)
4795 {
4796   HOST_WIDE_INT low, high;
4797
4798   switch (GET_CODE (op))
4799     {
4800     case CONST_INT:
4801 #if HOST_BITS_PER_WIDE_INT == 64
4802       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4803           && mask64_operand (op, mode))
4804         return 2;
4805       else
4806 #endif
4807         return num_insns_constant_wide (INTVAL (op));
4808
4809       case CONST_DOUBLE:
4810         if (mode == SFmode || mode == SDmode)
4811           {
4812             long l;
4813             REAL_VALUE_TYPE rv;
4814
4815             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4816             if (DECIMAL_FLOAT_MODE_P (mode))
4817               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
4818             else
4819               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4820             return num_insns_constant_wide ((HOST_WIDE_INT) l);
4821           }
4822
4823         if (mode == VOIDmode || mode == DImode)
4824           {
4825             high = CONST_DOUBLE_HIGH (op);
4826             low  = CONST_DOUBLE_LOW (op);
4827           }
4828         else
4829           {
4830             long l[2];
4831             REAL_VALUE_TYPE rv;
4832
4833             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4834             if (DECIMAL_FLOAT_MODE_P (mode))
4835               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
4836             else
4837               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
4838             high = l[WORDS_BIG_ENDIAN == 0];
4839             low  = l[WORDS_BIG_ENDIAN != 0];
4840           }
4841
4842         if (TARGET_32BIT)
4843           return (num_insns_constant_wide (low)
4844                   + num_insns_constant_wide (high));
4845         else
4846           {
4847             if ((high == 0 && low >= 0)
4848                 || (high == -1 && low < 0))
4849               return num_insns_constant_wide (low);
4850
4851             else if (mask64_operand (op, mode))
4852               return 2;
4853
4854             else if (low == 0)
4855               return num_insns_constant_wide (high) + 1;
4856
4857             else
4858               return (num_insns_constant_wide (high)
4859                       + num_insns_constant_wide (low) + 1);
4860           }
4861
4862     default:
4863       gcc_unreachable ();
4864     }
4865 }
4866
4867 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
4868    If the mode of OP is MODE_VECTOR_INT, this simply returns the
4869    corresponding element of the vector, but for V4SFmode and V2SFmode,
4870    the corresponding "float" is interpreted as an SImode integer.  */
4871
4872 HOST_WIDE_INT
4873 const_vector_elt_as_int (rtx op, unsigned int elt)
4874 {
4875   rtx tmp;
4876
4877   /* We can't handle V2DImode and V2DFmode vector constants here yet.  */
4878   gcc_assert (GET_MODE (op) != V2DImode
4879               && GET_MODE (op) != V2DFmode);
4880
4881   tmp = CONST_VECTOR_ELT (op, elt);
4882   if (GET_MODE (op) == V4SFmode
4883       || GET_MODE (op) == V2SFmode)
4884     tmp = gen_lowpart (SImode, tmp);
4885   return INTVAL (tmp);
4886 }
4887
4888 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
4889    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
4890    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
4891    all items are set to the same value and contain COPIES replicas of the
4892    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
4893    operand and the others are set to the value of the operand's msb.  */
4894
4895 static bool
4896 vspltis_constant (rtx op, unsigned step, unsigned copies)
4897 {
4898   enum machine_mode mode = GET_MODE (op);
4899   enum machine_mode inner = GET_MODE_INNER (mode);
4900
4901   unsigned i;
4902   unsigned nunits;
4903   unsigned bitsize;
4904   unsigned mask;
4905
4906   HOST_WIDE_INT val;
4907   HOST_WIDE_INT splat_val;
4908   HOST_WIDE_INT msb_val;
4909
4910   if (mode == V2DImode || mode == V2DFmode)
4911     return false;
4912
4913   nunits = GET_MODE_NUNITS (mode);
4914   bitsize = GET_MODE_BITSIZE (inner);
4915   mask = GET_MODE_MASK (inner);
4916
4917   val = const_vector_elt_as_int (op, nunits - 1);
4918   splat_val = val;
4919   msb_val = val > 0 ? 0 : -1;
4920
4921   /* Construct the value to be splatted, if possible.  If not, return 0.  */
4922   for (i = 2; i <= copies; i *= 2)
4923     {
4924       HOST_WIDE_INT small_val;
4925       bitsize /= 2;
4926       small_val = splat_val >> bitsize;
4927       mask >>= bitsize;
4928       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
4929         return false;
4930       splat_val = small_val;
4931     }
4932
4933   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
4934   if (EASY_VECTOR_15 (splat_val))
4935     ;
4936
4937   /* Also check if we can splat, and then add the result to itself.  Do so if
4938      the value is positive, of if the splat instruction is using OP's mode;
4939      for splat_val < 0, the splat and the add should use the same mode.  */
4940   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
4941            && (splat_val >= 0 || (step == 1 && copies == 1)))
4942     ;
4943
4944   /* Also check if are loading up the most significant bit which can be done by
4945      loading up -1 and shifting the value left by -1.  */
4946   else if (EASY_VECTOR_MSB (splat_val, inner))
4947     ;
4948
4949   else
4950     return false;
4951
4952   /* Check if VAL is present in every STEP-th element, and the
4953      other elements are filled with its most significant bit.  */
4954   for (i = 0; i < nunits - 1; ++i)
4955     {
4956       HOST_WIDE_INT desired_val;
4957       if (((i + 1) & (step - 1)) == 0)
4958         desired_val = val;
4959       else
4960         desired_val = msb_val;
4961
4962       if (desired_val != const_vector_elt_as_int (op, i))
4963         return false;
4964     }
4965
4966   return true;
4967 }
4968
4969
4970 /* Return true if OP is of the given MODE and can be synthesized
4971    with a vspltisb, vspltish or vspltisw.  */
4972
4973 bool
4974 easy_altivec_constant (rtx op, enum machine_mode mode)
4975 {
4976   unsigned step, copies;
4977
4978   if (mode == VOIDmode)
4979     mode = GET_MODE (op);
4980   else if (mode != GET_MODE (op))
4981     return false;
4982
4983   /* V2DI/V2DF was added with VSX.  Only allow 0 and all 1's as easy
4984      constants.  */
4985   if (mode == V2DFmode)
4986     return zero_constant (op, mode);
4987
4988   if (mode == V2DImode)
4989     {
4990       /* In case the compiler is built 32-bit, CONST_DOUBLE constants are not
4991          easy.  */
4992       if (GET_CODE (CONST_VECTOR_ELT (op, 0)) != CONST_INT
4993           || GET_CODE (CONST_VECTOR_ELT (op, 1)) != CONST_INT)
4994         return false;
4995
4996       if (zero_constant (op, mode))
4997         return true;
4998
4999       if (INTVAL (CONST_VECTOR_ELT (op, 0)) == -1
5000           && INTVAL (CONST_VECTOR_ELT (op, 1)) == -1)
5001         return true;
5002
5003       return false;
5004     }
5005
5006   /* Start with a vspltisw.  */
5007   step = GET_MODE_NUNITS (mode) / 4;
5008   copies = 1;
5009
5010   if (vspltis_constant (op, step, copies))
5011     return true;
5012
5013   /* Then try with a vspltish.  */
5014   if (step == 1)
5015     copies <<= 1;
5016   else
5017     step >>= 1;
5018
5019   if (vspltis_constant (op, step, copies))
5020     return true;
5021
5022   /* And finally a vspltisb.  */
5023   if (step == 1)
5024     copies <<= 1;
5025   else
5026     step >>= 1;
5027
5028   if (vspltis_constant (op, step, copies))
5029     return true;
5030
5031   return false;
5032 }
5033
5034 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
5035    result is OP.  Abort if it is not possible.  */
5036
5037 rtx
5038 gen_easy_altivec_constant (rtx op)
5039 {
5040   enum machine_mode mode = GET_MODE (op);
5041   int nunits = GET_MODE_NUNITS (mode);
5042   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
5043   unsigned step = nunits / 4;
5044   unsigned copies = 1;
5045
5046   /* Start with a vspltisw.  */
5047   if (vspltis_constant (op, step, copies))
5048     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
5049
5050   /* Then try with a vspltish.  */
5051   if (step == 1)
5052     copies <<= 1;
5053   else
5054     step >>= 1;
5055
5056   if (vspltis_constant (op, step, copies))
5057     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
5058
5059   /* And finally a vspltisb.  */
5060   if (step == 1)
5061     copies <<= 1;
5062   else
5063     step >>= 1;
5064
5065   if (vspltis_constant (op, step, copies))
5066     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
5067
5068   gcc_unreachable ();
5069 }
5070
5071 const char *
5072 output_vec_const_move (rtx *operands)
5073 {
5074   int cst, cst2;
5075   enum machine_mode mode;
5076   rtx dest, vec;
5077
5078   dest = operands[0];
5079   vec = operands[1];
5080   mode = GET_MODE (dest);
5081
5082   if (TARGET_VSX)
5083     {
5084       if (zero_constant (vec, mode))
5085         return "xxlxor %x0,%x0,%x0";
5086
5087       if (mode == V2DImode
5088           && INTVAL (CONST_VECTOR_ELT (vec, 0)) == -1
5089           && INTVAL (CONST_VECTOR_ELT (vec, 1)) == -1)
5090         return "vspltisw %0,-1";
5091     }
5092
5093   if (TARGET_ALTIVEC)
5094     {
5095       rtx splat_vec;
5096       if (zero_constant (vec, mode))
5097         return "vxor %0,%0,%0";
5098
5099       splat_vec = gen_easy_altivec_constant (vec);
5100       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
5101       operands[1] = XEXP (splat_vec, 0);
5102       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
5103         return "#";
5104
5105       switch (GET_MODE (splat_vec))
5106         {
5107         case V4SImode:
5108           return "vspltisw %0,%1";
5109
5110         case V8HImode:
5111           return "vspltish %0,%1";
5112
5113         case V16QImode:
5114           return "vspltisb %0,%1";
5115
5116         default:
5117           gcc_unreachable ();
5118         }
5119     }
5120
5121   gcc_assert (TARGET_SPE);
5122
5123   /* Vector constant 0 is handled as a splitter of V2SI, and in the
5124      pattern of V1DI, V4HI, and V2SF.
5125
5126      FIXME: We should probably return # and add post reload
5127      splitters for these, but this way is so easy ;-).  */
5128   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
5129   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
5130   operands[1] = CONST_VECTOR_ELT (vec, 0);
5131   operands[2] = CONST_VECTOR_ELT (vec, 1);
5132   if (cst == cst2)
5133     return "li %0,%1\n\tevmergelo %0,%0,%0";
5134   else
5135     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
5136 }
5137
5138 /* Initialize TARGET of vector PAIRED to VALS.  */
5139
5140 void
5141 paired_expand_vector_init (rtx target, rtx vals)
5142 {
5143   enum machine_mode mode = GET_MODE (target);
5144   int n_elts = GET_MODE_NUNITS (mode);
5145   int n_var = 0;
5146   rtx x, new_rtx, tmp, constant_op, op1, op2;
5147   int i;
5148
5149   for (i = 0; i < n_elts; ++i)
5150     {
5151       x = XVECEXP (vals, 0, i);
5152       if (!CONSTANT_P (x))
5153         ++n_var;
5154     }
5155   if (n_var == 0)
5156     {
5157       /* Load from constant pool.  */
5158       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
5159       return;
5160     }
5161
5162   if (n_var == 2)
5163     {
5164       /* The vector is initialized only with non-constants.  */
5165       new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
5166                                 XVECEXP (vals, 0, 1));
5167
5168       emit_move_insn (target, new_rtx);
5169       return;
5170     }
5171   
5172   /* One field is non-constant and the other one is a constant.  Load the
5173      constant from the constant pool and use ps_merge instruction to
5174      construct the whole vector.  */
5175   op1 = XVECEXP (vals, 0, 0);
5176   op2 = XVECEXP (vals, 0, 1);
5177
5178   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
5179
5180   tmp = gen_reg_rtx (GET_MODE (constant_op));
5181   emit_move_insn (tmp, constant_op);
5182
5183   if (CONSTANT_P (op1))
5184     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
5185   else
5186     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
5187
5188   emit_move_insn (target, new_rtx);
5189 }
5190
5191 void
5192 paired_expand_vector_move (rtx operands[])
5193 {
5194   rtx op0 = operands[0], op1 = operands[1];
5195
5196   emit_move_insn (op0, op1);
5197 }
5198
5199 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
5200    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
5201    operands for the relation operation COND.  This is a recursive
5202    function.  */
5203
5204 static void
5205 paired_emit_vector_compare (enum rtx_code rcode,
5206                             rtx dest, rtx op0, rtx op1,
5207                             rtx cc_op0, rtx cc_op1)
5208 {
5209   rtx tmp = gen_reg_rtx (V2SFmode);
5210   rtx tmp1, max, min;
5211
5212   gcc_assert (TARGET_PAIRED_FLOAT);
5213   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
5214
5215   switch (rcode)
5216     {
5217     case LT:
5218     case LTU:
5219       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
5220       return;
5221     case GE:
5222     case GEU:
5223       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
5224       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
5225       return;
5226     case LE:
5227     case LEU:
5228       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
5229       return;
5230     case GT:
5231       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
5232       return;
5233     case EQ:
5234       tmp1 = gen_reg_rtx (V2SFmode);
5235       max = gen_reg_rtx (V2SFmode);
5236       min = gen_reg_rtx (V2SFmode);
5237       gen_reg_rtx (V2SFmode);
5238       
5239       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
5240       emit_insn (gen_selv2sf4
5241                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
5242       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
5243       emit_insn (gen_selv2sf4
5244                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
5245       emit_insn (gen_subv2sf3 (tmp1, min, max));
5246       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
5247       return;
5248     case NE:
5249       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
5250       return;
5251     case UNLE:
5252       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
5253       return;
5254     case UNLT:
5255       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
5256       return;
5257     case UNGE:
5258       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
5259       return;
5260     case UNGT:
5261       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
5262       return;
5263     default:
5264       gcc_unreachable ();
5265     }
5266
5267   return;
5268 }
5269
5270 /* Emit vector conditional expression.
5271    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
5272    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
5273
5274 int
5275 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
5276                               rtx cond, rtx cc_op0, rtx cc_op1)
5277 {
5278   enum rtx_code rcode = GET_CODE (cond);
5279
5280   if (!TARGET_PAIRED_FLOAT)
5281     return 0;
5282
5283   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
5284
5285   return 1;
5286 }
5287
5288 /* Initialize vector TARGET to VALS.  */
5289
5290 void
5291 rs6000_expand_vector_init (rtx target, rtx vals)
5292 {
5293   enum machine_mode mode = GET_MODE (target);
5294   enum machine_mode inner_mode = GET_MODE_INNER (mode);
5295   int n_elts = GET_MODE_NUNITS (mode);
5296   int n_var = 0, one_var = -1;
5297   bool all_same = true, all_const_zero = true;
5298   rtx x, mem;
5299   int i;
5300
5301   for (i = 0; i < n_elts; ++i)
5302     {
5303       x = XVECEXP (vals, 0, i);
5304       if (!CONSTANT_P (x))
5305         ++n_var, one_var = i;
5306       else if (x != CONST0_RTX (inner_mode))
5307         all_const_zero = false;
5308
5309       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
5310         all_same = false;
5311     }
5312
5313   if (n_var == 0)
5314     {
5315       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
5316       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
5317       if ((int_vector_p || TARGET_VSX) && all_const_zero)
5318         {
5319           /* Zero register.  */
5320           emit_insn (gen_rtx_SET (VOIDmode, target,
5321                                   gen_rtx_XOR (mode, target, target)));
5322           return;
5323         }
5324       else if (int_vector_p && easy_vector_constant (const_vec, mode))
5325         {
5326           /* Splat immediate.  */
5327           emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
5328           return;
5329         }
5330       else
5331         {
5332           /* Load from constant pool.  */
5333           emit_move_insn (target, const_vec);
5334           return;
5335         }
5336     }
5337
5338   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
5339   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5340     {
5341       if (all_same)
5342         {
5343           rtx element = XVECEXP (vals, 0, 0);
5344           if (mode == V2DFmode)
5345             emit_insn (gen_vsx_splat_v2df (target, element));
5346           else
5347             emit_insn (gen_vsx_splat_v2di (target, element));
5348         }
5349       else
5350         {
5351           if (mode == V2DFmode)
5352             {
5353               rtx op0 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 0));
5354               rtx op1 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 1));
5355               emit_insn (gen_vsx_concat_v2df (target, op0, op1));
5356             }
5357           else
5358             {
5359               rtx op0 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 0));
5360               rtx op1 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 1));
5361               emit_insn (gen_vsx_concat_v2di (target, op0, op1));
5362             }
5363         }
5364       return;
5365     }
5366
5367   /* With single precision floating point on VSX, know that internally single
5368      precision is actually represented as a double, and either make 2 V2DF
5369      vectors, and convert these vectors to single precision, or do one
5370      conversion, and splat the result to the other elements.  */
5371   if (mode == V4SFmode && VECTOR_MEM_VSX_P (mode))
5372     {
5373       if (all_same)
5374         {
5375           rtx freg = gen_reg_rtx (V4SFmode);
5376           rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
5377
5378           emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
5379           emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
5380         }
5381       else
5382         {
5383           rtx dbl_even = gen_reg_rtx (V2DFmode);
5384           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
5385           rtx flt_even = gen_reg_rtx (V4SFmode);
5386           rtx flt_odd  = gen_reg_rtx (V4SFmode);
5387
5388           emit_insn (gen_vsx_concat_v2sf (dbl_even,
5389                                           copy_to_reg (XVECEXP (vals, 0, 0)),
5390                                           copy_to_reg (XVECEXP (vals, 0, 1))));
5391           emit_insn (gen_vsx_concat_v2sf (dbl_odd,
5392                                           copy_to_reg (XVECEXP (vals, 0, 2)),
5393                                           copy_to_reg (XVECEXP (vals, 0, 3))));
5394           emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
5395           emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
5396           emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
5397         }
5398       return;
5399     }
5400
5401   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
5402      of 64-bit items is not supported on Altivec.  */
5403   if (all_same && GET_MODE_SIZE (mode) <= 4)
5404     {
5405       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
5406       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
5407                       XVECEXP (vals, 0, 0));
5408       x = gen_rtx_UNSPEC (VOIDmode,
5409                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
5410       emit_insn (gen_rtx_PARALLEL (VOIDmode,
5411                                    gen_rtvec (2,
5412                                               gen_rtx_SET (VOIDmode,
5413                                                            target, mem),
5414                                               x)));
5415       x = gen_rtx_VEC_SELECT (inner_mode, target,
5416                               gen_rtx_PARALLEL (VOIDmode,
5417                                                 gen_rtvec (1, const0_rtx)));
5418       emit_insn (gen_rtx_SET (VOIDmode, target,
5419                               gen_rtx_VEC_DUPLICATE (mode, x)));
5420       return;
5421     }
5422
5423   /* One field is non-constant.  Load constant then overwrite
5424      varying field.  */
5425   if (n_var == 1)
5426     {
5427       rtx copy = copy_rtx (vals);
5428
5429       /* Load constant part of vector, substitute neighboring value for
5430          varying element.  */
5431       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
5432       rs6000_expand_vector_init (target, copy);
5433
5434       /* Insert variable.  */
5435       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
5436       return;
5437     }
5438
5439   /* Construct the vector in memory one field at a time
5440      and load the whole vector.  */
5441   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
5442   for (i = 0; i < n_elts; i++)
5443     emit_move_insn (adjust_address_nv (mem, inner_mode,
5444                                     i * GET_MODE_SIZE (inner_mode)),
5445                     XVECEXP (vals, 0, i));
5446   emit_move_insn (target, mem);
5447 }
5448
5449 /* Set field ELT of TARGET to VAL.  */
5450
5451 void
5452 rs6000_expand_vector_set (rtx target, rtx val, int elt)
5453 {
5454   enum machine_mode mode = GET_MODE (target);
5455   enum machine_mode inner_mode = GET_MODE_INNER (mode);
5456   rtx reg = gen_reg_rtx (mode);
5457   rtx mask, mem, x;
5458   int width = GET_MODE_SIZE (inner_mode);
5459   int i;
5460
5461   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5462     {
5463       rtx (*set_func) (rtx, rtx, rtx, rtx)
5464         = ((mode == V2DFmode) ? gen_vsx_set_v2df : gen_vsx_set_v2di);
5465       emit_insn (set_func (target, target, val, GEN_INT (elt)));
5466       return;
5467     }
5468
5469   /* Load single variable value.  */
5470   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
5471   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
5472   x = gen_rtx_UNSPEC (VOIDmode,
5473                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
5474   emit_insn (gen_rtx_PARALLEL (VOIDmode,
5475                                gen_rtvec (2,
5476                                           gen_rtx_SET (VOIDmode,
5477                                                        reg, mem),
5478                                           x)));
5479
5480   /* Linear sequence.  */
5481   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
5482   for (i = 0; i < 16; ++i)
5483     XVECEXP (mask, 0, i) = GEN_INT (i);
5484
5485   /* Set permute mask to insert element into target.  */
5486   for (i = 0; i < width; ++i)
5487     XVECEXP (mask, 0, elt*width + i)
5488       = GEN_INT (i + 0x10);
5489   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
5490   x = gen_rtx_UNSPEC (mode,
5491                       gen_rtvec (3, target, reg,
5492                                  force_reg (V16QImode, x)),
5493                       UNSPEC_VPERM);
5494   emit_insn (gen_rtx_SET (VOIDmode, target, x));
5495 }
5496
5497 /* Extract field ELT from VEC into TARGET.  */
5498
5499 void
5500 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
5501 {
5502   enum machine_mode mode = GET_MODE (vec);
5503   enum machine_mode inner_mode = GET_MODE_INNER (mode);
5504   rtx mem;
5505
5506   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5507     {
5508       rtx (*extract_func) (rtx, rtx, rtx)
5509         = ((mode == V2DFmode) ? gen_vsx_extract_v2df : gen_vsx_extract_v2di);
5510       emit_insn (extract_func (target, vec, GEN_INT (elt)));
5511       return;
5512     }
5513
5514   /* Allocate mode-sized buffer.  */
5515   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
5516
5517   emit_move_insn (mem, vec);
5518
5519   /* Add offset to field within buffer matching vector element.  */
5520   mem = adjust_address_nv (mem, inner_mode, elt * GET_MODE_SIZE (inner_mode));
5521
5522   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
5523 }
5524
5525 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
5526    implement ANDing by the mask IN.  */
5527 void
5528 build_mask64_2_operands (rtx in, rtx *out)
5529 {
5530 #if HOST_BITS_PER_WIDE_INT >= 64
5531   unsigned HOST_WIDE_INT c, lsb, m1, m2;
5532   int shift;
5533
5534   gcc_assert (GET_CODE (in) == CONST_INT);
5535
5536   c = INTVAL (in);
5537   if (c & 1)
5538     {
5539       /* Assume c initially something like 0x00fff000000fffff.  The idea
5540          is to rotate the word so that the middle ^^^^^^ group of zeros
5541          is at the MS end and can be cleared with an rldicl mask.  We then
5542          rotate back and clear off the MS    ^^ group of zeros with a
5543          second rldicl.  */
5544       c = ~c;                   /*   c == 0xff000ffffff00000 */
5545       lsb = c & -c;             /* lsb == 0x0000000000100000 */
5546       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
5547       c = ~c;                   /*   c == 0x00fff000000fffff */
5548       c &= -lsb;                /*   c == 0x00fff00000000000 */
5549       lsb = c & -c;             /* lsb == 0x0000100000000000 */
5550       c = ~c;                   /*   c == 0xff000fffffffffff */
5551       c &= -lsb;                /*   c == 0xff00000000000000 */
5552       shift = 0;
5553       while ((lsb >>= 1) != 0)
5554         shift++;                /* shift == 44 on exit from loop */
5555       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
5556       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
5557       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
5558     }
5559   else
5560     {
5561       /* Assume c initially something like 0xff000f0000000000.  The idea
5562          is to rotate the word so that the     ^^^  middle group of zeros
5563          is at the LS end and can be cleared with an rldicr mask.  We then
5564          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
5565          a second rldicr.  */
5566       lsb = c & -c;             /* lsb == 0x0000010000000000 */
5567       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
5568       c = ~c;                   /*   c == 0x00fff0ffffffffff */
5569       c &= -lsb;                /*   c == 0x00fff00000000000 */
5570       lsb = c & -c;             /* lsb == 0x0000100000000000 */
5571       c = ~c;                   /*   c == 0xff000fffffffffff */
5572       c &= -lsb;                /*   c == 0xff00000000000000 */
5573       shift = 0;
5574       while ((lsb >>= 1) != 0)
5575         shift++;                /* shift == 44 on exit from loop */
5576       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
5577       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
5578       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
5579     }
5580
5581   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
5582      masks will be all 1's.  We are guaranteed more than one transition.  */
5583   out[0] = GEN_INT (64 - shift);
5584   out[1] = GEN_INT (m1);
5585   out[2] = GEN_INT (shift);
5586   out[3] = GEN_INT (m2);
5587 #else
5588   (void)in;
5589   (void)out;
5590   gcc_unreachable ();
5591 #endif
5592 }
5593
5594 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
5595
5596 bool
5597 invalid_e500_subreg (rtx op, enum machine_mode mode)
5598 {
5599   if (TARGET_E500_DOUBLE)
5600     {
5601       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
5602          subreg:TI and reg:TF.  Decimal float modes are like integer
5603          modes (only low part of each register used) for this
5604          purpose.  */
5605       if (GET_CODE (op) == SUBREG
5606           && (mode == SImode || mode == DImode || mode == TImode
5607               || mode == DDmode || mode == TDmode)
5608           && REG_P (SUBREG_REG (op))
5609           && (GET_MODE (SUBREG_REG (op)) == DFmode
5610               || GET_MODE (SUBREG_REG (op)) == TFmode))
5611         return true;
5612
5613       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
5614          reg:TI.  */
5615       if (GET_CODE (op) == SUBREG
5616           && (mode == DFmode || mode == TFmode)
5617           && REG_P (SUBREG_REG (op))
5618           && (GET_MODE (SUBREG_REG (op)) == DImode
5619               || GET_MODE (SUBREG_REG (op)) == TImode
5620               || GET_MODE (SUBREG_REG (op)) == DDmode
5621               || GET_MODE (SUBREG_REG (op)) == TDmode))
5622         return true;
5623     }
5624
5625   if (TARGET_SPE
5626       && GET_CODE (op) == SUBREG
5627       && mode == SImode
5628       && REG_P (SUBREG_REG (op))
5629       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
5630     return true;
5631
5632   return false;
5633 }
5634
5635 /* AIX increases natural record alignment to doubleword if the first
5636    field is an FP double while the FP fields remain word aligned.  */
5637
5638 unsigned int
5639 rs6000_special_round_type_align (tree type, unsigned int computed,
5640                                  unsigned int specified)
5641 {
5642   unsigned int align = MAX (computed, specified);
5643   tree field = TYPE_FIELDS (type);
5644
5645   /* Skip all non field decls */
5646   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5647     field = DECL_CHAIN (field);
5648
5649   if (field != NULL && field != type)
5650     {
5651       type = TREE_TYPE (field);
5652       while (TREE_CODE (type) == ARRAY_TYPE)
5653         type = TREE_TYPE (type);
5654
5655       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
5656         align = MAX (align, 64);
5657     }
5658
5659   return align;
5660 }
5661
5662 /* Darwin increases record alignment to the natural alignment of
5663    the first field.  */
5664
5665 unsigned int
5666 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
5667                                         unsigned int specified)
5668 {
5669   unsigned int align = MAX (computed, specified);
5670
5671   if (TYPE_PACKED (type))
5672     return align;
5673
5674   /* Find the first field, looking down into aggregates.  */
5675   do {
5676     tree field = TYPE_FIELDS (type);
5677     /* Skip all non field decls */
5678     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5679       field = DECL_CHAIN (field);
5680     if (! field)
5681       break;
5682     /* A packed field does not contribute any extra alignment.  */
5683     if (DECL_PACKED (field))
5684       return align;
5685     type = TREE_TYPE (field);
5686     while (TREE_CODE (type) == ARRAY_TYPE)
5687       type = TREE_TYPE (type);
5688   } while (AGGREGATE_TYPE_P (type));
5689
5690   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
5691     align = MAX (align, TYPE_ALIGN (type));
5692
5693   return align;
5694 }
5695
5696 /* Return 1 for an operand in small memory on V.4/eabi.  */
5697
5698 int
5699 small_data_operand (rtx op ATTRIBUTE_UNUSED,
5700                     enum machine_mode mode ATTRIBUTE_UNUSED)
5701 {
5702 #if TARGET_ELF
5703   rtx sym_ref;
5704
5705   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
5706     return 0;
5707
5708   if (DEFAULT_ABI != ABI_V4)
5709     return 0;
5710
5711   /* Vector and float memory instructions have a limited offset on the
5712      SPE, so using a vector or float variable directly as an operand is
5713      not useful.  */
5714   if (TARGET_SPE
5715       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
5716     return 0;
5717
5718   if (GET_CODE (op) == SYMBOL_REF)
5719     sym_ref = op;
5720
5721   else if (GET_CODE (op) != CONST
5722            || GET_CODE (XEXP (op, 0)) != PLUS
5723            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
5724            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
5725     return 0;
5726
5727   else
5728     {
5729       rtx sum = XEXP (op, 0);
5730       HOST_WIDE_INT summand;
5731
5732       /* We have to be careful here, because it is the referenced address
5733          that must be 32k from _SDA_BASE_, not just the symbol.  */
5734       summand = INTVAL (XEXP (sum, 1));
5735       if (summand < 0 || summand > g_switch_value)
5736         return 0;
5737
5738       sym_ref = XEXP (sum, 0);
5739     }
5740
5741   return SYMBOL_REF_SMALL_P (sym_ref);
5742 #else
5743   return 0;
5744 #endif
5745 }
5746
5747 /* Return true if either operand is a general purpose register.  */
5748
5749 bool
5750 gpr_or_gpr_p (rtx op0, rtx op1)
5751 {
5752   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
5753           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
5754 }
5755
5756 \f
5757 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
5758
5759 static bool
5760 reg_offset_addressing_ok_p (enum machine_mode mode)
5761 {
5762   switch (mode)
5763     {
5764     case V16QImode:
5765     case V8HImode:
5766     case V4SFmode:
5767     case V4SImode:
5768     case V2DFmode:
5769     case V2DImode:
5770       /* AltiVec/VSX vector modes.  Only reg+reg addressing is valid.  */
5771       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
5772         return false;
5773       break;
5774
5775     case V4HImode:
5776     case V2SImode:
5777     case V1DImode:
5778     case V2SFmode:
5779        /* Paired vector modes.  Only reg+reg addressing is valid.  */
5780       if (TARGET_PAIRED_FLOAT)
5781         return false;
5782       break;
5783
5784     default:
5785       break;
5786     }
5787
5788   return true;
5789 }
5790
5791 static bool
5792 virtual_stack_registers_memory_p (rtx op)
5793 {
5794   int regnum;
5795
5796   if (GET_CODE (op) == REG)
5797     regnum = REGNO (op);
5798
5799   else if (GET_CODE (op) == PLUS
5800            && GET_CODE (XEXP (op, 0)) == REG
5801            && GET_CODE (XEXP (op, 1)) == CONST_INT)
5802     regnum = REGNO (XEXP (op, 0));
5803
5804   else
5805     return false;
5806
5807   return (regnum >= FIRST_VIRTUAL_REGISTER
5808           && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
5809 }
5810
5811 /* Return true if memory accesses to OP are known to never straddle
5812    a 32k boundary.  */
5813
5814 static bool
5815 offsettable_ok_by_alignment (rtx op, HOST_WIDE_INT offset,
5816                              enum machine_mode mode)
5817 {
5818   tree decl, type;
5819   unsigned HOST_WIDE_INT dsize, dalign;
5820
5821   if (GET_CODE (op) != SYMBOL_REF)
5822     return false;
5823
5824   decl = SYMBOL_REF_DECL (op);
5825   if (!decl)
5826     {
5827       if (GET_MODE_SIZE (mode) == 0)
5828         return false;
5829
5830       /* -fsection-anchors loses the original SYMBOL_REF_DECL when
5831          replacing memory addresses with an anchor plus offset.  We
5832          could find the decl by rummaging around in the block->objects
5833          VEC for the given offset but that seems like too much work.  */
5834       dalign = 1;
5835       if (SYMBOL_REF_HAS_BLOCK_INFO_P (op)
5836           && SYMBOL_REF_ANCHOR_P (op)
5837           && SYMBOL_REF_BLOCK (op) != NULL)
5838         {
5839           struct object_block *block = SYMBOL_REF_BLOCK (op);
5840           HOST_WIDE_INT lsb, mask;
5841
5842           /* Given the alignment of the block..  */
5843           dalign = block->alignment;
5844           mask = dalign / BITS_PER_UNIT - 1;
5845
5846           /* ..and the combined offset of the anchor and any offset
5847              to this block object..  */
5848           offset += SYMBOL_REF_BLOCK_OFFSET (op);
5849           lsb = offset & -offset;
5850
5851           /* ..find how many bits of the alignment we know for the
5852              object.  */
5853           mask &= lsb - 1;
5854           dalign = mask + 1;
5855         }
5856       return dalign >= GET_MODE_SIZE (mode);
5857     }
5858
5859   if (DECL_P (decl))
5860     {
5861       if (TREE_CODE (decl) == FUNCTION_DECL)
5862         return true;
5863
5864       if (!DECL_SIZE_UNIT (decl))
5865         return false;
5866
5867       if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
5868         return false;
5869
5870       dsize = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
5871       if (dsize > 32768)
5872         return false;
5873
5874       dalign = DECL_ALIGN_UNIT (decl);
5875       return dalign >= dsize;
5876     }
5877
5878   type = TREE_TYPE (decl);
5879
5880   if (TREE_CODE (decl) == STRING_CST)
5881     dsize = TREE_STRING_LENGTH (decl);
5882   else if (TYPE_SIZE_UNIT (type)
5883            && host_integerp (TYPE_SIZE_UNIT (type), 1))
5884     dsize = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5885   else
5886     return false;
5887   if (dsize > 32768)
5888     return false;
5889
5890   dalign = TYPE_ALIGN (type);
5891   if (CONSTANT_CLASS_P (decl))
5892     dalign = CONSTANT_ALIGNMENT (decl, dalign);
5893   else
5894     dalign = DATA_ALIGNMENT (decl, dalign);
5895   dalign /= BITS_PER_UNIT;
5896   return dalign >= dsize;
5897 }
5898
5899 static bool
5900 constant_pool_expr_p (rtx op)
5901 {
5902   rtx base, offset;
5903
5904   split_const (op, &base, &offset);
5905   return (GET_CODE (base) == SYMBOL_REF
5906           && CONSTANT_POOL_ADDRESS_P (base)
5907           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
5908 }
5909
5910 static rtx tocrel_base, tocrel_offset;
5911
5912 bool
5913 toc_relative_expr_p (rtx op)
5914 {
5915   if (GET_CODE (op) != CONST)
5916     return false;
5917
5918   split_const (op, &tocrel_base, &tocrel_offset);
5919   return (GET_CODE (tocrel_base) == UNSPEC
5920           && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
5921 }
5922
5923 /* Return true if X is a constant pool address, and also for cmodel=medium
5924    if X is a toc-relative address known to be offsettable within MODE.  */
5925
5926 bool
5927 legitimate_constant_pool_address_p (const_rtx x, enum machine_mode mode,
5928                                     bool strict)
5929 {
5930   return (TARGET_TOC
5931           && (GET_CODE (x) == PLUS || GET_CODE (x) == LO_SUM)
5932           && GET_CODE (XEXP (x, 0)) == REG
5933           && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5934               || ((TARGET_MINIMAL_TOC
5935                    || TARGET_CMODEL != CMODEL_SMALL)
5936                   && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict)))
5937           && toc_relative_expr_p (XEXP (x, 1))
5938           && (TARGET_CMODEL != CMODEL_MEDIUM
5939               || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
5940               || mode == QImode
5941               || offsettable_ok_by_alignment (XVECEXP (tocrel_base, 0, 0),
5942                                               INTVAL (tocrel_offset), mode)));
5943 }
5944
5945 static bool
5946 legitimate_small_data_p (enum machine_mode mode, rtx x)
5947 {
5948   return (DEFAULT_ABI == ABI_V4
5949           && !flag_pic && !TARGET_TOC
5950           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
5951           && small_data_operand (x, mode));
5952 }
5953
5954 /* SPE offset addressing is limited to 5-bits worth of double words.  */
5955 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
5956
5957 bool
5958 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
5959 {
5960   unsigned HOST_WIDE_INT offset, extra;
5961
5962   if (GET_CODE (x) != PLUS)
5963     return false;
5964   if (GET_CODE (XEXP (x, 0)) != REG)
5965     return false;
5966   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5967     return false;
5968   if (!reg_offset_addressing_ok_p (mode))
5969     return virtual_stack_registers_memory_p (x);
5970   if (legitimate_constant_pool_address_p (x, mode, strict))
5971     return true;
5972   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5973     return false;
5974
5975   offset = INTVAL (XEXP (x, 1));
5976   extra = 0;
5977   switch (mode)
5978     {
5979     case V4HImode:
5980     case V2SImode:
5981     case V1DImode:
5982     case V2SFmode:
5983       /* SPE vector modes.  */
5984       return SPE_CONST_OFFSET_OK (offset);
5985
5986     case DFmode:
5987       if (TARGET_E500_DOUBLE)
5988         return SPE_CONST_OFFSET_OK (offset);
5989
5990       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
5991          addressing.  */
5992       if (VECTOR_MEM_VSX_P (DFmode))
5993         return false;
5994
5995     case DDmode:
5996     case DImode:
5997       /* On e500v2, we may have:
5998
5999            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
6000
6001          Which gets addressed with evldd instructions.  */
6002       if (TARGET_E500_DOUBLE)
6003         return SPE_CONST_OFFSET_OK (offset);
6004
6005       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
6006         extra = 4;
6007       else if (offset & 3)
6008         return false;
6009       break;
6010
6011     case TFmode:
6012       if (TARGET_E500_DOUBLE)
6013         return (SPE_CONST_OFFSET_OK (offset)
6014                 && SPE_CONST_OFFSET_OK (offset + 8));
6015
6016     case TDmode:
6017     case TImode:
6018       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
6019         extra = 12;
6020       else if (offset & 3)
6021         return false;
6022       else
6023         extra = 8;
6024       break;
6025
6026     default:
6027       break;
6028     }
6029
6030   offset += 0x8000;
6031   return (offset < 0x10000) && (offset + extra < 0x10000);
6032 }
6033
6034 bool
6035 legitimate_indexed_address_p (rtx x, int strict)
6036 {
6037   rtx op0, op1;
6038
6039   if (GET_CODE (x) != PLUS)
6040     return false;
6041
6042   op0 = XEXP (x, 0);
6043   op1 = XEXP (x, 1);
6044
6045   /* Recognize the rtl generated by reload which we know will later be
6046      replaced with proper base and index regs.  */
6047   if (!strict
6048       && reload_in_progress
6049       && (REG_P (op0) || GET_CODE (op0) == PLUS)
6050       && REG_P (op1))
6051     return true;
6052
6053   return (REG_P (op0) && REG_P (op1)
6054           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
6055                && INT_REG_OK_FOR_INDEX_P (op1, strict))
6056               || (INT_REG_OK_FOR_BASE_P (op1, strict)
6057                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
6058 }
6059
6060 bool
6061 avoiding_indexed_address_p (enum machine_mode mode)
6062 {
6063   /* Avoid indexed addressing for modes that have non-indexed
6064      load/store instruction forms.  */
6065   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
6066 }
6067
6068 inline bool
6069 legitimate_indirect_address_p (rtx x, int strict)
6070 {
6071   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
6072 }
6073
6074 bool
6075 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
6076 {
6077   if (!TARGET_MACHO || !flag_pic
6078       || mode != SImode || GET_CODE (x) != MEM)
6079     return false;
6080   x = XEXP (x, 0);
6081
6082   if (GET_CODE (x) != LO_SUM)
6083     return false;
6084   if (GET_CODE (XEXP (x, 0)) != REG)
6085     return false;
6086   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
6087     return false;
6088   x = XEXP (x, 1);
6089
6090   return CONSTANT_P (x);
6091 }
6092
6093 static bool
6094 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
6095 {
6096   if (GET_CODE (x) != LO_SUM)
6097     return false;
6098   if (GET_CODE (XEXP (x, 0)) != REG)
6099     return false;
6100   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
6101     return false;
6102   /* Restrict addressing for DI because of our SUBREG hackery.  */
6103   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6104                              || mode == DDmode || mode == TDmode
6105                              || mode == DImode))
6106     return false;
6107   x = XEXP (x, 1);
6108
6109   if (TARGET_ELF || TARGET_MACHO)
6110     {
6111       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
6112         return false;
6113       if (TARGET_TOC)
6114         return false;
6115       if (GET_MODE_NUNITS (mode) != 1)
6116         return false;
6117       if (GET_MODE_BITSIZE (mode) > 64
6118           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
6119               && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
6120                    && (mode == DFmode || mode == DDmode))))
6121         return false;
6122
6123       return CONSTANT_P (x);
6124     }
6125
6126   return false;
6127 }
6128
6129
6130 /* Try machine-dependent ways of modifying an illegitimate address
6131    to be legitimate.  If we find one, return the new, valid address.
6132    This is used from only one place: `memory_address' in explow.c.
6133
6134    OLDX is the address as it was before break_out_memory_refs was
6135    called.  In some cases it is useful to look at this to decide what
6136    needs to be done.
6137
6138    It is always safe for this function to do nothing.  It exists to
6139    recognize opportunities to optimize the output.
6140
6141    On RS/6000, first check for the sum of a register with a constant
6142    integer that is out of range.  If so, generate code to add the
6143    constant with the low-order 16 bits masked to the register and force
6144    this result into another register (this can be done with `cau').
6145    Then generate an address of REG+(CONST&0xffff), allowing for the
6146    possibility of bit 16 being a one.
6147
6148    Then check for the sum of a register and something not constant, try to
6149    load the other things into a register and return the sum.  */
6150
6151 static rtx
6152 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
6153                            enum machine_mode mode)
6154 {
6155   unsigned int extra = 0;
6156
6157   if (!reg_offset_addressing_ok_p (mode))
6158     {
6159       if (virtual_stack_registers_memory_p (x))
6160         return x;
6161
6162       /* In theory we should not be seeing addresses of the form reg+0,
6163          but just in case it is generated, optimize it away.  */
6164       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
6165         return force_reg (Pmode, XEXP (x, 0));
6166
6167       /* Make sure both operands are registers.  */
6168       else if (GET_CODE (x) == PLUS)
6169         return gen_rtx_PLUS (Pmode,
6170                              force_reg (Pmode, XEXP (x, 0)),
6171                              force_reg (Pmode, XEXP (x, 1)));
6172       else
6173         return force_reg (Pmode, x);
6174     }
6175   if (GET_CODE (x) == SYMBOL_REF)
6176     {
6177       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
6178       if (model != 0)
6179         return rs6000_legitimize_tls_address (x, model);
6180     }
6181
6182   switch (mode)
6183     {
6184     case DFmode:
6185     case DDmode:
6186       extra = 4;
6187       break;
6188     case DImode:
6189       if (!TARGET_POWERPC64)
6190         extra = 4;
6191       break;
6192     case TFmode:
6193     case TDmode:
6194       extra = 12;
6195       break;
6196     case TImode:
6197       extra = TARGET_POWERPC64 ? 8 : 12;
6198       break;
6199     default:
6200       break;
6201     }
6202
6203   if (GET_CODE (x) == PLUS
6204       && GET_CODE (XEXP (x, 0)) == REG
6205       && GET_CODE (XEXP (x, 1)) == CONST_INT
6206       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
6207           >= 0x10000 - extra)
6208       && !((TARGET_POWERPC64
6209             && (mode == DImode || mode == TImode)
6210             && (INTVAL (XEXP (x, 1)) & 3) != 0)
6211            || SPE_VECTOR_MODE (mode)
6212            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6213                                       || mode == DImode || mode == DDmode
6214                                       || mode == TDmode))))
6215     {
6216       HOST_WIDE_INT high_int, low_int;
6217       rtx sum;
6218       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
6219       if (low_int >= 0x8000 - extra)
6220         low_int = 0;
6221       high_int = INTVAL (XEXP (x, 1)) - low_int;
6222       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
6223                                          GEN_INT (high_int)), 0);
6224       return plus_constant (sum, low_int);
6225     }
6226   else if (GET_CODE (x) == PLUS
6227            && GET_CODE (XEXP (x, 0)) == REG
6228            && GET_CODE (XEXP (x, 1)) != CONST_INT
6229            && GET_MODE_NUNITS (mode) == 1
6230            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6231                || TARGET_POWERPC64
6232                || ((mode != DImode && mode != DFmode && mode != DDmode)
6233                    || (TARGET_E500_DOUBLE && mode != DDmode)))
6234            && (TARGET_POWERPC64 || mode != DImode)
6235            && !avoiding_indexed_address_p (mode)
6236            && mode != TImode
6237            && mode != TFmode
6238            && mode != TDmode)
6239     {
6240       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
6241                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
6242     }
6243   else if (SPE_VECTOR_MODE (mode)
6244            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6245                                       || mode == DDmode || mode == TDmode
6246                                       || mode == DImode)))
6247     {
6248       if (mode == DImode)
6249         return x;
6250       /* We accept [reg + reg] and [reg + OFFSET].  */
6251
6252       if (GET_CODE (x) == PLUS)
6253        {
6254          rtx op1 = XEXP (x, 0);
6255          rtx op2 = XEXP (x, 1);
6256          rtx y;
6257
6258          op1 = force_reg (Pmode, op1);
6259
6260          if (GET_CODE (op2) != REG
6261              && (GET_CODE (op2) != CONST_INT
6262                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
6263                  || (GET_MODE_SIZE (mode) > 8
6264                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
6265            op2 = force_reg (Pmode, op2);
6266
6267          /* We can't always do [reg + reg] for these, because [reg +
6268             reg + offset] is not a legitimate addressing mode.  */
6269          y = gen_rtx_PLUS (Pmode, op1, op2);
6270
6271          if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
6272            return force_reg (Pmode, y);
6273          else
6274            return y;
6275        }
6276
6277       return force_reg (Pmode, x);
6278     }
6279   else if (TARGET_ELF
6280            && TARGET_32BIT
6281            && TARGET_NO_TOC
6282            && ! flag_pic
6283            && GET_CODE (x) != CONST_INT
6284            && GET_CODE (x) != CONST_DOUBLE
6285            && CONSTANT_P (x)
6286            && GET_MODE_NUNITS (mode) == 1
6287            && (GET_MODE_BITSIZE (mode) <= 32
6288                || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6289                    && (mode == DFmode || mode == DDmode))))
6290     {
6291       rtx reg = gen_reg_rtx (Pmode);
6292       emit_insn (gen_elf_high (reg, x));
6293       return gen_rtx_LO_SUM (Pmode, reg, x);
6294     }
6295   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
6296            && ! flag_pic
6297 #if TARGET_MACHO
6298            && ! MACHO_DYNAMIC_NO_PIC_P
6299 #endif
6300            && GET_CODE (x) != CONST_INT
6301            && GET_CODE (x) != CONST_DOUBLE
6302            && CONSTANT_P (x)
6303            && GET_MODE_NUNITS (mode) == 1
6304            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6305                || (mode != DFmode && mode != DDmode))
6306            && mode != DImode
6307            && mode != TImode)
6308     {
6309       rtx reg = gen_reg_rtx (Pmode);
6310       emit_insn (gen_macho_high (reg, x));
6311       return gen_rtx_LO_SUM (Pmode, reg, x);
6312     }
6313   else if (TARGET_TOC
6314            && GET_CODE (x) == SYMBOL_REF
6315            && constant_pool_expr_p (x)
6316            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
6317     {
6318       rtx reg = TARGET_CMODEL != CMODEL_SMALL ? gen_reg_rtx (Pmode) : NULL_RTX;
6319       return create_TOC_reference (x, reg);
6320     }
6321   else
6322     return x;
6323 }
6324
6325 /* Debug version of rs6000_legitimize_address.  */
6326 static rtx
6327 rs6000_debug_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
6328 {
6329   rtx ret;
6330   rtx insns;
6331
6332   start_sequence ();
6333   ret = rs6000_legitimize_address (x, oldx, mode);
6334   insns = get_insns ();
6335   end_sequence ();
6336
6337   if (ret != x)
6338     {
6339       fprintf (stderr,
6340                "\nrs6000_legitimize_address: mode %s, old code %s, "
6341                "new code %s, modified\n",
6342                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
6343                GET_RTX_NAME (GET_CODE (ret)));
6344
6345       fprintf (stderr, "Original address:\n");
6346       debug_rtx (x);
6347
6348       fprintf (stderr, "oldx:\n");
6349       debug_rtx (oldx);
6350
6351       fprintf (stderr, "New address:\n");
6352       debug_rtx (ret);
6353
6354       if (insns)
6355         {
6356           fprintf (stderr, "Insns added:\n");
6357           debug_rtx_list (insns, 20);
6358         }
6359     }
6360   else
6361     {
6362       fprintf (stderr,
6363                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
6364                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
6365
6366       debug_rtx (x);
6367     }
6368
6369   if (insns)
6370     emit_insn (insns);
6371
6372   return ret;
6373 }
6374
6375 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
6376    We need to emit DTP-relative relocations.  */
6377
6378 static void
6379 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
6380 {
6381   switch (size)
6382     {
6383     case 4:
6384       fputs ("\t.long\t", file);
6385       break;
6386     case 8:
6387       fputs (DOUBLE_INT_ASM_OP, file);
6388       break;
6389     default:
6390       gcc_unreachable ();
6391     }
6392   output_addr_const (file, x);
6393   fputs ("@dtprel+0x8000", file);
6394 }
6395
6396 /* In the name of slightly smaller debug output, and to cater to
6397    general assembler lossage, recognize various UNSPEC sequences
6398    and turn them back into a direct symbol reference.  */
6399
6400 static rtx
6401 rs6000_delegitimize_address (rtx orig_x)
6402 {
6403   rtx x, y;
6404
6405   orig_x = delegitimize_mem_from_attrs (orig_x);
6406   x = orig_x;
6407   if (MEM_P (x))
6408     x = XEXP (x, 0);
6409
6410   if (GET_CODE (x) == (TARGET_CMODEL != CMODEL_SMALL ? LO_SUM : PLUS)
6411       && GET_CODE (XEXP (x, 1)) == CONST)
6412     {
6413       y = XEXP (XEXP (x, 1), 0);
6414       if (GET_CODE (y) == UNSPEC
6415           && XINT (y, 1) == UNSPEC_TOCREL
6416           && ((GET_CODE (XEXP (x, 0)) == REG
6417                && (REGNO (XEXP (x, 0)) == TOC_REGISTER
6418                    || TARGET_MINIMAL_TOC
6419                    || TARGET_CMODEL != CMODEL_SMALL))
6420               || (TARGET_CMODEL != CMODEL_SMALL
6421                   && GET_CODE (XEXP (x, 0)) == PLUS
6422                   && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6423                   && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6424                   && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6425                   && rtx_equal_p (XEXP (x, 1),
6426                                   XEXP (XEXP (XEXP (x, 0), 1), 0)))))
6427         {
6428           y = XVECEXP (y, 0, 0);
6429           if (!MEM_P (orig_x))
6430             return y;
6431           else
6432             return replace_equiv_address_nv (orig_x, y);
6433         }
6434     }
6435
6436   if (TARGET_MACHO
6437       && GET_CODE (orig_x) == LO_SUM
6438       && GET_CODE (XEXP (x, 1)) == CONST)
6439     {
6440       y = XEXP (XEXP (x, 1), 0);
6441       if (GET_CODE (y) == UNSPEC
6442           && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
6443         return XVECEXP (y, 0, 0);
6444     }
6445
6446   return orig_x;
6447 }
6448
6449 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
6450
6451 static GTY(()) rtx rs6000_tls_symbol;
6452 static rtx
6453 rs6000_tls_get_addr (void)
6454 {
6455   if (!rs6000_tls_symbol)
6456     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
6457
6458   return rs6000_tls_symbol;
6459 }
6460
6461 /* Construct the SYMBOL_REF for TLS GOT references.  */
6462
6463 static GTY(()) rtx rs6000_got_symbol;
6464 static rtx
6465 rs6000_got_sym (void)
6466 {
6467   if (!rs6000_got_symbol)
6468     {
6469       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
6470       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
6471       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
6472     }
6473
6474   return rs6000_got_symbol;
6475 }
6476
6477 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
6478    this (thread-local) address.  */
6479
6480 static rtx
6481 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
6482 {
6483   rtx dest, insn;
6484
6485   dest = gen_reg_rtx (Pmode);
6486   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
6487     {
6488       rtx tlsreg;
6489
6490       if (TARGET_64BIT)
6491         {
6492           tlsreg = gen_rtx_REG (Pmode, 13);
6493           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
6494         }
6495       else
6496         {
6497           tlsreg = gen_rtx_REG (Pmode, 2);
6498           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
6499         }
6500       emit_insn (insn);
6501     }
6502   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
6503     {
6504       rtx tlsreg, tmp;
6505
6506       tmp = gen_reg_rtx (Pmode);
6507       if (TARGET_64BIT)
6508         {
6509           tlsreg = gen_rtx_REG (Pmode, 13);
6510           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
6511         }
6512       else
6513         {
6514           tlsreg = gen_rtx_REG (Pmode, 2);
6515           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
6516         }
6517       emit_insn (insn);
6518       if (TARGET_64BIT)
6519         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
6520       else
6521         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
6522       emit_insn (insn);
6523     }
6524   else
6525     {
6526       rtx r3, got, tga, tmp1, tmp2, call_insn;
6527
6528       /* We currently use relocations like @got@tlsgd for tls, which
6529          means the linker will handle allocation of tls entries, placing
6530          them in the .got section.  So use a pointer to the .got section,
6531          not one to secondary TOC sections used by 64-bit -mminimal-toc,
6532          or to secondary GOT sections used by 32-bit -fPIC.  */
6533       if (TARGET_64BIT)
6534         got = gen_rtx_REG (Pmode, 2);
6535       else
6536         {
6537           if (flag_pic == 1)
6538             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
6539           else
6540             {
6541               rtx gsym = rs6000_got_sym ();
6542               got = gen_reg_rtx (Pmode);
6543               if (flag_pic == 0)
6544                 rs6000_emit_move (got, gsym, Pmode);
6545               else
6546                 {
6547                   rtx mem, lab, last;
6548
6549                   tmp1 = gen_reg_rtx (Pmode);
6550                   tmp2 = gen_reg_rtx (Pmode);
6551                   mem = gen_const_mem (Pmode, tmp1);
6552                   lab = gen_label_rtx ();
6553                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
6554                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
6555                   emit_move_insn (tmp2, mem);
6556                   last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
6557                   set_unique_reg_note (last, REG_EQUAL, gsym);
6558                 }
6559             }
6560         }
6561
6562       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
6563         {
6564           r3 = gen_rtx_REG (Pmode, 3);
6565           tga = rs6000_tls_get_addr ();
6566           emit_library_call_value (tga, dest, LCT_CONST, Pmode, 1, r3, Pmode);
6567
6568           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
6569             insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
6570           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
6571             insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
6572           else if (DEFAULT_ABI == ABI_V4)
6573             insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
6574           else
6575             gcc_unreachable ();
6576           call_insn = last_call_insn ();
6577           PATTERN (call_insn) = insn;
6578           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
6579             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
6580                      pic_offset_table_rtx);
6581         }
6582       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
6583         {
6584           r3 = gen_rtx_REG (Pmode, 3);
6585           tga = rs6000_tls_get_addr ();
6586           tmp1 = gen_reg_rtx (Pmode);
6587           emit_library_call_value (tga, tmp1, LCT_CONST, Pmode, 1, r3, Pmode);
6588
6589           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
6590             insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
6591           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
6592             insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
6593           else if (DEFAULT_ABI == ABI_V4)
6594             insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
6595           else
6596             gcc_unreachable ();
6597           call_insn = last_call_insn ();
6598           PATTERN (call_insn) = insn;
6599           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
6600             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
6601                      pic_offset_table_rtx);
6602
6603           if (rs6000_tls_size == 16)
6604             {
6605               if (TARGET_64BIT)
6606                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
6607               else
6608                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
6609             }
6610           else if (rs6000_tls_size == 32)
6611             {
6612               tmp2 = gen_reg_rtx (Pmode);
6613               if (TARGET_64BIT)
6614                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
6615               else
6616                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
6617               emit_insn (insn);
6618               if (TARGET_64BIT)
6619                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
6620               else
6621                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
6622             }
6623           else
6624             {
6625               tmp2 = gen_reg_rtx (Pmode);
6626               if (TARGET_64BIT)
6627                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
6628               else
6629                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
6630               emit_insn (insn);
6631               insn = gen_rtx_SET (Pmode, dest,
6632                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
6633             }
6634           emit_insn (insn);
6635         }
6636       else
6637         {
6638           /* IE, or 64-bit offset LE.  */
6639           tmp2 = gen_reg_rtx (Pmode);
6640           if (TARGET_64BIT)
6641             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
6642           else
6643             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
6644           emit_insn (insn);
6645           if (TARGET_64BIT)
6646             insn = gen_tls_tls_64 (dest, tmp2, addr);
6647           else
6648             insn = gen_tls_tls_32 (dest, tmp2, addr);
6649           emit_insn (insn);
6650         }
6651     }
6652
6653   return dest;
6654 }
6655
6656 /* Return 1 if X contains a thread-local symbol.  */
6657
6658 bool
6659 rs6000_tls_referenced_p (rtx x)
6660 {
6661   if (! TARGET_HAVE_TLS)
6662     return false;
6663
6664   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
6665 }
6666
6667 /* Return 1 if *X is a thread-local symbol.  This is the same as
6668    rs6000_tls_symbol_ref except for the type of the unused argument.  */
6669
6670 static int
6671 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
6672 {
6673   return RS6000_SYMBOL_REF_TLS_P (*x);
6674 }
6675
6676 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
6677    replace the input X, or the original X if no replacement is called for.
6678    The output parameter *WIN is 1 if the calling macro should goto WIN,
6679    0 if it should not.
6680
6681    For RS/6000, we wish to handle large displacements off a base
6682    register by splitting the addend across an addiu/addis and the mem insn.
6683    This cuts number of extra insns needed from 3 to 1.
6684
6685    On Darwin, we use this to generate code for floating point constants.
6686    A movsf_low is generated so we wind up with 2 instructions rather than 3.
6687    The Darwin code is inside #if TARGET_MACHO because only then are the
6688    machopic_* functions defined.  */
6689 static rtx
6690 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
6691                                   int opnum, int type,
6692                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
6693 {
6694   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6695
6696   /* Nasty hack for vsx_splat_V2DF/V2DI load from mem, which takes a
6697      DFmode/DImode MEM.  */
6698   if (reg_offset_p
6699       && opnum == 1
6700       && ((mode == DFmode && recog_data.operand_mode[0] == V2DFmode)
6701           || (mode == DImode && recog_data.operand_mode[0] == V2DImode)))
6702     reg_offset_p = false;
6703
6704   /* We must recognize output that we have already generated ourselves.  */
6705   if (GET_CODE (x) == PLUS
6706       && GET_CODE (XEXP (x, 0)) == PLUS
6707       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6708       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6709       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6710     {
6711       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6712                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6713                    opnum, (enum reload_type)type);
6714       *win = 1;
6715       return x;
6716     }
6717
6718   /* Likewise for (lo_sum (high ...) ...) output we have generated.  */
6719   if (GET_CODE (x) == LO_SUM
6720       && GET_CODE (XEXP (x, 0)) == HIGH)
6721     {
6722       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6723                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6724                    opnum, (enum reload_type)type);
6725       *win = 1;
6726       return x;
6727     }
6728
6729 #if TARGET_MACHO
6730   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
6731       && GET_CODE (x) == LO_SUM
6732       && GET_CODE (XEXP (x, 0)) == PLUS
6733       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
6734       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6735       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
6736       && machopic_operand_p (XEXP (x, 1)))
6737     {
6738       /* Result of previous invocation of this function on Darwin
6739          floating point constant.  */
6740       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6741                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6742                    opnum, (enum reload_type)type);
6743       *win = 1;
6744       return x;
6745     }
6746 #endif
6747
6748   if (TARGET_CMODEL != CMODEL_SMALL
6749       && GET_CODE (x) == LO_SUM
6750       && GET_CODE (XEXP (x, 0)) == PLUS
6751       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6752       && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6753       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6754       && GET_CODE (XEXP (x, 1)) == CONST
6755       && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
6756       && XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_TOCREL
6757       && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 1), 0), XEXP (x, 1)))
6758     {
6759       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6760                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6761                    opnum, (enum reload_type) type);
6762       *win = 1;
6763       return x;
6764     }
6765
6766   /* Force ld/std non-word aligned offset into base register by wrapping
6767      in offset 0.  */
6768   if (GET_CODE (x) == PLUS
6769       && GET_CODE (XEXP (x, 0)) == REG
6770       && REGNO (XEXP (x, 0)) < 32
6771       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6772       && GET_CODE (XEXP (x, 1)) == CONST_INT
6773       && reg_offset_p
6774       && (INTVAL (XEXP (x, 1)) & 3) != 0
6775       && VECTOR_MEM_NONE_P (mode)
6776       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
6777       && TARGET_POWERPC64)
6778     {
6779       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
6780       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6781                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6782                    opnum, (enum reload_type) type);
6783       *win = 1;
6784       return x;
6785     }
6786
6787   if (GET_CODE (x) == PLUS
6788       && GET_CODE (XEXP (x, 0)) == REG
6789       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
6790       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6791       && GET_CODE (XEXP (x, 1)) == CONST_INT
6792       && reg_offset_p
6793       && !SPE_VECTOR_MODE (mode)
6794       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6795                                   || mode == DDmode || mode == TDmode
6796                                   || mode == DImode))
6797       && VECTOR_MEM_NONE_P (mode))
6798     {
6799       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
6800       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
6801       HOST_WIDE_INT high
6802         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
6803
6804       /* Check for 32-bit overflow.  */
6805       if (high + low != val)
6806         {
6807           *win = 0;
6808           return x;
6809         }
6810
6811       /* Reload the high part into a base reg; leave the low part
6812          in the mem directly.  */
6813
6814       x = gen_rtx_PLUS (GET_MODE (x),
6815                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6816                                       GEN_INT (high)),
6817                         GEN_INT (low));
6818
6819       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6820                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6821                    opnum, (enum reload_type)type);
6822       *win = 1;
6823       return x;
6824     }
6825
6826   if (GET_CODE (x) == SYMBOL_REF
6827       && reg_offset_p
6828       && VECTOR_MEM_NONE_P (mode)
6829       && !SPE_VECTOR_MODE (mode)
6830 #if TARGET_MACHO
6831       && DEFAULT_ABI == ABI_DARWIN
6832       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
6833 #else
6834       && DEFAULT_ABI == ABI_V4
6835       && !flag_pic
6836 #endif
6837       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
6838          The same goes for DImode without 64-bit gprs and DFmode and DDmode
6839          without fprs.  */
6840       && mode != TFmode
6841       && mode != TDmode
6842       && (mode != DImode || TARGET_POWERPC64)
6843       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
6844           || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
6845     {
6846 #if TARGET_MACHO
6847       if (flag_pic)
6848         {
6849           rtx offset = machopic_gen_offset (x);
6850           x = gen_rtx_LO_SUM (GET_MODE (x),
6851                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
6852                   gen_rtx_HIGH (Pmode, offset)), offset);
6853         }
6854       else
6855 #endif
6856         x = gen_rtx_LO_SUM (GET_MODE (x),
6857               gen_rtx_HIGH (Pmode, x), x);
6858
6859       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6860                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6861                    opnum, (enum reload_type)type);
6862       *win = 1;
6863       return x;
6864     }
6865
6866   /* Reload an offset address wrapped by an AND that represents the
6867      masking of the lower bits.  Strip the outer AND and let reload
6868      convert the offset address into an indirect address.  For VSX,
6869      force reload to create the address with an AND in a separate
6870      register, because we can't guarantee an altivec register will
6871      be used.  */
6872   if (VECTOR_MEM_ALTIVEC_P (mode)
6873       && GET_CODE (x) == AND
6874       && GET_CODE (XEXP (x, 0)) == PLUS
6875       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6876       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6877       && GET_CODE (XEXP (x, 1)) == CONST_INT
6878       && INTVAL (XEXP (x, 1)) == -16)
6879     {
6880       x = XEXP (x, 0);
6881       *win = 1;
6882       return x;
6883     }
6884
6885   if (TARGET_TOC
6886       && reg_offset_p
6887       && GET_CODE (x) == SYMBOL_REF
6888       && constant_pool_expr_p (x)
6889       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
6890     {
6891       x = create_TOC_reference (x, NULL_RTX);
6892       if (TARGET_CMODEL != CMODEL_SMALL)
6893         push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6894                      BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6895                      opnum, (enum reload_type) type);
6896       *win = 1;
6897       return x;
6898     }
6899   *win = 0;
6900   return x;
6901 }
6902
6903 /* Debug version of rs6000_legitimize_reload_address.  */
6904 static rtx
6905 rs6000_debug_legitimize_reload_address (rtx x, enum machine_mode mode,
6906                                         int opnum, int type,
6907                                         int ind_levels, int *win)
6908 {
6909   rtx ret = rs6000_legitimize_reload_address (x, mode, opnum, type,
6910                                               ind_levels, win);
6911   fprintf (stderr,
6912            "\nrs6000_legitimize_reload_address: mode = %s, opnum = %d, "
6913            "type = %d, ind_levels = %d, win = %d, original addr:\n",
6914            GET_MODE_NAME (mode), opnum, type, ind_levels, *win);
6915   debug_rtx (x);
6916
6917   if (x == ret)
6918     fprintf (stderr, "Same address returned\n");
6919   else if (!ret)
6920     fprintf (stderr, "NULL returned\n");
6921   else
6922     {
6923       fprintf (stderr, "New address:\n");
6924       debug_rtx (ret);
6925     }
6926
6927   return ret;
6928 }
6929
6930 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
6931    that is a valid memory address for an instruction.
6932    The MODE argument is the machine mode for the MEM expression
6933    that wants to use this address.
6934
6935    On the RS/6000, there are four valid address: a SYMBOL_REF that
6936    refers to a constant pool entry of an address (or the sum of it
6937    plus a constant), a short (16-bit signed) constant plus a register,
6938    the sum of two registers, or a register indirect, possibly with an
6939    auto-increment.  For DFmode, DDmode and DImode with a constant plus
6940    register, we must ensure that both words are addressable or PowerPC64
6941    with offset word aligned.
6942
6943    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
6944    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
6945    because adjacent memory cells are accessed by adding word-sized offsets
6946    during assembly output.  */
6947 bool
6948 rs6000_legitimate_address_p (enum machine_mode mode, rtx x, bool reg_ok_strict)
6949 {
6950   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6951
6952   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
6953   if (VECTOR_MEM_ALTIVEC_P (mode)
6954       && GET_CODE (x) == AND
6955       && GET_CODE (XEXP (x, 1)) == CONST_INT
6956       && INTVAL (XEXP (x, 1)) == -16)
6957     x = XEXP (x, 0);
6958
6959   if (RS6000_SYMBOL_REF_TLS_P (x))
6960     return 0;
6961   if (legitimate_indirect_address_p (x, reg_ok_strict))
6962     return 1;
6963   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
6964       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6965       && !SPE_VECTOR_MODE (mode)
6966       && mode != TFmode
6967       && mode != TDmode
6968       /* Restrict addressing for DI because of our SUBREG hackery.  */
6969       && !(TARGET_E500_DOUBLE
6970            && (mode == DFmode || mode == DDmode || mode == DImode))
6971       && TARGET_UPDATE
6972       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
6973     return 1;
6974   if (virtual_stack_registers_memory_p (x))
6975     return 1;
6976   if (reg_offset_p && legitimate_small_data_p (mode, x))
6977     return 1;
6978   if (reg_offset_p
6979       && legitimate_constant_pool_address_p (x, mode, reg_ok_strict))
6980     return 1;
6981   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
6982   if (! reg_ok_strict
6983       && reg_offset_p
6984       && GET_CODE (x) == PLUS
6985       && GET_CODE (XEXP (x, 0)) == REG
6986       && (XEXP (x, 0) == virtual_stack_vars_rtx
6987           || XEXP (x, 0) == arg_pointer_rtx)
6988       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6989     return 1;
6990   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
6991     return 1;
6992   if (mode != TImode
6993       && mode != TFmode
6994       && mode != TDmode
6995       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6996           || TARGET_POWERPC64
6997           || (mode != DFmode && mode != DDmode)
6998           || (TARGET_E500_DOUBLE && mode != DDmode))
6999       && (TARGET_POWERPC64 || mode != DImode)
7000       && !avoiding_indexed_address_p (mode)
7001       && legitimate_indexed_address_p (x, reg_ok_strict))
7002     return 1;
7003   if (GET_CODE (x) == PRE_MODIFY
7004       && mode != TImode
7005       && mode != TFmode
7006       && mode != TDmode
7007       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
7008           || TARGET_POWERPC64
7009           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
7010       && (TARGET_POWERPC64 || mode != DImode)
7011       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
7012       && !SPE_VECTOR_MODE (mode)
7013       /* Restrict addressing for DI because of our SUBREG hackery.  */
7014       && !(TARGET_E500_DOUBLE
7015            && (mode == DFmode || mode == DDmode || mode == DImode))
7016       && TARGET_UPDATE
7017       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
7018       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
7019           || (!avoiding_indexed_address_p (mode)
7020               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
7021       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
7022     return 1;
7023   if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
7024     return 1;
7025   return 0;
7026 }
7027
7028 /* Debug version of rs6000_legitimate_address_p.  */
7029 static bool
7030 rs6000_debug_legitimate_address_p (enum machine_mode mode, rtx x,
7031                                    bool reg_ok_strict)
7032 {
7033   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
7034   fprintf (stderr,
7035            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
7036            "strict = %d, code = %s\n",
7037            ret ? "true" : "false",
7038            GET_MODE_NAME (mode),
7039            reg_ok_strict,
7040            GET_RTX_NAME (GET_CODE (x)));
7041   debug_rtx (x);
7042
7043   return ret;
7044 }
7045
7046 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
7047
7048 static bool
7049 rs6000_mode_dependent_address_p (const_rtx addr)
7050 {
7051   return rs6000_mode_dependent_address_ptr (addr);
7052 }
7053
7054 /* Go to LABEL if ADDR (a legitimate address expression)
7055    has an effect that depends on the machine mode it is used for.
7056
7057    On the RS/6000 this is true of all integral offsets (since AltiVec
7058    and VSX modes don't allow them) or is a pre-increment or decrement.
7059
7060    ??? Except that due to conceptual problems in offsettable_address_p
7061    we can't really report the problems of integral offsets.  So leave
7062    this assuming that the adjustable offset must be valid for the
7063    sub-words of a TFmode operand, which is what we had before.  */
7064
7065 static bool
7066 rs6000_mode_dependent_address (const_rtx addr)
7067 {
7068   switch (GET_CODE (addr))
7069     {
7070     case PLUS:
7071       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
7072          is considered a legitimate address before reload, so there
7073          are no offset restrictions in that case.  Note that this
7074          condition is safe in strict mode because any address involving
7075          virtual_stack_vars_rtx or arg_pointer_rtx would already have
7076          been rejected as illegitimate.  */
7077       if (XEXP (addr, 0) != virtual_stack_vars_rtx
7078           && XEXP (addr, 0) != arg_pointer_rtx
7079           && GET_CODE (XEXP (addr, 1)) == CONST_INT)
7080         {
7081           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
7082           return val + 12 + 0x8000 >= 0x10000;
7083         }
7084       break;
7085
7086     case LO_SUM:
7087       /* Anything in the constant pool is sufficiently aligned that
7088          all bytes have the same high part address.  */
7089       return !legitimate_constant_pool_address_p (addr, QImode, false);
7090
7091     /* Auto-increment cases are now treated generically in recog.c.  */
7092     case PRE_MODIFY:
7093       return TARGET_UPDATE;
7094
7095     /* AND is only allowed in Altivec loads.  */
7096     case AND:
7097       return true;
7098
7099     default:
7100       break;
7101     }
7102
7103   return false;
7104 }
7105
7106 /* Debug version of rs6000_mode_dependent_address.  */
7107 static bool
7108 rs6000_debug_mode_dependent_address (const_rtx addr)
7109 {
7110   bool ret = rs6000_mode_dependent_address (addr);
7111
7112   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
7113            ret ? "true" : "false");
7114   debug_rtx (addr);
7115
7116   return ret;
7117 }
7118
7119 /* Implement FIND_BASE_TERM.  */
7120
7121 rtx
7122 rs6000_find_base_term (rtx op)
7123 {
7124   rtx base, offset;
7125
7126   split_const (op, &base, &offset);
7127   if (GET_CODE (base) == UNSPEC)
7128     switch (XINT (base, 1))
7129       {
7130       case UNSPEC_TOCREL:
7131       case UNSPEC_MACHOPIC_OFFSET:
7132         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
7133            for aliasing purposes.  */
7134         return XVECEXP (base, 0, 0);
7135       }
7136
7137   return op;
7138 }
7139
7140 /* More elaborate version of recog's offsettable_memref_p predicate
7141    that works around the ??? note of rs6000_mode_dependent_address.
7142    In particular it accepts
7143
7144      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
7145
7146    in 32-bit mode, that the recog predicate rejects.  */
7147
7148 bool
7149 rs6000_offsettable_memref_p (rtx op)
7150 {
7151   if (!MEM_P (op))
7152     return false;
7153
7154   /* First mimic offsettable_memref_p.  */
7155   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
7156     return true;
7157
7158   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
7159      the latter predicate knows nothing about the mode of the memory
7160      reference and, therefore, assumes that it is the largest supported
7161      mode (TFmode).  As a consequence, legitimate offsettable memory
7162      references are rejected.  rs6000_legitimate_offset_address_p contains
7163      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
7164   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
7165 }
7166
7167 /* Change register usage conditional on target flags.  */
7168 static void
7169 rs6000_conditional_register_usage (void)
7170 {
7171   int i;
7172
7173   if (TARGET_DEBUG_TARGET)
7174     fprintf (stderr, "rs6000_conditional_register_usage called\n");
7175
7176   /* Set MQ register fixed (already call_used) if not POWER
7177      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
7178      be allocated.  */
7179   if (! TARGET_POWER)
7180     fixed_regs[64] = 1;
7181
7182   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
7183   if (TARGET_64BIT)
7184     fixed_regs[13] = call_used_regs[13]
7185       = call_really_used_regs[13] = 1;
7186
7187   /* Conditionally disable FPRs.  */
7188   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
7189     for (i = 32; i < 64; i++)
7190       fixed_regs[i] = call_used_regs[i]
7191         = call_really_used_regs[i] = 1;
7192
7193   /* The TOC register is not killed across calls in a way that is
7194      visible to the compiler.  */
7195   if (DEFAULT_ABI == ABI_AIX)
7196     call_really_used_regs[2] = 0;
7197
7198   if (DEFAULT_ABI == ABI_V4
7199       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
7200       && flag_pic == 2)
7201     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7202
7203   if (DEFAULT_ABI == ABI_V4
7204       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
7205       && flag_pic == 1)
7206     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7207       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7208       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7209
7210   if (DEFAULT_ABI == ABI_DARWIN
7211       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
7212       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7213       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7214       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7215
7216   if (TARGET_TOC && TARGET_MINIMAL_TOC)
7217     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7218       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7219
7220   if (TARGET_SPE)
7221     {
7222       global_regs[SPEFSCR_REGNO] = 1;
7223       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
7224          registers in prologues and epilogues.  We no longer use r14
7225          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
7226          pool for link-compatibility with older versions of GCC.  Once
7227          "old" code has died out, we can return r14 to the allocation
7228          pool.  */
7229       fixed_regs[14]
7230         = call_used_regs[14]
7231         = call_really_used_regs[14] = 1;
7232     }
7233
7234   if (!TARGET_ALTIVEC && !TARGET_VSX)
7235     {
7236       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
7237         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
7238       call_really_used_regs[VRSAVE_REGNO] = 1;
7239     }
7240
7241   if (TARGET_ALTIVEC || TARGET_VSX)
7242     global_regs[VSCR_REGNO] = 1;
7243
7244   if (TARGET_ALTIVEC_ABI)
7245     {
7246       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
7247         call_used_regs[i] = call_really_used_regs[i] = 1;
7248
7249       /* AIX reserves VR20:31 in non-extended ABI mode.  */
7250       if (TARGET_XCOFF)
7251         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
7252           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
7253     }
7254 }
7255 \f
7256 /* Try to output insns to set TARGET equal to the constant C if it can
7257    be done in less than N insns.  Do all computations in MODE.
7258    Returns the place where the output has been placed if it can be
7259    done and the insns have been emitted.  If it would take more than N
7260    insns, zero is returned and no insns and emitted.  */
7261
7262 rtx
7263 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
7264                        rtx source, int n ATTRIBUTE_UNUSED)
7265 {
7266   rtx result, insn, set;
7267   HOST_WIDE_INT c0, c1;
7268
7269   switch (mode)
7270     {
7271       case  QImode:
7272     case HImode:
7273       if (dest == NULL)
7274         dest = gen_reg_rtx (mode);
7275       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
7276       return dest;
7277
7278     case SImode:
7279       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
7280
7281       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
7282                               GEN_INT (INTVAL (source)
7283                                        & (~ (HOST_WIDE_INT) 0xffff))));
7284       emit_insn (gen_rtx_SET (VOIDmode, dest,
7285                               gen_rtx_IOR (SImode, copy_rtx (result),
7286                                            GEN_INT (INTVAL (source) & 0xffff))));
7287       result = dest;
7288       break;
7289
7290     case DImode:
7291       switch (GET_CODE (source))
7292         {
7293         case CONST_INT:
7294           c0 = INTVAL (source);
7295           c1 = -(c0 < 0);
7296           break;
7297
7298         case CONST_DOUBLE:
7299 #if HOST_BITS_PER_WIDE_INT >= 64
7300           c0 = CONST_DOUBLE_LOW (source);
7301           c1 = -(c0 < 0);
7302 #else
7303           c0 = CONST_DOUBLE_LOW (source);
7304           c1 = CONST_DOUBLE_HIGH (source);
7305 #endif
7306           break;
7307
7308         default:
7309           gcc_unreachable ();
7310         }
7311
7312       result = rs6000_emit_set_long_const (dest, c0, c1);
7313       break;
7314
7315     default:
7316       gcc_unreachable ();
7317     }
7318
7319   insn = get_last_insn ();
7320   set = single_set (insn);
7321   if (! CONSTANT_P (SET_SRC (set)))
7322     set_unique_reg_note (insn, REG_EQUAL, source);
7323
7324   return result;
7325 }
7326
7327 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
7328    fall back to a straight forward decomposition.  We do this to avoid
7329    exponential run times encountered when looking for longer sequences
7330    with rs6000_emit_set_const.  */
7331 static rtx
7332 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
7333 {
7334   if (!TARGET_POWERPC64)
7335     {
7336       rtx operand1, operand2;
7337
7338       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
7339                                         DImode);
7340       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
7341                                         DImode);
7342       emit_move_insn (operand1, GEN_INT (c1));
7343       emit_move_insn (operand2, GEN_INT (c2));
7344     }
7345   else
7346     {
7347       HOST_WIDE_INT ud1, ud2, ud3, ud4;
7348
7349       ud1 = c1 & 0xffff;
7350       ud2 = (c1 & 0xffff0000) >> 16;
7351 #if HOST_BITS_PER_WIDE_INT >= 64
7352       c2 = c1 >> 32;
7353 #endif
7354       ud3 = c2 & 0xffff;
7355       ud4 = (c2 & 0xffff0000) >> 16;
7356
7357       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
7358           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
7359         {
7360           if (ud1 & 0x8000)
7361             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
7362           else
7363             emit_move_insn (dest, GEN_INT (ud1));
7364         }
7365
7366       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
7367                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
7368         {
7369           if (ud2 & 0x8000)
7370             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
7371                                            - 0x80000000));
7372           else
7373             emit_move_insn (dest, GEN_INT (ud2 << 16));
7374           if (ud1 != 0)
7375             emit_move_insn (copy_rtx (dest),
7376                             gen_rtx_IOR (DImode, copy_rtx (dest),
7377                                          GEN_INT (ud1)));
7378         }
7379       else if (ud3 == 0 && ud4 == 0)
7380         {
7381           gcc_assert (ud2 & 0x8000);
7382           emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
7383                                          - 0x80000000));
7384           if (ud1 != 0)
7385             emit_move_insn (copy_rtx (dest),
7386                             gen_rtx_IOR (DImode, copy_rtx (dest),
7387                                          GEN_INT (ud1)));
7388           emit_move_insn (copy_rtx (dest),
7389                           gen_rtx_ZERO_EXTEND (DImode,
7390                                                gen_lowpart (SImode,
7391                                                             copy_rtx (dest))));
7392         }
7393       else if ((ud4 == 0xffff && (ud3 & 0x8000))
7394                || (ud4 == 0 && ! (ud3 & 0x8000)))
7395         {
7396           if (ud3 & 0x8000)
7397             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
7398                                            - 0x80000000));
7399           else
7400             emit_move_insn (dest, GEN_INT (ud3 << 16));
7401
7402           if (ud2 != 0)
7403             emit_move_insn (copy_rtx (dest),
7404                             gen_rtx_IOR (DImode, copy_rtx (dest),
7405                                          GEN_INT (ud2)));
7406           emit_move_insn (copy_rtx (dest),
7407                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
7408                                           GEN_INT (16)));
7409           if (ud1 != 0)
7410             emit_move_insn (copy_rtx (dest),
7411                             gen_rtx_IOR (DImode, copy_rtx (dest),
7412                                          GEN_INT (ud1)));
7413         }
7414       else
7415         {
7416           if (ud4 & 0x8000)
7417             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
7418                                            - 0x80000000));
7419           else
7420             emit_move_insn (dest, GEN_INT (ud4 << 16));
7421
7422           if (ud3 != 0)
7423             emit_move_insn (copy_rtx (dest),
7424                             gen_rtx_IOR (DImode, copy_rtx (dest),
7425                                          GEN_INT (ud3)));
7426
7427           emit_move_insn (copy_rtx (dest),
7428                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
7429                                           GEN_INT (32)));
7430           if (ud2 != 0)
7431             emit_move_insn (copy_rtx (dest),
7432                             gen_rtx_IOR (DImode, copy_rtx (dest),
7433                                          GEN_INT (ud2 << 16)));
7434           if (ud1 != 0)
7435             emit_move_insn (copy_rtx (dest),
7436                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
7437         }
7438     }
7439   return dest;
7440 }
7441
7442 /* Helper for the following.  Get rid of [r+r] memory refs
7443    in cases where it won't work (TImode, TFmode, TDmode).  */
7444
7445 static void
7446 rs6000_eliminate_indexed_memrefs (rtx operands[2])
7447 {
7448   if (reload_in_progress)
7449     return;
7450
7451   if (GET_CODE (operands[0]) == MEM
7452       && GET_CODE (XEXP (operands[0], 0)) != REG
7453       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0),
7454                                                GET_MODE (operands[0]), false))
7455     operands[0]
7456       = replace_equiv_address (operands[0],
7457                                copy_addr_to_reg (XEXP (operands[0], 0)));
7458
7459   if (GET_CODE (operands[1]) == MEM
7460       && GET_CODE (XEXP (operands[1], 0)) != REG
7461       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0),
7462                                                GET_MODE (operands[1]), false))
7463     operands[1]
7464       = replace_equiv_address (operands[1],
7465                                copy_addr_to_reg (XEXP (operands[1], 0)));
7466 }
7467
7468 /* Emit a move from SOURCE to DEST in mode MODE.  */
7469 void
7470 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
7471 {
7472   rtx operands[2];
7473   operands[0] = dest;
7474   operands[1] = source;
7475
7476   if (TARGET_DEBUG_ADDR)
7477     {
7478       fprintf (stderr,
7479                "\nrs6000_emit_move: mode = %s, reload_in_progress = %d, "
7480                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
7481                GET_MODE_NAME (mode),
7482                reload_in_progress,
7483                reload_completed,
7484                can_create_pseudo_p ());
7485       debug_rtx (dest);
7486       fprintf (stderr, "source:\n");
7487       debug_rtx (source);
7488     }
7489
7490   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
7491   if (GET_CODE (operands[1]) == CONST_DOUBLE
7492       && ! FLOAT_MODE_P (mode)
7493       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
7494     {
7495       /* FIXME.  This should never happen.  */
7496       /* Since it seems that it does, do the safe thing and convert
7497          to a CONST_INT.  */
7498       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
7499     }
7500   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
7501               || FLOAT_MODE_P (mode)
7502               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
7503                    || CONST_DOUBLE_LOW (operands[1]) < 0)
7504                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
7505                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
7506
7507   /* Check if GCC is setting up a block move that will end up using FP
7508      registers as temporaries.  We must make sure this is acceptable.  */
7509   if (GET_CODE (operands[0]) == MEM
7510       && GET_CODE (operands[1]) == MEM
7511       && mode == DImode
7512       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
7513           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
7514       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
7515                                             ? 32 : MEM_ALIGN (operands[0])))
7516             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
7517                                                ? 32
7518                                                : MEM_ALIGN (operands[1]))))
7519       && ! MEM_VOLATILE_P (operands [0])
7520       && ! MEM_VOLATILE_P (operands [1]))
7521     {
7522       emit_move_insn (adjust_address (operands[0], SImode, 0),
7523                       adjust_address (operands[1], SImode, 0));
7524       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
7525                       adjust_address (copy_rtx (operands[1]), SImode, 4));
7526       return;
7527     }
7528
7529   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
7530       && !gpc_reg_operand (operands[1], mode))
7531     operands[1] = force_reg (mode, operands[1]);
7532
7533   if (mode == SFmode && ! TARGET_POWERPC
7534       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
7535       && GET_CODE (operands[0]) == MEM)
7536     {
7537       int regnum;
7538
7539       if (reload_in_progress || reload_completed)
7540         regnum = true_regnum (operands[1]);
7541       else if (GET_CODE (operands[1]) == REG)
7542         regnum = REGNO (operands[1]);
7543       else
7544         regnum = -1;
7545
7546       /* If operands[1] is a register, on POWER it may have
7547          double-precision data in it, so truncate it to single
7548          precision.  */
7549       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
7550         {
7551           rtx newreg;
7552           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
7553                     : gen_reg_rtx (mode));
7554           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
7555           operands[1] = newreg;
7556         }
7557     }
7558
7559   /* Recognize the case where operand[1] is a reference to thread-local
7560      data and load its address to a register.  */
7561   if (rs6000_tls_referenced_p (operands[1]))
7562     {
7563       enum tls_model model;
7564       rtx tmp = operands[1];
7565       rtx addend = NULL;
7566
7567       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
7568         {
7569           addend = XEXP (XEXP (tmp, 0), 1);
7570           tmp = XEXP (XEXP (tmp, 0), 0);
7571         }
7572
7573       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
7574       model = SYMBOL_REF_TLS_MODEL (tmp);
7575       gcc_assert (model != 0);
7576
7577       tmp = rs6000_legitimize_tls_address (tmp, model);
7578       if (addend)
7579         {
7580           tmp = gen_rtx_PLUS (mode, tmp, addend);
7581           tmp = force_operand (tmp, operands[0]);
7582         }
7583       operands[1] = tmp;
7584     }
7585
7586   /* Handle the case where reload calls us with an invalid address.  */
7587   if (reload_in_progress && mode == Pmode
7588       && (! general_operand (operands[1], mode)
7589           || ! nonimmediate_operand (operands[0], mode)))
7590     goto emit_set;
7591
7592   /* 128-bit constant floating-point values on Darwin should really be
7593      loaded as two parts.  */
7594   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
7595       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
7596     {
7597       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
7598          know how to get a DFmode SUBREG of a TFmode.  */
7599       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
7600       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
7601                         simplify_gen_subreg (imode, operands[1], mode, 0),
7602                         imode);
7603       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
7604                                              GET_MODE_SIZE (imode)),
7605                         simplify_gen_subreg (imode, operands[1], mode,
7606                                              GET_MODE_SIZE (imode)),
7607                         imode);
7608       return;
7609     }
7610
7611   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
7612     cfun->machine->sdmode_stack_slot =
7613       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
7614
7615   if (reload_in_progress
7616       && mode == SDmode
7617       && MEM_P (operands[0])
7618       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
7619       && REG_P (operands[1]))
7620     {
7621       if (FP_REGNO_P (REGNO (operands[1])))
7622         {
7623           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
7624           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7625           emit_insn (gen_movsd_store (mem, operands[1]));
7626         }
7627       else if (INT_REGNO_P (REGNO (operands[1])))
7628         {
7629           rtx mem = adjust_address_nv (operands[0], mode, 4);
7630           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7631           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
7632         }
7633       else
7634         gcc_unreachable();
7635       return;
7636     }
7637   if (reload_in_progress
7638       && mode == SDmode
7639       && REG_P (operands[0])
7640       && MEM_P (operands[1])
7641       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
7642     {
7643       if (FP_REGNO_P (REGNO (operands[0])))
7644         {
7645           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
7646           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7647           emit_insn (gen_movsd_load (operands[0], mem));
7648         }
7649       else if (INT_REGNO_P (REGNO (operands[0])))
7650         {
7651           rtx mem = adjust_address_nv (operands[1], mode, 4);
7652           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7653           emit_insn (gen_movsd_hardfloat (operands[0], mem));
7654         }
7655       else
7656         gcc_unreachable();
7657       return;
7658     }
7659
7660   /* FIXME:  In the long term, this switch statement should go away
7661      and be replaced by a sequence of tests based on things like
7662      mode == Pmode.  */
7663   switch (mode)
7664     {
7665     case HImode:
7666     case QImode:
7667       if (CONSTANT_P (operands[1])
7668           && GET_CODE (operands[1]) != CONST_INT)
7669         operands[1] = force_const_mem (mode, operands[1]);
7670       break;
7671
7672     case TFmode:
7673     case TDmode:
7674       rs6000_eliminate_indexed_memrefs (operands);
7675       /* fall through */
7676
7677     case DFmode:
7678     case DDmode:
7679     case SFmode:
7680     case SDmode:
7681       if (CONSTANT_P (operands[1])
7682           && ! easy_fp_constant (operands[1], mode))
7683         operands[1] = force_const_mem (mode, operands[1]);
7684       break;
7685
7686     case V16QImode:
7687     case V8HImode:
7688     case V4SFmode:
7689     case V4SImode:
7690     case V4HImode:
7691     case V2SFmode:
7692     case V2SImode:
7693     case V1DImode:
7694     case V2DFmode:
7695     case V2DImode:
7696       if (CONSTANT_P (operands[1])
7697           && !easy_vector_constant (operands[1], mode))
7698         operands[1] = force_const_mem (mode, operands[1]);
7699       break;
7700
7701     case SImode:
7702     case DImode:
7703       /* Use default pattern for address of ELF small data */
7704       if (TARGET_ELF
7705           && mode == Pmode
7706           && DEFAULT_ABI == ABI_V4
7707           && (GET_CODE (operands[1]) == SYMBOL_REF
7708               || GET_CODE (operands[1]) == CONST)
7709           && small_data_operand (operands[1], mode))
7710         {
7711           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7712           return;
7713         }
7714
7715       if (DEFAULT_ABI == ABI_V4
7716           && mode == Pmode && mode == SImode
7717           && flag_pic == 1 && got_operand (operands[1], mode))
7718         {
7719           emit_insn (gen_movsi_got (operands[0], operands[1]));
7720           return;
7721         }
7722
7723       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
7724           && TARGET_NO_TOC
7725           && ! flag_pic
7726           && mode == Pmode
7727           && CONSTANT_P (operands[1])
7728           && GET_CODE (operands[1]) != HIGH
7729           && GET_CODE (operands[1]) != CONST_INT)
7730         {
7731           rtx target = (!can_create_pseudo_p ()
7732                         ? operands[0]
7733                         : gen_reg_rtx (mode));
7734
7735           /* If this is a function address on -mcall-aixdesc,
7736              convert it to the address of the descriptor.  */
7737           if (DEFAULT_ABI == ABI_AIX
7738               && GET_CODE (operands[1]) == SYMBOL_REF
7739               && XSTR (operands[1], 0)[0] == '.')
7740             {
7741               const char *name = XSTR (operands[1], 0);
7742               rtx new_ref;
7743               while (*name == '.')
7744                 name++;
7745               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
7746               CONSTANT_POOL_ADDRESS_P (new_ref)
7747                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
7748               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
7749               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
7750               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
7751               operands[1] = new_ref;
7752             }
7753
7754           if (DEFAULT_ABI == ABI_DARWIN)
7755             {
7756 #if TARGET_MACHO
7757               if (MACHO_DYNAMIC_NO_PIC_P)
7758                 {
7759                   /* Take care of any required data indirection.  */
7760                   operands[1] = rs6000_machopic_legitimize_pic_address (
7761                                   operands[1], mode, operands[0]);
7762                   if (operands[0] != operands[1])
7763                     emit_insn (gen_rtx_SET (VOIDmode,
7764                                             operands[0], operands[1]));
7765                   return;
7766                 }
7767 #endif
7768               emit_insn (gen_macho_high (target, operands[1]));
7769               emit_insn (gen_macho_low (operands[0], target, operands[1]));
7770               return;
7771             }
7772
7773           emit_insn (gen_elf_high (target, operands[1]));
7774           emit_insn (gen_elf_low (operands[0], target, operands[1]));
7775           return;
7776         }
7777
7778       /* If this is a SYMBOL_REF that refers to a constant pool entry,
7779          and we have put it in the TOC, we just need to make a TOC-relative
7780          reference to it.  */
7781       if ((TARGET_TOC
7782            && GET_CODE (operands[1]) == SYMBOL_REF
7783            && constant_pool_expr_p (operands[1])
7784            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
7785                                                get_pool_mode (operands[1])))
7786           || (TARGET_CMODEL == CMODEL_MEDIUM
7787               && GET_CODE (operands[1]) == SYMBOL_REF
7788               && !CONSTANT_POOL_ADDRESS_P (operands[1])
7789               && SYMBOL_REF_LOCAL_P (operands[1])))
7790         {
7791           rtx reg = NULL_RTX;
7792           if (TARGET_CMODEL != CMODEL_SMALL)
7793             {
7794               if (can_create_pseudo_p ())
7795                 reg = gen_reg_rtx (Pmode);
7796               else
7797                 reg = operands[0];
7798             }
7799           operands[1] = create_TOC_reference (operands[1], reg);
7800         }
7801       else if (mode == Pmode
7802                && CONSTANT_P (operands[1])
7803                && ((GET_CODE (operands[1]) != CONST_INT
7804                     && ! easy_fp_constant (operands[1], mode))
7805                    || (GET_CODE (operands[1]) == CONST_INT
7806                        && (num_insns_constant (operands[1], mode)
7807                            > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
7808                    || (GET_CODE (operands[0]) == REG
7809                        && FP_REGNO_P (REGNO (operands[0]))))
7810                && GET_CODE (operands[1]) != HIGH
7811                && ! legitimate_constant_pool_address_p (operands[1], mode,
7812                                                         false)
7813                && ! toc_relative_expr_p (operands[1])
7814                && (TARGET_CMODEL == CMODEL_SMALL
7815                    || can_create_pseudo_p ()
7816                    || (REG_P (operands[0])
7817                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
7818         {
7819
7820 #if TARGET_MACHO
7821           /* Darwin uses a special PIC legitimizer.  */
7822           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
7823             {
7824               operands[1] =
7825                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
7826                                                         operands[0]);
7827               if (operands[0] != operands[1])
7828                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7829               return;
7830             }
7831 #endif
7832
7833           /* If we are to limit the number of things we put in the TOC and
7834              this is a symbol plus a constant we can add in one insn,
7835              just put the symbol in the TOC and add the constant.  Don't do
7836              this if reload is in progress.  */
7837           if (GET_CODE (operands[1]) == CONST
7838               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
7839               && GET_CODE (XEXP (operands[1], 0)) == PLUS
7840               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
7841               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
7842                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
7843               && ! side_effects_p (operands[0]))
7844             {
7845               rtx sym =
7846                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
7847               rtx other = XEXP (XEXP (operands[1], 0), 1);
7848
7849               sym = force_reg (mode, sym);
7850               emit_insn (gen_add3_insn (operands[0], sym, other));
7851               return;
7852             }
7853
7854           operands[1] = force_const_mem (mode, operands[1]);
7855
7856           if (TARGET_TOC
7857               && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
7858               && constant_pool_expr_p (XEXP (operands[1], 0))
7859               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
7860                         get_pool_constant (XEXP (operands[1], 0)),
7861                         get_pool_mode (XEXP (operands[1], 0))))
7862             {
7863               rtx tocref;
7864               rtx reg = NULL_RTX;
7865               if (TARGET_CMODEL != CMODEL_SMALL)
7866                 {
7867                   if (can_create_pseudo_p ())
7868                     reg = gen_reg_rtx (Pmode);
7869                   else
7870                     reg = operands[0];
7871                 }
7872               tocref = create_TOC_reference (XEXP (operands[1], 0), reg);
7873               operands[1] = gen_const_mem (mode, tocref);
7874               set_mem_alias_set (operands[1], get_TOC_alias_set ());
7875             }
7876         }
7877       break;
7878
7879     case TImode:
7880       rs6000_eliminate_indexed_memrefs (operands);
7881
7882       if (TARGET_POWER)
7883         {
7884           emit_insn (gen_rtx_PARALLEL (VOIDmode,
7885                        gen_rtvec (2,
7886                                   gen_rtx_SET (VOIDmode,
7887                                                operands[0], operands[1]),
7888                                   gen_rtx_CLOBBER (VOIDmode,
7889                                                    gen_rtx_SCRATCH (SImode)))));
7890           return;
7891         }
7892       break;
7893
7894     default:
7895       fatal_insn ("bad move", gen_rtx_SET (VOIDmode, dest, source));
7896     }
7897
7898   /* Above, we may have called force_const_mem which may have returned
7899      an invalid address.  If we can, fix this up; otherwise, reload will
7900      have to deal with it.  */
7901   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
7902     operands[1] = validize_mem (operands[1]);
7903
7904  emit_set:
7905   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7906 }
7907 \f
7908 /* Nonzero if we can use a floating-point register to pass this arg.  */
7909 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
7910   (SCALAR_FLOAT_MODE_P (MODE)                   \
7911    && (CUM)->fregno <= FP_ARG_MAX_REG           \
7912    && TARGET_HARD_FLOAT && TARGET_FPRS)
7913
7914 /* Nonzero if we can use an AltiVec register to pass this arg.  */
7915 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)              \
7916   ((ALTIVEC_VECTOR_MODE (MODE) || VSX_VECTOR_MODE (MODE))       \
7917    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
7918    && TARGET_ALTIVEC_ABI                                        \
7919    && (NAMED))
7920
7921 /* Return a nonzero value to say to return the function value in
7922    memory, just as large structures are always returned.  TYPE will be
7923    the data type of the value, and FNTYPE will be the type of the
7924    function doing the returning, or @code{NULL} for libcalls.
7925
7926    The AIX ABI for the RS/6000 specifies that all structures are
7927    returned in memory.  The Darwin ABI does the same.
7928    
7929    For the Darwin 64 Bit ABI, a function result can be returned in
7930    registers or in memory, depending on the size of the return data
7931    type.  If it is returned in registers, the value occupies the same
7932    registers as it would if it were the first and only function
7933    argument.  Otherwise, the function places its result in memory at
7934    the location pointed to by GPR3.
7935    
7936    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
7937    but a draft put them in memory, and GCC used to implement the draft
7938    instead of the final standard.  Therefore, aix_struct_return
7939    controls this instead of DEFAULT_ABI; V.4 targets needing backward
7940    compatibility can change DRAFT_V4_STRUCT_RET to override the
7941    default, and -m switches get the final word.  See
7942    rs6000_option_override_internal for more details.
7943
7944    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
7945    long double support is enabled.  These values are returned in memory.
7946
7947    int_size_in_bytes returns -1 for variable size objects, which go in
7948    memory always.  The cast to unsigned makes -1 > 8.  */
7949
7950 static bool
7951 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7952 {
7953   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
7954   if (TARGET_MACHO
7955       && rs6000_darwin64_abi
7956       && TREE_CODE (type) == RECORD_TYPE
7957       && int_size_in_bytes (type) > 0)
7958     {
7959       CUMULATIVE_ARGS valcum;
7960       rtx valret;
7961
7962       valcum.words = 0;
7963       valcum.fregno = FP_ARG_MIN_REG;
7964       valcum.vregno = ALTIVEC_ARG_MIN_REG;
7965       /* Do a trial code generation as if this were going to be passed
7966          as an argument; if any part goes in memory, we return NULL.  */
7967       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
7968       if (valret)
7969         return false;
7970       /* Otherwise fall through to more conventional ABI rules.  */
7971     }
7972
7973   if (AGGREGATE_TYPE_P (type)
7974       && (aix_struct_return
7975           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
7976     return true;
7977
7978   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
7979      modes only exist for GCC vector types if -maltivec.  */
7980   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
7981       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7982     return false;
7983
7984   /* Return synthetic vectors in memory.  */
7985   if (TREE_CODE (type) == VECTOR_TYPE
7986       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
7987     {
7988       static bool warned_for_return_big_vectors = false;
7989       if (!warned_for_return_big_vectors)
7990         {
7991           warning (0, "GCC vector returned by reference: "
7992                    "non-standard ABI extension with no compatibility guarantee");
7993           warned_for_return_big_vectors = true;
7994         }
7995       return true;
7996     }
7997
7998   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
7999     return true;
8000
8001   return false;
8002 }
8003
8004 #ifdef HAVE_AS_GNU_ATTRIBUTE
8005 /* Return TRUE if a call to function FNDECL may be one that
8006    potentially affects the function calling ABI of the object file.  */
8007
8008 static bool
8009 call_ABI_of_interest (tree fndecl)
8010 {
8011   if (cgraph_state == CGRAPH_STATE_EXPANSION)
8012     {
8013       struct cgraph_node *c_node;
8014
8015       /* Libcalls are always interesting.  */
8016       if (fndecl == NULL_TREE)
8017         return true;
8018
8019       /* Any call to an external function is interesting.  */
8020       if (DECL_EXTERNAL (fndecl))
8021         return true;
8022
8023       /* Interesting functions that we are emitting in this object file.  */
8024       c_node = cgraph_node (fndecl);
8025       return !cgraph_only_called_directly_p (c_node);
8026     }
8027   return false;
8028 }
8029 #endif
8030
8031 /* Initialize a variable CUM of type CUMULATIVE_ARGS
8032    for a call to a function whose data type is FNTYPE.
8033    For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
8034
8035    For incoming args we set the number of arguments in the prototype large
8036    so we never return a PARALLEL.  */
8037
8038 void
8039 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
8040                       rtx libname ATTRIBUTE_UNUSED, int incoming,
8041                       int libcall, int n_named_args,
8042                       tree fndecl ATTRIBUTE_UNUSED,
8043                       enum machine_mode return_mode ATTRIBUTE_UNUSED)
8044 {
8045   static CUMULATIVE_ARGS zero_cumulative;
8046
8047   *cum = zero_cumulative;
8048   cum->words = 0;
8049   cum->fregno = FP_ARG_MIN_REG;
8050   cum->vregno = ALTIVEC_ARG_MIN_REG;
8051   cum->prototype = (fntype && prototype_p (fntype));
8052   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
8053                       ? CALL_LIBCALL : CALL_NORMAL);
8054   cum->sysv_gregno = GP_ARG_MIN_REG;
8055   cum->stdarg = stdarg_p (fntype);
8056
8057   cum->nargs_prototype = 0;
8058   if (incoming || cum->prototype)
8059     cum->nargs_prototype = n_named_args;
8060
8061   /* Check for a longcall attribute.  */
8062   if ((!fntype && rs6000_default_long_calls)
8063       || (fntype
8064           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
8065           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
8066     cum->call_cookie |= CALL_LONG;
8067
8068   if (TARGET_DEBUG_ARG)
8069     {
8070       fprintf (stderr, "\ninit_cumulative_args:");
8071       if (fntype)
8072         {
8073           tree ret_type = TREE_TYPE (fntype);
8074           fprintf (stderr, " ret code = %s,",
8075                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
8076         }
8077
8078       if (cum->call_cookie & CALL_LONG)
8079         fprintf (stderr, " longcall,");
8080
8081       fprintf (stderr, " proto = %d, nargs = %d\n",
8082                cum->prototype, cum->nargs_prototype);
8083     }
8084
8085 #ifdef HAVE_AS_GNU_ATTRIBUTE
8086   if (DEFAULT_ABI == ABI_V4)
8087     {
8088       cum->escapes = call_ABI_of_interest (fndecl);
8089       if (cum->escapes)
8090         {
8091           tree return_type;
8092
8093           if (fntype)
8094             {
8095               return_type = TREE_TYPE (fntype);
8096               return_mode = TYPE_MODE (return_type);
8097             }
8098           else
8099             return_type = lang_hooks.types.type_for_mode (return_mode, 0);
8100
8101           if (return_type != NULL)
8102             {
8103               if (TREE_CODE (return_type) == RECORD_TYPE
8104                   && TYPE_TRANSPARENT_AGGR (return_type))
8105                 {
8106                   return_type = TREE_TYPE (first_field (return_type));
8107                   return_mode = TYPE_MODE (return_type);
8108                 }
8109               if (AGGREGATE_TYPE_P (return_type)
8110                   && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
8111                       <= 8))
8112                 rs6000_returns_struct = true;
8113             }
8114           if (SCALAR_FLOAT_MODE_P (return_mode))
8115             rs6000_passes_float = true;
8116           else if (ALTIVEC_VECTOR_MODE (return_mode)
8117                    || VSX_VECTOR_MODE (return_mode)
8118                    || SPE_VECTOR_MODE (return_mode))
8119             rs6000_passes_vector = true;
8120         }
8121     }
8122 #endif
8123
8124   if (fntype
8125       && !TARGET_ALTIVEC
8126       && TARGET_ALTIVEC_ABI
8127       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
8128     {
8129       error ("cannot return value in vector register because"
8130              " altivec instructions are disabled, use -maltivec"
8131              " to enable them");
8132     }
8133 }
8134 \f
8135 /* Return true if TYPE must be passed on the stack and not in registers.  */
8136
8137 static bool
8138 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
8139 {
8140   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
8141     return must_pass_in_stack_var_size (mode, type);
8142   else
8143     return must_pass_in_stack_var_size_or_pad (mode, type);
8144 }
8145
8146 /* If defined, a C expression which determines whether, and in which
8147    direction, to pad out an argument with extra space.  The value
8148    should be of type `enum direction': either `upward' to pad above
8149    the argument, `downward' to pad below, or `none' to inhibit
8150    padding.
8151
8152    For the AIX ABI structs are always stored left shifted in their
8153    argument slot.  */
8154
8155 enum direction
8156 function_arg_padding (enum machine_mode mode, const_tree type)
8157 {
8158 #ifndef AGGREGATE_PADDING_FIXED
8159 #define AGGREGATE_PADDING_FIXED 0
8160 #endif
8161 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
8162 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
8163 #endif
8164
8165   if (!AGGREGATE_PADDING_FIXED)
8166     {
8167       /* GCC used to pass structures of the same size as integer types as
8168          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
8169          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
8170          passed padded downward, except that -mstrict-align further
8171          muddied the water in that multi-component structures of 2 and 4
8172          bytes in size were passed padded upward.
8173
8174          The following arranges for best compatibility with previous
8175          versions of gcc, but removes the -mstrict-align dependency.  */
8176       if (BYTES_BIG_ENDIAN)
8177         {
8178           HOST_WIDE_INT size = 0;
8179
8180           if (mode == BLKmode)
8181             {
8182               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
8183                 size = int_size_in_bytes (type);
8184             }
8185           else
8186             size = GET_MODE_SIZE (mode);
8187
8188           if (size == 1 || size == 2 || size == 4)
8189             return downward;
8190         }
8191       return upward;
8192     }
8193
8194   if (AGGREGATES_PAD_UPWARD_ALWAYS)
8195     {
8196       if (type != 0 && AGGREGATE_TYPE_P (type))
8197         return upward;
8198     }
8199
8200   /* Fall back to the default.  */
8201   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
8202 }
8203
8204 /* If defined, a C expression that gives the alignment boundary, in bits,
8205    of an argument with the specified mode and type.  If it is not defined,
8206    PARM_BOUNDARY is used for all arguments.
8207
8208    V.4 wants long longs and doubles to be double word aligned.  Just
8209    testing the mode size is a boneheaded way to do this as it means
8210    that other types such as complex int are also double word aligned.
8211    However, we're stuck with this because changing the ABI might break
8212    existing library interfaces.
8213
8214    Doubleword align SPE vectors.
8215    Quadword align Altivec vectors.
8216    Quadword align large synthetic vector types.   */
8217
8218 static unsigned int
8219 rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
8220 {
8221   if (DEFAULT_ABI == ABI_V4
8222       && (GET_MODE_SIZE (mode) == 8
8223           || (TARGET_HARD_FLOAT
8224               && TARGET_FPRS
8225               && (mode == TFmode || mode == TDmode))))
8226     return 64;
8227   else if (SPE_VECTOR_MODE (mode)
8228            || (type && TREE_CODE (type) == VECTOR_TYPE
8229                && int_size_in_bytes (type) >= 8
8230                && int_size_in_bytes (type) < 16))
8231     return 64;
8232   else if ((ALTIVEC_VECTOR_MODE (mode) || VSX_VECTOR_MODE (mode))
8233            || (type && TREE_CODE (type) == VECTOR_TYPE
8234                && int_size_in_bytes (type) >= 16))
8235     return 128;
8236   else if (TARGET_MACHO
8237            && rs6000_darwin64_abi
8238            && mode == BLKmode
8239            && type && TYPE_ALIGN (type) > 64)
8240     return 128;
8241   else
8242     return PARM_BOUNDARY;
8243 }
8244
8245 /* For a function parm of MODE and TYPE, return the starting word in
8246    the parameter area.  NWORDS of the parameter area are already used.  */
8247
8248 static unsigned int
8249 rs6000_parm_start (enum machine_mode mode, const_tree type,
8250                    unsigned int nwords)
8251 {
8252   unsigned int align;
8253   unsigned int parm_offset;
8254
8255   align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
8256   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
8257   return nwords + (-(parm_offset + nwords) & align);
8258 }
8259
8260 /* Compute the size (in words) of a function argument.  */
8261
8262 static unsigned long
8263 rs6000_arg_size (enum machine_mode mode, const_tree type)
8264 {
8265   unsigned long size;
8266
8267   if (mode != BLKmode)
8268     size = GET_MODE_SIZE (mode);
8269   else
8270     size = int_size_in_bytes (type);
8271
8272   if (TARGET_32BIT)
8273     return (size + 3) >> 2;
8274   else
8275     return (size + 7) >> 3;
8276 }
8277 \f
8278 /* Use this to flush pending int fields.  */
8279
8280 static void
8281 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
8282                                           HOST_WIDE_INT bitpos, int final)
8283 {
8284   unsigned int startbit, endbit;
8285   int intregs, intoffset;
8286   enum machine_mode mode;
8287
8288   /* Handle the situations where a float is taking up the first half
8289      of the GPR, and the other half is empty (typically due to
8290      alignment restrictions). We can detect this by a 8-byte-aligned
8291      int field, or by seeing that this is the final flush for this
8292      argument. Count the word and continue on.  */
8293   if (cum->floats_in_gpr == 1
8294       && (cum->intoffset % 64 == 0
8295           || (cum->intoffset == -1 && final)))
8296     {
8297       cum->words++;
8298       cum->floats_in_gpr = 0;
8299     }
8300
8301   if (cum->intoffset == -1)
8302     return;
8303
8304   intoffset = cum->intoffset;
8305   cum->intoffset = -1;
8306   cum->floats_in_gpr = 0;
8307
8308   if (intoffset % BITS_PER_WORD != 0)
8309     {
8310       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8311                             MODE_INT, 0);
8312       if (mode == BLKmode)
8313         {
8314           /* We couldn't find an appropriate mode, which happens,
8315              e.g., in packed structs when there are 3 bytes to load.
8316              Back intoffset back to the beginning of the word in this
8317              case.  */
8318           intoffset = intoffset & -BITS_PER_WORD;
8319         }
8320     }
8321
8322   startbit = intoffset & -BITS_PER_WORD;
8323   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8324   intregs = (endbit - startbit) / BITS_PER_WORD;
8325   cum->words += intregs;
8326   /* words should be unsigned. */
8327   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
8328     {
8329       int pad = (endbit/BITS_PER_WORD) - cum->words;
8330       cum->words += pad;
8331     }
8332 }
8333
8334 /* The darwin64 ABI calls for us to recurse down through structs,
8335    looking for elements passed in registers.  Unfortunately, we have
8336    to track int register count here also because of misalignments
8337    in powerpc alignment mode.  */
8338
8339 static void
8340 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
8341                                             const_tree type,
8342                                             HOST_WIDE_INT startbitpos)
8343 {
8344   tree f;
8345
8346   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8347     if (TREE_CODE (f) == FIELD_DECL)
8348       {
8349         HOST_WIDE_INT bitpos = startbitpos;
8350         tree ftype = TREE_TYPE (f);
8351         enum machine_mode mode;
8352         if (ftype == error_mark_node)
8353           continue;
8354         mode = TYPE_MODE (ftype);
8355
8356         if (DECL_SIZE (f) != 0
8357             && host_integerp (bit_position (f), 1))
8358           bitpos += int_bit_position (f);
8359
8360         /* ??? FIXME: else assume zero offset.  */
8361
8362         if (TREE_CODE (ftype) == RECORD_TYPE)
8363           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
8364         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
8365           {
8366             unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
8367             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
8368             cum->fregno += n_fpregs;
8369             /* Single-precision floats present a special problem for
8370                us, because they are smaller than an 8-byte GPR, and so
8371                the structure-packing rules combined with the standard
8372                varargs behavior mean that we want to pack float/float
8373                and float/int combinations into a single register's
8374                space. This is complicated by the arg advance flushing,
8375                which works on arbitrarily large groups of int-type
8376                fields.  */
8377             if (mode == SFmode)
8378               {
8379                 if (cum->floats_in_gpr == 1)
8380                   {
8381                     /* Two floats in a word; count the word and reset
8382                        the float count.  */
8383                     cum->words++;
8384                     cum->floats_in_gpr = 0;
8385                   }
8386                 else if (bitpos % 64 == 0)
8387                   {
8388                     /* A float at the beginning of an 8-byte word;
8389                        count it and put off adjusting cum->words until
8390                        we see if a arg advance flush is going to do it
8391                        for us.  */
8392                     cum->floats_in_gpr++;
8393                   }
8394                 else
8395                   {
8396                     /* The float is at the end of a word, preceded
8397                        by integer fields, so the arg advance flush
8398                        just above has already set cum->words and
8399                        everything is taken care of.  */
8400                   }
8401               }
8402             else
8403               cum->words += n_fpregs;
8404           }
8405         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
8406           {
8407             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
8408             cum->vregno++;
8409             cum->words += 2;
8410           }
8411         else if (cum->intoffset == -1)
8412           cum->intoffset = bitpos;
8413       }
8414 }
8415
8416 /* Check for an item that needs to be considered specially under the darwin 64
8417    bit ABI.  These are record types where the mode is BLK or the structure is
8418    8 bytes in size.  */
8419 static int
8420 rs6000_darwin64_struct_check_p (enum machine_mode mode, const_tree type)
8421 {
8422   return rs6000_darwin64_abi
8423          && ((mode == BLKmode 
8424               && TREE_CODE (type) == RECORD_TYPE 
8425               && int_size_in_bytes (type) > 0)
8426           || (type && TREE_CODE (type) == RECORD_TYPE 
8427               && int_size_in_bytes (type) == 8)) ? 1 : 0;
8428 }
8429
8430 /* Update the data in CUM to advance over an argument
8431    of mode MODE and data type TYPE.
8432    (TYPE is null for libcalls where that information may not be available.)
8433
8434    Note that for args passed by reference, function_arg will be called
8435    with MODE and TYPE set to that of the pointer to the arg, not the arg
8436    itself.  */
8437
8438 static void
8439 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8440                                const_tree type, bool named, int depth)
8441 {
8442   /* Only tick off an argument if we're not recursing.  */
8443   if (depth == 0)
8444     cum->nargs_prototype--;
8445
8446 #ifdef HAVE_AS_GNU_ATTRIBUTE
8447   if (DEFAULT_ABI == ABI_V4
8448       && cum->escapes)
8449     {
8450       if (SCALAR_FLOAT_MODE_P (mode))
8451         rs6000_passes_float = true;
8452       else if (named && (ALTIVEC_VECTOR_MODE (mode) || VSX_VECTOR_MODE (mode)))
8453         rs6000_passes_vector = true;
8454       else if (SPE_VECTOR_MODE (mode)
8455                && !cum->stdarg
8456                && cum->sysv_gregno <= GP_ARG_MAX_REG)
8457         rs6000_passes_vector = true;
8458     }
8459 #endif
8460
8461   if (TARGET_ALTIVEC_ABI
8462       && (ALTIVEC_VECTOR_MODE (mode)
8463           || VSX_VECTOR_MODE (mode)
8464           || (type && TREE_CODE (type) == VECTOR_TYPE
8465               && int_size_in_bytes (type) == 16)))
8466     {
8467       bool stack = false;
8468
8469       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8470         {
8471           cum->vregno++;
8472           if (!TARGET_ALTIVEC)
8473             error ("cannot pass argument in vector register because"
8474                    " altivec instructions are disabled, use -maltivec"
8475                    " to enable them");
8476
8477           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
8478              even if it is going to be passed in a vector register.
8479              Darwin does the same for variable-argument functions.  */
8480           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
8481               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
8482             stack = true;
8483         }
8484       else
8485         stack = true;
8486
8487       if (stack)
8488         {
8489           int align;
8490
8491           /* Vector parameters must be 16-byte aligned.  This places
8492              them at 2 mod 4 in terms of words in 32-bit mode, since
8493              the parameter save area starts at offset 24 from the
8494              stack.  In 64-bit mode, they just have to start on an
8495              even word, since the parameter save area is 16-byte
8496              aligned.  Space for GPRs is reserved even if the argument
8497              will be passed in memory.  */
8498           if (TARGET_32BIT)
8499             align = (2 - cum->words) & 3;
8500           else
8501             align = cum->words & 1;
8502           cum->words += align + rs6000_arg_size (mode, type);
8503
8504           if (TARGET_DEBUG_ARG)
8505             {
8506               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
8507                        cum->words, align);
8508               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
8509                        cum->nargs_prototype, cum->prototype,
8510                        GET_MODE_NAME (mode));
8511             }
8512         }
8513     }
8514   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
8515            && !cum->stdarg
8516            && cum->sysv_gregno <= GP_ARG_MAX_REG)
8517     cum->sysv_gregno++;
8518
8519   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8520     {
8521       int size = int_size_in_bytes (type);
8522       /* Variable sized types have size == -1 and are
8523          treated as if consisting entirely of ints.
8524          Pad to 16 byte boundary if needed.  */
8525       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8526           && (cum->words % 2) != 0)
8527         cum->words++;
8528       /* For varargs, we can just go up by the size of the struct. */
8529       if (!named)
8530         cum->words += (size + 7) / 8;
8531       else
8532         {
8533           /* It is tempting to say int register count just goes up by
8534              sizeof(type)/8, but this is wrong in a case such as
8535              { int; double; int; } [powerpc alignment].  We have to
8536              grovel through the fields for these too.  */
8537           cum->intoffset = 0;
8538           cum->floats_in_gpr = 0;
8539           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
8540           rs6000_darwin64_record_arg_advance_flush (cum,
8541                                                     size * BITS_PER_UNIT, 1);
8542         }
8543           if (TARGET_DEBUG_ARG)
8544             {
8545               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
8546                        cum->words, TYPE_ALIGN (type), size);
8547               fprintf (stderr, 
8548                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
8549                        cum->nargs_prototype, cum->prototype,
8550                        GET_MODE_NAME (mode));
8551             }
8552     }
8553   else if (DEFAULT_ABI == ABI_V4)
8554     {
8555       if (TARGET_HARD_FLOAT && TARGET_FPRS
8556           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8557               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8558               || (mode == TFmode && !TARGET_IEEEQUAD)
8559               || mode == SDmode || mode == DDmode || mode == TDmode))
8560         {
8561           /* _Decimal128 must use an even/odd register pair.  This assumes
8562              that the register number is odd when fregno is odd.  */
8563           if (mode == TDmode && (cum->fregno % 2) == 1)
8564             cum->fregno++;
8565
8566           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8567               <= FP_ARG_V4_MAX_REG)
8568             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8569           else
8570             {
8571               cum->fregno = FP_ARG_V4_MAX_REG + 1;
8572               if (mode == DFmode || mode == TFmode
8573                   || mode == DDmode || mode == TDmode)
8574                 cum->words += cum->words & 1;
8575               cum->words += rs6000_arg_size (mode, type);
8576             }
8577         }
8578       else
8579         {
8580           int n_words = rs6000_arg_size (mode, type);
8581           int gregno = cum->sysv_gregno;
8582
8583           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8584              (r7,r8) or (r9,r10).  As does any other 2 word item such
8585              as complex int due to a historical mistake.  */
8586           if (n_words == 2)
8587             gregno += (1 - gregno) & 1;
8588
8589           /* Multi-reg args are not split between registers and stack.  */
8590           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8591             {
8592               /* Long long and SPE vectors are aligned on the stack.
8593                  So are other 2 word items such as complex int due to
8594                  a historical mistake.  */
8595               if (n_words == 2)
8596                 cum->words += cum->words & 1;
8597               cum->words += n_words;
8598             }
8599
8600           /* Note: continuing to accumulate gregno past when we've started
8601              spilling to the stack indicates the fact that we've started
8602              spilling to the stack to expand_builtin_saveregs.  */
8603           cum->sysv_gregno = gregno + n_words;
8604         }
8605
8606       if (TARGET_DEBUG_ARG)
8607         {
8608           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8609                    cum->words, cum->fregno);
8610           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
8611                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
8612           fprintf (stderr, "mode = %4s, named = %d\n",
8613                    GET_MODE_NAME (mode), named);
8614         }
8615     }
8616   else
8617     {
8618       int n_words = rs6000_arg_size (mode, type);
8619       int start_words = cum->words;
8620       int align_words = rs6000_parm_start (mode, type, start_words);
8621
8622       cum->words = align_words + n_words;
8623
8624       if (SCALAR_FLOAT_MODE_P (mode)
8625           && TARGET_HARD_FLOAT && TARGET_FPRS)
8626         {
8627           /* _Decimal128 must be passed in an even/odd float register pair.
8628              This assumes that the register number is odd when fregno is
8629              odd.  */
8630           if (mode == TDmode && (cum->fregno % 2) == 1)
8631             cum->fregno++;
8632           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8633         }
8634
8635       if (TARGET_DEBUG_ARG)
8636         {
8637           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8638                    cum->words, cum->fregno);
8639           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
8640                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
8641           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
8642                    named, align_words - start_words, depth);
8643         }
8644     }
8645 }
8646
8647 static void
8648 rs6000_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8649                              const_tree type, bool named)
8650 {
8651   rs6000_function_arg_advance_1 (cum, mode, type, named, 0);
8652 }
8653
8654 static rtx
8655 spe_build_register_parallel (enum machine_mode mode, int gregno)
8656 {
8657   rtx r1, r3, r5, r7;
8658
8659   switch (mode)
8660     {
8661     case DFmode:
8662       r1 = gen_rtx_REG (DImode, gregno);
8663       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8664       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
8665
8666     case DCmode:
8667     case TFmode:
8668       r1 = gen_rtx_REG (DImode, gregno);
8669       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8670       r3 = gen_rtx_REG (DImode, gregno + 2);
8671       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8672       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
8673
8674     case TCmode:
8675       r1 = gen_rtx_REG (DImode, gregno);
8676       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8677       r3 = gen_rtx_REG (DImode, gregno + 2);
8678       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8679       r5 = gen_rtx_REG (DImode, gregno + 4);
8680       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
8681       r7 = gen_rtx_REG (DImode, gregno + 6);
8682       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
8683       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
8684
8685     default:
8686       gcc_unreachable ();
8687     }
8688 }
8689
8690 /* Determine where to put a SIMD argument on the SPE.  */
8691 static rtx
8692 rs6000_spe_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
8693                          const_tree type)
8694 {
8695   int gregno = cum->sysv_gregno;
8696
8697   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
8698      are passed and returned in a pair of GPRs for ABI compatibility.  */
8699   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
8700                              || mode == DCmode || mode == TCmode))
8701     {
8702       int n_words = rs6000_arg_size (mode, type);
8703
8704       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
8705       if (mode == DFmode)
8706         gregno += (1 - gregno) & 1;
8707
8708       /* Multi-reg args are not split between registers and stack.  */
8709       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8710         return NULL_RTX;
8711
8712       return spe_build_register_parallel (mode, gregno);
8713     }
8714   if (cum->stdarg)
8715     {
8716       int n_words = rs6000_arg_size (mode, type);
8717
8718       /* SPE vectors are put in odd registers.  */
8719       if (n_words == 2 && (gregno & 1) == 0)
8720         gregno += 1;
8721
8722       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
8723         {
8724           rtx r1, r2;
8725           enum machine_mode m = SImode;
8726
8727           r1 = gen_rtx_REG (m, gregno);
8728           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
8729           r2 = gen_rtx_REG (m, gregno + 1);
8730           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
8731           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
8732         }
8733       else
8734         return NULL_RTX;
8735     }
8736   else
8737     {
8738       if (gregno <= GP_ARG_MAX_REG)
8739         return gen_rtx_REG (mode, gregno);
8740       else
8741         return NULL_RTX;
8742     }
8743 }
8744
8745 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
8746    structure between cum->intoffset and bitpos to integer registers.  */
8747
8748 static void
8749 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
8750                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
8751 {
8752   enum machine_mode mode;
8753   unsigned int regno;
8754   unsigned int startbit, endbit;
8755   int this_regno, intregs, intoffset;
8756   rtx reg;
8757
8758   if (cum->intoffset == -1)
8759     return;
8760
8761   intoffset = cum->intoffset;
8762   cum->intoffset = -1;
8763
8764   /* If this is the trailing part of a word, try to only load that
8765      much into the register.  Otherwise load the whole register.  Note
8766      that in the latter case we may pick up unwanted bits.  It's not a
8767      problem at the moment but may wish to revisit.  */
8768
8769   if (intoffset % BITS_PER_WORD != 0)
8770     {
8771       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8772                           MODE_INT, 0);
8773       if (mode == BLKmode)
8774         {
8775           /* We couldn't find an appropriate mode, which happens,
8776              e.g., in packed structs when there are 3 bytes to load.
8777              Back intoffset back to the beginning of the word in this
8778              case.  */
8779          intoffset = intoffset & -BITS_PER_WORD;
8780          mode = word_mode;
8781         }
8782     }
8783   else
8784     mode = word_mode;
8785
8786   startbit = intoffset & -BITS_PER_WORD;
8787   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8788   intregs = (endbit - startbit) / BITS_PER_WORD;
8789   this_regno = cum->words + intoffset / BITS_PER_WORD;
8790
8791   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
8792     cum->use_stack = 1;
8793
8794   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
8795   if (intregs <= 0)
8796     return;
8797
8798   intoffset /= BITS_PER_UNIT;
8799   do
8800     {
8801       regno = GP_ARG_MIN_REG + this_regno;
8802       reg = gen_rtx_REG (mode, regno);
8803       rvec[(*k)++] =
8804         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
8805
8806       this_regno += 1;
8807       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
8808       mode = word_mode;
8809       intregs -= 1;
8810     }
8811   while (intregs > 0);
8812 }
8813
8814 /* Recursive workhorse for the following.  */
8815
8816 static void
8817 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
8818                                     HOST_WIDE_INT startbitpos, rtx rvec[],
8819                                     int *k)
8820 {
8821   tree f;
8822
8823   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8824     if (TREE_CODE (f) == FIELD_DECL)
8825       {
8826         HOST_WIDE_INT bitpos = startbitpos;
8827         tree ftype = TREE_TYPE (f);
8828         enum machine_mode mode;
8829         if (ftype == error_mark_node)
8830           continue;
8831         mode = TYPE_MODE (ftype);
8832
8833         if (DECL_SIZE (f) != 0
8834             && host_integerp (bit_position (f), 1))
8835           bitpos += int_bit_position (f);
8836
8837         /* ??? FIXME: else assume zero offset.  */
8838
8839         if (TREE_CODE (ftype) == RECORD_TYPE)
8840           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
8841         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
8842           {
8843             unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8844 #if 0
8845             switch (mode)
8846               {
8847               case SCmode: mode = SFmode; break;
8848               case DCmode: mode = DFmode; break;
8849               case TCmode: mode = TFmode; break;
8850               default: break;
8851               }
8852 #endif
8853             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8854             if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8855               {
8856                 gcc_assert (cum->fregno == FP_ARG_MAX_REG
8857                             && (mode == TFmode || mode == TDmode));
8858                 /* Long double or _Decimal128 split over regs and memory.  */
8859                 mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
8860                 cum->use_stack=1;
8861               }
8862             rvec[(*k)++]
8863               = gen_rtx_EXPR_LIST (VOIDmode,
8864                                    gen_rtx_REG (mode, cum->fregno++),
8865                                    GEN_INT (bitpos / BITS_PER_UNIT));
8866             if (mode == TFmode || mode == TDmode)
8867               cum->fregno++;
8868           }
8869         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
8870           {
8871             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8872             rvec[(*k)++]
8873               = gen_rtx_EXPR_LIST (VOIDmode,
8874                                    gen_rtx_REG (mode, cum->vregno++),
8875                                    GEN_INT (bitpos / BITS_PER_UNIT));
8876           }
8877         else if (cum->intoffset == -1)
8878           cum->intoffset = bitpos;
8879       }
8880 }
8881
8882 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
8883    the register(s) to be used for each field and subfield of a struct
8884    being passed by value, along with the offset of where the
8885    register's value may be found in the block.  FP fields go in FP
8886    register, vector fields go in vector registers, and everything
8887    else goes in int registers, packed as in memory.
8888
8889    This code is also used for function return values.  RETVAL indicates
8890    whether this is the case.
8891
8892    Much of this is taken from the SPARC V9 port, which has a similar
8893    calling convention.  */
8894
8895 static rtx
8896 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
8897                             bool named, bool retval)
8898 {
8899   rtx rvec[FIRST_PSEUDO_REGISTER];
8900   int k = 1, kbase = 1;
8901   HOST_WIDE_INT typesize = int_size_in_bytes (type);
8902   /* This is a copy; modifications are not visible to our caller.  */
8903   CUMULATIVE_ARGS copy_cum = *orig_cum;
8904   CUMULATIVE_ARGS *cum = &copy_cum;
8905
8906   /* Pad to 16 byte boundary if needed.  */
8907   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8908       && (cum->words % 2) != 0)
8909     cum->words++;
8910
8911   cum->intoffset = 0;
8912   cum->use_stack = 0;
8913   cum->named = named;
8914
8915   /* Put entries into rvec[] for individual FP and vector fields, and
8916      for the chunks of memory that go in int regs.  Note we start at
8917      element 1; 0 is reserved for an indication of using memory, and
8918      may or may not be filled in below. */
8919   rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
8920   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
8921
8922   /* If any part of the struct went on the stack put all of it there.
8923      This hack is because the generic code for
8924      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
8925      parts of the struct are not at the beginning.  */
8926   if (cum->use_stack)
8927     {
8928       if (retval)
8929         return NULL_RTX;    /* doesn't go in registers at all */
8930       kbase = 0;
8931       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8932     }
8933   if (k > 1 || cum->use_stack)
8934     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
8935   else
8936     return NULL_RTX;
8937 }
8938
8939 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
8940
8941 static rtx
8942 rs6000_mixed_function_arg (enum machine_mode mode, const_tree type,
8943                            int align_words)
8944 {
8945   int n_units;
8946   int i, k;
8947   rtx rvec[GP_ARG_NUM_REG + 1];
8948
8949   if (align_words >= GP_ARG_NUM_REG)
8950     return NULL_RTX;
8951
8952   n_units = rs6000_arg_size (mode, type);
8953
8954   /* Optimize the simple case where the arg fits in one gpr, except in
8955      the case of BLKmode due to assign_parms assuming that registers are
8956      BITS_PER_WORD wide.  */
8957   if (n_units == 0
8958       || (n_units == 1 && mode != BLKmode))
8959     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8960
8961   k = 0;
8962   if (align_words + n_units > GP_ARG_NUM_REG)
8963     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
8964        using a magic NULL_RTX component.
8965        This is not strictly correct.  Only some of the arg belongs in
8966        memory, not all of it.  However, the normal scheme using
8967        function_arg_partial_nregs can result in unusual subregs, eg.
8968        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
8969        store the whole arg to memory is often more efficient than code
8970        to store pieces, and we know that space is available in the right
8971        place for the whole arg.  */
8972     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8973
8974   i = 0;
8975   do
8976     {
8977       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
8978       rtx off = GEN_INT (i++ * 4);
8979       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8980     }
8981   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
8982
8983   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8984 }
8985
8986 /* Determine where to put an argument to a function.
8987    Value is zero to push the argument on the stack,
8988    or a hard register in which to store the argument.
8989
8990    MODE is the argument's machine mode.
8991    TYPE is the data type of the argument (as a tree).
8992     This is null for libcalls where that information may
8993     not be available.
8994    CUM is a variable of type CUMULATIVE_ARGS which gives info about
8995     the preceding args and about the function being called.  It is
8996     not modified in this routine.
8997    NAMED is nonzero if this argument is a named parameter
8998     (otherwise it is an extra parameter matching an ellipsis).
8999
9000    On RS/6000 the first eight words of non-FP are normally in registers
9001    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
9002    Under V.4, the first 8 FP args are in registers.
9003
9004    If this is floating-point and no prototype is specified, we use
9005    both an FP and integer register (or possibly FP reg and stack).  Library
9006    functions (when CALL_LIBCALL is set) always have the proper types for args,
9007    so we can pass the FP value just in one register.  emit_library_function
9008    doesn't support PARALLEL anyway.
9009
9010    Note that for args passed by reference, function_arg will be called
9011    with MODE and TYPE set to that of the pointer to the arg, not the arg
9012    itself.  */
9013
9014 static rtx
9015 rs6000_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9016                      const_tree type, bool named)
9017 {
9018   enum rs6000_abi abi = DEFAULT_ABI;
9019
9020   /* Return a marker to indicate whether CR1 needs to set or clear the
9021      bit that V.4 uses to say fp args were passed in registers.
9022      Assume that we don't need the marker for software floating point,
9023      or compiler generated library calls.  */
9024   if (mode == VOIDmode)
9025     {
9026       if (abi == ABI_V4
9027           && (cum->call_cookie & CALL_LIBCALL) == 0
9028           && (cum->stdarg
9029               || (cum->nargs_prototype < 0
9030                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
9031         {
9032           /* For the SPE, we need to crxor CR6 always.  */
9033           if (TARGET_SPE_ABI)
9034             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
9035           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
9036             return GEN_INT (cum->call_cookie
9037                             | ((cum->fregno == FP_ARG_MIN_REG)
9038                                ? CALL_V4_SET_FP_ARGS
9039                                : CALL_V4_CLEAR_FP_ARGS));
9040         }
9041
9042       return GEN_INT (cum->call_cookie);
9043     }
9044
9045   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
9046     {
9047       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
9048       if (rslt != NULL_RTX)
9049         return rslt;
9050       /* Else fall through to usual handling.  */
9051     }
9052
9053   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
9054     if (TARGET_64BIT && ! cum->prototype)
9055       {
9056         /* Vector parameters get passed in vector register
9057            and also in GPRs or memory, in absence of prototype.  */
9058         int align_words;
9059         rtx slot;
9060         align_words = (cum->words + 1) & ~1;
9061
9062         if (align_words >= GP_ARG_NUM_REG)
9063           {
9064             slot = NULL_RTX;
9065           }
9066         else
9067           {
9068             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
9069           }
9070         return gen_rtx_PARALLEL (mode,
9071                  gen_rtvec (2,
9072                             gen_rtx_EXPR_LIST (VOIDmode,
9073                                                slot, const0_rtx),
9074                             gen_rtx_EXPR_LIST (VOIDmode,
9075                                                gen_rtx_REG (mode, cum->vregno),
9076                                                const0_rtx)));
9077       }
9078     else
9079       return gen_rtx_REG (mode, cum->vregno);
9080   else if (TARGET_ALTIVEC_ABI
9081            && (ALTIVEC_VECTOR_MODE (mode)
9082                || VSX_VECTOR_MODE (mode)
9083                || (type && TREE_CODE (type) == VECTOR_TYPE
9084                    && int_size_in_bytes (type) == 16)))
9085     {
9086       if (named || abi == ABI_V4)
9087         return NULL_RTX;
9088       else
9089         {
9090           /* Vector parameters to varargs functions under AIX or Darwin
9091              get passed in memory and possibly also in GPRs.  */
9092           int align, align_words, n_words;
9093           enum machine_mode part_mode;
9094
9095           /* Vector parameters must be 16-byte aligned.  This places them at
9096              2 mod 4 in terms of words in 32-bit mode, since the parameter
9097              save area starts at offset 24 from the stack.  In 64-bit mode,
9098              they just have to start on an even word, since the parameter
9099              save area is 16-byte aligned.  */
9100           if (TARGET_32BIT)
9101             align = (2 - cum->words) & 3;
9102           else
9103             align = cum->words & 1;
9104           align_words = cum->words + align;
9105
9106           /* Out of registers?  Memory, then.  */
9107           if (align_words >= GP_ARG_NUM_REG)
9108             return NULL_RTX;
9109
9110           if (TARGET_32BIT && TARGET_POWERPC64)
9111             return rs6000_mixed_function_arg (mode, type, align_words);
9112
9113           /* The vector value goes in GPRs.  Only the part of the
9114              value in GPRs is reported here.  */
9115           part_mode = mode;
9116           n_words = rs6000_arg_size (mode, type);
9117           if (align_words + n_words > GP_ARG_NUM_REG)
9118             /* Fortunately, there are only two possibilities, the value
9119                is either wholly in GPRs or half in GPRs and half not.  */
9120             part_mode = DImode;
9121
9122           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
9123         }
9124     }
9125   else if (TARGET_SPE_ABI && TARGET_SPE
9126            && (SPE_VECTOR_MODE (mode)
9127                || (TARGET_E500_DOUBLE && (mode == DFmode
9128                                           || mode == DCmode
9129                                           || mode == TFmode
9130                                           || mode == TCmode))))
9131     return rs6000_spe_function_arg (cum, mode, type);
9132
9133   else if (abi == ABI_V4)
9134     {
9135       if (TARGET_HARD_FLOAT && TARGET_FPRS
9136           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
9137               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
9138               || (mode == TFmode && !TARGET_IEEEQUAD)
9139               || mode == SDmode || mode == DDmode || mode == TDmode))
9140         {
9141           /* _Decimal128 must use an even/odd register pair.  This assumes
9142              that the register number is odd when fregno is odd.  */
9143           if (mode == TDmode && (cum->fregno % 2) == 1)
9144             cum->fregno++;
9145
9146           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
9147               <= FP_ARG_V4_MAX_REG)
9148             return gen_rtx_REG (mode, cum->fregno);
9149           else
9150             return NULL_RTX;
9151         }
9152       else
9153         {
9154           int n_words = rs6000_arg_size (mode, type);
9155           int gregno = cum->sysv_gregno;
9156
9157           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
9158              (r7,r8) or (r9,r10).  As does any other 2 word item such
9159              as complex int due to a historical mistake.  */
9160           if (n_words == 2)
9161             gregno += (1 - gregno) & 1;
9162
9163           /* Multi-reg args are not split between registers and stack.  */
9164           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
9165             return NULL_RTX;
9166
9167           if (TARGET_32BIT && TARGET_POWERPC64)
9168             return rs6000_mixed_function_arg (mode, type,
9169                                               gregno - GP_ARG_MIN_REG);
9170           return gen_rtx_REG (mode, gregno);
9171         }
9172     }
9173   else
9174     {
9175       int align_words = rs6000_parm_start (mode, type, cum->words);
9176
9177       /* _Decimal128 must be passed in an even/odd float register pair.
9178          This assumes that the register number is odd when fregno is odd.  */
9179       if (mode == TDmode && (cum->fregno % 2) == 1)
9180         cum->fregno++;
9181
9182       if (USE_FP_FOR_ARG_P (cum, mode, type))
9183         {
9184           rtx rvec[GP_ARG_NUM_REG + 1];
9185           rtx r;
9186           int k;
9187           bool needs_psave;
9188           enum machine_mode fmode = mode;
9189           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
9190
9191           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
9192             {
9193               /* Currently, we only ever need one reg here because complex
9194                  doubles are split.  */
9195               gcc_assert (cum->fregno == FP_ARG_MAX_REG
9196                           && (fmode == TFmode || fmode == TDmode));
9197
9198               /* Long double or _Decimal128 split over regs and memory.  */
9199               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
9200             }
9201
9202           /* Do we also need to pass this arg in the parameter save
9203              area?  */
9204           needs_psave = (type
9205                          && (cum->nargs_prototype <= 0
9206                              || (DEFAULT_ABI == ABI_AIX
9207                                  && TARGET_XL_COMPAT
9208                                  && align_words >= GP_ARG_NUM_REG)));
9209
9210           if (!needs_psave && mode == fmode)
9211             return gen_rtx_REG (fmode, cum->fregno);
9212
9213           k = 0;
9214           if (needs_psave)
9215             {
9216               /* Describe the part that goes in gprs or the stack.
9217                  This piece must come first, before the fprs.  */
9218               if (align_words < GP_ARG_NUM_REG)
9219                 {
9220                   unsigned long n_words = rs6000_arg_size (mode, type);
9221
9222                   if (align_words + n_words > GP_ARG_NUM_REG
9223                       || (TARGET_32BIT && TARGET_POWERPC64))
9224                     {
9225                       /* If this is partially on the stack, then we only
9226                          include the portion actually in registers here.  */
9227                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
9228                       rtx off;
9229                       int i = 0;
9230                       if (align_words + n_words > GP_ARG_NUM_REG)
9231                         /* Not all of the arg fits in gprs.  Say that it
9232                            goes in memory too, using a magic NULL_RTX
9233                            component.  Also see comment in
9234                            rs6000_mixed_function_arg for why the normal
9235                            function_arg_partial_nregs scheme doesn't work
9236                            in this case. */
9237                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
9238                                                        const0_rtx);
9239                       do
9240                         {
9241                           r = gen_rtx_REG (rmode,
9242                                            GP_ARG_MIN_REG + align_words);
9243                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
9244                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
9245                         }
9246                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
9247                     }
9248                   else
9249                     {
9250                       /* The whole arg fits in gprs.  */
9251                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
9252                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
9253                     }
9254                 }
9255               else
9256                 /* It's entirely in memory.  */
9257                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
9258             }
9259
9260           /* Describe where this piece goes in the fprs.  */
9261           r = gen_rtx_REG (fmode, cum->fregno);
9262           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
9263
9264           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
9265         }
9266       else if (align_words < GP_ARG_NUM_REG)
9267         {
9268           if (TARGET_32BIT && TARGET_POWERPC64)
9269             return rs6000_mixed_function_arg (mode, type, align_words);
9270
9271           if (mode == BLKmode)
9272             mode = Pmode;
9273
9274           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
9275         }
9276       else
9277         return NULL_RTX;
9278     }
9279 }
9280 \f
9281 /* For an arg passed partly in registers and partly in memory, this is
9282    the number of bytes passed in registers.  For args passed entirely in
9283    registers or entirely in memory, zero.  When an arg is described by a
9284    PARALLEL, perhaps using more than one register type, this function
9285    returns the number of bytes used by the first element of the PARALLEL.  */
9286
9287 static int
9288 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9289                           tree type, bool named)
9290 {
9291   int ret = 0;
9292   int align_words;
9293
9294   if (DEFAULT_ABI == ABI_V4)
9295     return 0;
9296
9297   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
9298       && cum->nargs_prototype >= 0)
9299     return 0;
9300
9301   /* In this complicated case we just disable the partial_nregs code.  */
9302   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
9303     return 0;
9304
9305   align_words = rs6000_parm_start (mode, type, cum->words);
9306
9307   if (USE_FP_FOR_ARG_P (cum, mode, type))
9308     {
9309       /* If we are passing this arg in the fixed parameter save area
9310          (gprs or memory) as well as fprs, then this function should
9311          return the number of partial bytes passed in the parameter
9312          save area rather than partial bytes passed in fprs.  */
9313       if (type
9314           && (cum->nargs_prototype <= 0
9315               || (DEFAULT_ABI == ABI_AIX
9316                   && TARGET_XL_COMPAT
9317                   && align_words >= GP_ARG_NUM_REG)))
9318         return 0;
9319       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
9320                > FP_ARG_MAX_REG + 1)
9321         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
9322       else if (cum->nargs_prototype >= 0)
9323         return 0;
9324     }
9325
9326   if (align_words < GP_ARG_NUM_REG
9327       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
9328     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
9329
9330   if (ret != 0 && TARGET_DEBUG_ARG)
9331     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
9332
9333   return ret;
9334 }
9335 \f
9336 /* A C expression that indicates when an argument must be passed by
9337    reference.  If nonzero for an argument, a copy of that argument is
9338    made in memory and a pointer to the argument is passed instead of
9339    the argument itself.  The pointer is passed in whatever way is
9340    appropriate for passing a pointer to that type.
9341
9342    Under V.4, aggregates and long double are passed by reference.
9343
9344    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
9345    reference unless the AltiVec vector extension ABI is in force.
9346
9347    As an extension to all ABIs, variable sized types are passed by
9348    reference.  */
9349
9350 static bool
9351 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
9352                           enum machine_mode mode, const_tree type,
9353                           bool named ATTRIBUTE_UNUSED)
9354 {
9355   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
9356     {
9357       if (TARGET_DEBUG_ARG)
9358         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
9359       return 1;
9360     }
9361
9362   if (!type)
9363     return 0;
9364
9365   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
9366     {
9367       if (TARGET_DEBUG_ARG)
9368         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
9369       return 1;
9370     }
9371
9372   if (int_size_in_bytes (type) < 0)
9373     {
9374       if (TARGET_DEBUG_ARG)
9375         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
9376       return 1;
9377     }
9378
9379   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
9380      modes only exist for GCC vector types if -maltivec.  */
9381   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
9382     {
9383       if (TARGET_DEBUG_ARG)
9384         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
9385       return 1;
9386     }
9387
9388   /* Pass synthetic vectors in memory.  */
9389   if (TREE_CODE (type) == VECTOR_TYPE
9390       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
9391     {
9392       static bool warned_for_pass_big_vectors = false;
9393       if (TARGET_DEBUG_ARG)
9394         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
9395       if (!warned_for_pass_big_vectors)
9396         {
9397           warning (0, "GCC vector passed by reference: "
9398                    "non-standard ABI extension with no compatibility guarantee");
9399           warned_for_pass_big_vectors = true;
9400         }
9401       return 1;
9402     }
9403
9404   return 0;
9405 }
9406
9407 static void
9408 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
9409 {
9410   int i;
9411   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
9412
9413   if (nregs == 0)
9414     return;
9415
9416   for (i = 0; i < nregs; i++)
9417     {
9418       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
9419       if (reload_completed)
9420         {
9421           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
9422             tem = NULL_RTX;
9423           else
9424             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
9425                                        i * GET_MODE_SIZE (reg_mode));
9426         }
9427       else
9428         tem = replace_equiv_address (tem, XEXP (tem, 0));
9429
9430       gcc_assert (tem);
9431
9432       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
9433     }
9434 }
9435 \f
9436 /* Perform any needed actions needed for a function that is receiving a
9437    variable number of arguments.
9438
9439    CUM is as above.
9440
9441    MODE and TYPE are the mode and type of the current parameter.
9442
9443    PRETEND_SIZE is a variable that should be set to the amount of stack
9444    that must be pushed by the prolog to pretend that our caller pushed
9445    it.
9446
9447    Normally, this macro will push all remaining incoming registers on the
9448    stack and set PRETEND_SIZE to the length of the registers pushed.  */
9449
9450 static void
9451 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9452                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
9453                         int no_rtl)
9454 {
9455   CUMULATIVE_ARGS next_cum;
9456   int reg_size = TARGET_32BIT ? 4 : 8;
9457   rtx save_area = NULL_RTX, mem;
9458   int first_reg_offset;
9459   alias_set_type set;
9460
9461   /* Skip the last named argument.  */
9462   next_cum = *cum;
9463   rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
9464
9465   if (DEFAULT_ABI == ABI_V4)
9466     {
9467       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
9468
9469       if (! no_rtl)
9470         {
9471           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
9472           HOST_WIDE_INT offset = 0;
9473
9474           /* Try to optimize the size of the varargs save area.
9475              The ABI requires that ap.reg_save_area is doubleword
9476              aligned, but we don't need to allocate space for all
9477              the bytes, only those to which we actually will save
9478              anything.  */
9479           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
9480             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
9481           if (TARGET_HARD_FLOAT && TARGET_FPRS
9482               && next_cum.fregno <= FP_ARG_V4_MAX_REG
9483               && cfun->va_list_fpr_size)
9484             {
9485               if (gpr_reg_num)
9486                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
9487                            * UNITS_PER_FP_WORD;
9488               if (cfun->va_list_fpr_size
9489                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
9490                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
9491               else
9492                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
9493                             * UNITS_PER_FP_WORD;
9494             }
9495           if (gpr_reg_num)
9496             {
9497               offset = -((first_reg_offset * reg_size) & ~7);
9498               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
9499                 {
9500                   gpr_reg_num = cfun->va_list_gpr_size;
9501                   if (reg_size == 4 && (first_reg_offset & 1))
9502                     gpr_reg_num++;
9503                 }
9504               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
9505             }
9506           else if (fpr_size)
9507             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
9508                        * UNITS_PER_FP_WORD
9509                      - (int) (GP_ARG_NUM_REG * reg_size);
9510
9511           if (gpr_size + fpr_size)
9512             {
9513               rtx reg_save_area
9514                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
9515               gcc_assert (GET_CODE (reg_save_area) == MEM);
9516               reg_save_area = XEXP (reg_save_area, 0);
9517               if (GET_CODE (reg_save_area) == PLUS)
9518                 {
9519                   gcc_assert (XEXP (reg_save_area, 0)
9520                               == virtual_stack_vars_rtx);
9521                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
9522                   offset += INTVAL (XEXP (reg_save_area, 1));
9523                 }
9524               else
9525                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
9526             }
9527
9528           cfun->machine->varargs_save_offset = offset;
9529           save_area = plus_constant (virtual_stack_vars_rtx, offset);
9530         }
9531     }
9532   else
9533     {
9534       first_reg_offset = next_cum.words;
9535       save_area = virtual_incoming_args_rtx;
9536
9537       if (targetm.calls.must_pass_in_stack (mode, type))
9538         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
9539     }
9540
9541   set = get_varargs_alias_set ();
9542   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
9543       && cfun->va_list_gpr_size)
9544     {
9545       int nregs = GP_ARG_NUM_REG - first_reg_offset;
9546
9547       if (va_list_gpr_counter_field)
9548         {
9549           /* V4 va_list_gpr_size counts number of registers needed.  */
9550           if (nregs > cfun->va_list_gpr_size)
9551             nregs = cfun->va_list_gpr_size;
9552         }
9553       else
9554         {
9555           /* char * va_list instead counts number of bytes needed.  */
9556           if (nregs > cfun->va_list_gpr_size / reg_size)
9557             nregs = cfun->va_list_gpr_size / reg_size;
9558         }
9559
9560       mem = gen_rtx_MEM (BLKmode,
9561                          plus_constant (save_area,
9562                                         first_reg_offset * reg_size));
9563       MEM_NOTRAP_P (mem) = 1;
9564       set_mem_alias_set (mem, set);
9565       set_mem_align (mem, BITS_PER_WORD);
9566
9567       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
9568                                   nregs);
9569     }
9570
9571   /* Save FP registers if needed.  */
9572   if (DEFAULT_ABI == ABI_V4
9573       && TARGET_HARD_FLOAT && TARGET_FPRS
9574       && ! no_rtl
9575       && next_cum.fregno <= FP_ARG_V4_MAX_REG
9576       && cfun->va_list_fpr_size)
9577     {
9578       int fregno = next_cum.fregno, nregs;
9579       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
9580       rtx lab = gen_label_rtx ();
9581       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
9582                                                * UNITS_PER_FP_WORD);
9583
9584       emit_jump_insn
9585         (gen_rtx_SET (VOIDmode,
9586                       pc_rtx,
9587                       gen_rtx_IF_THEN_ELSE (VOIDmode,
9588                                             gen_rtx_NE (VOIDmode, cr1,
9589                                                         const0_rtx),
9590                                             gen_rtx_LABEL_REF (VOIDmode, lab),
9591                                             pc_rtx)));
9592
9593       for (nregs = 0;
9594            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
9595            fregno++, off += UNITS_PER_FP_WORD, nregs++)
9596         {
9597           mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9598                               ? DFmode : SFmode, 
9599                              plus_constant (save_area, off));
9600           MEM_NOTRAP_P (mem) = 1;
9601           set_mem_alias_set (mem, set);
9602           set_mem_align (mem, GET_MODE_ALIGNMENT (
9603                          (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9604                           ? DFmode : SFmode));
9605           emit_move_insn (mem, gen_rtx_REG (
9606                           (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9607                            ? DFmode : SFmode, fregno));
9608         }
9609
9610       emit_label (lab);
9611     }
9612 }
9613
9614 /* Create the va_list data type.  */
9615
9616 static tree
9617 rs6000_build_builtin_va_list (void)
9618 {
9619   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
9620
9621   /* For AIX, prefer 'char *' because that's what the system
9622      header files like.  */
9623   if (DEFAULT_ABI != ABI_V4)
9624     return build_pointer_type (char_type_node);
9625
9626   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
9627   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
9628                           get_identifier ("__va_list_tag"), record);
9629
9630   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
9631                       unsigned_char_type_node);
9632   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
9633                       unsigned_char_type_node);
9634   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
9635      every user file.  */
9636   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9637                       get_identifier ("reserved"), short_unsigned_type_node);
9638   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9639                       get_identifier ("overflow_arg_area"),
9640                       ptr_type_node);
9641   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9642                       get_identifier ("reg_save_area"),
9643                       ptr_type_node);
9644
9645   va_list_gpr_counter_field = f_gpr;
9646   va_list_fpr_counter_field = f_fpr;
9647
9648   DECL_FIELD_CONTEXT (f_gpr) = record;
9649   DECL_FIELD_CONTEXT (f_fpr) = record;
9650   DECL_FIELD_CONTEXT (f_res) = record;
9651   DECL_FIELD_CONTEXT (f_ovf) = record;
9652   DECL_FIELD_CONTEXT (f_sav) = record;
9653
9654   TYPE_STUB_DECL (record) = type_decl;
9655   TYPE_NAME (record) = type_decl;
9656   TYPE_FIELDS (record) = f_gpr;
9657   DECL_CHAIN (f_gpr) = f_fpr;
9658   DECL_CHAIN (f_fpr) = f_res;
9659   DECL_CHAIN (f_res) = f_ovf;
9660   DECL_CHAIN (f_ovf) = f_sav;
9661
9662   layout_type (record);
9663
9664   /* The correct type is an array type of one element.  */
9665   return build_array_type (record, build_index_type (size_zero_node));
9666 }
9667
9668 /* Implement va_start.  */
9669
9670 static void
9671 rs6000_va_start (tree valist, rtx nextarg)
9672 {
9673   HOST_WIDE_INT words, n_gpr, n_fpr;
9674   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9675   tree gpr, fpr, ovf, sav, t;
9676
9677   /* Only SVR4 needs something special.  */
9678   if (DEFAULT_ABI != ABI_V4)
9679     {
9680       std_expand_builtin_va_start (valist, nextarg);
9681       return;
9682     }
9683
9684   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9685   f_fpr = DECL_CHAIN (f_gpr);
9686   f_res = DECL_CHAIN (f_fpr);
9687   f_ovf = DECL_CHAIN (f_res);
9688   f_sav = DECL_CHAIN (f_ovf);
9689
9690   valist = build_simple_mem_ref (valist);
9691   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9692   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9693                 f_fpr, NULL_TREE);
9694   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9695                 f_ovf, NULL_TREE);
9696   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9697                 f_sav, NULL_TREE);
9698
9699   /* Count number of gp and fp argument registers used.  */
9700   words = crtl->args.info.words;
9701   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
9702                GP_ARG_NUM_REG);
9703   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
9704                FP_ARG_NUM_REG);
9705
9706   if (TARGET_DEBUG_ARG)
9707     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
9708              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
9709              words, n_gpr, n_fpr);
9710
9711   if (cfun->va_list_gpr_size)
9712     {
9713       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
9714                   build_int_cst (NULL_TREE, n_gpr));
9715       TREE_SIDE_EFFECTS (t) = 1;
9716       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9717     }
9718
9719   if (cfun->va_list_fpr_size)
9720     {
9721       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
9722                   build_int_cst (NULL_TREE, n_fpr));
9723       TREE_SIDE_EFFECTS (t) = 1;
9724       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9725
9726 #ifdef HAVE_AS_GNU_ATTRIBUTE
9727       if (call_ABI_of_interest (cfun->decl))
9728         rs6000_passes_float = true;
9729 #endif
9730     }
9731
9732   /* Find the overflow area.  */
9733   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
9734   if (words != 0)
9735     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
9736                 size_int (words * UNITS_PER_WORD));
9737   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
9738   TREE_SIDE_EFFECTS (t) = 1;
9739   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9740
9741   /* If there were no va_arg invocations, don't set up the register
9742      save area.  */
9743   if (!cfun->va_list_gpr_size
9744       && !cfun->va_list_fpr_size
9745       && n_gpr < GP_ARG_NUM_REG
9746       && n_fpr < FP_ARG_V4_MAX_REG)
9747     return;
9748
9749   /* Find the register save area.  */
9750   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
9751   if (cfun->machine->varargs_save_offset)
9752     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
9753                 size_int (cfun->machine->varargs_save_offset));
9754   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
9755   TREE_SIDE_EFFECTS (t) = 1;
9756   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9757 }
9758
9759 /* Implement va_arg.  */
9760
9761 tree
9762 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
9763                         gimple_seq *post_p)
9764 {
9765   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9766   tree gpr, fpr, ovf, sav, reg, t, u;
9767   int size, rsize, n_reg, sav_ofs, sav_scale;
9768   tree lab_false, lab_over, addr;
9769   int align;
9770   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
9771   int regalign = 0;
9772   gimple stmt;
9773
9774   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
9775     {
9776       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
9777       return build_va_arg_indirect_ref (t);
9778     }
9779
9780   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
9781      earlier version of gcc, with the property that it always applied alignment
9782      adjustments to the va-args (even for zero-sized types).  The cheapest way
9783      to deal with this is to replicate the effect of the part of 
9784      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
9785      of relevance.  
9786      We don't need to check for pass-by-reference because of the test above.
9787      We can return a simplifed answer, since we know there's no offset to add.  */
9788
9789   if (TARGET_MACHO
9790       && rs6000_darwin64_abi 
9791       && integer_zerop (TYPE_SIZE (type)))
9792     {
9793       unsigned HOST_WIDE_INT align, boundary;
9794       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
9795       align = PARM_BOUNDARY / BITS_PER_UNIT;
9796       boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
9797       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
9798         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
9799       boundary /= BITS_PER_UNIT;
9800       if (boundary > align)
9801         {
9802           tree t ;
9803           /* This updates arg ptr by the amount that would be necessary
9804              to align the zero-sized (but not zero-alignment) item.  */
9805           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9806                   fold_build2 (POINTER_PLUS_EXPR,
9807                                TREE_TYPE (valist),
9808                                valist_tmp, size_int (boundary - 1)));
9809           gimplify_and_add (t, pre_p);
9810
9811           t = fold_convert (sizetype, valist_tmp);
9812           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9813                   fold_convert (TREE_TYPE (valist),
9814                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
9815                                              size_int (-boundary))));
9816           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
9817           gimplify_and_add (t, pre_p);
9818         }
9819       /* Since it is zero-sized there's no increment for the item itself. */
9820       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
9821       return build_va_arg_indirect_ref (valist_tmp);
9822     }
9823
9824   if (DEFAULT_ABI != ABI_V4)
9825     {
9826       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
9827         {
9828           tree elem_type = TREE_TYPE (type);
9829           enum machine_mode elem_mode = TYPE_MODE (elem_type);
9830           int elem_size = GET_MODE_SIZE (elem_mode);
9831
9832           if (elem_size < UNITS_PER_WORD)
9833             {
9834               tree real_part, imag_part;
9835               gimple_seq post = NULL;
9836
9837               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9838                                                   &post);
9839               /* Copy the value into a temporary, lest the formal temporary
9840                  be reused out from under us.  */
9841               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
9842               gimple_seq_add_seq (pre_p, post);
9843
9844               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9845                                                   post_p);
9846
9847               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
9848             }
9849         }
9850
9851       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
9852     }
9853
9854   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9855   f_fpr = DECL_CHAIN (f_gpr);
9856   f_res = DECL_CHAIN (f_fpr);
9857   f_ovf = DECL_CHAIN (f_res);
9858   f_sav = DECL_CHAIN (f_ovf);
9859
9860   valist = build_va_arg_indirect_ref (valist);
9861   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9862   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9863                 f_fpr, NULL_TREE);
9864   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9865                 f_ovf, NULL_TREE);
9866   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9867                 f_sav, NULL_TREE);
9868
9869   size = int_size_in_bytes (type);
9870   rsize = (size + 3) / 4;
9871   align = 1;
9872
9873   if (TARGET_HARD_FLOAT && TARGET_FPRS
9874       && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
9875           || (TARGET_DOUBLE_FLOAT 
9876               && (TYPE_MODE (type) == DFmode 
9877                   || TYPE_MODE (type) == TFmode
9878                   || TYPE_MODE (type) == SDmode
9879                   || TYPE_MODE (type) == DDmode
9880                   || TYPE_MODE (type) == TDmode))))
9881     {
9882       /* FP args go in FP registers, if present.  */
9883       reg = fpr;
9884       n_reg = (size + 7) / 8;
9885       sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
9886       sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
9887       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
9888         align = 8;
9889     }
9890   else
9891     {
9892       /* Otherwise into GP registers.  */
9893       reg = gpr;
9894       n_reg = rsize;
9895       sav_ofs = 0;
9896       sav_scale = 4;
9897       if (n_reg == 2)
9898         align = 8;
9899     }
9900
9901   /* Pull the value out of the saved registers....  */
9902
9903   lab_over = NULL;
9904   addr = create_tmp_var (ptr_type_node, "addr");
9905
9906   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
9907   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
9908     align = 16;
9909   else
9910     {
9911       lab_false = create_artificial_label (input_location);
9912       lab_over = create_artificial_label (input_location);
9913
9914       /* Long long and SPE vectors are aligned in the registers.
9915          As are any other 2 gpr item such as complex int due to a
9916          historical mistake.  */
9917       u = reg;
9918       if (n_reg == 2 && reg == gpr)
9919         {
9920           regalign = 1;
9921           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9922                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
9923           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
9924                       unshare_expr (reg), u);
9925         }
9926       /* _Decimal128 is passed in even/odd fpr pairs; the stored
9927          reg number is 0 for f1, so we want to make it odd.  */
9928       else if (reg == fpr && TYPE_MODE (type) == TDmode)
9929         {
9930           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9931                       build_int_cst (TREE_TYPE (reg), 1));
9932           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
9933         }
9934
9935       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
9936       t = build2 (GE_EXPR, boolean_type_node, u, t);
9937       u = build1 (GOTO_EXPR, void_type_node, lab_false);
9938       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
9939       gimplify_and_add (t, pre_p);
9940
9941       t = sav;
9942       if (sav_ofs)
9943         t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
9944
9945       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9946                   build_int_cst (TREE_TYPE (reg), n_reg));
9947       u = fold_convert (sizetype, u);
9948       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
9949       t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
9950
9951       /* _Decimal32 varargs are located in the second word of the 64-bit
9952          FP register for 32-bit binaries.  */
9953       if (!TARGET_POWERPC64
9954           && TARGET_HARD_FLOAT && TARGET_FPRS
9955           && TYPE_MODE (type) == SDmode)
9956         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9957
9958       gimplify_assign (addr, t, pre_p);
9959
9960       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
9961
9962       stmt = gimple_build_label (lab_false);
9963       gimple_seq_add_stmt (pre_p, stmt);
9964
9965       if ((n_reg == 2 && !regalign) || n_reg > 2)
9966         {
9967           /* Ensure that we don't find any more args in regs.
9968              Alignment has taken care of for special cases.  */
9969           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
9970         }
9971     }
9972
9973   /* ... otherwise out of the overflow area.  */
9974
9975   /* Care for on-stack alignment if needed.  */
9976   t = ovf;
9977   if (align != 1)
9978     {
9979       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
9980       t = fold_convert (sizetype, t);
9981       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
9982                   size_int (-align));
9983       t = fold_convert (TREE_TYPE (ovf), t);
9984     }
9985   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
9986
9987   gimplify_assign (unshare_expr (addr), t, pre_p);
9988
9989   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9990   gimplify_assign (unshare_expr (ovf), t, pre_p);
9991
9992   if (lab_over)
9993     {
9994       stmt = gimple_build_label (lab_over);
9995       gimple_seq_add_stmt (pre_p, stmt);
9996     }
9997
9998   if (STRICT_ALIGNMENT
9999       && (TYPE_ALIGN (type)
10000           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
10001     {
10002       /* The value (of type complex double, for example) may not be
10003          aligned in memory in the saved registers, so copy via a
10004          temporary.  (This is the same code as used for SPARC.)  */
10005       tree tmp = create_tmp_var (type, "va_arg_tmp");
10006       tree dest_addr = build_fold_addr_expr (tmp);
10007
10008       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
10009                                    3, dest_addr, addr, size_int (rsize * 4));
10010
10011       gimplify_and_add (copy, pre_p);
10012       addr = dest_addr;
10013     }
10014
10015   addr = fold_convert (ptrtype, addr);
10016   return build_va_arg_indirect_ref (addr);
10017 }
10018
10019 /* Builtins.  */
10020
10021 static void
10022 def_builtin (int mask, const char *name, tree type, int code)
10023 {
10024   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
10025     {
10026       tree t;
10027       if (rs6000_builtin_decls[code])
10028         fatal_error ("internal error: builtin function to %s already processed",
10029                      name);
10030
10031       rs6000_builtin_decls[code] = t =
10032         add_builtin_function (name, type, code, BUILT_IN_MD,
10033                               NULL, NULL_TREE);
10034
10035       gcc_assert (code >= 0 && code < (int)RS6000_BUILTIN_COUNT);
10036       switch (builtin_classify[code])
10037         {
10038         default:
10039           gcc_unreachable ();
10040
10041           /* assume builtin can do anything.  */
10042         case RS6000_BTC_MISC:
10043           break;
10044
10045           /* const function, function only depends on the inputs.  */
10046         case RS6000_BTC_CONST:
10047           TREE_READONLY (t) = 1;
10048           TREE_NOTHROW (t) = 1;
10049           break;
10050
10051           /* pure function, function can read global memory.  */
10052         case RS6000_BTC_PURE:
10053           DECL_PURE_P (t) = 1;
10054           TREE_NOTHROW (t) = 1;
10055           break;
10056
10057           /* Function is a math function.  If rounding mode is on, then treat
10058              the function as not reading global memory, but it can have
10059              arbitrary side effects.  If it is off, then assume the function is
10060              a const function.  This mimics the ATTR_MATHFN_FPROUNDING
10061              attribute in builtin-attribute.def that is used for the math
10062              functions. */
10063         case RS6000_BTC_FP_PURE:
10064           TREE_NOTHROW (t) = 1;
10065           if (flag_rounding_math)
10066             {
10067               DECL_PURE_P (t) = 1;
10068               DECL_IS_NOVOPS (t) = 1;
10069             }
10070           else
10071             TREE_READONLY (t) = 1;
10072           break;
10073         }
10074     }
10075 }
10076
10077 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
10078
10079 static const struct builtin_description bdesc_3arg[] =
10080 {
10081   { MASK_ALTIVEC, CODE_FOR_fmav4sf4, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
10082   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
10083   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
10084   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
10085   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
10086   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
10087   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
10088   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
10089   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
10090   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
10091   { MASK_ALTIVEC, CODE_FOR_nfmsv4sf4, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
10092   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2df, "__builtin_altivec_vperm_2df", ALTIVEC_BUILTIN_VPERM_2DF },
10093   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di, "__builtin_altivec_vperm_2di", ALTIVEC_BUILTIN_VPERM_2DI },
10094   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
10095   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
10096   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
10097   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
10098   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_altivec_vperm_2di_uns", ALTIVEC_BUILTIN_VPERM_2DI_UNS },
10099   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_altivec_vperm_4si_uns", ALTIVEC_BUILTIN_VPERM_4SI_UNS },
10100   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_altivec_vperm_8hi_uns", ALTIVEC_BUILTIN_VPERM_8HI_UNS },
10101   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi_uns", ALTIVEC_BUILTIN_VPERM_16QI_UNS },
10102   { MASK_ALTIVEC, CODE_FOR_vector_select_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
10103   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
10104   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
10105   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
10106   { MASK_ALTIVEC, CODE_FOR_vector_select_v2df, "__builtin_altivec_vsel_2df", ALTIVEC_BUILTIN_VSEL_2DF },
10107   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di, "__builtin_altivec_vsel_2di", ALTIVEC_BUILTIN_VSEL_2DI },
10108   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si_uns, "__builtin_altivec_vsel_4si_uns", ALTIVEC_BUILTIN_VSEL_4SI_UNS },
10109   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi_uns, "__builtin_altivec_vsel_8hi_uns", ALTIVEC_BUILTIN_VSEL_8HI_UNS },
10110   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi_uns, "__builtin_altivec_vsel_16qi_uns", ALTIVEC_BUILTIN_VSEL_16QI_UNS },
10111   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di_uns, "__builtin_altivec_vsel_2di_uns", ALTIVEC_BUILTIN_VSEL_2DI_UNS },
10112   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
10113   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
10114   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
10115   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
10116
10117   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
10118   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
10119   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
10120   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
10121   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
10122   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
10123   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
10124   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
10125   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
10126   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
10127   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
10128   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
10129   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
10130   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
10131   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
10132
10133   { MASK_VSX, CODE_FOR_fmav2df4, "__builtin_vsx_xvmadddp", VSX_BUILTIN_XVMADDDP },
10134   { MASK_VSX, CODE_FOR_fmsv2df4, "__builtin_vsx_xvmsubdp", VSX_BUILTIN_XVMSUBDP },
10135   { MASK_VSX, CODE_FOR_nfmav2df4, "__builtin_vsx_xvnmadddp", VSX_BUILTIN_XVNMADDDP },
10136   { MASK_VSX, CODE_FOR_nfmsv2df4, "__builtin_vsx_xvnmsubdp", VSX_BUILTIN_XVNMSUBDP },
10137
10138   { MASK_VSX, CODE_FOR_fmav4sf4, "__builtin_vsx_xvmaddsp", VSX_BUILTIN_XVMADDSP },
10139   { MASK_VSX, CODE_FOR_fmsv4sf4, "__builtin_vsx_xvmsubsp", VSX_BUILTIN_XVMSUBSP },
10140   { MASK_VSX, CODE_FOR_nfmav4sf4, "__builtin_vsx_xvnmaddsp", VSX_BUILTIN_XVNMADDSP },
10141   { MASK_VSX, CODE_FOR_nfmsv4sf4, "__builtin_vsx_xvnmsubsp", VSX_BUILTIN_XVNMSUBSP },
10142
10143   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msub", VSX_BUILTIN_VEC_MSUB },
10144   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmadd", VSX_BUILTIN_VEC_NMADD },
10145
10146   { MASK_VSX, CODE_FOR_vector_select_v2di, "__builtin_vsx_xxsel_2di", VSX_BUILTIN_XXSEL_2DI },
10147   { MASK_VSX, CODE_FOR_vector_select_v2df, "__builtin_vsx_xxsel_2df", VSX_BUILTIN_XXSEL_2DF },
10148   { MASK_VSX, CODE_FOR_vector_select_v4sf, "__builtin_vsx_xxsel_4sf", VSX_BUILTIN_XXSEL_4SF },
10149   { MASK_VSX, CODE_FOR_vector_select_v4si, "__builtin_vsx_xxsel_4si", VSX_BUILTIN_XXSEL_4SI },
10150   { MASK_VSX, CODE_FOR_vector_select_v8hi, "__builtin_vsx_xxsel_8hi", VSX_BUILTIN_XXSEL_8HI },
10151   { MASK_VSX, CODE_FOR_vector_select_v16qi, "__builtin_vsx_xxsel_16qi", VSX_BUILTIN_XXSEL_16QI },
10152   { MASK_VSX, CODE_FOR_vector_select_v2di_uns, "__builtin_vsx_xxsel_2di_uns", VSX_BUILTIN_XXSEL_2DI_UNS },
10153   { MASK_VSX, CODE_FOR_vector_select_v4si_uns, "__builtin_vsx_xxsel_4si_uns", VSX_BUILTIN_XXSEL_4SI_UNS },
10154   { MASK_VSX, CODE_FOR_vector_select_v8hi_uns, "__builtin_vsx_xxsel_8hi_uns", VSX_BUILTIN_XXSEL_8HI_UNS },
10155   { MASK_VSX, CODE_FOR_vector_select_v16qi_uns, "__builtin_vsx_xxsel_16qi_uns", VSX_BUILTIN_XXSEL_16QI_UNS },
10156
10157   { MASK_VSX, CODE_FOR_altivec_vperm_v2di, "__builtin_vsx_vperm_2di", VSX_BUILTIN_VPERM_2DI },
10158   { MASK_VSX, CODE_FOR_altivec_vperm_v2df, "__builtin_vsx_vperm_2df", VSX_BUILTIN_VPERM_2DF },
10159   { MASK_VSX, CODE_FOR_altivec_vperm_v4sf, "__builtin_vsx_vperm_4sf", VSX_BUILTIN_VPERM_4SF },
10160   { MASK_VSX, CODE_FOR_altivec_vperm_v4si, "__builtin_vsx_vperm_4si", VSX_BUILTIN_VPERM_4SI },
10161   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi, "__builtin_vsx_vperm_8hi", VSX_BUILTIN_VPERM_8HI },
10162   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi, "__builtin_vsx_vperm_16qi", VSX_BUILTIN_VPERM_16QI },
10163   { MASK_VSX, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_vsx_vperm_2di_uns", VSX_BUILTIN_VPERM_2DI_UNS },
10164   { MASK_VSX, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_vsx_vperm_4si_uns", VSX_BUILTIN_VPERM_4SI_UNS },
10165   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_vsx_vperm_8hi_uns", VSX_BUILTIN_VPERM_8HI_UNS },
10166   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_vsx_vperm_16qi_uns", VSX_BUILTIN_VPERM_16QI_UNS },
10167
10168   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2df, "__builtin_vsx_xxpermdi_2df", VSX_BUILTIN_XXPERMDI_2DF },
10169   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2di, "__builtin_vsx_xxpermdi_2di", VSX_BUILTIN_XXPERMDI_2DI },
10170   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4sf, "__builtin_vsx_xxpermdi_4sf", VSX_BUILTIN_XXPERMDI_4SF },
10171   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4si, "__builtin_vsx_xxpermdi_4si", VSX_BUILTIN_XXPERMDI_4SI },
10172   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v8hi, "__builtin_vsx_xxpermdi_8hi", VSX_BUILTIN_XXPERMDI_8HI },
10173   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v16qi, "__builtin_vsx_xxpermdi_16qi", VSX_BUILTIN_XXPERMDI_16QI },
10174   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxpermdi", VSX_BUILTIN_VEC_XXPERMDI },
10175   { MASK_VSX, CODE_FOR_vsx_set_v2df, "__builtin_vsx_set_2df", VSX_BUILTIN_SET_2DF },
10176   { MASK_VSX, CODE_FOR_vsx_set_v2di, "__builtin_vsx_set_2di", VSX_BUILTIN_SET_2DI },
10177
10178   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2di, "__builtin_vsx_xxsldwi_2di", VSX_BUILTIN_XXSLDWI_2DI },
10179   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2df, "__builtin_vsx_xxsldwi_2df", VSX_BUILTIN_XXSLDWI_2DF },
10180   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4sf, "__builtin_vsx_xxsldwi_4sf", VSX_BUILTIN_XXSLDWI_4SF },
10181   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4si, "__builtin_vsx_xxsldwi_4si", VSX_BUILTIN_XXSLDWI_4SI },
10182   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v8hi, "__builtin_vsx_xxsldwi_8hi", VSX_BUILTIN_XXSLDWI_8HI },
10183   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v16qi, "__builtin_vsx_xxsldwi_16qi", VSX_BUILTIN_XXSLDWI_16QI },
10184   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxsldwi", VSX_BUILTIN_VEC_XXSLDWI },
10185
10186   { 0, CODE_FOR_fmsv2sf4, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
10187   { 0, CODE_FOR_fmav2sf4, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
10188   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
10189   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
10190   { 0, CODE_FOR_nfmsv2sf4, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
10191   { 0, CODE_FOR_nfmav2sf4, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
10192   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
10193   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
10194   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
10195 };
10196
10197 /* DST operations: void foo (void *, const int, const char).  */
10198
10199 static const struct builtin_description bdesc_dst[] =
10200 {
10201   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
10202   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
10203   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
10204   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
10205
10206   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
10207   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
10208   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
10209   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
10210 };
10211
10212 /* Simple binary operations: VECc = foo (VECa, VECb).  */
10213
10214 static struct builtin_description bdesc_2arg[] =
10215 {
10216   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
10217   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
10218   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
10219   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
10220   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
10221   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
10222   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
10223   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
10224   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
10225   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
10226   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
10227   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
10228   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
10229   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
10230   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
10231   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
10232   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
10233   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
10234   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
10235   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
10236   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
10237   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
10238   { MASK_ALTIVEC, CODE_FOR_vector_eqv16qi, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
10239   { MASK_ALTIVEC, CODE_FOR_vector_eqv8hi, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
10240   { MASK_ALTIVEC, CODE_FOR_vector_eqv4si, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
10241   { MASK_ALTIVEC, CODE_FOR_vector_eqv4sf, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
10242   { MASK_ALTIVEC, CODE_FOR_vector_gev4sf, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
10243   { MASK_ALTIVEC, CODE_FOR_vector_gtuv16qi, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
10244   { MASK_ALTIVEC, CODE_FOR_vector_gtv16qi, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
10245   { MASK_ALTIVEC, CODE_FOR_vector_gtuv8hi, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
10246   { MASK_ALTIVEC, CODE_FOR_vector_gtv8hi, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
10247   { MASK_ALTIVEC, CODE_FOR_vector_gtuv4si, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
10248   { MASK_ALTIVEC, CODE_FOR_vector_gtv4si, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
10249   { MASK_ALTIVEC, CODE_FOR_vector_gtv4sf, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
10250   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
10251   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
10252   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
10253   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
10254   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
10255   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
10256   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
10257   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
10258   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
10259   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
10260   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
10261   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
10262   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
10263   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
10264   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
10265   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
10266   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
10267   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
10268   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
10269   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
10270   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
10271   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
10272   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
10273   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub_uns", ALTIVEC_BUILTIN_VMULEUB_UNS },
10274   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
10275   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
10276   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh_uns", ALTIVEC_BUILTIN_VMULEUH_UNS },
10277   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
10278   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
10279   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub_uns", ALTIVEC_BUILTIN_VMULOUB_UNS },
10280   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
10281   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
10282   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh_uns", ALTIVEC_BUILTIN_VMULOUH_UNS },
10283   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
10284   { MASK_ALTIVEC, CODE_FOR_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
10285   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
10286   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
10287   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
10288   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
10289   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
10290   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
10291   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
10292   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
10293   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
10294   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
10295   { MASK_ALTIVEC, CODE_FOR_recipv4sf3, "__builtin_altivec_vrecipdivfp", ALTIVEC_BUILTIN_VRECIPFP },
10296   { MASK_ALTIVEC, CODE_FOR_vrotlv16qi3, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
10297   { MASK_ALTIVEC, CODE_FOR_vrotlv8hi3, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
10298   { MASK_ALTIVEC, CODE_FOR_vrotlv4si3, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
10299   { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
10300   { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
10301   { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
10302   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
10303   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
10304   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
10305   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
10306   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
10307   { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
10308   { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
10309   { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
10310   { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
10311   { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
10312   { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
10313   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
10314   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
10315   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
10316   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
10317   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
10318   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
10319   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
10320   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
10321   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
10322   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
10323   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
10324   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
10325   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
10326   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
10327   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
10328   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
10329   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
10330   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
10331   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
10332   { MASK_ALTIVEC, CODE_FOR_vector_copysignv4sf3, "__builtin_altivec_copysignfp", ALTIVEC_BUILTIN_COPYSIGN_V4SF },
10333
10334   { MASK_VSX, CODE_FOR_addv2df3, "__builtin_vsx_xvadddp", VSX_BUILTIN_XVADDDP },
10335   { MASK_VSX, CODE_FOR_subv2df3, "__builtin_vsx_xvsubdp", VSX_BUILTIN_XVSUBDP },
10336   { MASK_VSX, CODE_FOR_mulv2df3, "__builtin_vsx_xvmuldp", VSX_BUILTIN_XVMULDP },
10337   { MASK_VSX, CODE_FOR_divv2df3, "__builtin_vsx_xvdivdp", VSX_BUILTIN_XVDIVDP },
10338   { MASK_VSX, CODE_FOR_recipv2df3, "__builtin_vsx_xvrecipdivdp", VSX_BUILTIN_RECIP_V2DF },
10339   { MASK_VSX, CODE_FOR_sminv2df3, "__builtin_vsx_xvmindp", VSX_BUILTIN_XVMINDP },
10340   { MASK_VSX, CODE_FOR_smaxv2df3, "__builtin_vsx_xvmaxdp", VSX_BUILTIN_XVMAXDP },
10341   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fe, "__builtin_vsx_xvtdivdp_fe", VSX_BUILTIN_XVTDIVDP_FE },
10342   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fg, "__builtin_vsx_xvtdivdp_fg", VSX_BUILTIN_XVTDIVDP_FG },
10343   { MASK_VSX, CODE_FOR_vector_eqv2df, "__builtin_vsx_xvcmpeqdp", VSX_BUILTIN_XVCMPEQDP },
10344   { MASK_VSX, CODE_FOR_vector_gtv2df, "__builtin_vsx_xvcmpgtdp", VSX_BUILTIN_XVCMPGTDP },
10345   { MASK_VSX, CODE_FOR_vector_gev2df, "__builtin_vsx_xvcmpgedp", VSX_BUILTIN_XVCMPGEDP },
10346
10347   { MASK_VSX, CODE_FOR_addv4sf3, "__builtin_vsx_xvaddsp", VSX_BUILTIN_XVADDSP },
10348   { MASK_VSX, CODE_FOR_subv4sf3, "__builtin_vsx_xvsubsp", VSX_BUILTIN_XVSUBSP },
10349   { MASK_VSX, CODE_FOR_mulv4sf3, "__builtin_vsx_xvmulsp", VSX_BUILTIN_XVMULSP },
10350   { MASK_VSX, CODE_FOR_divv4sf3, "__builtin_vsx_xvdivsp", VSX_BUILTIN_XVDIVSP },
10351   { MASK_VSX, CODE_FOR_recipv4sf3, "__builtin_vsx_xvrecipdivsp", VSX_BUILTIN_RECIP_V4SF },
10352   { MASK_VSX, CODE_FOR_sminv4sf3, "__builtin_vsx_xvminsp", VSX_BUILTIN_XVMINSP },
10353   { MASK_VSX, CODE_FOR_smaxv4sf3, "__builtin_vsx_xvmaxsp", VSX_BUILTIN_XVMAXSP },
10354   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fe, "__builtin_vsx_xvtdivsp_fe", VSX_BUILTIN_XVTDIVSP_FE },
10355   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fg, "__builtin_vsx_xvtdivsp_fg", VSX_BUILTIN_XVTDIVSP_FG },
10356   { MASK_VSX, CODE_FOR_vector_eqv4sf, "__builtin_vsx_xvcmpeqsp", VSX_BUILTIN_XVCMPEQSP },
10357   { MASK_VSX, CODE_FOR_vector_gtv4sf, "__builtin_vsx_xvcmpgtsp", VSX_BUILTIN_XVCMPGTSP },
10358   { MASK_VSX, CODE_FOR_vector_gev4sf, "__builtin_vsx_xvcmpgesp", VSX_BUILTIN_XVCMPGESP },
10359
10360   { MASK_VSX, CODE_FOR_smindf3, "__builtin_vsx_xsmindp", VSX_BUILTIN_XSMINDP },
10361   { MASK_VSX, CODE_FOR_smaxdf3, "__builtin_vsx_xsmaxdp", VSX_BUILTIN_XSMAXDP },
10362   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fe, "__builtin_vsx_xstdivdp_fe", VSX_BUILTIN_XSTDIVDP_FE },
10363   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fg, "__builtin_vsx_xstdivdp_fg", VSX_BUILTIN_XSTDIVDP_FG },
10364   { MASK_VSX, CODE_FOR_vector_copysignv2df3, "__builtin_vsx_cpsgndp", VSX_BUILTIN_CPSGNDP },
10365   { MASK_VSX, CODE_FOR_vector_copysignv4sf3, "__builtin_vsx_cpsgnsp", VSX_BUILTIN_CPSGNSP },
10366
10367   { MASK_VSX, CODE_FOR_vsx_concat_v2df, "__builtin_vsx_concat_2df", VSX_BUILTIN_CONCAT_2DF },
10368   { MASK_VSX, CODE_FOR_vsx_concat_v2di, "__builtin_vsx_concat_2di", VSX_BUILTIN_CONCAT_2DI },
10369   { MASK_VSX, CODE_FOR_vsx_splat_v2df, "__builtin_vsx_splat_2df", VSX_BUILTIN_SPLAT_2DF },
10370   { MASK_VSX, CODE_FOR_vsx_splat_v2di, "__builtin_vsx_splat_2di", VSX_BUILTIN_SPLAT_2DI },
10371   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4sf, "__builtin_vsx_xxmrghw", VSX_BUILTIN_XXMRGHW_4SF },
10372   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
10373   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
10374   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
10375   { MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
10376   { MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
10377   { MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
10378   { MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
10379
10380   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
10381   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
10382   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
10383   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
10384   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
10385   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
10386   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
10387   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
10388   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
10389   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
10390   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
10391   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
10392   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
10393   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
10394   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
10395   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
10396   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
10397   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
10398   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
10399   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
10400   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
10401   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
10402   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
10403   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
10404   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
10405   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
10406   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
10407   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
10408   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
10409   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
10410   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
10411   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
10412   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
10413   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
10414   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
10415   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
10416   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
10417   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
10418   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
10419   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_copysign", ALTIVEC_BUILTIN_VEC_COPYSIGN },
10420   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
10421   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
10422   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
10423   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
10424   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
10425   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
10426   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
10427   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
10428   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
10429   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
10430   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
10431   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
10432   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
10433   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
10434   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
10435   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
10436   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
10437   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
10438   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
10439   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
10440   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
10441   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
10442   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
10443   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
10444   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
10445   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
10446   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
10447   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
10448   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
10449   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
10450   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
10451   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
10452   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
10453   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
10454   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
10455   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
10456   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
10457   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
10458   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
10459   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
10460   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
10461   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
10462   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
10463   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
10464   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
10465   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
10466   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
10467   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
10468   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_recipdiv", ALTIVEC_BUILTIN_VEC_RECIP },
10469   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
10470   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
10471   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
10472   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
10473   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
10474   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
10475   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
10476   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
10477   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
10478   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
10479   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
10480   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
10481   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
10482   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
10483   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
10484   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
10485   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
10486   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
10487   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
10488   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
10489   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
10490   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
10491   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
10492   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
10493   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
10494   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
10495   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
10496   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
10497   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
10498   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
10499   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
10500   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
10501   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
10502   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
10503   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
10504   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
10505   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
10506   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
10507   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
10508   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
10509
10510   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_mul", VSX_BUILTIN_VEC_MUL },
10511   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_div", VSX_BUILTIN_VEC_DIV },
10512
10513   { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
10514   { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
10515   { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
10516   { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
10517   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
10518   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
10519   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
10520   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
10521   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
10522   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
10523
10524   /* Place holder, leave as first spe builtin.  */
10525   { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
10526   { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
10527   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
10528   { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
10529   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
10530   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
10531   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
10532   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
10533   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
10534   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
10535   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
10536   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
10537   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
10538   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
10539   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
10540   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
10541   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
10542   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
10543   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
10544   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
10545   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
10546   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
10547   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
10548   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
10549   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
10550   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
10551   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
10552   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
10553   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
10554   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
10555   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
10556   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
10557   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
10558   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
10559   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
10560   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
10561   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
10562   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
10563   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
10564   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
10565   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
10566   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
10567   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
10568   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
10569   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
10570   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
10571   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
10572   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
10573   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
10574   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
10575   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
10576   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
10577   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
10578   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
10579   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
10580   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
10581   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
10582   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
10583   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
10584   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
10585   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
10586   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
10587   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
10588   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
10589   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
10590   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
10591   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
10592   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
10593   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
10594   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
10595   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
10596   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
10597   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
10598   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
10599   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
10600   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
10601   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
10602   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
10603   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
10604   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
10605   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
10606   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
10607   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
10608   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
10609   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
10610   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
10611   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
10612   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
10613   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
10614   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
10615   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
10616   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
10617   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
10618   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
10619   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
10620   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
10621   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
10622   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
10623   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
10624   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
10625   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
10626   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
10627   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
10628   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
10629   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
10630   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
10631   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
10632   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
10633   { 0, CODE_FOR_subv2si3, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
10634
10635   /* SPE binary operations expecting a 5-bit unsigned literal.  */
10636   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
10637
10638   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
10639   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
10640   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
10641   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
10642   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
10643   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
10644   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
10645   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
10646   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
10647   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
10648   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
10649   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
10650   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
10651   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
10652   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
10653   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
10654   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
10655   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
10656   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
10657   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
10658   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
10659   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
10660   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
10661   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
10662   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
10663   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
10664
10665   /* Place-holder.  Leave as last binary SPE builtin.  */
10666   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
10667 };
10668
10669 /* AltiVec predicates.  */
10670
10671 struct builtin_description_predicates
10672 {
10673   const unsigned int mask;
10674   const enum insn_code icode;
10675   const char *const name;
10676   const enum rs6000_builtins code;
10677 };
10678
10679 static const struct builtin_description_predicates bdesc_altivec_preds[] =
10680 {
10681   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p",
10682     ALTIVEC_BUILTIN_VCMPBFP_P },
10683   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_eq_v4sf_p,
10684     "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
10685   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_ge_v4sf_p,
10686     "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
10687   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_gt_v4sf_p,
10688     "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
10689   { MASK_ALTIVEC, CODE_FOR_vector_eq_v4si_p, "__builtin_altivec_vcmpequw_p",
10690     ALTIVEC_BUILTIN_VCMPEQUW_P },
10691   { MASK_ALTIVEC, CODE_FOR_vector_gt_v4si_p, "__builtin_altivec_vcmpgtsw_p",
10692     ALTIVEC_BUILTIN_VCMPGTSW_P },
10693   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v4si_p, "__builtin_altivec_vcmpgtuw_p",
10694     ALTIVEC_BUILTIN_VCMPGTUW_P },
10695   { MASK_ALTIVEC, CODE_FOR_vector_eq_v8hi_p, "__builtin_altivec_vcmpequh_p",
10696     ALTIVEC_BUILTIN_VCMPEQUH_P },
10697   { MASK_ALTIVEC, CODE_FOR_vector_gt_v8hi_p, "__builtin_altivec_vcmpgtsh_p",
10698     ALTIVEC_BUILTIN_VCMPGTSH_P },
10699   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v8hi_p, "__builtin_altivec_vcmpgtuh_p",
10700     ALTIVEC_BUILTIN_VCMPGTUH_P },
10701   { MASK_ALTIVEC, CODE_FOR_vector_eq_v16qi_p, "__builtin_altivec_vcmpequb_p",
10702     ALTIVEC_BUILTIN_VCMPEQUB_P },
10703   { MASK_ALTIVEC, CODE_FOR_vector_gt_v16qi_p, "__builtin_altivec_vcmpgtsb_p",
10704     ALTIVEC_BUILTIN_VCMPGTSB_P },
10705   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v16qi_p, "__builtin_altivec_vcmpgtub_p",
10706     ALTIVEC_BUILTIN_VCMPGTUB_P },
10707
10708   { MASK_VSX, CODE_FOR_vector_eq_v4sf_p, "__builtin_vsx_xvcmpeqsp_p",
10709     VSX_BUILTIN_XVCMPEQSP_P },
10710   { MASK_VSX, CODE_FOR_vector_ge_v4sf_p, "__builtin_vsx_xvcmpgesp_p",
10711     VSX_BUILTIN_XVCMPGESP_P },
10712   { MASK_VSX, CODE_FOR_vector_gt_v4sf_p, "__builtin_vsx_xvcmpgtsp_p",
10713     VSX_BUILTIN_XVCMPGTSP_P },
10714   { MASK_VSX, CODE_FOR_vector_eq_v2df_p, "__builtin_vsx_xvcmpeqdp_p",
10715     VSX_BUILTIN_XVCMPEQDP_P },
10716   { MASK_VSX, CODE_FOR_vector_ge_v2df_p, "__builtin_vsx_xvcmpgedp_p",
10717     VSX_BUILTIN_XVCMPGEDP_P },
10718   { MASK_VSX, CODE_FOR_vector_gt_v2df_p, "__builtin_vsx_xvcmpgtdp_p",
10719     VSX_BUILTIN_XVCMPGTDP_P },
10720
10721   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpeq_p",
10722     ALTIVEC_BUILTIN_VCMPEQ_P },
10723   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpgt_p",
10724     ALTIVEC_BUILTIN_VCMPGT_P },
10725   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpge_p",
10726     ALTIVEC_BUILTIN_VCMPGE_P }
10727 };
10728
10729 /* SPE predicates.  */
10730 static struct builtin_description bdesc_spe_predicates[] =
10731 {
10732   /* Place-holder.  Leave as first.  */
10733   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
10734   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
10735   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
10736   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
10737   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
10738   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
10739   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
10740   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
10741   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
10742   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
10743   /* Place-holder.  Leave as last.  */
10744   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
10745 };
10746
10747 /* SPE evsel predicates.  */
10748 static struct builtin_description bdesc_spe_evsel[] =
10749 {
10750   /* Place-holder.  Leave as first.  */
10751   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
10752   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
10753   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
10754   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
10755   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
10756   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
10757   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
10758   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
10759   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
10760   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
10761   /* Place-holder.  Leave as last.  */
10762   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
10763 };
10764
10765 /* PAIRED predicates.  */
10766 static const struct builtin_description bdesc_paired_preds[] =
10767 {
10768   /* Place-holder.  Leave as first.  */
10769   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
10770   /* Place-holder.  Leave as last.  */
10771   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
10772 };
10773
10774 /* ABS* operations.  */
10775
10776 static const struct builtin_description bdesc_abs[] =
10777 {
10778   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
10779   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
10780   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
10781   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
10782   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
10783   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
10784   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI },
10785   { MASK_VSX, CODE_FOR_absv2df2, "__builtin_vsx_xvabsdp", VSX_BUILTIN_XVABSDP },
10786   { MASK_VSX, CODE_FOR_vsx_nabsv2df2, "__builtin_vsx_xvnabsdp", VSX_BUILTIN_XVNABSDP },
10787   { MASK_VSX, CODE_FOR_absv4sf2, "__builtin_vsx_xvabssp", VSX_BUILTIN_XVABSSP },
10788   { MASK_VSX, CODE_FOR_vsx_nabsv4sf2, "__builtin_vsx_xvnabssp", VSX_BUILTIN_XVNABSSP },
10789 };
10790
10791 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
10792    foo (VECa).  */
10793
10794 static struct builtin_description bdesc_1arg[] =
10795 {
10796   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
10797   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
10798   { MASK_ALTIVEC, CODE_FOR_rev4sf2, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
10799   { MASK_ALTIVEC, CODE_FOR_vector_floorv4sf2, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
10800   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
10801   { MASK_ALTIVEC, CODE_FOR_vector_ceilv4sf2, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
10802   { MASK_ALTIVEC, CODE_FOR_vector_btruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
10803   { MASK_ALTIVEC, CODE_FOR_rsqrtv4sf2, "__builtin_altivec_vrsqrtfp", ALTIVEC_BUILTIN_VRSQRTFP },
10804   { MASK_ALTIVEC, CODE_FOR_rsqrtev4sf2, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
10805   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
10806   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
10807   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
10808   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
10809   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
10810   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
10811   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
10812   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
10813   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
10814
10815   { MASK_VSX, CODE_FOR_negv2df2, "__builtin_vsx_xvnegdp", VSX_BUILTIN_XVNEGDP },
10816   { MASK_VSX, CODE_FOR_sqrtv2df2, "__builtin_vsx_xvsqrtdp", VSX_BUILTIN_XVSQRTDP },
10817   { MASK_VSX, CODE_FOR_rsqrtv2df2, "__builtin_vsx_xvrsqrtdp", VSX_BUILTIN_VEC_RSQRT_V2DF },
10818   { MASK_VSX, CODE_FOR_rsqrtev2df2, "__builtin_vsx_xvrsqrtedp", VSX_BUILTIN_XVRSQRTEDP },
10819   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fe, "__builtin_vsx_xvtsqrtdp_fe", VSX_BUILTIN_XVTSQRTDP_FE },
10820   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fg, "__builtin_vsx_xvtsqrtdp_fg", VSX_BUILTIN_XVTSQRTDP_FG },
10821   { MASK_VSX, CODE_FOR_vsx_frev2df2, "__builtin_vsx_xvredp", VSX_BUILTIN_XVREDP },
10822
10823   { MASK_VSX, CODE_FOR_negv4sf2, "__builtin_vsx_xvnegsp", VSX_BUILTIN_XVNEGSP },
10824   { MASK_VSX, CODE_FOR_sqrtv4sf2, "__builtin_vsx_xvsqrtsp", VSX_BUILTIN_XVSQRTSP },
10825   { MASK_VSX, CODE_FOR_rsqrtv4sf2, "__builtin_vsx_xvrsqrtsp", VSX_BUILTIN_VEC_RSQRT_V4SF },
10826   { MASK_VSX, CODE_FOR_rsqrtev4sf2, "__builtin_vsx_xvrsqrtesp", VSX_BUILTIN_XVRSQRTESP },
10827   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fe, "__builtin_vsx_xvtsqrtsp_fe", VSX_BUILTIN_XVTSQRTSP_FE },
10828   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fg, "__builtin_vsx_xvtsqrtsp_fg", VSX_BUILTIN_XVTSQRTSP_FG },
10829   { MASK_VSX, CODE_FOR_vsx_frev4sf2, "__builtin_vsx_xvresp", VSX_BUILTIN_XVRESP },
10830
10831   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvdpsp", VSX_BUILTIN_XSCVDPSP },
10832   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvspdp", VSX_BUILTIN_XSCVSPDP },
10833   { MASK_VSX, CODE_FOR_vsx_xvcvdpsp, "__builtin_vsx_xvcvdpsp", VSX_BUILTIN_XVCVDPSP },
10834   { MASK_VSX, CODE_FOR_vsx_xvcvspdp, "__builtin_vsx_xvcvspdp", VSX_BUILTIN_XVCVSPDP },
10835   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fe, "__builtin_vsx_xstsqrtdp_fe", VSX_BUILTIN_XSTSQRTDP_FE },
10836   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fg, "__builtin_vsx_xstsqrtdp_fg", VSX_BUILTIN_XSTSQRTDP_FG },
10837
10838   { MASK_VSX, CODE_FOR_vsx_fix_truncv2dfv2di2, "__builtin_vsx_xvcvdpsxds", VSX_BUILTIN_XVCVDPSXDS },
10839   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds", VSX_BUILTIN_XVCVDPUXDS },
10840   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds_uns", VSX_BUILTIN_XVCVDPUXDS_UNS },
10841   { MASK_VSX, CODE_FOR_vsx_floatv2div2df2, "__builtin_vsx_xvcvsxddp", VSX_BUILTIN_XVCVSXDDP },
10842   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp", VSX_BUILTIN_XVCVUXDDP },
10843   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp_uns", VSX_BUILTIN_XVCVUXDDP_UNS },
10844
10845   { MASK_VSX, CODE_FOR_vsx_fix_truncv4sfv4si2, "__builtin_vsx_xvcvspsxws", VSX_BUILTIN_XVCVSPSXWS },
10846   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv4sfv4si2, "__builtin_vsx_xvcvspuxws", VSX_BUILTIN_XVCVSPUXWS },
10847   { MASK_VSX, CODE_FOR_vsx_floatv4siv4sf2, "__builtin_vsx_xvcvsxwsp", VSX_BUILTIN_XVCVSXWSP },
10848   { MASK_VSX, CODE_FOR_vsx_floatunsv4siv4sf2, "__builtin_vsx_xvcvuxwsp", VSX_BUILTIN_XVCVUXWSP },
10849
10850   { MASK_VSX, CODE_FOR_vsx_xvcvdpsxws, "__builtin_vsx_xvcvdpsxws", VSX_BUILTIN_XVCVDPSXWS },
10851   { MASK_VSX, CODE_FOR_vsx_xvcvdpuxws, "__builtin_vsx_xvcvdpuxws", VSX_BUILTIN_XVCVDPUXWS },
10852   { MASK_VSX, CODE_FOR_vsx_xvcvsxwdp, "__builtin_vsx_xvcvsxwdp", VSX_BUILTIN_XVCVSXWDP },
10853   { MASK_VSX, CODE_FOR_vsx_xvcvuxwdp, "__builtin_vsx_xvcvuxwdp", VSX_BUILTIN_XVCVUXWDP },
10854   { MASK_VSX, CODE_FOR_vsx_xvrdpi, "__builtin_vsx_xvrdpi", VSX_BUILTIN_XVRDPI },
10855   { MASK_VSX, CODE_FOR_vsx_xvrdpic, "__builtin_vsx_xvrdpic", VSX_BUILTIN_XVRDPIC },
10856   { MASK_VSX, CODE_FOR_vsx_floorv2df2, "__builtin_vsx_xvrdpim", VSX_BUILTIN_XVRDPIM },
10857   { MASK_VSX, CODE_FOR_vsx_ceilv2df2, "__builtin_vsx_xvrdpip", VSX_BUILTIN_XVRDPIP },
10858   { MASK_VSX, CODE_FOR_vsx_btruncv2df2, "__builtin_vsx_xvrdpiz", VSX_BUILTIN_XVRDPIZ },
10859
10860   { MASK_VSX, CODE_FOR_vsx_xvcvspsxds, "__builtin_vsx_xvcvspsxds", VSX_BUILTIN_XVCVSPSXDS },
10861   { MASK_VSX, CODE_FOR_vsx_xvcvspuxds, "__builtin_vsx_xvcvspuxds", VSX_BUILTIN_XVCVSPUXDS },
10862   { MASK_VSX, CODE_FOR_vsx_xvcvsxdsp, "__builtin_vsx_xvcvsxdsp", VSX_BUILTIN_XVCVSXDSP },
10863   { MASK_VSX, CODE_FOR_vsx_xvcvuxdsp, "__builtin_vsx_xvcvuxdsp", VSX_BUILTIN_XVCVUXDSP },
10864   { MASK_VSX, CODE_FOR_vsx_xvrspi, "__builtin_vsx_xvrspi", VSX_BUILTIN_XVRSPI },
10865   { MASK_VSX, CODE_FOR_vsx_xvrspic, "__builtin_vsx_xvrspic", VSX_BUILTIN_XVRSPIC },
10866   { MASK_VSX, CODE_FOR_vsx_floorv4sf2, "__builtin_vsx_xvrspim", VSX_BUILTIN_XVRSPIM },
10867   { MASK_VSX, CODE_FOR_vsx_ceilv4sf2, "__builtin_vsx_xvrspip", VSX_BUILTIN_XVRSPIP },
10868   { MASK_VSX, CODE_FOR_vsx_btruncv4sf2, "__builtin_vsx_xvrspiz", VSX_BUILTIN_XVRSPIZ },
10869
10870   { MASK_VSX, CODE_FOR_vsx_xsrdpi, "__builtin_vsx_xsrdpi", VSX_BUILTIN_XSRDPI },
10871   { MASK_VSX, CODE_FOR_vsx_xsrdpic, "__builtin_vsx_xsrdpic", VSX_BUILTIN_XSRDPIC },
10872   { MASK_VSX, CODE_FOR_vsx_floordf2, "__builtin_vsx_xsrdpim", VSX_BUILTIN_XSRDPIM },
10873   { MASK_VSX, CODE_FOR_vsx_ceildf2, "__builtin_vsx_xsrdpip", VSX_BUILTIN_XSRDPIP },
10874   { MASK_VSX, CODE_FOR_vsx_btruncdf2, "__builtin_vsx_xsrdpiz", VSX_BUILTIN_XSRDPIZ },
10875
10876   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
10877   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
10878   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
10879   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
10880   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
10881   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
10882   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
10883   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
10884   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
10885   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrt", ALTIVEC_BUILTIN_VEC_RSQRT },
10886   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
10887   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
10888   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
10889   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
10890   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
10891   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
10892   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
10893   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
10894   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
10895   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
10896
10897   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nearbyint", ALTIVEC_BUILTIN_VEC_NEARBYINT },
10898   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_rint", ALTIVEC_BUILTIN_VEC_RINT },
10899   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sqrt", ALTIVEC_BUILTIN_VEC_SQRT },
10900
10901   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_floatv4siv4sf2, "__builtin_vec_float_sisf", VECTOR_BUILTIN_FLOAT_V4SI_V4SF },
10902   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_unsigned_floatv4siv4sf2, "__builtin_vec_uns_float_sisf", VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF },
10903   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fix_truncv4sfv4si2, "__builtin_vec_fix_sfsi", VECTOR_BUILTIN_FIX_V4SF_V4SI },
10904   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fixuns_truncv4sfv4si2, "__builtin_vec_fixuns_sfsi", VECTOR_BUILTIN_FIXUNS_V4SF_V4SI },
10905
10906   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
10907      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
10908   { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
10909   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
10910   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
10911   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
10912   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
10913   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
10914   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
10915   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
10916   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
10917   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
10918   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
10919   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
10920   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
10921   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
10922   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
10923   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
10924   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
10925   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
10926   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
10927   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
10928   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
10929   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
10930   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
10931   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
10932   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
10933   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
10934   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
10935   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
10936
10937   /* Place-holder.  Leave as last unary SPE builtin.  */
10938   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
10939
10940   { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
10941   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
10942   { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
10943   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
10944   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
10945 };
10946
10947 static rtx
10948 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
10949 {
10950   rtx pat;
10951   tree arg0 = CALL_EXPR_ARG (exp, 0);
10952   rtx op0 = expand_normal (arg0);
10953   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10954   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10955
10956   if (icode == CODE_FOR_nothing)
10957     /* Builtin not supported on this processor.  */
10958     return 0;
10959
10960   /* If we got invalid arguments bail out before generating bad rtl.  */
10961   if (arg0 == error_mark_node)
10962     return const0_rtx;
10963
10964   if (icode == CODE_FOR_altivec_vspltisb
10965       || icode == CODE_FOR_altivec_vspltish
10966       || icode == CODE_FOR_altivec_vspltisw
10967       || icode == CODE_FOR_spe_evsplatfi
10968       || icode == CODE_FOR_spe_evsplati)
10969     {
10970       /* Only allow 5-bit *signed* literals.  */
10971       if (GET_CODE (op0) != CONST_INT
10972           || INTVAL (op0) > 15
10973           || INTVAL (op0) < -16)
10974         {
10975           error ("argument 1 must be a 5-bit signed literal");
10976           return const0_rtx;
10977         }
10978     }
10979
10980   if (target == 0
10981       || GET_MODE (target) != tmode
10982       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10983     target = gen_reg_rtx (tmode);
10984
10985   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10986     op0 = copy_to_mode_reg (mode0, op0);
10987
10988   pat = GEN_FCN (icode) (target, op0);
10989   if (! pat)
10990     return 0;
10991   emit_insn (pat);
10992
10993   return target;
10994 }
10995
10996 static rtx
10997 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
10998 {
10999   rtx pat, scratch1, scratch2;
11000   tree arg0 = CALL_EXPR_ARG (exp, 0);
11001   rtx op0 = expand_normal (arg0);
11002   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11003   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11004
11005   /* If we have invalid arguments, bail out before generating bad rtl.  */
11006   if (arg0 == error_mark_node)
11007     return const0_rtx;
11008
11009   if (target == 0
11010       || GET_MODE (target) != tmode
11011       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11012     target = gen_reg_rtx (tmode);
11013
11014   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11015     op0 = copy_to_mode_reg (mode0, op0);
11016
11017   scratch1 = gen_reg_rtx (mode0);
11018   scratch2 = gen_reg_rtx (mode0);
11019
11020   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
11021   if (! pat)
11022     return 0;
11023   emit_insn (pat);
11024
11025   return target;
11026 }
11027
11028 static rtx
11029 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
11030 {
11031   rtx pat;
11032   tree arg0 = CALL_EXPR_ARG (exp, 0);
11033   tree arg1 = CALL_EXPR_ARG (exp, 1);
11034   rtx op0 = expand_normal (arg0);
11035   rtx op1 = expand_normal (arg1);
11036   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11037   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11038   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11039
11040   if (icode == CODE_FOR_nothing)
11041     /* Builtin not supported on this processor.  */
11042     return 0;
11043
11044   /* If we got invalid arguments bail out before generating bad rtl.  */
11045   if (arg0 == error_mark_node || arg1 == error_mark_node)
11046     return const0_rtx;
11047
11048   if (icode == CODE_FOR_altivec_vcfux
11049       || icode == CODE_FOR_altivec_vcfsx
11050       || icode == CODE_FOR_altivec_vctsxs
11051       || icode == CODE_FOR_altivec_vctuxs
11052       || icode == CODE_FOR_altivec_vspltb
11053       || icode == CODE_FOR_altivec_vsplth
11054       || icode == CODE_FOR_altivec_vspltw
11055       || icode == CODE_FOR_spe_evaddiw
11056       || icode == CODE_FOR_spe_evldd
11057       || icode == CODE_FOR_spe_evldh
11058       || icode == CODE_FOR_spe_evldw
11059       || icode == CODE_FOR_spe_evlhhesplat
11060       || icode == CODE_FOR_spe_evlhhossplat
11061       || icode == CODE_FOR_spe_evlhhousplat
11062       || icode == CODE_FOR_spe_evlwhe
11063       || icode == CODE_FOR_spe_evlwhos
11064       || icode == CODE_FOR_spe_evlwhou
11065       || icode == CODE_FOR_spe_evlwhsplat
11066       || icode == CODE_FOR_spe_evlwwsplat
11067       || icode == CODE_FOR_spe_evrlwi
11068       || icode == CODE_FOR_spe_evslwi
11069       || icode == CODE_FOR_spe_evsrwis
11070       || icode == CODE_FOR_spe_evsubifw
11071       || icode == CODE_FOR_spe_evsrwiu)
11072     {
11073       /* Only allow 5-bit unsigned literals.  */
11074       STRIP_NOPS (arg1);
11075       if (TREE_CODE (arg1) != INTEGER_CST
11076           || TREE_INT_CST_LOW (arg1) & ~0x1f)
11077         {
11078           error ("argument 2 must be a 5-bit unsigned literal");
11079           return const0_rtx;
11080         }
11081     }
11082
11083   if (target == 0
11084       || GET_MODE (target) != tmode
11085       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11086     target = gen_reg_rtx (tmode);
11087
11088   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11089     op0 = copy_to_mode_reg (mode0, op0);
11090   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11091     op1 = copy_to_mode_reg (mode1, op1);
11092
11093   pat = GEN_FCN (icode) (target, op0, op1);
11094   if (! pat)
11095     return 0;
11096   emit_insn (pat);
11097
11098   return target;
11099 }
11100
11101 static rtx
11102 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11103 {
11104   rtx pat, scratch;
11105   tree cr6_form = CALL_EXPR_ARG (exp, 0);
11106   tree arg0 = CALL_EXPR_ARG (exp, 1);
11107   tree arg1 = CALL_EXPR_ARG (exp, 2);
11108   rtx op0 = expand_normal (arg0);
11109   rtx op1 = expand_normal (arg1);
11110   enum machine_mode tmode = SImode;
11111   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11112   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11113   int cr6_form_int;
11114
11115   if (TREE_CODE (cr6_form) != INTEGER_CST)
11116     {
11117       error ("argument 1 of __builtin_altivec_predicate must be a constant");
11118       return const0_rtx;
11119     }
11120   else
11121     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
11122
11123   gcc_assert (mode0 == mode1);
11124
11125   /* If we have invalid arguments, bail out before generating bad rtl.  */
11126   if (arg0 == error_mark_node || arg1 == error_mark_node)
11127     return const0_rtx;
11128
11129   if (target == 0
11130       || GET_MODE (target) != tmode
11131       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11132     target = gen_reg_rtx (tmode);
11133
11134   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11135     op0 = copy_to_mode_reg (mode0, op0);
11136   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11137     op1 = copy_to_mode_reg (mode1, op1);
11138
11139   scratch = gen_reg_rtx (mode0);
11140
11141   pat = GEN_FCN (icode) (scratch, op0, op1);
11142   if (! pat)
11143     return 0;
11144   emit_insn (pat);
11145
11146   /* The vec_any* and vec_all* predicates use the same opcodes for two
11147      different operations, but the bits in CR6 will be different
11148      depending on what information we want.  So we have to play tricks
11149      with CR6 to get the right bits out.
11150
11151      If you think this is disgusting, look at the specs for the
11152      AltiVec predicates.  */
11153
11154   switch (cr6_form_int)
11155     {
11156     case 0:
11157       emit_insn (gen_cr6_test_for_zero (target));
11158       break;
11159     case 1:
11160       emit_insn (gen_cr6_test_for_zero_reverse (target));
11161       break;
11162     case 2:
11163       emit_insn (gen_cr6_test_for_lt (target));
11164       break;
11165     case 3:
11166       emit_insn (gen_cr6_test_for_lt_reverse (target));
11167       break;
11168     default:
11169       error ("argument 1 of __builtin_altivec_predicate is out of range");
11170       break;
11171     }
11172
11173   return target;
11174 }
11175
11176 static rtx
11177 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
11178 {
11179   rtx pat, addr;
11180   tree arg0 = CALL_EXPR_ARG (exp, 0);
11181   tree arg1 = CALL_EXPR_ARG (exp, 1);
11182   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11183   enum machine_mode mode0 = Pmode;
11184   enum machine_mode mode1 = Pmode;
11185   rtx op0 = expand_normal (arg0);
11186   rtx op1 = expand_normal (arg1);
11187
11188   if (icode == CODE_FOR_nothing)
11189     /* Builtin not supported on this processor.  */
11190     return 0;
11191
11192   /* If we got invalid arguments bail out before generating bad rtl.  */
11193   if (arg0 == error_mark_node || arg1 == error_mark_node)
11194     return const0_rtx;
11195
11196   if (target == 0
11197       || GET_MODE (target) != tmode
11198       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11199     target = gen_reg_rtx (tmode);
11200
11201   op1 = copy_to_mode_reg (mode1, op1);
11202
11203   if (op0 == const0_rtx)
11204     {
11205       addr = gen_rtx_MEM (tmode, op1);
11206     }
11207   else
11208     {
11209       op0 = copy_to_mode_reg (mode0, op0);
11210       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
11211     }
11212
11213   pat = GEN_FCN (icode) (target, addr);
11214
11215   if (! pat)
11216     return 0;
11217   emit_insn (pat);
11218
11219   return target;
11220 }
11221
11222 static rtx
11223 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
11224 {
11225   rtx pat, addr;
11226   tree arg0 = CALL_EXPR_ARG (exp, 0);
11227   tree arg1 = CALL_EXPR_ARG (exp, 1);
11228   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11229   enum machine_mode mode0 = Pmode;
11230   enum machine_mode mode1 = Pmode;
11231   rtx op0 = expand_normal (arg0);
11232   rtx op1 = expand_normal (arg1);
11233
11234   if (icode == CODE_FOR_nothing)
11235     /* Builtin not supported on this processor.  */
11236     return 0;
11237
11238   /* If we got invalid arguments bail out before generating bad rtl.  */
11239   if (arg0 == error_mark_node || arg1 == error_mark_node)
11240     return const0_rtx;
11241
11242   if (target == 0
11243       || GET_MODE (target) != tmode
11244       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11245     target = gen_reg_rtx (tmode);
11246
11247   op1 = copy_to_mode_reg (mode1, op1);
11248
11249   if (op0 == const0_rtx)
11250     {
11251       addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
11252     }
11253   else
11254     {
11255       op0 = copy_to_mode_reg (mode0, op0);
11256       addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
11257     }
11258
11259   pat = GEN_FCN (icode) (target, addr);
11260
11261   if (! pat)
11262     return 0;
11263   emit_insn (pat);
11264
11265   return target;
11266 }
11267
11268 static rtx
11269 spe_expand_stv_builtin (enum insn_code icode, tree exp)
11270 {
11271   tree arg0 = CALL_EXPR_ARG (exp, 0);
11272   tree arg1 = CALL_EXPR_ARG (exp, 1);
11273   tree arg2 = CALL_EXPR_ARG (exp, 2);
11274   rtx op0 = expand_normal (arg0);
11275   rtx op1 = expand_normal (arg1);
11276   rtx op2 = expand_normal (arg2);
11277   rtx pat;
11278   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
11279   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
11280   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
11281
11282   /* Invalid arguments.  Bail before doing anything stoopid!  */
11283   if (arg0 == error_mark_node
11284       || arg1 == error_mark_node
11285       || arg2 == error_mark_node)
11286     return const0_rtx;
11287
11288   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
11289     op0 = copy_to_mode_reg (mode2, op0);
11290   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
11291     op1 = copy_to_mode_reg (mode0, op1);
11292   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
11293     op2 = copy_to_mode_reg (mode1, op2);
11294
11295   pat = GEN_FCN (icode) (op1, op2, op0);
11296   if (pat)
11297     emit_insn (pat);
11298   return NULL_RTX;
11299 }
11300
11301 static rtx
11302 paired_expand_stv_builtin (enum insn_code icode, tree exp)
11303 {
11304   tree arg0 = CALL_EXPR_ARG (exp, 0);
11305   tree arg1 = CALL_EXPR_ARG (exp, 1);
11306   tree arg2 = CALL_EXPR_ARG (exp, 2);
11307   rtx op0 = expand_normal (arg0);
11308   rtx op1 = expand_normal (arg1);
11309   rtx op2 = expand_normal (arg2);
11310   rtx pat, addr;
11311   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11312   enum machine_mode mode1 = Pmode;
11313   enum machine_mode mode2 = Pmode;
11314
11315   /* Invalid arguments.  Bail before doing anything stoopid!  */
11316   if (arg0 == error_mark_node
11317       || arg1 == error_mark_node
11318       || arg2 == error_mark_node)
11319     return const0_rtx;
11320
11321   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
11322     op0 = copy_to_mode_reg (tmode, op0);
11323
11324   op2 = copy_to_mode_reg (mode2, op2);
11325
11326   if (op1 == const0_rtx)
11327     {
11328       addr = gen_rtx_MEM (tmode, op2);
11329     }
11330   else
11331     {
11332       op1 = copy_to_mode_reg (mode1, op1);
11333       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
11334     }
11335
11336   pat = GEN_FCN (icode) (addr, op0);
11337   if (pat)
11338     emit_insn (pat);
11339   return NULL_RTX;
11340 }
11341
11342 static rtx
11343 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
11344 {
11345   tree arg0 = CALL_EXPR_ARG (exp, 0);
11346   tree arg1 = CALL_EXPR_ARG (exp, 1);
11347   tree arg2 = CALL_EXPR_ARG (exp, 2);
11348   rtx op0 = expand_normal (arg0);
11349   rtx op1 = expand_normal (arg1);
11350   rtx op2 = expand_normal (arg2);
11351   rtx pat, addr;
11352   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11353   enum machine_mode smode = insn_data[icode].operand[1].mode;
11354   enum machine_mode mode1 = Pmode;
11355   enum machine_mode mode2 = Pmode;
11356
11357   /* Invalid arguments.  Bail before doing anything stoopid!  */
11358   if (arg0 == error_mark_node
11359       || arg1 == error_mark_node
11360       || arg2 == error_mark_node)
11361     return const0_rtx;
11362
11363   if (! (*insn_data[icode].operand[1].predicate) (op0, smode))
11364     op0 = copy_to_mode_reg (smode, op0);
11365
11366   op2 = copy_to_mode_reg (mode2, op2);
11367
11368   if (op1 == const0_rtx)
11369     {
11370       addr = gen_rtx_MEM (tmode, op2);
11371     }
11372   else
11373     {
11374       op1 = copy_to_mode_reg (mode1, op1);
11375       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
11376     }
11377
11378   pat = GEN_FCN (icode) (addr, op0);
11379   if (pat)
11380     emit_insn (pat);
11381   return NULL_RTX;
11382 }
11383
11384 static rtx
11385 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
11386 {
11387   rtx pat;
11388   tree arg0 = CALL_EXPR_ARG (exp, 0);
11389   tree arg1 = CALL_EXPR_ARG (exp, 1);
11390   tree arg2 = CALL_EXPR_ARG (exp, 2);
11391   rtx op0 = expand_normal (arg0);
11392   rtx op1 = expand_normal (arg1);
11393   rtx op2 = expand_normal (arg2);
11394   enum machine_mode tmode = insn_data[icode].operand[0].mode;
11395   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11396   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11397   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
11398
11399   if (icode == CODE_FOR_nothing)
11400     /* Builtin not supported on this processor.  */
11401     return 0;
11402
11403   /* If we got invalid arguments bail out before generating bad rtl.  */
11404   if (arg0 == error_mark_node
11405       || arg1 == error_mark_node
11406       || arg2 == error_mark_node)
11407     return const0_rtx;
11408
11409   /* Check and prepare argument depending on the instruction code.
11410
11411      Note that a switch statement instead of the sequence of tests
11412      would be incorrect as many of the CODE_FOR values could be
11413      CODE_FOR_nothing and that would yield multiple alternatives
11414      with identical values.  We'd never reach here at runtime in
11415      this case.  */
11416   if (icode == CODE_FOR_altivec_vsldoi_v4sf
11417       || icode == CODE_FOR_altivec_vsldoi_v4si
11418       || icode == CODE_FOR_altivec_vsldoi_v8hi
11419       || icode == CODE_FOR_altivec_vsldoi_v16qi)
11420     {
11421       /* Only allow 4-bit unsigned literals.  */
11422       STRIP_NOPS (arg2);
11423       if (TREE_CODE (arg2) != INTEGER_CST
11424           || TREE_INT_CST_LOW (arg2) & ~0xf)
11425         {
11426           error ("argument 3 must be a 4-bit unsigned literal");
11427           return const0_rtx;
11428         }
11429     }
11430   else if (icode == CODE_FOR_vsx_xxpermdi_v2df
11431            || icode == CODE_FOR_vsx_xxpermdi_v2di
11432            || icode == CODE_FOR_vsx_xxsldwi_v16qi
11433            || icode == CODE_FOR_vsx_xxsldwi_v8hi
11434            || icode == CODE_FOR_vsx_xxsldwi_v4si
11435            || icode == CODE_FOR_vsx_xxsldwi_v4sf
11436            || icode == CODE_FOR_vsx_xxsldwi_v2di
11437            || icode == CODE_FOR_vsx_xxsldwi_v2df)
11438     {
11439       /* Only allow 2-bit unsigned literals.  */
11440       STRIP_NOPS (arg2);
11441       if (TREE_CODE (arg2) != INTEGER_CST
11442           || TREE_INT_CST_LOW (arg2) & ~0x3)
11443         {
11444           error ("argument 3 must be a 2-bit unsigned literal");
11445           return const0_rtx;
11446         }
11447     }
11448   else if (icode == CODE_FOR_vsx_set_v2df
11449            || icode == CODE_FOR_vsx_set_v2di)
11450     {
11451       /* Only allow 1-bit unsigned literals.  */
11452       STRIP_NOPS (arg2);
11453       if (TREE_CODE (arg2) != INTEGER_CST
11454           || TREE_INT_CST_LOW (arg2) & ~0x1)
11455         {
11456           error ("argument 3 must be a 1-bit unsigned literal");
11457           return const0_rtx;
11458         }
11459     }
11460
11461   if (target == 0
11462       || GET_MODE (target) != tmode
11463       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11464     target = gen_reg_rtx (tmode);
11465
11466   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11467     op0 = copy_to_mode_reg (mode0, op0);
11468   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11469     op1 = copy_to_mode_reg (mode1, op1);
11470   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
11471     op2 = copy_to_mode_reg (mode2, op2);
11472
11473   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
11474     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
11475   else 
11476     pat = GEN_FCN (icode) (target, op0, op1, op2);
11477   if (! pat)
11478     return 0;
11479   emit_insn (pat);
11480
11481   return target;
11482 }
11483
11484 /* Expand the lvx builtins.  */
11485 static rtx
11486 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
11487 {
11488   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11489   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11490   tree arg0;
11491   enum machine_mode tmode, mode0;
11492   rtx pat, op0;
11493   enum insn_code icode;
11494
11495   switch (fcode)
11496     {
11497     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
11498       icode = CODE_FOR_vector_altivec_load_v16qi;
11499       break;
11500     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
11501       icode = CODE_FOR_vector_altivec_load_v8hi;
11502       break;
11503     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
11504       icode = CODE_FOR_vector_altivec_load_v4si;
11505       break;
11506     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
11507       icode = CODE_FOR_vector_altivec_load_v4sf;
11508       break;
11509     case ALTIVEC_BUILTIN_LD_INTERNAL_2df:
11510       icode = CODE_FOR_vector_altivec_load_v2df;
11511       break;
11512     case ALTIVEC_BUILTIN_LD_INTERNAL_2di:
11513       icode = CODE_FOR_vector_altivec_load_v2di;
11514       break;
11515     default:
11516       *expandedp = false;
11517       return NULL_RTX;
11518     }
11519
11520   *expandedp = true;
11521
11522   arg0 = CALL_EXPR_ARG (exp, 0);
11523   op0 = expand_normal (arg0);
11524   tmode = insn_data[icode].operand[0].mode;
11525   mode0 = insn_data[icode].operand[1].mode;
11526
11527   if (target == 0
11528       || GET_MODE (target) != tmode
11529       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11530     target = gen_reg_rtx (tmode);
11531
11532   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11533     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
11534
11535   pat = GEN_FCN (icode) (target, op0);
11536   if (! pat)
11537     return 0;
11538   emit_insn (pat);
11539   return target;
11540 }
11541
11542 /* Expand the stvx builtins.  */
11543 static rtx
11544 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
11545                            bool *expandedp)
11546 {
11547   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11548   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11549   tree arg0, arg1;
11550   enum machine_mode mode0, mode1;
11551   rtx pat, op0, op1;
11552   enum insn_code icode;
11553
11554   switch (fcode)
11555     {
11556     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
11557       icode = CODE_FOR_vector_altivec_store_v16qi;
11558       break;
11559     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
11560       icode = CODE_FOR_vector_altivec_store_v8hi;
11561       break;
11562     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
11563       icode = CODE_FOR_vector_altivec_store_v4si;
11564       break;
11565     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
11566       icode = CODE_FOR_vector_altivec_store_v4sf;
11567       break;
11568     case ALTIVEC_BUILTIN_ST_INTERNAL_2df:
11569       icode = CODE_FOR_vector_altivec_store_v2df;
11570       break;
11571     case ALTIVEC_BUILTIN_ST_INTERNAL_2di:
11572       icode = CODE_FOR_vector_altivec_store_v2di;
11573       break;
11574     default:
11575       *expandedp = false;
11576       return NULL_RTX;
11577     }
11578
11579   arg0 = CALL_EXPR_ARG (exp, 0);
11580   arg1 = CALL_EXPR_ARG (exp, 1);
11581   op0 = expand_normal (arg0);
11582   op1 = expand_normal (arg1);
11583   mode0 = insn_data[icode].operand[0].mode;
11584   mode1 = insn_data[icode].operand[1].mode;
11585
11586   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11587     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
11588   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11589     op1 = copy_to_mode_reg (mode1, op1);
11590
11591   pat = GEN_FCN (icode) (op0, op1);
11592   if (pat)
11593     emit_insn (pat);
11594
11595   *expandedp = true;
11596   return NULL_RTX;
11597 }
11598
11599 /* Expand the dst builtins.  */
11600 static rtx
11601 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
11602                             bool *expandedp)
11603 {
11604   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11605   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11606   tree arg0, arg1, arg2;
11607   enum machine_mode mode0, mode1;
11608   rtx pat, op0, op1, op2;
11609   const struct builtin_description *d;
11610   size_t i;
11611
11612   *expandedp = false;
11613
11614   /* Handle DST variants.  */
11615   d = bdesc_dst;
11616   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
11617     if (d->code == fcode)
11618       {
11619         arg0 = CALL_EXPR_ARG (exp, 0);
11620         arg1 = CALL_EXPR_ARG (exp, 1);
11621         arg2 = CALL_EXPR_ARG (exp, 2);
11622         op0 = expand_normal (arg0);
11623         op1 = expand_normal (arg1);
11624         op2 = expand_normal (arg2);
11625         mode0 = insn_data[d->icode].operand[0].mode;
11626         mode1 = insn_data[d->icode].operand[1].mode;
11627
11628         /* Invalid arguments, bail out before generating bad rtl.  */
11629         if (arg0 == error_mark_node
11630             || arg1 == error_mark_node
11631             || arg2 == error_mark_node)
11632           return const0_rtx;
11633
11634         *expandedp = true;
11635         STRIP_NOPS (arg2);
11636         if (TREE_CODE (arg2) != INTEGER_CST
11637             || TREE_INT_CST_LOW (arg2) & ~0x3)
11638           {
11639             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
11640             return const0_rtx;
11641           }
11642
11643         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
11644           op0 = copy_to_mode_reg (Pmode, op0);
11645         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
11646           op1 = copy_to_mode_reg (mode1, op1);
11647
11648         pat = GEN_FCN (d->icode) (op0, op1, op2);
11649         if (pat != 0)
11650           emit_insn (pat);
11651
11652         return NULL_RTX;
11653       }
11654
11655   return NULL_RTX;
11656 }
11657
11658 /* Expand vec_init builtin.  */
11659 static rtx
11660 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
11661 {
11662   enum machine_mode tmode = TYPE_MODE (type);
11663   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
11664   int i, n_elt = GET_MODE_NUNITS (tmode);
11665   rtvec v = rtvec_alloc (n_elt);
11666
11667   gcc_assert (VECTOR_MODE_P (tmode));
11668   gcc_assert (n_elt == call_expr_nargs (exp));
11669
11670   for (i = 0; i < n_elt; ++i)
11671     {
11672       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
11673       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
11674     }
11675
11676   if (!target || !register_operand (target, tmode))
11677     target = gen_reg_rtx (tmode);
11678
11679   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
11680   return target;
11681 }
11682
11683 /* Return the integer constant in ARG.  Constrain it to be in the range
11684    of the subparts of VEC_TYPE; issue an error if not.  */
11685
11686 static int
11687 get_element_number (tree vec_type, tree arg)
11688 {
11689   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
11690
11691   if (!host_integerp (arg, 1)
11692       || (elt = tree_low_cst (arg, 1), elt > max))
11693     {
11694       error ("selector must be an integer constant in the range 0..%wi", max);
11695       return 0;
11696     }
11697
11698   return elt;
11699 }
11700
11701 /* Expand vec_set builtin.  */
11702 static rtx
11703 altivec_expand_vec_set_builtin (tree exp)
11704 {
11705   enum machine_mode tmode, mode1;
11706   tree arg0, arg1, arg2;
11707   int elt;
11708   rtx op0, op1;
11709
11710   arg0 = CALL_EXPR_ARG (exp, 0);
11711   arg1 = CALL_EXPR_ARG (exp, 1);
11712   arg2 = CALL_EXPR_ARG (exp, 2);
11713
11714   tmode = TYPE_MODE (TREE_TYPE (arg0));
11715   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11716   gcc_assert (VECTOR_MODE_P (tmode));
11717
11718   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
11719   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
11720   elt = get_element_number (TREE_TYPE (arg0), arg2);
11721
11722   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
11723     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
11724
11725   op0 = force_reg (tmode, op0);
11726   op1 = force_reg (mode1, op1);
11727
11728   rs6000_expand_vector_set (op0, op1, elt);
11729
11730   return op0;
11731 }
11732
11733 /* Expand vec_ext builtin.  */
11734 static rtx
11735 altivec_expand_vec_ext_builtin (tree exp, rtx target)
11736 {
11737   enum machine_mode tmode, mode0;
11738   tree arg0, arg1;
11739   int elt;
11740   rtx op0;
11741
11742   arg0 = CALL_EXPR_ARG (exp, 0);
11743   arg1 = CALL_EXPR_ARG (exp, 1);
11744
11745   op0 = expand_normal (arg0);
11746   elt = get_element_number (TREE_TYPE (arg0), arg1);
11747
11748   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11749   mode0 = TYPE_MODE (TREE_TYPE (arg0));
11750   gcc_assert (VECTOR_MODE_P (mode0));
11751
11752   op0 = force_reg (mode0, op0);
11753
11754   if (optimize || !target || !register_operand (target, tmode))
11755     target = gen_reg_rtx (tmode);
11756
11757   rs6000_expand_vector_extract (target, op0, elt);
11758
11759   return target;
11760 }
11761
11762 /* Expand the builtin in EXP and store the result in TARGET.  Store
11763    true in *EXPANDEDP if we found a builtin to expand.  */
11764 static rtx
11765 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
11766 {
11767   const struct builtin_description *d;
11768   const struct builtin_description_predicates *dp;
11769   size_t i;
11770   enum insn_code icode;
11771   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11772   tree arg0;
11773   rtx op0, pat;
11774   enum machine_mode tmode, mode0;
11775   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11776
11777   if ((fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
11778        && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
11779       || (fcode >= VSX_BUILTIN_OVERLOADED_FIRST
11780           && fcode <= VSX_BUILTIN_OVERLOADED_LAST))
11781     {
11782       *expandedp = true;
11783       error ("unresolved overload for Altivec builtin %qF", fndecl);
11784       return const0_rtx;
11785     }
11786
11787   target = altivec_expand_ld_builtin (exp, target, expandedp);
11788   if (*expandedp)
11789     return target;
11790
11791   target = altivec_expand_st_builtin (exp, target, expandedp);
11792   if (*expandedp)
11793     return target;
11794
11795   target = altivec_expand_dst_builtin (exp, target, expandedp);
11796   if (*expandedp)
11797     return target;
11798
11799   *expandedp = true;
11800
11801   switch (fcode)
11802     {
11803     case ALTIVEC_BUILTIN_STVX:
11804       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4si, exp);
11805     case ALTIVEC_BUILTIN_STVEBX:
11806       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
11807     case ALTIVEC_BUILTIN_STVEHX:
11808       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
11809     case ALTIVEC_BUILTIN_STVEWX:
11810       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
11811     case ALTIVEC_BUILTIN_STVXL:
11812       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
11813
11814     case ALTIVEC_BUILTIN_STVLX:
11815       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
11816     case ALTIVEC_BUILTIN_STVLXL:
11817       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
11818     case ALTIVEC_BUILTIN_STVRX:
11819       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
11820     case ALTIVEC_BUILTIN_STVRXL:
11821       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
11822
11823     case VSX_BUILTIN_STXVD2X_V2DF:
11824       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2df, exp);
11825     case VSX_BUILTIN_STXVD2X_V2DI:
11826       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2di, exp);
11827     case VSX_BUILTIN_STXVW4X_V4SF:
11828       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4sf, exp);
11829     case VSX_BUILTIN_STXVW4X_V4SI:
11830       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4si, exp);
11831     case VSX_BUILTIN_STXVW4X_V8HI:
11832       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v8hi, exp);
11833     case VSX_BUILTIN_STXVW4X_V16QI:
11834       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
11835
11836     case ALTIVEC_BUILTIN_MFVSCR:
11837       icode = CODE_FOR_altivec_mfvscr;
11838       tmode = insn_data[icode].operand[0].mode;
11839
11840       if (target == 0
11841           || GET_MODE (target) != tmode
11842           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11843         target = gen_reg_rtx (tmode);
11844
11845       pat = GEN_FCN (icode) (target);
11846       if (! pat)
11847         return 0;
11848       emit_insn (pat);
11849       return target;
11850
11851     case ALTIVEC_BUILTIN_MTVSCR:
11852       icode = CODE_FOR_altivec_mtvscr;
11853       arg0 = CALL_EXPR_ARG (exp, 0);
11854       op0 = expand_normal (arg0);
11855       mode0 = insn_data[icode].operand[0].mode;
11856
11857       /* If we got invalid arguments bail out before generating bad rtl.  */
11858       if (arg0 == error_mark_node)
11859         return const0_rtx;
11860
11861       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11862         op0 = copy_to_mode_reg (mode0, op0);
11863
11864       pat = GEN_FCN (icode) (op0);
11865       if (pat)
11866         emit_insn (pat);
11867       return NULL_RTX;
11868
11869     case ALTIVEC_BUILTIN_DSSALL:
11870       emit_insn (gen_altivec_dssall ());
11871       return NULL_RTX;
11872
11873     case ALTIVEC_BUILTIN_DSS:
11874       icode = CODE_FOR_altivec_dss;
11875       arg0 = CALL_EXPR_ARG (exp, 0);
11876       STRIP_NOPS (arg0);
11877       op0 = expand_normal (arg0);
11878       mode0 = insn_data[icode].operand[0].mode;
11879
11880       /* If we got invalid arguments bail out before generating bad rtl.  */
11881       if (arg0 == error_mark_node)
11882         return const0_rtx;
11883
11884       if (TREE_CODE (arg0) != INTEGER_CST
11885           || TREE_INT_CST_LOW (arg0) & ~0x3)
11886         {
11887           error ("argument to dss must be a 2-bit unsigned literal");
11888           return const0_rtx;
11889         }
11890
11891       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11892         op0 = copy_to_mode_reg (mode0, op0);
11893
11894       emit_insn (gen_altivec_dss (op0));
11895       return NULL_RTX;
11896
11897     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
11898     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
11899     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
11900     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
11901     case VSX_BUILTIN_VEC_INIT_V2DF:
11902     case VSX_BUILTIN_VEC_INIT_V2DI:
11903       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
11904
11905     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
11906     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
11907     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
11908     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
11909     case VSX_BUILTIN_VEC_SET_V2DF:
11910     case VSX_BUILTIN_VEC_SET_V2DI:
11911       return altivec_expand_vec_set_builtin (exp);
11912
11913     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
11914     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
11915     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
11916     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
11917     case VSX_BUILTIN_VEC_EXT_V2DF:
11918     case VSX_BUILTIN_VEC_EXT_V2DI:
11919       return altivec_expand_vec_ext_builtin (exp, target);
11920
11921     default:
11922       break;
11923       /* Fall through.  */
11924     }
11925
11926   /* Expand abs* operations.  */
11927   d = bdesc_abs;
11928   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
11929     if (d->code == fcode)
11930       return altivec_expand_abs_builtin (d->icode, exp, target);
11931
11932   /* Expand the AltiVec predicates.  */
11933   dp = bdesc_altivec_preds;
11934   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
11935     if (dp->code == fcode)
11936       return altivec_expand_predicate_builtin (dp->icode, exp, target);
11937
11938   /* LV* are funky.  We initialized them differently.  */
11939   switch (fcode)
11940     {
11941     case ALTIVEC_BUILTIN_LVSL:
11942       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
11943                                         exp, target, false);
11944     case ALTIVEC_BUILTIN_LVSR:
11945       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
11946                                         exp, target, false);
11947     case ALTIVEC_BUILTIN_LVEBX:
11948       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
11949                                         exp, target, false);
11950     case ALTIVEC_BUILTIN_LVEHX:
11951       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
11952                                         exp, target, false);
11953     case ALTIVEC_BUILTIN_LVEWX:
11954       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
11955                                         exp, target, false);
11956     case ALTIVEC_BUILTIN_LVXL:
11957       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
11958                                         exp, target, false);
11959     case ALTIVEC_BUILTIN_LVX:
11960       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4si,
11961                                         exp, target, false);
11962     case ALTIVEC_BUILTIN_LVLX:
11963       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
11964                                         exp, target, true);
11965     case ALTIVEC_BUILTIN_LVLXL:
11966       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
11967                                         exp, target, true);
11968     case ALTIVEC_BUILTIN_LVRX:
11969       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
11970                                         exp, target, true);
11971     case ALTIVEC_BUILTIN_LVRXL:
11972       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
11973                                         exp, target, true);
11974     case VSX_BUILTIN_LXVD2X_V2DF:
11975       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2df,
11976                                         exp, target, false);
11977     case VSX_BUILTIN_LXVD2X_V2DI:
11978       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2di,
11979                                         exp, target, false);
11980     case VSX_BUILTIN_LXVW4X_V4SF:
11981       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4sf,
11982                                         exp, target, false);
11983     case VSX_BUILTIN_LXVW4X_V4SI:
11984       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4si,
11985                                         exp, target, false);
11986     case VSX_BUILTIN_LXVW4X_V8HI:
11987       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v8hi,
11988                                         exp, target, false);
11989     case VSX_BUILTIN_LXVW4X_V16QI:
11990       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
11991                                         exp, target, false);
11992       break;
11993     default:
11994       break;
11995       /* Fall through.  */
11996     }
11997
11998   *expandedp = false;
11999   return NULL_RTX;
12000 }
12001
12002 /* Expand the builtin in EXP and store the result in TARGET.  Store
12003    true in *EXPANDEDP if we found a builtin to expand.  */
12004 static rtx
12005 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
12006 {
12007   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
12008   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
12009   const struct builtin_description *d;
12010   size_t i;
12011
12012   *expandedp = true;
12013
12014   switch (fcode)
12015     {
12016     case PAIRED_BUILTIN_STX:
12017       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
12018     case PAIRED_BUILTIN_LX:
12019       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
12020     default:
12021       break;
12022       /* Fall through.  */
12023     }
12024
12025   /* Expand the paired predicates.  */
12026   d = bdesc_paired_preds;
12027   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
12028     if (d->code == fcode)
12029       return paired_expand_predicate_builtin (d->icode, exp, target);
12030
12031   *expandedp = false;
12032   return NULL_RTX;
12033 }
12034
12035 /* Binops that need to be initialized manually, but can be expanded
12036    automagically by rs6000_expand_binop_builtin.  */
12037 static struct builtin_description bdesc_2arg_spe[] =
12038 {
12039   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
12040   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
12041   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
12042   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
12043   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
12044   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
12045   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
12046   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
12047   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
12048   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
12049   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
12050   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
12051   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
12052   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
12053   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
12054   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
12055   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
12056   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
12057   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
12058   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
12059   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
12060   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
12061 };
12062
12063 /* Expand the builtin in EXP and store the result in TARGET.  Store
12064    true in *EXPANDEDP if we found a builtin to expand.
12065
12066    This expands the SPE builtins that are not simple unary and binary
12067    operations.  */
12068 static rtx
12069 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
12070 {
12071   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
12072   tree arg1, arg0;
12073   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
12074   enum insn_code icode;
12075   enum machine_mode tmode, mode0;
12076   rtx pat, op0;
12077   struct builtin_description *d;
12078   size_t i;
12079
12080   *expandedp = true;
12081
12082   /* Syntax check for a 5-bit unsigned immediate.  */
12083   switch (fcode)
12084     {
12085     case SPE_BUILTIN_EVSTDD:
12086     case SPE_BUILTIN_EVSTDH:
12087     case SPE_BUILTIN_EVSTDW:
12088     case SPE_BUILTIN_EVSTWHE:
12089     case SPE_BUILTIN_EVSTWHO:
12090     case SPE_BUILTIN_EVSTWWE:
12091     case SPE_BUILTIN_EVSTWWO:
12092       arg1 = CALL_EXPR_ARG (exp, 2);
12093       if (TREE_CODE (arg1) != INTEGER_CST
12094           || TREE_INT_CST_LOW (arg1) & ~0x1f)
12095         {
12096           error ("argument 2 must be a 5-bit unsigned literal");
12097           return const0_rtx;
12098         }
12099       break;
12100     default:
12101       break;
12102     }
12103
12104   /* The evsplat*i instructions are not quite generic.  */
12105   switch (fcode)
12106     {
12107     case SPE_BUILTIN_EVSPLATFI:
12108       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
12109                                          exp, target);
12110     case SPE_BUILTIN_EVSPLATI:
12111       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
12112                                          exp, target);
12113     default:
12114       break;
12115     }
12116
12117   d = (struct builtin_description *) bdesc_2arg_spe;
12118   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
12119     if (d->code == fcode)
12120       return rs6000_expand_binop_builtin (d->icode, exp, target);
12121
12122   d = (struct builtin_description *) bdesc_spe_predicates;
12123   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
12124     if (d->code == fcode)
12125       return spe_expand_predicate_builtin (d->icode, exp, target);
12126
12127   d = (struct builtin_description *) bdesc_spe_evsel;
12128   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
12129     if (d->code == fcode)
12130       return spe_expand_evsel_builtin (d->icode, exp, target);
12131
12132   switch (fcode)
12133     {
12134     case SPE_BUILTIN_EVSTDDX:
12135       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
12136     case SPE_BUILTIN_EVSTDHX:
12137       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
12138     case SPE_BUILTIN_EVSTDWX:
12139       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
12140     case SPE_BUILTIN_EVSTWHEX:
12141       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
12142     case SPE_BUILTIN_EVSTWHOX:
12143       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
12144     case SPE_BUILTIN_EVSTWWEX:
12145       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
12146     case SPE_BUILTIN_EVSTWWOX:
12147       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
12148     case SPE_BUILTIN_EVSTDD:
12149       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
12150     case SPE_BUILTIN_EVSTDH:
12151       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
12152     case SPE_BUILTIN_EVSTDW:
12153       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
12154     case SPE_BUILTIN_EVSTWHE:
12155       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
12156     case SPE_BUILTIN_EVSTWHO:
12157       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
12158     case SPE_BUILTIN_EVSTWWE:
12159       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
12160     case SPE_BUILTIN_EVSTWWO:
12161       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
12162     case SPE_BUILTIN_MFSPEFSCR:
12163       icode = CODE_FOR_spe_mfspefscr;
12164       tmode = insn_data[icode].operand[0].mode;
12165
12166       if (target == 0
12167           || GET_MODE (target) != tmode
12168           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
12169         target = gen_reg_rtx (tmode);
12170
12171       pat = GEN_FCN (icode) (target);
12172       if (! pat)
12173         return 0;
12174       emit_insn (pat);
12175       return target;
12176     case SPE_BUILTIN_MTSPEFSCR:
12177       icode = CODE_FOR_spe_mtspefscr;
12178       arg0 = CALL_EXPR_ARG (exp, 0);
12179       op0 = expand_normal (arg0);
12180       mode0 = insn_data[icode].operand[0].mode;
12181
12182       if (arg0 == error_mark_node)
12183         return const0_rtx;
12184
12185       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
12186         op0 = copy_to_mode_reg (mode0, op0);
12187
12188       pat = GEN_FCN (icode) (op0);
12189       if (pat)
12190         emit_insn (pat);
12191       return NULL_RTX;
12192     default:
12193       break;
12194     }
12195
12196   *expandedp = false;
12197   return NULL_RTX;
12198 }
12199
12200 static rtx
12201 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
12202 {
12203   rtx pat, scratch, tmp;
12204   tree form = CALL_EXPR_ARG (exp, 0);
12205   tree arg0 = CALL_EXPR_ARG (exp, 1);
12206   tree arg1 = CALL_EXPR_ARG (exp, 2);
12207   rtx op0 = expand_normal (arg0);
12208   rtx op1 = expand_normal (arg1);
12209   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
12210   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
12211   int form_int;
12212   enum rtx_code code;
12213
12214   if (TREE_CODE (form) != INTEGER_CST)
12215     {
12216       error ("argument 1 of __builtin_paired_predicate must be a constant");
12217       return const0_rtx;
12218     }
12219   else
12220     form_int = TREE_INT_CST_LOW (form);
12221
12222   gcc_assert (mode0 == mode1);
12223
12224   if (arg0 == error_mark_node || arg1 == error_mark_node)
12225     return const0_rtx;
12226
12227   if (target == 0
12228       || GET_MODE (target) != SImode
12229       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
12230     target = gen_reg_rtx (SImode);
12231   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
12232     op0 = copy_to_mode_reg (mode0, op0);
12233   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
12234     op1 = copy_to_mode_reg (mode1, op1);
12235
12236   scratch = gen_reg_rtx (CCFPmode);
12237
12238   pat = GEN_FCN (icode) (scratch, op0, op1);
12239   if (!pat)
12240     return const0_rtx;
12241
12242   emit_insn (pat);
12243
12244   switch (form_int)
12245     {
12246       /* LT bit.  */
12247     case 0:
12248       code = LT;
12249       break;
12250       /* GT bit.  */
12251     case 1:
12252       code = GT;
12253       break;
12254       /* EQ bit.  */
12255     case 2:
12256       code = EQ;
12257       break;
12258       /* UN bit.  */
12259     case 3:
12260       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
12261       return target;
12262     default:
12263       error ("argument 1 of __builtin_paired_predicate is out of range");
12264       return const0_rtx;
12265     }
12266
12267   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
12268   emit_move_insn (target, tmp);
12269   return target;
12270 }
12271
12272 static rtx
12273 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
12274 {
12275   rtx pat, scratch, tmp;
12276   tree form = CALL_EXPR_ARG (exp, 0);
12277   tree arg0 = CALL_EXPR_ARG (exp, 1);
12278   tree arg1 = CALL_EXPR_ARG (exp, 2);
12279   rtx op0 = expand_normal (arg0);
12280   rtx op1 = expand_normal (arg1);
12281   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
12282   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
12283   int form_int;
12284   enum rtx_code code;
12285
12286   if (TREE_CODE (form) != INTEGER_CST)
12287     {
12288       error ("argument 1 of __builtin_spe_predicate must be a constant");
12289       return const0_rtx;
12290     }
12291   else
12292     form_int = TREE_INT_CST_LOW (form);
12293
12294   gcc_assert (mode0 == mode1);
12295
12296   if (arg0 == error_mark_node || arg1 == error_mark_node)
12297     return const0_rtx;
12298
12299   if (target == 0
12300       || GET_MODE (target) != SImode
12301       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
12302     target = gen_reg_rtx (SImode);
12303
12304   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
12305     op0 = copy_to_mode_reg (mode0, op0);
12306   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
12307     op1 = copy_to_mode_reg (mode1, op1);
12308
12309   scratch = gen_reg_rtx (CCmode);
12310
12311   pat = GEN_FCN (icode) (scratch, op0, op1);
12312   if (! pat)
12313     return const0_rtx;
12314   emit_insn (pat);
12315
12316   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
12317      _lower_.  We use one compare, but look in different bits of the
12318      CR for each variant.
12319
12320      There are 2 elements in each SPE simd type (upper/lower).  The CR
12321      bits are set as follows:
12322
12323      BIT0  | BIT 1  | BIT 2   | BIT 3
12324      U     |   L    | (U | L) | (U & L)
12325
12326      So, for an "all" relationship, BIT 3 would be set.
12327      For an "any" relationship, BIT 2 would be set.  Etc.
12328
12329      Following traditional nomenclature, these bits map to:
12330
12331      BIT0  | BIT 1  | BIT 2   | BIT 3
12332      LT    | GT     | EQ      | OV
12333
12334      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
12335   */
12336
12337   switch (form_int)
12338     {
12339       /* All variant.  OV bit.  */
12340     case 0:
12341       /* We need to get to the OV bit, which is the ORDERED bit.  We
12342          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
12343          that's ugly and will make validate_condition_mode die.
12344          So let's just use another pattern.  */
12345       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
12346       return target;
12347       /* Any variant.  EQ bit.  */
12348     case 1:
12349       code = EQ;
12350       break;
12351       /* Upper variant.  LT bit.  */
12352     case 2:
12353       code = LT;
12354       break;
12355       /* Lower variant.  GT bit.  */
12356     case 3:
12357       code = GT;
12358       break;
12359     default:
12360       error ("argument 1 of __builtin_spe_predicate is out of range");
12361       return const0_rtx;
12362     }
12363
12364   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
12365   emit_move_insn (target, tmp);
12366
12367   return target;
12368 }
12369
12370 /* The evsel builtins look like this:
12371
12372      e = __builtin_spe_evsel_OP (a, b, c, d);
12373
12374    and work like this:
12375
12376      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
12377      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
12378 */
12379
12380 static rtx
12381 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
12382 {
12383   rtx pat, scratch;
12384   tree arg0 = CALL_EXPR_ARG (exp, 0);
12385   tree arg1 = CALL_EXPR_ARG (exp, 1);
12386   tree arg2 = CALL_EXPR_ARG (exp, 2);
12387   tree arg3 = CALL_EXPR_ARG (exp, 3);
12388   rtx op0 = expand_normal (arg0);
12389   rtx op1 = expand_normal (arg1);
12390   rtx op2 = expand_normal (arg2);
12391   rtx op3 = expand_normal (arg3);
12392   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
12393   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
12394
12395   gcc_assert (mode0 == mode1);
12396
12397   if (arg0 == error_mark_node || arg1 == error_mark_node
12398       || arg2 == error_mark_node || arg3 == error_mark_node)
12399     return const0_rtx;
12400
12401   if (target == 0
12402       || GET_MODE (target) != mode0
12403       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
12404     target = gen_reg_rtx (mode0);
12405
12406   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
12407     op0 = copy_to_mode_reg (mode0, op0);
12408   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
12409     op1 = copy_to_mode_reg (mode0, op1);
12410   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
12411     op2 = copy_to_mode_reg (mode0, op2);
12412   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
12413     op3 = copy_to_mode_reg (mode0, op3);
12414
12415   /* Generate the compare.  */
12416   scratch = gen_reg_rtx (CCmode);
12417   pat = GEN_FCN (icode) (scratch, op0, op1);
12418   if (! pat)
12419     return const0_rtx;
12420   emit_insn (pat);
12421
12422   if (mode0 == V2SImode)
12423     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
12424   else
12425     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
12426
12427   return target;
12428 }
12429
12430 /* Expand an expression EXP that calls a built-in function,
12431    with result going to TARGET if that's convenient
12432    (and in mode MODE if that's convenient).
12433    SUBTARGET may be used as the target for computing one of EXP's operands.
12434    IGNORE is nonzero if the value is to be ignored.  */
12435
12436 static rtx
12437 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
12438                        enum machine_mode mode ATTRIBUTE_UNUSED,
12439                        int ignore ATTRIBUTE_UNUSED)
12440 {
12441   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
12442   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
12443   const struct builtin_description *d;
12444   size_t i;
12445   rtx ret;
12446   bool success;
12447
12448   switch (fcode)
12449     {
12450     case RS6000_BUILTIN_RECIP:
12451       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
12452
12453     case RS6000_BUILTIN_RECIPF:
12454       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
12455
12456     case RS6000_BUILTIN_RSQRTF:
12457       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
12458
12459     case RS6000_BUILTIN_RSQRT:
12460       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
12461
12462     case RS6000_BUILTIN_BSWAP_HI:
12463       return rs6000_expand_unop_builtin (CODE_FOR_bswaphi2, exp, target);
12464
12465     case POWER7_BUILTIN_BPERMD:
12466       return rs6000_expand_binop_builtin (((TARGET_64BIT)
12467                                            ? CODE_FOR_bpermd_di
12468                                            : CODE_FOR_bpermd_si), exp, target);
12469
12470     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
12471     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
12472       {
12473         int icode = (int) CODE_FOR_altivec_lvsr;
12474         enum machine_mode tmode = insn_data[icode].operand[0].mode;
12475         enum machine_mode mode = insn_data[icode].operand[1].mode;
12476         tree arg;
12477         rtx op, addr, pat;
12478
12479         gcc_assert (TARGET_ALTIVEC);
12480
12481         arg = CALL_EXPR_ARG (exp, 0);
12482         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
12483         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
12484         addr = memory_address (mode, op);
12485         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
12486           op = addr;
12487         else
12488           {
12489             /* For the load case need to negate the address.  */
12490             op = gen_reg_rtx (GET_MODE (addr));
12491             emit_insn (gen_rtx_SET (VOIDmode, op,
12492                                     gen_rtx_NEG (GET_MODE (addr), addr)));
12493           }
12494         op = gen_rtx_MEM (mode, op);
12495
12496         if (target == 0
12497             || GET_MODE (target) != tmode
12498             || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
12499           target = gen_reg_rtx (tmode);
12500
12501         /*pat = gen_altivec_lvsr (target, op);*/
12502         pat = GEN_FCN (icode) (target, op);
12503         if (!pat)
12504           return 0;
12505         emit_insn (pat);
12506
12507         return target;
12508       }
12509
12510     case ALTIVEC_BUILTIN_VCFUX:
12511     case ALTIVEC_BUILTIN_VCFSX:
12512     case ALTIVEC_BUILTIN_VCTUXS:
12513     case ALTIVEC_BUILTIN_VCTSXS:
12514   /* FIXME: There's got to be a nicer way to handle this case than
12515      constructing a new CALL_EXPR.  */
12516       if (call_expr_nargs (exp) == 1)
12517         {
12518           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
12519                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
12520         }
12521       break;
12522
12523     default:
12524       break;
12525     }
12526
12527   if (TARGET_ALTIVEC)
12528     {
12529       ret = altivec_expand_builtin (exp, target, &success);
12530
12531       if (success)
12532         return ret;
12533     }
12534   if (TARGET_SPE)
12535     {
12536       ret = spe_expand_builtin (exp, target, &success);
12537
12538       if (success)
12539         return ret;
12540     }
12541   if (TARGET_PAIRED_FLOAT)
12542     {
12543       ret = paired_expand_builtin (exp, target, &success);
12544
12545       if (success)
12546         return ret;
12547     }  
12548
12549   gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
12550
12551   /* Handle simple unary operations.  */
12552   d = (struct builtin_description *) bdesc_1arg;
12553   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
12554     if (d->code == fcode)
12555       return rs6000_expand_unop_builtin (d->icode, exp, target);
12556
12557   /* Handle simple binary operations.  */
12558   d = (struct builtin_description *) bdesc_2arg;
12559   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
12560     if (d->code == fcode)
12561       return rs6000_expand_binop_builtin (d->icode, exp, target);
12562
12563   /* Handle simple ternary operations.  */
12564   d = bdesc_3arg;
12565   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
12566     if (d->code == fcode)
12567       return rs6000_expand_ternop_builtin (d->icode, exp, target);
12568
12569   gcc_unreachable ();
12570 }
12571
12572 static void
12573 rs6000_init_builtins (void)
12574 {
12575   tree tdecl;
12576   tree ftype;
12577
12578   V2SI_type_node = build_vector_type (intSI_type_node, 2);
12579   V2SF_type_node = build_vector_type (float_type_node, 2);
12580   V2DI_type_node = build_vector_type (intDI_type_node, 2);
12581   V2DF_type_node = build_vector_type (double_type_node, 2);
12582   V4HI_type_node = build_vector_type (intHI_type_node, 4);
12583   V4SI_type_node = build_vector_type (intSI_type_node, 4);
12584   V4SF_type_node = build_vector_type (float_type_node, 4);
12585   V8HI_type_node = build_vector_type (intHI_type_node, 8);
12586   V16QI_type_node = build_vector_type (intQI_type_node, 16);
12587
12588   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
12589   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
12590   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
12591   unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2);
12592
12593   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
12594   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
12595   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
12596   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
12597
12598   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
12599      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
12600      'vector unsigned short'.  */
12601
12602   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
12603   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12604   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
12605   bool_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
12606   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12607
12608   long_integer_type_internal_node = long_integer_type_node;
12609   long_unsigned_type_internal_node = long_unsigned_type_node;
12610   long_long_integer_type_internal_node = long_long_integer_type_node;
12611   long_long_unsigned_type_internal_node = long_long_unsigned_type_node;
12612   intQI_type_internal_node = intQI_type_node;
12613   uintQI_type_internal_node = unsigned_intQI_type_node;
12614   intHI_type_internal_node = intHI_type_node;
12615   uintHI_type_internal_node = unsigned_intHI_type_node;
12616   intSI_type_internal_node = intSI_type_node;
12617   uintSI_type_internal_node = unsigned_intSI_type_node;
12618   intDI_type_internal_node = intDI_type_node;
12619   uintDI_type_internal_node = unsigned_intDI_type_node;
12620   float_type_internal_node = float_type_node;
12621   double_type_internal_node = double_type_node;
12622   void_type_internal_node = void_type_node;
12623
12624   /* Initialize the modes for builtin_function_type, mapping a machine mode to
12625      tree type node.  */
12626   builtin_mode_to_type[QImode][0] = integer_type_node;
12627   builtin_mode_to_type[HImode][0] = integer_type_node;
12628   builtin_mode_to_type[SImode][0] = intSI_type_node;
12629   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
12630   builtin_mode_to_type[DImode][0] = intDI_type_node;
12631   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
12632   builtin_mode_to_type[SFmode][0] = float_type_node;
12633   builtin_mode_to_type[DFmode][0] = double_type_node;
12634   builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
12635   builtin_mode_to_type[V2SFmode][0] = V2SF_type_node;
12636   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
12637   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
12638   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
12639   builtin_mode_to_type[V4HImode][0] = V4HI_type_node;
12640   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
12641   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
12642   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
12643   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
12644   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
12645   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
12646   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
12647
12648   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12649                       get_identifier ("__bool char"),
12650                       bool_char_type_node);
12651   TYPE_NAME (bool_char_type_node) = tdecl;
12652   (*lang_hooks.decls.pushdecl) (tdecl);
12653   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12654                       get_identifier ("__bool short"),
12655                       bool_short_type_node);
12656   TYPE_NAME (bool_short_type_node) = tdecl;
12657   (*lang_hooks.decls.pushdecl) (tdecl);
12658   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12659                       get_identifier ("__bool int"),
12660                       bool_int_type_node);
12661   TYPE_NAME (bool_int_type_node) = tdecl;
12662   (*lang_hooks.decls.pushdecl) (tdecl);
12663   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"),
12664                       pixel_type_node);
12665   TYPE_NAME (pixel_type_node) = tdecl;
12666   (*lang_hooks.decls.pushdecl) (tdecl);
12667
12668   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
12669   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
12670   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
12671   bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2);
12672   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
12673
12674   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12675                       get_identifier ("__vector unsigned char"),
12676                       unsigned_V16QI_type_node);
12677   TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
12678   (*lang_hooks.decls.pushdecl) (tdecl);
12679   tdecl = build_decl (BUILTINS_LOCATION,
12680                       TYPE_DECL, get_identifier ("__vector signed char"),
12681                       V16QI_type_node);
12682   TYPE_NAME (V16QI_type_node) = tdecl;
12683   (*lang_hooks.decls.pushdecl) (tdecl);
12684   tdecl = build_decl (BUILTINS_LOCATION,
12685                       TYPE_DECL, get_identifier ("__vector __bool char"),
12686                       bool_V16QI_type_node);
12687   TYPE_NAME ( bool_V16QI_type_node) = tdecl;
12688   (*lang_hooks.decls.pushdecl) (tdecl);
12689
12690   tdecl = build_decl (BUILTINS_LOCATION,
12691                       TYPE_DECL, get_identifier ("__vector unsigned short"),
12692                       unsigned_V8HI_type_node);
12693   TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
12694   (*lang_hooks.decls.pushdecl) (tdecl);
12695   tdecl = build_decl (BUILTINS_LOCATION,
12696                       TYPE_DECL, get_identifier ("__vector signed short"),
12697                       V8HI_type_node);
12698   TYPE_NAME (V8HI_type_node) = tdecl;
12699   (*lang_hooks.decls.pushdecl) (tdecl);
12700   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12701                       get_identifier ("__vector __bool short"),
12702                       bool_V8HI_type_node);
12703   TYPE_NAME (bool_V8HI_type_node) = tdecl;
12704   (*lang_hooks.decls.pushdecl) (tdecl);
12705
12706   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12707                       get_identifier ("__vector unsigned int"),
12708                       unsigned_V4SI_type_node);
12709   TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
12710   (*lang_hooks.decls.pushdecl) (tdecl);
12711   tdecl = build_decl (BUILTINS_LOCATION,
12712                       TYPE_DECL, get_identifier ("__vector signed int"),
12713                       V4SI_type_node);
12714   TYPE_NAME (V4SI_type_node) = tdecl;
12715   (*lang_hooks.decls.pushdecl) (tdecl);
12716   tdecl = build_decl (BUILTINS_LOCATION,
12717                       TYPE_DECL, get_identifier ("__vector __bool int"),
12718                       bool_V4SI_type_node);
12719   TYPE_NAME (bool_V4SI_type_node) = tdecl;
12720   (*lang_hooks.decls.pushdecl) (tdecl);
12721
12722   tdecl = build_decl (BUILTINS_LOCATION,
12723                       TYPE_DECL, get_identifier ("__vector float"),
12724                       V4SF_type_node);
12725   TYPE_NAME (V4SF_type_node) = tdecl;
12726   (*lang_hooks.decls.pushdecl) (tdecl);
12727   tdecl = build_decl (BUILTINS_LOCATION,
12728                       TYPE_DECL, get_identifier ("__vector __pixel"),
12729                       pixel_V8HI_type_node);
12730   TYPE_NAME (pixel_V8HI_type_node) = tdecl;
12731   (*lang_hooks.decls.pushdecl) (tdecl);
12732
12733   if (TARGET_VSX)
12734     {
12735       tdecl = build_decl (BUILTINS_LOCATION,
12736                           TYPE_DECL, get_identifier ("__vector double"),
12737                           V2DF_type_node);
12738       TYPE_NAME (V2DF_type_node) = tdecl;
12739       (*lang_hooks.decls.pushdecl) (tdecl);
12740
12741       tdecl = build_decl (BUILTINS_LOCATION,
12742                           TYPE_DECL, get_identifier ("__vector long"),
12743                           V2DI_type_node);
12744       TYPE_NAME (V2DI_type_node) = tdecl;
12745       (*lang_hooks.decls.pushdecl) (tdecl);
12746
12747       tdecl = build_decl (BUILTINS_LOCATION,
12748                           TYPE_DECL, get_identifier ("__vector unsigned long"),
12749                           unsigned_V2DI_type_node);
12750       TYPE_NAME (unsigned_V2DI_type_node) = tdecl;
12751       (*lang_hooks.decls.pushdecl) (tdecl);
12752
12753       tdecl = build_decl (BUILTINS_LOCATION,
12754                           TYPE_DECL, get_identifier ("__vector __bool long"),
12755                           bool_V2DI_type_node);
12756       TYPE_NAME (bool_V2DI_type_node) = tdecl;
12757       (*lang_hooks.decls.pushdecl) (tdecl);
12758     }
12759
12760   if (TARGET_PAIRED_FLOAT)
12761     paired_init_builtins ();
12762   if (TARGET_SPE)
12763     spe_init_builtins ();
12764   if (TARGET_ALTIVEC)
12765     altivec_init_builtins ();
12766   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT || TARGET_VSX)
12767     rs6000_common_init_builtins ();
12768   if (TARGET_FRE)
12769     {
12770       ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
12771                                      RS6000_BUILTIN_RECIP,
12772                                      "__builtin_recipdiv");
12773       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
12774                    RS6000_BUILTIN_RECIP);
12775     }
12776   if (TARGET_FRES)
12777     {
12778       ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
12779                                      RS6000_BUILTIN_RECIPF,
12780                                      "__builtin_recipdivf");
12781       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
12782                    RS6000_BUILTIN_RECIPF);
12783     }
12784   if (TARGET_FRSQRTE)
12785     {
12786       ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
12787                                      RS6000_BUILTIN_RSQRT,
12788                                      "__builtin_rsqrt");
12789       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrt", ftype,
12790                    RS6000_BUILTIN_RSQRT);
12791     }
12792   if (TARGET_FRSQRTES)
12793     {
12794       ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
12795                                      RS6000_BUILTIN_RSQRTF,
12796                                      "__builtin_rsqrtf");
12797       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
12798                    RS6000_BUILTIN_RSQRTF);
12799     }
12800   if (TARGET_POPCNTD)
12801     {
12802       enum machine_mode mode = (TARGET_64BIT) ? DImode : SImode;
12803       tree ftype = builtin_function_type (mode, mode, mode, VOIDmode,
12804                                           POWER7_BUILTIN_BPERMD,
12805                                           "__builtin_bpermd");
12806       def_builtin (MASK_POPCNTD, "__builtin_bpermd", ftype,
12807                    POWER7_BUILTIN_BPERMD);
12808     }
12809   if (TARGET_POWERPC)
12810     {
12811       /* Don't use builtin_function_type here, as it maps HI/QI to SI.  */
12812       tree ftype = build_function_type_list (unsigned_intHI_type_node,
12813                                              unsigned_intHI_type_node,
12814                                              NULL_TREE);
12815       def_builtin (MASK_POWERPC, "__builtin_bswap16", ftype,
12816                    RS6000_BUILTIN_BSWAP_HI);
12817     }
12818
12819 #if TARGET_XCOFF
12820   /* AIX libm provides clog as __clog.  */
12821   if (built_in_decls [BUILT_IN_CLOG])
12822     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
12823 #endif
12824
12825 #ifdef SUBTARGET_INIT_BUILTINS
12826   SUBTARGET_INIT_BUILTINS;
12827 #endif
12828 }
12829
12830 /* Returns the rs6000 builtin decl for CODE.  */
12831
12832 static tree
12833 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
12834 {
12835   if (code >= RS6000_BUILTIN_COUNT)
12836     return error_mark_node;
12837
12838   return rs6000_builtin_decls[code];
12839 }
12840
12841 /* Search through a set of builtins and enable the mask bits.
12842    DESC is an array of builtins.
12843    SIZE is the total number of builtins.
12844    START is the builtin enum at which to start.
12845    END is the builtin enum at which to end.  */
12846 static void
12847 enable_mask_for_builtins (struct builtin_description *desc, int size,
12848                           enum rs6000_builtins start,
12849                           enum rs6000_builtins end)
12850 {
12851   int i;
12852
12853   for (i = 0; i < size; ++i)
12854     if (desc[i].code == start)
12855       break;
12856
12857   if (i == size)
12858     return;
12859
12860   for (; i < size; ++i)
12861     {
12862       /* Flip all the bits on.  */
12863       desc[i].mask = target_flags;
12864       if (desc[i].code == end)
12865         break;
12866     }
12867 }
12868
12869 static void
12870 spe_init_builtins (void)
12871 {
12872   tree endlink = void_list_node;
12873   tree puint_type_node = build_pointer_type (unsigned_type_node);
12874   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
12875   struct builtin_description *d;
12876   size_t i;
12877
12878   tree v2si_ftype_4_v2si
12879     = build_function_type
12880     (opaque_V2SI_type_node,
12881      tree_cons (NULL_TREE, opaque_V2SI_type_node,
12882                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12883                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12884                                       tree_cons (NULL_TREE, opaque_V2SI_type_node,
12885                                                  endlink)))));
12886
12887   tree v2sf_ftype_4_v2sf
12888     = build_function_type
12889     (opaque_V2SF_type_node,
12890      tree_cons (NULL_TREE, opaque_V2SF_type_node,
12891                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12892                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
12893                                       tree_cons (NULL_TREE, opaque_V2SF_type_node,
12894                                                  endlink)))));
12895
12896   tree int_ftype_int_v2si_v2si
12897     = build_function_type
12898     (integer_type_node,
12899      tree_cons (NULL_TREE, integer_type_node,
12900                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12901                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12902                                       endlink))));
12903
12904   tree int_ftype_int_v2sf_v2sf
12905     = build_function_type
12906     (integer_type_node,
12907      tree_cons (NULL_TREE, integer_type_node,
12908                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12909                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
12910                                       endlink))));
12911
12912   tree void_ftype_v2si_puint_int
12913     = build_function_type (void_type_node,
12914                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12915                                       tree_cons (NULL_TREE, puint_type_node,
12916                                                  tree_cons (NULL_TREE,
12917                                                             integer_type_node,
12918                                                             endlink))));
12919
12920   tree void_ftype_v2si_puint_char
12921     = build_function_type (void_type_node,
12922                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12923                                       tree_cons (NULL_TREE, puint_type_node,
12924                                                  tree_cons (NULL_TREE,
12925                                                             char_type_node,
12926                                                             endlink))));
12927
12928   tree void_ftype_v2si_pv2si_int
12929     = build_function_type (void_type_node,
12930                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12931                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12932                                                  tree_cons (NULL_TREE,
12933                                                             integer_type_node,
12934                                                             endlink))));
12935
12936   tree void_ftype_v2si_pv2si_char
12937     = build_function_type (void_type_node,
12938                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12939                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12940                                                  tree_cons (NULL_TREE,
12941                                                             char_type_node,
12942                                                             endlink))));
12943
12944   tree void_ftype_int
12945     = build_function_type (void_type_node,
12946                            tree_cons (NULL_TREE, integer_type_node, endlink));
12947
12948   tree int_ftype_void
12949     = build_function_type (integer_type_node, endlink);
12950
12951   tree v2si_ftype_pv2si_int
12952     = build_function_type (opaque_V2SI_type_node,
12953                            tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12954                                       tree_cons (NULL_TREE, integer_type_node,
12955                                                  endlink)));
12956
12957   tree v2si_ftype_puint_int
12958     = build_function_type (opaque_V2SI_type_node,
12959                            tree_cons (NULL_TREE, puint_type_node,
12960                                       tree_cons (NULL_TREE, integer_type_node,
12961                                                  endlink)));
12962
12963   tree v2si_ftype_pushort_int
12964     = build_function_type (opaque_V2SI_type_node,
12965                            tree_cons (NULL_TREE, pushort_type_node,
12966                                       tree_cons (NULL_TREE, integer_type_node,
12967                                                  endlink)));
12968
12969   tree v2si_ftype_signed_char
12970     = build_function_type (opaque_V2SI_type_node,
12971                            tree_cons (NULL_TREE, signed_char_type_node,
12972                                       endlink));
12973
12974   /* The initialization of the simple binary and unary builtins is
12975      done in rs6000_common_init_builtins, but we have to enable the
12976      mask bits here manually because we have run out of `target_flags'
12977      bits.  We really need to redesign this mask business.  */
12978
12979   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
12980                             ARRAY_SIZE (bdesc_2arg),
12981                             SPE_BUILTIN_EVADDW,
12982                             SPE_BUILTIN_EVXOR);
12983   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
12984                             ARRAY_SIZE (bdesc_1arg),
12985                             SPE_BUILTIN_EVABS,
12986                             SPE_BUILTIN_EVSUBFUSIAAW);
12987   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
12988                             ARRAY_SIZE (bdesc_spe_predicates),
12989                             SPE_BUILTIN_EVCMPEQ,
12990                             SPE_BUILTIN_EVFSTSTLT);
12991   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
12992                             ARRAY_SIZE (bdesc_spe_evsel),
12993                             SPE_BUILTIN_EVSEL_CMPGTS,
12994                             SPE_BUILTIN_EVSEL_FSTSTEQ);
12995
12996   (*lang_hooks.decls.pushdecl)
12997     (build_decl (BUILTINS_LOCATION, TYPE_DECL,
12998                  get_identifier ("__ev64_opaque__"),
12999                  opaque_V2SI_type_node));
13000
13001   /* Initialize irregular SPE builtins.  */
13002
13003   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
13004   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
13005   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
13006   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
13007   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
13008   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
13009   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
13010   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
13011   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
13012   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
13013   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
13014   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
13015   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
13016   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
13017   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
13018   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
13019   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
13020   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
13021
13022   /* Loads.  */
13023   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
13024   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
13025   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
13026   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
13027   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
13028   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
13029   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
13030   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
13031   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
13032   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
13033   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
13034   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
13035   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
13036   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
13037   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
13038   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
13039   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
13040   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
13041   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
13042   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
13043   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
13044   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
13045
13046   /* Predicates.  */
13047   d = (struct builtin_description *) bdesc_spe_predicates;
13048   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
13049     {
13050       tree type;
13051
13052       switch (insn_data[d->icode].operand[1].mode)
13053         {
13054         case V2SImode:
13055           type = int_ftype_int_v2si_v2si;
13056           break;
13057         case V2SFmode:
13058           type = int_ftype_int_v2sf_v2sf;
13059           break;
13060         default:
13061           gcc_unreachable ();
13062         }
13063
13064       def_builtin (d->mask, d->name, type, d->code);
13065     }
13066
13067   /* Evsel predicates.  */
13068   d = (struct builtin_description *) bdesc_spe_evsel;
13069   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
13070     {
13071       tree type;
13072
13073       switch (insn_data[d->icode].operand[1].mode)
13074         {
13075         case V2SImode:
13076           type = v2si_ftype_4_v2si;
13077           break;
13078         case V2SFmode:
13079           type = v2sf_ftype_4_v2sf;
13080           break;
13081         default:
13082           gcc_unreachable ();
13083         }
13084
13085       def_builtin (d->mask, d->name, type, d->code);
13086     }
13087 }
13088
13089 static void
13090 paired_init_builtins (void)
13091 {
13092   const struct builtin_description *d;
13093   size_t i;
13094   tree endlink = void_list_node;
13095
13096    tree int_ftype_int_v2sf_v2sf
13097     = build_function_type
13098     (integer_type_node,
13099      tree_cons (NULL_TREE, integer_type_node,
13100                 tree_cons (NULL_TREE, V2SF_type_node,
13101                            tree_cons (NULL_TREE, V2SF_type_node,
13102                                       endlink))));
13103   tree pcfloat_type_node =
13104     build_pointer_type (build_qualified_type
13105                         (float_type_node, TYPE_QUAL_CONST));
13106
13107   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
13108                                                            long_integer_type_node,
13109                                                            pcfloat_type_node,
13110                                                            NULL_TREE);
13111   tree void_ftype_v2sf_long_pcfloat =
13112     build_function_type_list (void_type_node,
13113                               V2SF_type_node,
13114                               long_integer_type_node,
13115                               pcfloat_type_node,
13116                               NULL_TREE);
13117
13118
13119   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
13120                PAIRED_BUILTIN_LX);
13121
13122
13123   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
13124                PAIRED_BUILTIN_STX);
13125
13126   /* Predicates.  */
13127   d = bdesc_paired_preds;
13128   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
13129     {
13130       tree type;
13131
13132       switch (insn_data[d->icode].operand[1].mode)
13133         {
13134         case V2SFmode:
13135           type = int_ftype_int_v2sf_v2sf;
13136           break;
13137         default:
13138           gcc_unreachable ();
13139         }
13140
13141       def_builtin (d->mask, d->name, type, d->code);
13142     }
13143 }
13144
13145 static void
13146 altivec_init_builtins (void)
13147 {
13148   const struct builtin_description *d;
13149   const struct builtin_description_predicates *dp;
13150   size_t i;
13151   tree ftype;
13152
13153   tree pvoid_type_node = build_pointer_type (void_type_node);
13154
13155   tree pcvoid_type_node
13156     = build_pointer_type (build_qualified_type (void_type_node,
13157                                                 TYPE_QUAL_CONST));
13158
13159   tree int_ftype_opaque
13160     = build_function_type_list (integer_type_node,
13161                                 opaque_V4SI_type_node, NULL_TREE);
13162   tree opaque_ftype_opaque
13163     = build_function_type (integer_type_node,
13164                                 NULL_TREE);
13165   tree opaque_ftype_opaque_int
13166     = build_function_type_list (opaque_V4SI_type_node,
13167                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
13168   tree opaque_ftype_opaque_opaque_int
13169     = build_function_type_list (opaque_V4SI_type_node,
13170                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
13171                                 integer_type_node, NULL_TREE);
13172   tree int_ftype_int_opaque_opaque
13173     = build_function_type_list (integer_type_node,
13174                                 integer_type_node, opaque_V4SI_type_node,
13175                                 opaque_V4SI_type_node, NULL_TREE);
13176   tree int_ftype_int_v4si_v4si
13177     = build_function_type_list (integer_type_node,
13178                                 integer_type_node, V4SI_type_node,
13179                                 V4SI_type_node, NULL_TREE);
13180   tree void_ftype_v4si
13181     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
13182   tree v8hi_ftype_void
13183     = build_function_type (V8HI_type_node, void_list_node);
13184   tree void_ftype_void
13185     = build_function_type (void_type_node, void_list_node);
13186   tree void_ftype_int
13187     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
13188
13189   tree opaque_ftype_long_pcvoid
13190     = build_function_type_list (opaque_V4SI_type_node,
13191                                 long_integer_type_node, pcvoid_type_node,
13192                                 NULL_TREE);
13193   tree v16qi_ftype_long_pcvoid
13194     = build_function_type_list (V16QI_type_node,
13195                                 long_integer_type_node, pcvoid_type_node,
13196                                 NULL_TREE);
13197   tree v8hi_ftype_long_pcvoid
13198     = build_function_type_list (V8HI_type_node,
13199                                 long_integer_type_node, pcvoid_type_node,
13200                                 NULL_TREE);
13201   tree v4si_ftype_long_pcvoid
13202     = build_function_type_list (V4SI_type_node,
13203                                 long_integer_type_node, pcvoid_type_node,
13204                                 NULL_TREE);
13205   tree v4sf_ftype_long_pcvoid
13206     = build_function_type_list (V4SF_type_node,
13207                                 long_integer_type_node, pcvoid_type_node,
13208                                 NULL_TREE);
13209   tree v2df_ftype_long_pcvoid
13210     = build_function_type_list (V2DF_type_node,
13211                                 long_integer_type_node, pcvoid_type_node,
13212                                 NULL_TREE);
13213   tree v2di_ftype_long_pcvoid
13214     = build_function_type_list (V2DI_type_node,
13215                                 long_integer_type_node, pcvoid_type_node,
13216                                 NULL_TREE);
13217
13218   tree void_ftype_opaque_long_pvoid
13219     = build_function_type_list (void_type_node,
13220                                 opaque_V4SI_type_node, long_integer_type_node,
13221                                 pvoid_type_node, NULL_TREE);
13222   tree void_ftype_v4si_long_pvoid
13223     = build_function_type_list (void_type_node,
13224                                 V4SI_type_node, long_integer_type_node,
13225                                 pvoid_type_node, NULL_TREE);
13226   tree void_ftype_v16qi_long_pvoid
13227     = build_function_type_list (void_type_node,
13228                                 V16QI_type_node, long_integer_type_node,
13229                                 pvoid_type_node, NULL_TREE);
13230   tree void_ftype_v8hi_long_pvoid
13231     = build_function_type_list (void_type_node,
13232                                 V8HI_type_node, long_integer_type_node,
13233                                 pvoid_type_node, NULL_TREE);
13234   tree void_ftype_v4sf_long_pvoid
13235     = build_function_type_list (void_type_node,
13236                                 V4SF_type_node, long_integer_type_node,
13237                                 pvoid_type_node, NULL_TREE);
13238   tree void_ftype_v2df_long_pvoid
13239     = build_function_type_list (void_type_node,
13240                                 V2DF_type_node, long_integer_type_node,
13241                                 pvoid_type_node, NULL_TREE);
13242   tree void_ftype_v2di_long_pvoid
13243     = build_function_type_list (void_type_node,
13244                                 V2DI_type_node, long_integer_type_node,
13245                                 pvoid_type_node, NULL_TREE);
13246   tree int_ftype_int_v8hi_v8hi
13247     = build_function_type_list (integer_type_node,
13248                                 integer_type_node, V8HI_type_node,
13249                                 V8HI_type_node, NULL_TREE);
13250   tree int_ftype_int_v16qi_v16qi
13251     = build_function_type_list (integer_type_node,
13252                                 integer_type_node, V16QI_type_node,
13253                                 V16QI_type_node, NULL_TREE);
13254   tree int_ftype_int_v4sf_v4sf
13255     = build_function_type_list (integer_type_node,
13256                                 integer_type_node, V4SF_type_node,
13257                                 V4SF_type_node, NULL_TREE);
13258   tree int_ftype_int_v2df_v2df
13259     = build_function_type_list (integer_type_node,
13260                                 integer_type_node, V2DF_type_node,
13261                                 V2DF_type_node, NULL_TREE);
13262   tree v4si_ftype_v4si
13263     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
13264   tree v8hi_ftype_v8hi
13265     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
13266   tree v16qi_ftype_v16qi
13267     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
13268   tree v4sf_ftype_v4sf
13269     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
13270   tree v2df_ftype_v2df
13271     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
13272   tree void_ftype_pcvoid_int_int
13273     = build_function_type_list (void_type_node,
13274                                 pcvoid_type_node, integer_type_node,
13275                                 integer_type_node, NULL_TREE);
13276
13277   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
13278   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
13279   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
13280   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
13281   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
13282   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
13283   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
13284   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
13285   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
13286   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
13287   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
13288   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
13289   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
13290   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
13291   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
13292   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
13293   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
13294   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
13295   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
13296   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
13297   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
13298   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
13299   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
13300   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
13301   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
13302   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
13303   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
13304   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
13305   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
13306   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
13307
13308   def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2df", v2df_ftype_long_pcvoid,
13309                VSX_BUILTIN_LXVD2X_V2DF);
13310   def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2di", v2di_ftype_long_pcvoid,
13311                VSX_BUILTIN_LXVD2X_V2DI);
13312   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4sf", v4sf_ftype_long_pcvoid,
13313                VSX_BUILTIN_LXVW4X_V4SF);
13314   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4si", v4si_ftype_long_pcvoid,
13315                VSX_BUILTIN_LXVW4X_V4SI);
13316   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v8hi",
13317                v8hi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V8HI);
13318   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v16qi",
13319                v16qi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V16QI);
13320   def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2df",
13321                void_ftype_v2df_long_pvoid, VSX_BUILTIN_STXVD2X_V2DF);
13322   def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2di",
13323                void_ftype_v2di_long_pvoid, VSX_BUILTIN_STXVD2X_V2DI);
13324   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4sf",
13325                void_ftype_v4sf_long_pvoid, VSX_BUILTIN_STXVW4X_V4SF);
13326   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4si",
13327                void_ftype_v4si_long_pvoid, VSX_BUILTIN_STXVW4X_V4SI);
13328   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v8hi",
13329                void_ftype_v8hi_long_pvoid, VSX_BUILTIN_STXVW4X_V8HI);
13330   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v16qi",
13331                void_ftype_v16qi_long_pvoid, VSX_BUILTIN_STXVW4X_V16QI);
13332   def_builtin (MASK_VSX, "__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
13333                VSX_BUILTIN_VEC_LD);
13334   def_builtin (MASK_VSX, "__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
13335                VSX_BUILTIN_VEC_ST);
13336
13337   if (rs6000_cpu == PROCESSOR_CELL)
13338     {
13339       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
13340       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
13341       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
13342       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
13343
13344       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
13345       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
13346       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
13347       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
13348
13349       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
13350       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
13351       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
13352       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
13353
13354       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
13355       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
13356       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
13357       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
13358     }
13359   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
13360   def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
13361   def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
13362
13363   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
13364   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
13365   def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
13366   def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
13367   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
13368   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
13369   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
13370   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
13371   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
13372   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
13373   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
13374   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
13375
13376   /* Add the DST variants.  */
13377   d = bdesc_dst;
13378   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
13379     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
13380
13381   /* Initialize the predicates.  */
13382   dp = bdesc_altivec_preds;
13383   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
13384     {
13385       enum machine_mode mode1;
13386       tree type;
13387       bool is_overloaded = ((dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13388                              && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13389                             || (dp->code >= VSX_BUILTIN_OVERLOADED_FIRST
13390                                 && dp->code <= VSX_BUILTIN_OVERLOADED_LAST));
13391
13392       if (is_overloaded)
13393         mode1 = VOIDmode;
13394       else
13395         mode1 = insn_data[dp->icode].operand[1].mode;
13396
13397       switch (mode1)
13398         {
13399         case VOIDmode:
13400           type = int_ftype_int_opaque_opaque;
13401           break;
13402         case V4SImode:
13403           type = int_ftype_int_v4si_v4si;
13404           break;
13405         case V8HImode:
13406           type = int_ftype_int_v8hi_v8hi;
13407           break;
13408         case V16QImode:
13409           type = int_ftype_int_v16qi_v16qi;
13410           break;
13411         case V4SFmode:
13412           type = int_ftype_int_v4sf_v4sf;
13413           break;
13414         case V2DFmode:
13415           type = int_ftype_int_v2df_v2df;
13416           break;
13417         default:
13418           gcc_unreachable ();
13419         }
13420
13421       def_builtin (dp->mask, dp->name, type, dp->code);
13422     }
13423
13424   /* Initialize the abs* operators.  */
13425   d = bdesc_abs;
13426   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
13427     {
13428       enum machine_mode mode0;
13429       tree type;
13430
13431       mode0 = insn_data[d->icode].operand[0].mode;
13432
13433       switch (mode0)
13434         {
13435         case V4SImode:
13436           type = v4si_ftype_v4si;
13437           break;
13438         case V8HImode:
13439           type = v8hi_ftype_v8hi;
13440           break;
13441         case V16QImode:
13442           type = v16qi_ftype_v16qi;
13443           break;
13444         case V4SFmode:
13445           type = v4sf_ftype_v4sf;
13446           break;
13447         case V2DFmode:
13448           type = v2df_ftype_v2df;
13449           break;
13450         default:
13451           gcc_unreachable ();
13452         }
13453
13454       def_builtin (d->mask, d->name, type, d->code);
13455     }
13456
13457   if (TARGET_ALTIVEC)
13458     {
13459       tree decl;
13460
13461       /* Initialize target builtin that implements
13462          targetm.vectorize.builtin_mask_for_load.  */
13463
13464       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
13465                                    v16qi_ftype_long_pcvoid,
13466                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
13467                                    BUILT_IN_MD, NULL, NULL_TREE);
13468       TREE_READONLY (decl) = 1;
13469       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
13470       altivec_builtin_mask_for_load = decl;
13471     }
13472
13473   /* Access to the vec_init patterns.  */
13474   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
13475                                     integer_type_node, integer_type_node,
13476                                     integer_type_node, NULL_TREE);
13477   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
13478                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
13479
13480   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
13481                                     short_integer_type_node,
13482                                     short_integer_type_node,
13483                                     short_integer_type_node,
13484                                     short_integer_type_node,
13485                                     short_integer_type_node,
13486                                     short_integer_type_node,
13487                                     short_integer_type_node, NULL_TREE);
13488   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
13489                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
13490
13491   ftype = build_function_type_list (V16QI_type_node, char_type_node,
13492                                     char_type_node, char_type_node,
13493                                     char_type_node, char_type_node,
13494                                     char_type_node, char_type_node,
13495                                     char_type_node, char_type_node,
13496                                     char_type_node, char_type_node,
13497                                     char_type_node, char_type_node,
13498                                     char_type_node, char_type_node,
13499                                     char_type_node, NULL_TREE);
13500   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
13501                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
13502
13503   ftype = build_function_type_list (V4SF_type_node, float_type_node,
13504                                     float_type_node, float_type_node,
13505                                     float_type_node, NULL_TREE);
13506   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
13507                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
13508
13509   if (TARGET_VSX)
13510     {
13511       ftype = build_function_type_list (V2DF_type_node, double_type_node,
13512                                         double_type_node, NULL_TREE);
13513       def_builtin (MASK_VSX, "__builtin_vec_init_v2df", ftype,
13514                    VSX_BUILTIN_VEC_INIT_V2DF);
13515
13516       ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
13517                                         intDI_type_node, NULL_TREE);
13518       def_builtin (MASK_VSX, "__builtin_vec_init_v2di", ftype,
13519                    VSX_BUILTIN_VEC_INIT_V2DI);
13520     }
13521
13522   /* Access to the vec_set patterns.  */
13523   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
13524                                     intSI_type_node,
13525                                     integer_type_node, NULL_TREE);
13526   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
13527                ALTIVEC_BUILTIN_VEC_SET_V4SI);
13528
13529   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
13530                                     intHI_type_node,
13531                                     integer_type_node, NULL_TREE);
13532   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
13533                ALTIVEC_BUILTIN_VEC_SET_V8HI);
13534
13535   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
13536                                     intQI_type_node,
13537                                     integer_type_node, NULL_TREE);
13538   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
13539                ALTIVEC_BUILTIN_VEC_SET_V16QI);
13540
13541   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
13542                                     float_type_node,
13543                                     integer_type_node, NULL_TREE);
13544   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_set_v4sf", ftype,
13545                ALTIVEC_BUILTIN_VEC_SET_V4SF);
13546
13547   if (TARGET_VSX)
13548     {
13549       ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
13550                                         double_type_node,
13551                                         integer_type_node, NULL_TREE);
13552       def_builtin (MASK_VSX, "__builtin_vec_set_v2df", ftype,
13553                    VSX_BUILTIN_VEC_SET_V2DF);
13554
13555       ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
13556                                         intDI_type_node,
13557                                         integer_type_node, NULL_TREE);
13558       def_builtin (MASK_VSX, "__builtin_vec_set_v2di", ftype,
13559                    VSX_BUILTIN_VEC_SET_V2DI);
13560     }
13561
13562   /* Access to the vec_extract patterns.  */
13563   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
13564                                     integer_type_node, NULL_TREE);
13565   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
13566                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
13567
13568   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
13569                                     integer_type_node, NULL_TREE);
13570   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
13571                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
13572
13573   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
13574                                     integer_type_node, NULL_TREE);
13575   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
13576                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
13577
13578   ftype = build_function_type_list (float_type_node, V4SF_type_node,
13579                                     integer_type_node, NULL_TREE);
13580   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_ext_v4sf", ftype,
13581                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
13582
13583   if (TARGET_VSX)
13584     {
13585       ftype = build_function_type_list (double_type_node, V2DF_type_node,
13586                                         integer_type_node, NULL_TREE);
13587       def_builtin (MASK_VSX, "__builtin_vec_ext_v2df", ftype,
13588                    VSX_BUILTIN_VEC_EXT_V2DF);
13589
13590       ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
13591                                         integer_type_node, NULL_TREE);
13592       def_builtin (MASK_VSX, "__builtin_vec_ext_v2di", ftype,
13593                    VSX_BUILTIN_VEC_EXT_V2DI);
13594     }
13595 }
13596
13597 /* Hash function for builtin functions with up to 3 arguments and a return
13598    type.  */
13599 static unsigned
13600 builtin_hash_function (const void *hash_entry)
13601 {
13602   unsigned ret = 0;
13603   int i;
13604   const struct builtin_hash_struct *bh =
13605     (const struct builtin_hash_struct *) hash_entry;
13606
13607   for (i = 0; i < 4; i++)
13608     {
13609       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
13610       ret = (ret * 2) + bh->uns_p[i];
13611     }
13612
13613   return ret;
13614 }
13615
13616 /* Compare builtin hash entries H1 and H2 for equivalence.  */
13617 static int
13618 builtin_hash_eq (const void *h1, const void *h2)
13619 {
13620   const struct builtin_hash_struct *p1 = (const struct builtin_hash_struct *) h1;
13621   const struct builtin_hash_struct *p2 = (const struct builtin_hash_struct *) h2;
13622
13623   return ((p1->mode[0] == p2->mode[0])
13624           && (p1->mode[1] == p2->mode[1])
13625           && (p1->mode[2] == p2->mode[2])
13626           && (p1->mode[3] == p2->mode[3])
13627           && (p1->uns_p[0] == p2->uns_p[0])
13628           && (p1->uns_p[1] == p2->uns_p[1])
13629           && (p1->uns_p[2] == p2->uns_p[2])
13630           && (p1->uns_p[3] == p2->uns_p[3]));
13631 }
13632
13633 /* Map types for builtin functions with an explicit return type and up to 3
13634    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
13635    of the argument.  */
13636 static tree
13637 builtin_function_type (enum machine_mode mode_ret, enum machine_mode mode_arg0,
13638                        enum machine_mode mode_arg1, enum machine_mode mode_arg2,
13639                        enum rs6000_builtins builtin, const char *name)
13640 {
13641   struct builtin_hash_struct h;
13642   struct builtin_hash_struct *h2;
13643   void **found;
13644   int num_args = 3;
13645   int i;
13646   tree ret_type = NULL_TREE;
13647   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
13648   tree args;
13649
13650   /* Create builtin_hash_table.  */
13651   if (builtin_hash_table == NULL)
13652     builtin_hash_table = htab_create_ggc (1500, builtin_hash_function,
13653                                           builtin_hash_eq, NULL);
13654
13655   h.type = NULL_TREE;
13656   h.mode[0] = mode_ret;
13657   h.mode[1] = mode_arg0;
13658   h.mode[2] = mode_arg1;
13659   h.mode[3] = mode_arg2;
13660   h.uns_p[0] = 0;
13661   h.uns_p[1] = 0;
13662   h.uns_p[2] = 0;
13663   h.uns_p[3] = 0;
13664
13665   /* If the builtin is a type that produces unsigned results or takes unsigned
13666      arguments, and it is returned as a decl for the vectorizer (such as
13667      widening multiplies, permute), make sure the arguments and return value
13668      are type correct.  */
13669   switch (builtin)
13670     {
13671       /* unsigned 2 argument functions.  */
13672     case ALTIVEC_BUILTIN_VMULEUB_UNS:
13673     case ALTIVEC_BUILTIN_VMULEUH_UNS:
13674     case ALTIVEC_BUILTIN_VMULOUB_UNS:
13675     case ALTIVEC_BUILTIN_VMULOUH_UNS:
13676       h.uns_p[0] = 1;
13677       h.uns_p[1] = 1;
13678       h.uns_p[2] = 1;
13679       break;
13680
13681       /* unsigned 3 argument functions.  */
13682     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
13683     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
13684     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
13685     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
13686     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
13687     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
13688     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
13689     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
13690     case VSX_BUILTIN_VPERM_16QI_UNS:
13691     case VSX_BUILTIN_VPERM_8HI_UNS:
13692     case VSX_BUILTIN_VPERM_4SI_UNS:
13693     case VSX_BUILTIN_VPERM_2DI_UNS:
13694     case VSX_BUILTIN_XXSEL_16QI_UNS:
13695     case VSX_BUILTIN_XXSEL_8HI_UNS:
13696     case VSX_BUILTIN_XXSEL_4SI_UNS:
13697     case VSX_BUILTIN_XXSEL_2DI_UNS:
13698       h.uns_p[0] = 1;
13699       h.uns_p[1] = 1;
13700       h.uns_p[2] = 1;
13701       h.uns_p[3] = 1;
13702       break;
13703
13704       /* signed permute functions with unsigned char mask.  */
13705     case ALTIVEC_BUILTIN_VPERM_16QI:
13706     case ALTIVEC_BUILTIN_VPERM_8HI:
13707     case ALTIVEC_BUILTIN_VPERM_4SI:
13708     case ALTIVEC_BUILTIN_VPERM_4SF:
13709     case ALTIVEC_BUILTIN_VPERM_2DI:
13710     case ALTIVEC_BUILTIN_VPERM_2DF:
13711     case VSX_BUILTIN_VPERM_16QI:
13712     case VSX_BUILTIN_VPERM_8HI:
13713     case VSX_BUILTIN_VPERM_4SI:
13714     case VSX_BUILTIN_VPERM_4SF:
13715     case VSX_BUILTIN_VPERM_2DI:
13716     case VSX_BUILTIN_VPERM_2DF:
13717       h.uns_p[3] = 1;
13718       break;
13719
13720       /* unsigned args, signed return.  */
13721     case VSX_BUILTIN_XVCVUXDDP_UNS:
13722     case VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF:
13723       h.uns_p[1] = 1;
13724       break;
13725
13726       /* signed args, unsigned return.  */
13727     case VSX_BUILTIN_XVCVDPUXDS_UNS:
13728     case VECTOR_BUILTIN_FIXUNS_V4SF_V4SI:
13729       h.uns_p[0] = 1;
13730       break;
13731
13732     default:
13733       break;
13734     }
13735
13736   /* Figure out how many args are present.  */
13737   while (num_args > 0 && h.mode[num_args] == VOIDmode)
13738     num_args--;
13739
13740   if (num_args == 0)
13741     fatal_error ("internal error: builtin function %s had no type", name);
13742
13743   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
13744   if (!ret_type && h.uns_p[0])
13745     ret_type = builtin_mode_to_type[h.mode[0]][0];
13746
13747   if (!ret_type)
13748     fatal_error ("internal error: builtin function %s had an unexpected "
13749                  "return type %s", name, GET_MODE_NAME (h.mode[0]));
13750
13751   for (i = 0; i < num_args; i++)
13752     {
13753       int m = (int) h.mode[i+1];
13754       int uns_p = h.uns_p[i+1];
13755
13756       arg_type[i] = builtin_mode_to_type[m][uns_p];
13757       if (!arg_type[i] && uns_p)
13758         arg_type[i] = builtin_mode_to_type[m][0];
13759
13760       if (!arg_type[i])
13761         fatal_error ("internal error: builtin function %s, argument %d "
13762                      "had unexpected argument type %s", name, i,
13763                      GET_MODE_NAME (m));
13764     }
13765
13766   found = htab_find_slot (builtin_hash_table, &h, INSERT);
13767   if (*found == NULL)
13768     {
13769       h2 = ggc_alloc_builtin_hash_struct ();
13770       *h2 = h;
13771       *found = (void *)h2;
13772       args = void_list_node;
13773
13774       for (i = num_args - 1; i >= 0; i--)
13775         args = tree_cons (NULL_TREE, arg_type[i], args);
13776
13777       h2->type = build_function_type (ret_type, args);
13778     }
13779
13780   return ((struct builtin_hash_struct *)(*found))->type;
13781 }
13782
13783 static void
13784 rs6000_common_init_builtins (void)
13785 {
13786   const struct builtin_description *d;
13787   size_t i;
13788
13789   tree opaque_ftype_opaque = NULL_TREE;
13790   tree opaque_ftype_opaque_opaque = NULL_TREE;
13791   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
13792   tree v2si_ftype_qi = NULL_TREE;
13793   tree v2si_ftype_v2si_qi = NULL_TREE;
13794   tree v2si_ftype_int_qi = NULL_TREE;
13795
13796   if (!TARGET_PAIRED_FLOAT)
13797     {
13798       builtin_mode_to_type[V2SImode][0] = opaque_V2SI_type_node;
13799       builtin_mode_to_type[V2SFmode][0] = opaque_V2SF_type_node;
13800     }
13801
13802   /* Add the ternary operators.  */
13803   d = bdesc_3arg;
13804   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
13805     {
13806       tree type;
13807       int mask = d->mask;
13808
13809       if ((mask != 0 && (mask & target_flags) == 0)
13810           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13811         continue;
13812
13813       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13814            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13815           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13816               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13817         {
13818           if (! (type = opaque_ftype_opaque_opaque_opaque))
13819             type = opaque_ftype_opaque_opaque_opaque
13820               = build_function_type_list (opaque_V4SI_type_node,
13821                                           opaque_V4SI_type_node,
13822                                           opaque_V4SI_type_node,
13823                                           opaque_V4SI_type_node,
13824                                           NULL_TREE);
13825         }
13826       else
13827         {
13828           enum insn_code icode = d->icode;
13829           if (d->name == 0 || icode == CODE_FOR_nothing)
13830             continue;
13831
13832           type = builtin_function_type (insn_data[icode].operand[0].mode,
13833                                         insn_data[icode].operand[1].mode,
13834                                         insn_data[icode].operand[2].mode,
13835                                         insn_data[icode].operand[3].mode,
13836                                         d->code, d->name);
13837         }
13838
13839       def_builtin (d->mask, d->name, type, d->code);
13840     }
13841
13842   /* Add the binary operators.  */
13843   d = bdesc_2arg;
13844   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13845     {
13846       enum machine_mode mode0, mode1, mode2;
13847       tree type;
13848       int mask = d->mask;
13849
13850       if ((mask != 0 && (mask & target_flags) == 0)
13851           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13852         continue;
13853
13854       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13855            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13856           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13857               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13858         {
13859           if (! (type = opaque_ftype_opaque_opaque))
13860             type = opaque_ftype_opaque_opaque
13861               = build_function_type_list (opaque_V4SI_type_node,
13862                                           opaque_V4SI_type_node,
13863                                           opaque_V4SI_type_node,
13864                                           NULL_TREE);
13865         }
13866       else
13867         {
13868           enum insn_code icode = d->icode;
13869           if (d->name == 0 || icode == CODE_FOR_nothing)
13870             continue;
13871
13872           mode0 = insn_data[icode].operand[0].mode;
13873           mode1 = insn_data[icode].operand[1].mode;
13874           mode2 = insn_data[icode].operand[2].mode;
13875
13876           if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
13877             {
13878               if (! (type = v2si_ftype_v2si_qi))
13879                 type = v2si_ftype_v2si_qi
13880                   = build_function_type_list (opaque_V2SI_type_node,
13881                                               opaque_V2SI_type_node,
13882                                               char_type_node,
13883                                               NULL_TREE);
13884             }
13885
13886           else if (mode0 == V2SImode && GET_MODE_CLASS (mode1) == MODE_INT
13887                    && mode2 == QImode)
13888             {
13889               if (! (type = v2si_ftype_int_qi))
13890                 type = v2si_ftype_int_qi
13891                   = build_function_type_list (opaque_V2SI_type_node,
13892                                               integer_type_node,
13893                                               char_type_node,
13894                                               NULL_TREE);
13895             }
13896
13897           else
13898             type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
13899                                           d->code, d->name);
13900         }
13901
13902       def_builtin (d->mask, d->name, type, d->code);
13903     }
13904
13905   /* Add the simple unary operators.  */
13906   d = (struct builtin_description *) bdesc_1arg;
13907   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13908     {
13909       enum machine_mode mode0, mode1;
13910       tree type;
13911       int mask = d->mask;
13912
13913       if ((mask != 0 && (mask & target_flags) == 0)
13914           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13915         continue;
13916
13917       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13918            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13919           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13920               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13921         {
13922           if (! (type = opaque_ftype_opaque))
13923             type = opaque_ftype_opaque
13924               = build_function_type_list (opaque_V4SI_type_node,
13925                                           opaque_V4SI_type_node,
13926                                           NULL_TREE);
13927         }
13928       else
13929         {
13930           enum insn_code icode = d->icode;
13931           if (d->name == 0 || icode == CODE_FOR_nothing)
13932             continue;
13933
13934           mode0 = insn_data[icode].operand[0].mode;
13935           mode1 = insn_data[icode].operand[1].mode;
13936
13937           if (mode0 == V2SImode && mode1 == QImode)
13938             {
13939               if (! (type = v2si_ftype_qi))
13940                 type = v2si_ftype_qi
13941                   = build_function_type_list (opaque_V2SI_type_node,
13942                                               char_type_node,
13943                                               NULL_TREE);
13944             }
13945
13946           else
13947             type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
13948                                           d->code, d->name);
13949         }
13950
13951       def_builtin (d->mask, d->name, type, d->code);
13952     }
13953 }
13954
13955 static void
13956 rs6000_init_libfuncs (void)
13957 {
13958   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
13959       && !TARGET_POWER2 && !TARGET_POWERPC)
13960     {
13961       /* AIX library routines for float->int conversion.  */
13962       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
13963       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
13964       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
13965       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
13966     }
13967
13968   if (!TARGET_IEEEQUAD)
13969       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
13970     if (!TARGET_XL_COMPAT)
13971       {
13972         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
13973         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
13974         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
13975         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
13976
13977         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
13978           {
13979             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
13980             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
13981             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
13982             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
13983             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
13984             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
13985             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
13986
13987             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
13988             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
13989             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
13990             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
13991             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
13992             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
13993             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
13994             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
13995           }
13996
13997         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
13998           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
13999       }
14000     else
14001       {
14002         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
14003         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
14004         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
14005         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
14006       }
14007   else
14008     {
14009       /* 32-bit SVR4 quad floating point routines.  */
14010
14011       set_optab_libfunc (add_optab, TFmode, "_q_add");
14012       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
14013       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
14014       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
14015       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
14016       if (TARGET_PPC_GPOPT || TARGET_POWER2)
14017         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
14018
14019       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
14020       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
14021       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
14022       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
14023       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
14024       set_optab_libfunc (le_optab, TFmode, "_q_fle");
14025
14026       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
14027       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
14028       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
14029       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
14030       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
14031       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
14032       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
14033       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
14034     }
14035 }
14036
14037 \f
14038 /* Expand a block clear operation, and return 1 if successful.  Return 0
14039    if we should let the compiler generate normal code.
14040
14041    operands[0] is the destination
14042    operands[1] is the length
14043    operands[3] is the alignment */
14044
14045 int
14046 expand_block_clear (rtx operands[])
14047 {
14048   rtx orig_dest = operands[0];
14049   rtx bytes_rtx = operands[1];
14050   rtx align_rtx = operands[3];
14051   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
14052   HOST_WIDE_INT align;
14053   HOST_WIDE_INT bytes;
14054   int offset;
14055   int clear_bytes;
14056   int clear_step;
14057
14058   /* If this is not a fixed size move, just call memcpy */
14059   if (! constp)
14060     return 0;
14061
14062   /* This must be a fixed size alignment  */
14063   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
14064   align = INTVAL (align_rtx) * BITS_PER_UNIT;
14065
14066   /* Anything to clear? */
14067   bytes = INTVAL (bytes_rtx);
14068   if (bytes <= 0)
14069     return 1;
14070
14071   /* Use the builtin memset after a point, to avoid huge code bloat.
14072      When optimize_size, avoid any significant code bloat; calling
14073      memset is about 4 instructions, so allow for one instruction to
14074      load zero and three to do clearing.  */
14075   if (TARGET_ALTIVEC && align >= 128)
14076     clear_step = 16;
14077   else if (TARGET_POWERPC64 && align >= 32)
14078     clear_step = 8;
14079   else if (TARGET_SPE && align >= 64)
14080     clear_step = 8;
14081   else
14082     clear_step = 4;
14083
14084   if (optimize_size && bytes > 3 * clear_step)
14085     return 0;
14086   if (! optimize_size && bytes > 8 * clear_step)
14087     return 0;
14088
14089   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
14090     {
14091       enum machine_mode mode = BLKmode;
14092       rtx dest;
14093
14094       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
14095         {
14096           clear_bytes = 16;
14097           mode = V4SImode;
14098         }
14099       else if (bytes >= 8 && TARGET_SPE && align >= 64)
14100         {
14101           clear_bytes = 8;
14102           mode = V2SImode;
14103         }
14104       else if (bytes >= 8 && TARGET_POWERPC64
14105                /* 64-bit loads and stores require word-aligned
14106                   displacements.  */
14107                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
14108         {
14109           clear_bytes = 8;
14110           mode = DImode;
14111         }
14112       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
14113         {                       /* move 4 bytes */
14114           clear_bytes = 4;
14115           mode = SImode;
14116         }
14117       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
14118         {                       /* move 2 bytes */
14119           clear_bytes = 2;
14120           mode = HImode;
14121         }
14122       else /* move 1 byte at a time */
14123         {
14124           clear_bytes = 1;
14125           mode = QImode;
14126         }
14127
14128       dest = adjust_address (orig_dest, mode, offset);
14129
14130       emit_move_insn (dest, CONST0_RTX (mode));
14131     }
14132
14133   return 1;
14134 }
14135
14136 \f
14137 /* Expand a block move operation, and return 1 if successful.  Return 0
14138    if we should let the compiler generate normal code.
14139
14140    operands[0] is the destination
14141    operands[1] is the source
14142    operands[2] is the length
14143    operands[3] is the alignment */
14144
14145 #define MAX_MOVE_REG 4
14146
14147 int
14148 expand_block_move (rtx operands[])
14149 {
14150   rtx orig_dest = operands[0];
14151   rtx orig_src  = operands[1];
14152   rtx bytes_rtx = operands[2];
14153   rtx align_rtx = operands[3];
14154   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
14155   int align;
14156   int bytes;
14157   int offset;
14158   int move_bytes;
14159   rtx stores[MAX_MOVE_REG];
14160   int num_reg = 0;
14161
14162   /* If this is not a fixed size move, just call memcpy */
14163   if (! constp)
14164     return 0;
14165
14166   /* This must be a fixed size alignment */
14167   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
14168   align = INTVAL (align_rtx) * BITS_PER_UNIT;
14169
14170   /* Anything to move? */
14171   bytes = INTVAL (bytes_rtx);
14172   if (bytes <= 0)
14173     return 1;
14174
14175   if (bytes > rs6000_block_move_inline_limit)
14176     return 0;
14177
14178   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
14179     {
14180       union {
14181         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
14182         rtx (*mov) (rtx, rtx);
14183       } gen_func;
14184       enum machine_mode mode = BLKmode;
14185       rtx src, dest;
14186
14187       /* Altivec first, since it will be faster than a string move
14188          when it applies, and usually not significantly larger.  */
14189       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
14190         {
14191           move_bytes = 16;
14192           mode = V4SImode;
14193           gen_func.mov = gen_movv4si;
14194         }
14195       else if (TARGET_SPE && bytes >= 8 && align >= 64)
14196         {
14197           move_bytes = 8;
14198           mode = V2SImode;
14199           gen_func.mov = gen_movv2si;
14200         }
14201       else if (TARGET_STRING
14202           && bytes > 24         /* move up to 32 bytes at a time */
14203           && ! fixed_regs[5]
14204           && ! fixed_regs[6]
14205           && ! fixed_regs[7]
14206           && ! fixed_regs[8]
14207           && ! fixed_regs[9]
14208           && ! fixed_regs[10]
14209           && ! fixed_regs[11]
14210           && ! fixed_regs[12])
14211         {
14212           move_bytes = (bytes > 32) ? 32 : bytes;
14213           gen_func.movmemsi = gen_movmemsi_8reg;
14214         }
14215       else if (TARGET_STRING
14216                && bytes > 16    /* move up to 24 bytes at a time */
14217                && ! fixed_regs[5]
14218                && ! fixed_regs[6]
14219                && ! fixed_regs[7]
14220                && ! fixed_regs[8]
14221                && ! fixed_regs[9]
14222                && ! fixed_regs[10])
14223         {
14224           move_bytes = (bytes > 24) ? 24 : bytes;
14225           gen_func.movmemsi = gen_movmemsi_6reg;
14226         }
14227       else if (TARGET_STRING
14228                && bytes > 8     /* move up to 16 bytes at a time */
14229                && ! fixed_regs[5]
14230                && ! fixed_regs[6]
14231                && ! fixed_regs[7]
14232                && ! fixed_regs[8])
14233         {
14234           move_bytes = (bytes > 16) ? 16 : bytes;
14235           gen_func.movmemsi = gen_movmemsi_4reg;
14236         }
14237       else if (bytes >= 8 && TARGET_POWERPC64
14238                /* 64-bit loads and stores require word-aligned
14239                   displacements.  */
14240                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
14241         {
14242           move_bytes = 8;
14243           mode = DImode;
14244           gen_func.mov = gen_movdi;
14245         }
14246       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
14247         {                       /* move up to 8 bytes at a time */
14248           move_bytes = (bytes > 8) ? 8 : bytes;
14249           gen_func.movmemsi = gen_movmemsi_2reg;
14250         }
14251       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
14252         {                       /* move 4 bytes */
14253           move_bytes = 4;
14254           mode = SImode;
14255           gen_func.mov = gen_movsi;
14256         }
14257       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
14258         {                       /* move 2 bytes */
14259           move_bytes = 2;
14260           mode = HImode;
14261           gen_func.mov = gen_movhi;
14262         }
14263       else if (TARGET_STRING && bytes > 1)
14264         {                       /* move up to 4 bytes at a time */
14265           move_bytes = (bytes > 4) ? 4 : bytes;
14266           gen_func.movmemsi = gen_movmemsi_1reg;
14267         }
14268       else /* move 1 byte at a time */
14269         {
14270           move_bytes = 1;
14271           mode = QImode;
14272           gen_func.mov = gen_movqi;
14273         }
14274
14275       src = adjust_address (orig_src, mode, offset);
14276       dest = adjust_address (orig_dest, mode, offset);
14277
14278       if (mode != BLKmode)
14279         {
14280           rtx tmp_reg = gen_reg_rtx (mode);
14281
14282           emit_insn ((*gen_func.mov) (tmp_reg, src));
14283           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
14284         }
14285
14286       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
14287         {
14288           int i;
14289           for (i = 0; i < num_reg; i++)
14290             emit_insn (stores[i]);
14291           num_reg = 0;
14292         }
14293
14294       if (mode == BLKmode)
14295         {
14296           /* Move the address into scratch registers.  The movmemsi
14297              patterns require zero offset.  */
14298           if (!REG_P (XEXP (src, 0)))
14299             {
14300               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
14301               src = replace_equiv_address (src, src_reg);
14302             }
14303           set_mem_size (src, GEN_INT (move_bytes));
14304
14305           if (!REG_P (XEXP (dest, 0)))
14306             {
14307               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
14308               dest = replace_equiv_address (dest, dest_reg);
14309             }
14310           set_mem_size (dest, GEN_INT (move_bytes));
14311
14312           emit_insn ((*gen_func.movmemsi) (dest, src,
14313                                            GEN_INT (move_bytes & 31),
14314                                            align_rtx));
14315         }
14316     }
14317
14318   return 1;
14319 }
14320
14321 \f
14322 /* Return a string to perform a load_multiple operation.
14323    operands[0] is the vector.
14324    operands[1] is the source address.
14325    operands[2] is the first destination register.  */
14326
14327 const char *
14328 rs6000_output_load_multiple (rtx operands[3])
14329 {
14330   /* We have to handle the case where the pseudo used to contain the address
14331      is assigned to one of the output registers.  */
14332   int i, j;
14333   int words = XVECLEN (operands[0], 0);
14334   rtx xop[10];
14335
14336   if (XVECLEN (operands[0], 0) == 1)
14337     return "{l|lwz} %2,0(%1)";
14338
14339   for (i = 0; i < words; i++)
14340     if (refers_to_regno_p (REGNO (operands[2]) + i,
14341                            REGNO (operands[2]) + i + 1, operands[1], 0))
14342       {
14343         if (i == words-1)
14344           {
14345             xop[0] = GEN_INT (4 * (words-1));
14346             xop[1] = operands[1];
14347             xop[2] = operands[2];
14348             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
14349             return "";
14350           }
14351         else if (i == 0)
14352           {
14353             xop[0] = GEN_INT (4 * (words-1));
14354             xop[1] = operands[1];
14355             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
14356             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);
14357             return "";
14358           }
14359         else
14360           {
14361             for (j = 0; j < words; j++)
14362               if (j != i)
14363                 {
14364                   xop[0] = GEN_INT (j * 4);
14365                   xop[1] = operands[1];
14366                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
14367                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
14368                 }
14369             xop[0] = GEN_INT (i * 4);
14370             xop[1] = operands[1];
14371             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
14372             return "";
14373           }
14374       }
14375
14376   return "{lsi|lswi} %2,%1,%N0";
14377 }
14378
14379 \f
14380 /* A validation routine: say whether CODE, a condition code, and MODE
14381    match.  The other alternatives either don't make sense or should
14382    never be generated.  */
14383
14384 void
14385 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
14386 {
14387   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
14388                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
14389               && GET_MODE_CLASS (mode) == MODE_CC);
14390
14391   /* These don't make sense.  */
14392   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
14393               || mode != CCUNSmode);
14394
14395   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
14396               || mode == CCUNSmode);
14397
14398   gcc_assert (mode == CCFPmode
14399               || (code != ORDERED && code != UNORDERED
14400                   && code != UNEQ && code != LTGT
14401                   && code != UNGT && code != UNLT
14402                   && code != UNGE && code != UNLE));
14403
14404   /* These should never be generated except for
14405      flag_finite_math_only.  */
14406   gcc_assert (mode != CCFPmode
14407               || flag_finite_math_only
14408               || (code != LE && code != GE
14409                   && code != UNEQ && code != LTGT
14410                   && code != UNGT && code != UNLT));
14411
14412   /* These are invalid; the information is not there.  */
14413   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
14414 }
14415
14416 \f
14417 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
14418    mask required to convert the result of a rotate insn into a shift
14419    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
14420
14421 int
14422 includes_lshift_p (rtx shiftop, rtx andop)
14423 {
14424   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
14425
14426   shift_mask <<= INTVAL (shiftop);
14427
14428   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
14429 }
14430
14431 /* Similar, but for right shift.  */
14432
14433 int
14434 includes_rshift_p (rtx shiftop, rtx andop)
14435 {
14436   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
14437
14438   shift_mask >>= INTVAL (shiftop);
14439
14440   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
14441 }
14442
14443 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
14444    to perform a left shift.  It must have exactly SHIFTOP least
14445    significant 0's, then one or more 1's, then zero or more 0's.  */
14446
14447 int
14448 includes_rldic_lshift_p (rtx shiftop, rtx andop)
14449 {
14450   if (GET_CODE (andop) == CONST_INT)
14451     {
14452       HOST_WIDE_INT c, lsb, shift_mask;
14453
14454       c = INTVAL (andop);
14455       if (c == 0 || c == ~0)
14456         return 0;
14457
14458       shift_mask = ~0;
14459       shift_mask <<= INTVAL (shiftop);
14460
14461       /* Find the least significant one bit.  */
14462       lsb = c & -c;
14463
14464       /* It must coincide with the LSB of the shift mask.  */
14465       if (-lsb != shift_mask)
14466         return 0;
14467
14468       /* Invert to look for the next transition (if any).  */
14469       c = ~c;
14470
14471       /* Remove the low group of ones (originally low group of zeros).  */
14472       c &= -lsb;
14473
14474       /* Again find the lsb, and check we have all 1's above.  */
14475       lsb = c & -c;
14476       return c == -lsb;
14477     }
14478   else if (GET_CODE (andop) == CONST_DOUBLE
14479            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
14480     {
14481       HOST_WIDE_INT low, high, lsb;
14482       HOST_WIDE_INT shift_mask_low, shift_mask_high;
14483
14484       low = CONST_DOUBLE_LOW (andop);
14485       if (HOST_BITS_PER_WIDE_INT < 64)
14486         high = CONST_DOUBLE_HIGH (andop);
14487
14488       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
14489           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
14490         return 0;
14491
14492       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
14493         {
14494           shift_mask_high = ~0;
14495           if (INTVAL (shiftop) > 32)
14496             shift_mask_high <<= INTVAL (shiftop) - 32;
14497
14498           lsb = high & -high;
14499
14500           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
14501             return 0;
14502
14503           high = ~high;
14504           high &= -lsb;
14505
14506           lsb = high & -high;
14507           return high == -lsb;
14508         }
14509
14510       shift_mask_low = ~0;
14511       shift_mask_low <<= INTVAL (shiftop);
14512
14513       lsb = low & -low;
14514
14515       if (-lsb != shift_mask_low)
14516         return 0;
14517
14518       if (HOST_BITS_PER_WIDE_INT < 64)
14519         high = ~high;
14520       low = ~low;
14521       low &= -lsb;
14522
14523       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
14524         {
14525           lsb = high & -high;
14526           return high == -lsb;
14527         }
14528
14529       lsb = low & -low;
14530       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
14531     }
14532   else
14533     return 0;
14534 }
14535
14536 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
14537    to perform a left shift.  It must have SHIFTOP or more least
14538    significant 0's, with the remainder of the word 1's.  */
14539
14540 int
14541 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
14542 {
14543   if (GET_CODE (andop) == CONST_INT)
14544     {
14545       HOST_WIDE_INT c, lsb, shift_mask;
14546
14547       shift_mask = ~0;
14548       shift_mask <<= INTVAL (shiftop);
14549       c = INTVAL (andop);
14550
14551       /* Find the least significant one bit.  */
14552       lsb = c & -c;
14553
14554       /* It must be covered by the shift mask.
14555          This test also rejects c == 0.  */
14556       if ((lsb & shift_mask) == 0)
14557         return 0;
14558
14559       /* Check we have all 1's above the transition, and reject all 1's.  */
14560       return c == -lsb && lsb != 1;
14561     }
14562   else if (GET_CODE (andop) == CONST_DOUBLE
14563            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
14564     {
14565       HOST_WIDE_INT low, lsb, shift_mask_low;
14566
14567       low = CONST_DOUBLE_LOW (andop);
14568
14569       if (HOST_BITS_PER_WIDE_INT < 64)
14570         {
14571           HOST_WIDE_INT high, shift_mask_high;
14572
14573           high = CONST_DOUBLE_HIGH (andop);
14574
14575           if (low == 0)
14576             {
14577               shift_mask_high = ~0;
14578               if (INTVAL (shiftop) > 32)
14579                 shift_mask_high <<= INTVAL (shiftop) - 32;
14580
14581               lsb = high & -high;
14582
14583               if ((lsb & shift_mask_high) == 0)
14584                 return 0;
14585
14586               return high == -lsb;
14587             }
14588           if (high != ~0)
14589             return 0;
14590         }
14591
14592       shift_mask_low = ~0;
14593       shift_mask_low <<= INTVAL (shiftop);
14594
14595       lsb = low & -low;
14596
14597       if ((lsb & shift_mask_low) == 0)
14598         return 0;
14599
14600       return low == -lsb && lsb != 1;
14601     }
14602   else
14603     return 0;
14604 }
14605
14606 /* Return 1 if operands will generate a valid arguments to rlwimi
14607 instruction for insert with right shift in 64-bit mode.  The mask may
14608 not start on the first bit or stop on the last bit because wrap-around
14609 effects of instruction do not correspond to semantics of RTL insn.  */
14610
14611 int
14612 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
14613 {
14614   if (INTVAL (startop) > 32
14615       && INTVAL (startop) < 64
14616       && INTVAL (sizeop) > 1
14617       && INTVAL (sizeop) + INTVAL (startop) < 64
14618       && INTVAL (shiftop) > 0
14619       && INTVAL (sizeop) + INTVAL (shiftop) < 32
14620       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
14621     return 1;
14622
14623   return 0;
14624 }
14625
14626 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
14627    for lfq and stfq insns iff the registers are hard registers.   */
14628
14629 int
14630 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
14631 {
14632   /* We might have been passed a SUBREG.  */
14633   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
14634     return 0;
14635
14636   /* We might have been passed non floating point registers.  */
14637   if (!FP_REGNO_P (REGNO (reg1))
14638       || !FP_REGNO_P (REGNO (reg2)))
14639     return 0;
14640
14641   return (REGNO (reg1) == REGNO (reg2) - 1);
14642 }
14643
14644 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
14645    addr1 and addr2 must be in consecutive memory locations
14646    (addr2 == addr1 + 8).  */
14647
14648 int
14649 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
14650 {
14651   rtx addr1, addr2;
14652   unsigned int reg1, reg2;
14653   int offset1, offset2;
14654
14655   /* The mems cannot be volatile.  */
14656   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
14657     return 0;
14658
14659   addr1 = XEXP (mem1, 0);
14660   addr2 = XEXP (mem2, 0);
14661
14662   /* Extract an offset (if used) from the first addr.  */
14663   if (GET_CODE (addr1) == PLUS)
14664     {
14665       /* If not a REG, return zero.  */
14666       if (GET_CODE (XEXP (addr1, 0)) != REG)
14667         return 0;
14668       else
14669         {
14670           reg1 = REGNO (XEXP (addr1, 0));
14671           /* The offset must be constant!  */
14672           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
14673             return 0;
14674           offset1 = INTVAL (XEXP (addr1, 1));
14675         }
14676     }
14677   else if (GET_CODE (addr1) != REG)
14678     return 0;
14679   else
14680     {
14681       reg1 = REGNO (addr1);
14682       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14683       offset1 = 0;
14684     }
14685
14686   /* And now for the second addr.  */
14687   if (GET_CODE (addr2) == PLUS)
14688     {
14689       /* If not a REG, return zero.  */
14690       if (GET_CODE (XEXP (addr2, 0)) != REG)
14691         return 0;
14692       else
14693         {
14694           reg2 = REGNO (XEXP (addr2, 0));
14695           /* The offset must be constant. */
14696           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
14697             return 0;
14698           offset2 = INTVAL (XEXP (addr2, 1));
14699         }
14700     }
14701   else if (GET_CODE (addr2) != REG)
14702     return 0;
14703   else
14704     {
14705       reg2 = REGNO (addr2);
14706       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14707       offset2 = 0;
14708     }
14709
14710   /* Both of these must have the same base register.  */
14711   if (reg1 != reg2)
14712     return 0;
14713
14714   /* The offset for the second addr must be 8 more than the first addr.  */
14715   if (offset2 != offset1 + 8)
14716     return 0;
14717
14718   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
14719      instructions.  */
14720   return 1;
14721 }
14722 \f
14723
14724 rtx
14725 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
14726 {
14727   static bool eliminated = false;
14728   rtx ret;
14729
14730   if (mode != SDmode)
14731     ret = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
14732   else
14733     {
14734       rtx mem = cfun->machine->sdmode_stack_slot;
14735       gcc_assert (mem != NULL_RTX);
14736
14737       if (!eliminated)
14738         {
14739           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
14740           cfun->machine->sdmode_stack_slot = mem;
14741           eliminated = true;
14742         }
14743       ret = mem;
14744     }
14745
14746   if (TARGET_DEBUG_ADDR)
14747     {
14748       fprintf (stderr, "\nrs6000_secondary_memory_needed_rtx, mode %s, rtx:\n",
14749                GET_MODE_NAME (mode));
14750       if (!ret)
14751         fprintf (stderr, "\tNULL_RTX\n");
14752       else
14753         debug_rtx (ret);
14754     }
14755
14756   return ret;
14757 }
14758
14759 static tree
14760 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
14761 {
14762   /* Don't walk into types.  */
14763   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
14764     {
14765       *walk_subtrees = 0;
14766       return NULL_TREE;
14767     }
14768
14769   switch (TREE_CODE (*tp))
14770     {
14771     case VAR_DECL:
14772     case PARM_DECL:
14773     case FIELD_DECL:
14774     case RESULT_DECL:
14775     case SSA_NAME:
14776     case REAL_CST:
14777     case MEM_REF:
14778     case VIEW_CONVERT_EXPR:
14779       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
14780         return *tp;
14781       break;
14782     default:
14783       break;
14784     }
14785
14786   return NULL_TREE;
14787 }
14788
14789 enum reload_reg_type {
14790   GPR_REGISTER_TYPE,
14791   VECTOR_REGISTER_TYPE,
14792   OTHER_REGISTER_TYPE
14793 };
14794
14795 static enum reload_reg_type
14796 rs6000_reload_register_type (enum reg_class rclass)
14797 {
14798   switch (rclass)
14799     {
14800     case GENERAL_REGS:
14801     case BASE_REGS:
14802       return GPR_REGISTER_TYPE;
14803
14804     case FLOAT_REGS:
14805     case ALTIVEC_REGS:
14806     case VSX_REGS:
14807       return VECTOR_REGISTER_TYPE;
14808
14809     default:
14810       return OTHER_REGISTER_TYPE;
14811     }
14812 }
14813
14814 /* Inform reload about cases where moving X with a mode MODE to a register in
14815    RCLASS requires an extra scratch or immediate register.  Return the class
14816    needed for the immediate register.
14817
14818    For VSX and Altivec, we may need a register to convert sp+offset into
14819    reg+sp.  */
14820
14821 static reg_class_t
14822 rs6000_secondary_reload (bool in_p,
14823                          rtx x,
14824                          reg_class_t rclass_i,
14825                          enum machine_mode mode,
14826                          secondary_reload_info *sri)
14827 {
14828   enum reg_class rclass = (enum reg_class) rclass_i;
14829   reg_class_t ret = ALL_REGS;
14830   enum insn_code icode;
14831   bool default_p = false;
14832
14833   sri->icode = CODE_FOR_nothing;
14834
14835   /* Convert vector loads and stores into gprs to use an additional base
14836      register.  */
14837   icode = rs6000_vector_reload[mode][in_p != false];
14838   if (icode != CODE_FOR_nothing)
14839     {
14840       ret = NO_REGS;
14841       sri->icode = CODE_FOR_nothing;
14842       sri->extra_cost = 0;
14843
14844       if (GET_CODE (x) == MEM)
14845         {
14846           rtx addr = XEXP (x, 0);
14847
14848           /* Loads to and stores from gprs can do reg+offset, and wouldn't need
14849              an extra register in that case, but it would need an extra
14850              register if the addressing is reg+reg or (reg+reg)&(-16).  */
14851           if (rclass == GENERAL_REGS || rclass == BASE_REGS)
14852             {
14853               if (!legitimate_indirect_address_p (addr, false)
14854                   && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14855                 {
14856                   sri->icode = icode;
14857                   /* account for splitting the loads, and converting the
14858                      address from reg+reg to reg.  */
14859                   sri->extra_cost = (((TARGET_64BIT) ? 3 : 5)
14860                                      + ((GET_CODE (addr) == AND) ? 1 : 0));
14861                 }
14862             }
14863           /* Loads to and stores from vector registers can only do reg+reg
14864              addressing.  Altivec registers can also do (reg+reg)&(-16).  */
14865           else if (rclass == VSX_REGS || rclass == ALTIVEC_REGS
14866                    || rclass == FLOAT_REGS || rclass == NO_REGS)
14867             {
14868               if (!VECTOR_MEM_ALTIVEC_P (mode)
14869                   && GET_CODE (addr) == AND
14870                   && GET_CODE (XEXP (addr, 1)) == CONST_INT
14871                   && INTVAL (XEXP (addr, 1)) == -16
14872                   && (legitimate_indirect_address_p (XEXP (addr, 0), false)
14873                       || legitimate_indexed_address_p (XEXP (addr, 0), false)))
14874                 {
14875                   sri->icode = icode;
14876                   sri->extra_cost = ((GET_CODE (XEXP (addr, 0)) == PLUS)
14877                                      ? 2 : 1);
14878                 }
14879               else if (!legitimate_indirect_address_p (addr, false)
14880                        && (rclass == NO_REGS
14881                            || !legitimate_indexed_address_p (addr, false)))
14882                 {
14883                   sri->icode = icode;
14884                   sri->extra_cost = 1;
14885                 }
14886               else
14887                 icode = CODE_FOR_nothing;
14888             }
14889           /* Any other loads, including to pseudo registers which haven't been
14890              assigned to a register yet, default to require a scratch
14891              register.  */
14892           else
14893             {
14894               sri->icode = icode;
14895               sri->extra_cost = 2;
14896             }
14897         }
14898       else if (REG_P (x))
14899         {
14900           int regno = true_regnum (x);
14901
14902           icode = CODE_FOR_nothing;
14903           if (regno < 0 || regno >= FIRST_PSEUDO_REGISTER)
14904             default_p = true;
14905           else
14906             {
14907               enum reg_class xclass = REGNO_REG_CLASS (regno);
14908               enum reload_reg_type rtype1 = rs6000_reload_register_type (rclass);
14909               enum reload_reg_type rtype2 = rs6000_reload_register_type (xclass);
14910
14911               /* If memory is needed, use default_secondary_reload to create the
14912                  stack slot.  */
14913               if (rtype1 != rtype2 || rtype1 == OTHER_REGISTER_TYPE)
14914                 default_p = true;
14915               else
14916                 ret = NO_REGS;
14917             }
14918         }
14919       else
14920         default_p = true;
14921     }
14922   else
14923     default_p = true;
14924
14925   if (default_p)
14926     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
14927
14928   gcc_assert (ret != ALL_REGS);
14929
14930   if (TARGET_DEBUG_ADDR)
14931     {
14932       fprintf (stderr,
14933                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
14934                "mode = %s",
14935                reg_class_names[ret],
14936                in_p ? "true" : "false",
14937                reg_class_names[rclass],
14938                GET_MODE_NAME (mode));
14939
14940       if (default_p)
14941         fprintf (stderr, ", default secondary reload");
14942
14943       if (sri->icode != CODE_FOR_nothing)
14944         fprintf (stderr, ", reload func = %s, extra cost = %d\n",
14945                  insn_data[sri->icode].name, sri->extra_cost);
14946       else
14947         fprintf (stderr, "\n");
14948
14949       debug_rtx (x);
14950     }
14951
14952   return ret;
14953 }
14954
14955 /* Fixup reload addresses for Altivec or VSX loads/stores to change SP+offset
14956    to SP+reg addressing.  */
14957
14958 void
14959 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
14960 {
14961   int regno = true_regnum (reg);
14962   enum machine_mode mode = GET_MODE (reg);
14963   enum reg_class rclass;
14964   rtx addr;
14965   rtx and_op2 = NULL_RTX;
14966   rtx addr_op1;
14967   rtx addr_op2;
14968   rtx scratch_or_premodify = scratch;
14969   rtx and_rtx;
14970   rtx cc_clobber;
14971
14972   if (TARGET_DEBUG_ADDR)
14973     {
14974       fprintf (stderr, "\nrs6000_secondary_reload_inner, type = %s\n",
14975                store_p ? "store" : "load");
14976       fprintf (stderr, "reg:\n");
14977       debug_rtx (reg);
14978       fprintf (stderr, "mem:\n");
14979       debug_rtx (mem);
14980       fprintf (stderr, "scratch:\n");
14981       debug_rtx (scratch);
14982     }
14983
14984   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14985   gcc_assert (GET_CODE (mem) == MEM);
14986   rclass = REGNO_REG_CLASS (regno);
14987   addr = XEXP (mem, 0);
14988
14989   switch (rclass)
14990     {
14991       /* GPRs can handle reg + small constant, all other addresses need to use
14992          the scratch register.  */
14993     case GENERAL_REGS:
14994     case BASE_REGS:
14995       if (GET_CODE (addr) == AND)
14996         {
14997           and_op2 = XEXP (addr, 1);
14998           addr = XEXP (addr, 0);
14999         }
15000
15001       if (GET_CODE (addr) == PRE_MODIFY)
15002         {
15003           scratch_or_premodify = XEXP (addr, 0);
15004           gcc_assert (REG_P (scratch_or_premodify));
15005           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
15006           addr = XEXP (addr, 1);
15007         }
15008
15009       if (GET_CODE (addr) == PLUS
15010           && (!rs6000_legitimate_offset_address_p (TImode, addr, false)
15011               || and_op2 != NULL_RTX))
15012         {
15013           addr_op1 = XEXP (addr, 0);
15014           addr_op2 = XEXP (addr, 1);
15015           gcc_assert (legitimate_indirect_address_p (addr_op1, false));
15016
15017           if (!REG_P (addr_op2)
15018               && (GET_CODE (addr_op2) != CONST_INT
15019                   || !satisfies_constraint_I (addr_op2)))
15020             {
15021               if (TARGET_DEBUG_ADDR)
15022                 {
15023                   fprintf (stderr,
15024                            "\nMove plus addr to register %s, mode = %s: ",
15025                            rs6000_reg_names[REGNO (scratch)],
15026                            GET_MODE_NAME (mode));
15027                   debug_rtx (addr_op2);
15028                 }
15029               rs6000_emit_move (scratch, addr_op2, Pmode);
15030               addr_op2 = scratch;
15031             }
15032
15033           emit_insn (gen_rtx_SET (VOIDmode,
15034                                   scratch_or_premodify,
15035                                   gen_rtx_PLUS (Pmode,
15036                                                 addr_op1,
15037                                                 addr_op2)));
15038
15039           addr = scratch_or_premodify;
15040           scratch_or_premodify = scratch;
15041         }
15042       else if (!legitimate_indirect_address_p (addr, false)
15043                && !rs6000_legitimate_offset_address_p (TImode, addr, false))
15044         {
15045           if (TARGET_DEBUG_ADDR)
15046             {
15047               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
15048                        rs6000_reg_names[REGNO (scratch_or_premodify)],
15049                        GET_MODE_NAME (mode));
15050               debug_rtx (addr);
15051             }
15052           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
15053           addr = scratch_or_premodify;
15054           scratch_or_premodify = scratch;
15055         }
15056       break;
15057
15058       /* Float/Altivec registers can only handle reg+reg addressing.  Move
15059          other addresses into a scratch register.  */
15060     case FLOAT_REGS:
15061     case VSX_REGS:
15062     case ALTIVEC_REGS:
15063
15064       /* With float regs, we need to handle the AND ourselves, since we can't
15065          use the Altivec instruction with an implicit AND -16.  Allow scalar
15066          loads to float registers to use reg+offset even if VSX.  */
15067       if (GET_CODE (addr) == AND
15068           && (rclass != ALTIVEC_REGS || GET_MODE_SIZE (mode) != 16
15069               || GET_CODE (XEXP (addr, 1)) != CONST_INT
15070               || INTVAL (XEXP (addr, 1)) != -16
15071               || !VECTOR_MEM_ALTIVEC_P (mode)))
15072         {
15073           and_op2 = XEXP (addr, 1);
15074           addr = XEXP (addr, 0);
15075         }
15076
15077       /* If we aren't using a VSX load, save the PRE_MODIFY register and use it
15078          as the address later.  */
15079       if (GET_CODE (addr) == PRE_MODIFY
15080           && (!VECTOR_MEM_VSX_P (mode)
15081               || and_op2 != NULL_RTX
15082               || !legitimate_indexed_address_p (XEXP (addr, 1), false)))
15083         {
15084           scratch_or_premodify = XEXP (addr, 0);
15085           gcc_assert (legitimate_indirect_address_p (scratch_or_premodify,
15086                                                      false));
15087           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
15088           addr = XEXP (addr, 1);
15089         }
15090
15091       if (legitimate_indirect_address_p (addr, false)   /* reg */
15092           || legitimate_indexed_address_p (addr, false) /* reg+reg */
15093           || GET_CODE (addr) == PRE_MODIFY              /* VSX pre-modify */
15094           || (GET_CODE (addr) == AND                    /* Altivec memory */
15095               && GET_CODE (XEXP (addr, 1)) == CONST_INT
15096               && INTVAL (XEXP (addr, 1)) == -16
15097               && VECTOR_MEM_ALTIVEC_P (mode))
15098           || (rclass == FLOAT_REGS                      /* legacy float mem */
15099               && GET_MODE_SIZE (mode) == 8
15100               && and_op2 == NULL_RTX
15101               && scratch_or_premodify == scratch
15102               && rs6000_legitimate_offset_address_p (mode, addr, false)))
15103         ;
15104
15105       else if (GET_CODE (addr) == PLUS)
15106         {
15107           addr_op1 = XEXP (addr, 0);
15108           addr_op2 = XEXP (addr, 1);
15109           gcc_assert (REG_P (addr_op1));
15110
15111           if (TARGET_DEBUG_ADDR)
15112             {
15113               fprintf (stderr, "\nMove plus addr to register %s, mode = %s: ",
15114                        rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
15115               debug_rtx (addr_op2);
15116             }
15117           rs6000_emit_move (scratch, addr_op2, Pmode);
15118           emit_insn (gen_rtx_SET (VOIDmode,
15119                                   scratch_or_premodify,
15120                                   gen_rtx_PLUS (Pmode,
15121                                                 addr_op1,
15122                                                 scratch)));
15123           addr = scratch_or_premodify;
15124           scratch_or_premodify = scratch;
15125         }
15126
15127       else if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == CONST
15128                || GET_CODE (addr) == CONST_INT || REG_P (addr))
15129         {
15130           if (TARGET_DEBUG_ADDR)
15131             {
15132               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
15133                        rs6000_reg_names[REGNO (scratch_or_premodify)],
15134                        GET_MODE_NAME (mode));
15135               debug_rtx (addr);
15136             }
15137
15138           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
15139           addr = scratch_or_premodify;
15140           scratch_or_premodify = scratch;
15141         }
15142
15143       else
15144         gcc_unreachable ();
15145
15146       break;
15147
15148     default:
15149       gcc_unreachable ();
15150     }
15151
15152   /* If the original address involved a pre-modify that we couldn't use the VSX
15153      memory instruction with update, and we haven't taken care of already,
15154      store the address in the pre-modify register and use that as the
15155      address.  */
15156   if (scratch_or_premodify != scratch && scratch_or_premodify != addr)
15157     {
15158       emit_insn (gen_rtx_SET (VOIDmode, scratch_or_premodify, addr));
15159       addr = scratch_or_premodify;
15160     }
15161
15162   /* If the original address involved an AND -16 and we couldn't use an ALTIVEC
15163      memory instruction, recreate the AND now, including the clobber which is
15164      generated by the general ANDSI3/ANDDI3 patterns for the
15165      andi. instruction.  */
15166   if (and_op2 != NULL_RTX)
15167     {
15168       if (! legitimate_indirect_address_p (addr, false))
15169         {
15170           emit_insn (gen_rtx_SET (VOIDmode, scratch, addr));
15171           addr = scratch;
15172         }
15173
15174       if (TARGET_DEBUG_ADDR)
15175         {
15176           fprintf (stderr, "\nAnd addr to register %s, mode = %s: ",
15177                    rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
15178           debug_rtx (and_op2);
15179         }
15180
15181       and_rtx = gen_rtx_SET (VOIDmode,
15182                              scratch,
15183                              gen_rtx_AND (Pmode,
15184                                           addr,
15185                                           and_op2));
15186
15187       cc_clobber = gen_rtx_CLOBBER (CCmode, gen_rtx_SCRATCH (CCmode));
15188       emit_insn (gen_rtx_PARALLEL (VOIDmode,
15189                                    gen_rtvec (2, and_rtx, cc_clobber)));
15190       addr = scratch;
15191     }
15192
15193   /* Adjust the address if it changed.  */
15194   if (addr != XEXP (mem, 0))
15195     {
15196       mem = change_address (mem, mode, addr);
15197       if (TARGET_DEBUG_ADDR)
15198         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
15199     }
15200
15201   /* Now create the move.  */
15202   if (store_p)
15203     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
15204   else
15205     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
15206
15207   return;
15208 }
15209
15210 /* Target hook to return the cover classes for Integrated Register Allocator.
15211    Cover classes is a set of non-intersected register classes covering all hard
15212    registers used for register allocation purpose.  Any move between two
15213    registers of a cover class should be cheaper than load or store of the
15214    registers.  The value is array of register classes with LIM_REG_CLASSES used
15215    as the end marker.
15216
15217    We need two IRA_COVER_CLASSES, one for pre-VSX, and the other for VSX to
15218    account for the Altivec and Floating registers being subsets of the VSX
15219    register set under VSX, but distinct register sets on pre-VSX machines.  */
15220
15221 static const reg_class_t *
15222 rs6000_ira_cover_classes (void)
15223 {
15224   static const reg_class_t cover_pre_vsx[] = IRA_COVER_CLASSES_PRE_VSX;
15225   static const reg_class_t cover_vsx[]     = IRA_COVER_CLASSES_VSX;
15226
15227   return (TARGET_VSX) ? cover_vsx : cover_pre_vsx;
15228 }
15229
15230 /* Allocate a 64-bit stack slot to be used for copying SDmode
15231    values through if this function has any SDmode references.  */
15232
15233 static void
15234 rs6000_alloc_sdmode_stack_slot (void)
15235 {
15236   tree t;
15237   basic_block bb;
15238   gimple_stmt_iterator gsi;
15239
15240   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
15241
15242   FOR_EACH_BB (bb)
15243     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
15244       {
15245         tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
15246         if (ret)
15247           {
15248             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
15249             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
15250                                                                   SDmode, 0);
15251             return;
15252           }
15253       }
15254
15255   /* Check for any SDmode parameters of the function.  */
15256   for (t = DECL_ARGUMENTS (cfun->decl); t; t = DECL_CHAIN (t))
15257     {
15258       if (TREE_TYPE (t) == error_mark_node)
15259         continue;
15260
15261       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
15262           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
15263         {
15264           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
15265           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
15266                                                                 SDmode, 0);
15267           return;
15268         }
15269     }
15270 }
15271
15272 static void
15273 rs6000_instantiate_decls (void)
15274 {
15275   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
15276     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
15277 }
15278
15279 /* Given an rtx X being reloaded into a reg required to be
15280    in class CLASS, return the class of reg to actually use.
15281    In general this is just CLASS; but on some machines
15282    in some cases it is preferable to use a more restrictive class.
15283
15284    On the RS/6000, we have to return NO_REGS when we want to reload a
15285    floating-point CONST_DOUBLE to force it to be copied to memory.
15286
15287    We also don't want to reload integer values into floating-point
15288    registers if we can at all help it.  In fact, this can
15289    cause reload to die, if it tries to generate a reload of CTR
15290    into a FP register and discovers it doesn't have the memory location
15291    required.
15292
15293    ??? Would it be a good idea to have reload do the converse, that is
15294    try to reload floating modes into FP registers if possible?
15295  */
15296
15297 static enum reg_class
15298 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
15299 {
15300   enum machine_mode mode = GET_MODE (x);
15301
15302   if (VECTOR_UNIT_VSX_P (mode)
15303       && x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
15304     return rclass;
15305
15306   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
15307       && (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
15308       && easy_vector_constant (x, mode))
15309     return ALTIVEC_REGS;
15310
15311   if (CONSTANT_P (x) && reg_classes_intersect_p (rclass, FLOAT_REGS))
15312     return NO_REGS;
15313
15314   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
15315     return GENERAL_REGS;
15316
15317   /* For VSX, prefer the traditional registers for 64-bit values because we can
15318      use the non-VSX loads.  Prefer the Altivec registers if Altivec is
15319      handling the vector operations (i.e. V16QI, V8HI, and V4SI), or if we
15320      prefer Altivec loads..  */
15321   if (rclass == VSX_REGS)
15322     {
15323       if (GET_MODE_SIZE (mode) <= 8)
15324         return FLOAT_REGS;
15325
15326       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode))
15327         return ALTIVEC_REGS;
15328
15329       return rclass;
15330     }
15331
15332   return rclass;
15333 }
15334
15335 /* Debug version of rs6000_preferred_reload_class.  */
15336 static enum reg_class
15337 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
15338 {
15339   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
15340
15341   fprintf (stderr,
15342            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
15343            "mode = %s, x:\n",
15344            reg_class_names[ret], reg_class_names[rclass],
15345            GET_MODE_NAME (GET_MODE (x)));
15346   debug_rtx (x);
15347
15348   return ret;
15349 }
15350
15351 /* If we are copying between FP or AltiVec registers and anything else, we need
15352    a memory location.  The exception is when we are targeting ppc64 and the
15353    move to/from fpr to gpr instructions are available.  Also, under VSX, you
15354    can copy vector registers from the FP register set to the Altivec register
15355    set and vice versa.  */
15356
15357 static bool
15358 rs6000_secondary_memory_needed (enum reg_class class1,
15359                                 enum reg_class class2,
15360                                 enum machine_mode mode)
15361 {
15362   if (class1 == class2)
15363     return false;
15364
15365   /* Under VSX, there are 3 register classes that values could be in (VSX_REGS,
15366      ALTIVEC_REGS, and FLOAT_REGS).  We don't need to use memory to copy
15367      between these classes.  But we need memory for other things that can go in
15368      FLOAT_REGS like SFmode.  */
15369   if (TARGET_VSX
15370       && (VECTOR_MEM_VSX_P (mode) || VECTOR_UNIT_VSX_P (mode))
15371       && (class1 == VSX_REGS || class1 == ALTIVEC_REGS
15372           || class1 == FLOAT_REGS))
15373     return (class2 != VSX_REGS && class2 != ALTIVEC_REGS
15374             && class2 != FLOAT_REGS);
15375
15376   if (class1 == VSX_REGS || class2 == VSX_REGS)
15377     return true;
15378
15379   if (class1 == FLOAT_REGS
15380       && (!TARGET_MFPGPR || !TARGET_POWERPC64
15381           || ((mode != DFmode)
15382               && (mode != DDmode)
15383               && (mode != DImode))))
15384     return true;
15385
15386   if (class2 == FLOAT_REGS
15387       && (!TARGET_MFPGPR || !TARGET_POWERPC64
15388           || ((mode != DFmode)
15389               && (mode != DDmode)
15390               && (mode != DImode))))
15391     return true;
15392
15393   if (class1 == ALTIVEC_REGS || class2 == ALTIVEC_REGS)
15394     return true;
15395
15396   return false;
15397 }
15398
15399 /* Debug version of rs6000_secondary_memory_needed.  */
15400 static bool
15401 rs6000_debug_secondary_memory_needed (enum reg_class class1,
15402                                       enum reg_class class2,
15403                                       enum machine_mode mode)
15404 {
15405   bool ret = rs6000_secondary_memory_needed (class1, class2, mode);
15406
15407   fprintf (stderr,
15408            "rs6000_secondary_memory_needed, return: %s, class1 = %s, "
15409            "class2 = %s, mode = %s\n",
15410            ret ? "true" : "false", reg_class_names[class1],
15411            reg_class_names[class2], GET_MODE_NAME (mode));
15412
15413   return ret;
15414 }
15415
15416 /* Return the register class of a scratch register needed to copy IN into
15417    or out of a register in RCLASS in MODE.  If it can be done directly,
15418    NO_REGS is returned.  */
15419
15420 static enum reg_class
15421 rs6000_secondary_reload_class (enum reg_class rclass, enum machine_mode mode,
15422                                rtx in)
15423 {
15424   int regno;
15425
15426   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
15427 #if TARGET_MACHO
15428                      && MACHOPIC_INDIRECT
15429 #endif
15430                      ))
15431     {
15432       /* We cannot copy a symbolic operand directly into anything
15433          other than BASE_REGS for TARGET_ELF.  So indicate that a
15434          register from BASE_REGS is needed as an intermediate
15435          register.
15436
15437          On Darwin, pic addresses require a load from memory, which
15438          needs a base register.  */
15439       if (rclass != BASE_REGS
15440           && (GET_CODE (in) == SYMBOL_REF
15441               || GET_CODE (in) == HIGH
15442               || GET_CODE (in) == LABEL_REF
15443               || GET_CODE (in) == CONST))
15444         return BASE_REGS;
15445     }
15446
15447   if (GET_CODE (in) == REG)
15448     {
15449       regno = REGNO (in);
15450       if (regno >= FIRST_PSEUDO_REGISTER)
15451         {
15452           regno = true_regnum (in);
15453           if (regno >= FIRST_PSEUDO_REGISTER)
15454             regno = -1;
15455         }
15456     }
15457   else if (GET_CODE (in) == SUBREG)
15458     {
15459       regno = true_regnum (in);
15460       if (regno >= FIRST_PSEUDO_REGISTER)
15461         regno = -1;
15462     }
15463   else
15464     regno = -1;
15465
15466   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
15467      into anything.  */
15468   if (rclass == GENERAL_REGS || rclass == BASE_REGS
15469       || (regno >= 0 && INT_REGNO_P (regno)))
15470     return NO_REGS;
15471
15472   /* Constants, memory, and FP registers can go into FP registers.  */
15473   if ((regno == -1 || FP_REGNO_P (regno))
15474       && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
15475     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
15476
15477   /* Memory, and FP/altivec registers can go into fp/altivec registers under
15478      VSX.  */
15479   if (TARGET_VSX
15480       && (regno == -1 || VSX_REGNO_P (regno))
15481       && VSX_REG_CLASS_P (rclass))
15482     return NO_REGS;
15483
15484   /* Memory, and AltiVec registers can go into AltiVec registers.  */
15485   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
15486       && rclass == ALTIVEC_REGS)
15487     return NO_REGS;
15488
15489   /* We can copy among the CR registers.  */
15490   if ((rclass == CR_REGS || rclass == CR0_REGS)
15491       && regno >= 0 && CR_REGNO_P (regno))
15492     return NO_REGS;
15493
15494   /* Otherwise, we need GENERAL_REGS.  */
15495   return GENERAL_REGS;
15496 }
15497
15498 /* Debug version of rs6000_secondary_reload_class.  */
15499 static enum reg_class
15500 rs6000_debug_secondary_reload_class (enum reg_class rclass,
15501                                      enum machine_mode mode, rtx in)
15502 {
15503   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
15504   fprintf (stderr,
15505            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
15506            "mode = %s, input rtx:\n",
15507            reg_class_names[ret], reg_class_names[rclass],
15508            GET_MODE_NAME (mode));
15509   debug_rtx (in);
15510
15511   return ret;
15512 }
15513
15514 /* Return nonzero if for CLASS a mode change from FROM to TO is invalid.  */
15515
15516 static bool
15517 rs6000_cannot_change_mode_class (enum machine_mode from,
15518                                  enum machine_mode to,
15519                                  enum reg_class rclass)
15520 {
15521   unsigned from_size = GET_MODE_SIZE (from);
15522   unsigned to_size = GET_MODE_SIZE (to);
15523
15524   if (from_size != to_size)
15525     {
15526       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
15527       return ((from_size < 8 || to_size < 8 || TARGET_IEEEQUAD)
15528               && reg_classes_intersect_p (xclass, rclass));
15529     }
15530
15531   if (TARGET_E500_DOUBLE
15532       && ((((to) == DFmode) + ((from) == DFmode)) == 1
15533           || (((to) == TFmode) + ((from) == TFmode)) == 1
15534           || (((to) == DDmode) + ((from) == DDmode)) == 1
15535           || (((to) == TDmode) + ((from) == TDmode)) == 1
15536           || (((to) == DImode) + ((from) == DImode)) == 1))
15537     return true;
15538
15539   /* Since the VSX register set includes traditional floating point registers
15540      and altivec registers, just check for the size being different instead of
15541      trying to check whether the modes are vector modes.  Otherwise it won't
15542      allow say DF and DI to change classes.  */
15543   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
15544     return (from_size != 8 && from_size != 16);
15545
15546   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
15547       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
15548     return true;
15549
15550   if (TARGET_SPE && (SPE_VECTOR_MODE (from) + SPE_VECTOR_MODE (to)) == 1
15551       && reg_classes_intersect_p (GENERAL_REGS, rclass))
15552     return true;
15553
15554   return false;
15555 }
15556
15557 /* Debug version of rs6000_cannot_change_mode_class.  */
15558 static bool
15559 rs6000_debug_cannot_change_mode_class (enum machine_mode from,
15560                                        enum machine_mode to,
15561                                        enum reg_class rclass)
15562 {
15563   bool ret = rs6000_cannot_change_mode_class (from, to, rclass);
15564
15565   fprintf (stderr,
15566            "rs6000_cannot_change_mode_class, return %s, from = %s, "
15567            "to = %s, rclass = %s\n",
15568            ret ? "true" : "false",
15569            GET_MODE_NAME (from), GET_MODE_NAME (to),
15570            reg_class_names[rclass]);
15571
15572   return ret;
15573 }
15574 \f
15575 /* Given a comparison operation, return the bit number in CCR to test.  We
15576    know this is a valid comparison.
15577
15578    SCC_P is 1 if this is for an scc.  That means that %D will have been
15579    used instead of %C, so the bits will be in different places.
15580
15581    Return -1 if OP isn't a valid comparison for some reason.  */
15582
15583 int
15584 ccr_bit (rtx op, int scc_p)
15585 {
15586   enum rtx_code code = GET_CODE (op);
15587   enum machine_mode cc_mode;
15588   int cc_regnum;
15589   int base_bit;
15590   rtx reg;
15591
15592   if (!COMPARISON_P (op))
15593     return -1;
15594
15595   reg = XEXP (op, 0);
15596
15597   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
15598
15599   cc_mode = GET_MODE (reg);
15600   cc_regnum = REGNO (reg);
15601   base_bit = 4 * (cc_regnum - CR0_REGNO);
15602
15603   validate_condition_mode (code, cc_mode);
15604
15605   /* When generating a sCOND operation, only positive conditions are
15606      allowed.  */
15607   gcc_assert (!scc_p
15608               || code == EQ || code == GT || code == LT || code == UNORDERED
15609               || code == GTU || code == LTU);
15610
15611   switch (code)
15612     {
15613     case NE:
15614       return scc_p ? base_bit + 3 : base_bit + 2;
15615     case EQ:
15616       return base_bit + 2;
15617     case GT:  case GTU:  case UNLE:
15618       return base_bit + 1;
15619     case LT:  case LTU:  case UNGE:
15620       return base_bit;
15621     case ORDERED:  case UNORDERED:
15622       return base_bit + 3;
15623
15624     case GE:  case GEU:
15625       /* If scc, we will have done a cror to put the bit in the
15626          unordered position.  So test that bit.  For integer, this is ! LT
15627          unless this is an scc insn.  */
15628       return scc_p ? base_bit + 3 : base_bit;
15629
15630     case LE:  case LEU:
15631       return scc_p ? base_bit + 3 : base_bit + 1;
15632
15633     default:
15634       gcc_unreachable ();
15635     }
15636 }
15637 \f
15638 /* Return the GOT register.  */
15639
15640 rtx
15641 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
15642 {
15643   /* The second flow pass currently (June 1999) can't update
15644      regs_ever_live without disturbing other parts of the compiler, so
15645      update it here to make the prolog/epilogue code happy.  */
15646   if (!can_create_pseudo_p ()
15647       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
15648     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
15649
15650   crtl->uses_pic_offset_table = 1;
15651
15652   return pic_offset_table_rtx;
15653 }
15654 \f
15655 static rs6000_stack_t stack_info;
15656
15657 /* Function to init struct machine_function.
15658    This will be called, via a pointer variable,
15659    from push_function_context.  */
15660
15661 static struct machine_function *
15662 rs6000_init_machine_status (void)
15663 {
15664   stack_info.reload_completed = 0;
15665   return ggc_alloc_cleared_machine_function ();
15666 }
15667 \f
15668 /* These macros test for integers and extract the low-order bits.  */
15669 #define INT_P(X)  \
15670 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
15671  && GET_MODE (X) == VOIDmode)
15672
15673 #define INT_LOWPART(X) \
15674   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
15675
15676 int
15677 extract_MB (rtx op)
15678 {
15679   int i;
15680   unsigned long val = INT_LOWPART (op);
15681
15682   /* If the high bit is zero, the value is the first 1 bit we find
15683      from the left.  */
15684   if ((val & 0x80000000) == 0)
15685     {
15686       gcc_assert (val & 0xffffffff);
15687
15688       i = 1;
15689       while (((val <<= 1) & 0x80000000) == 0)
15690         ++i;
15691       return i;
15692     }
15693
15694   /* If the high bit is set and the low bit is not, or the mask is all
15695      1's, the value is zero.  */
15696   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
15697     return 0;
15698
15699   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15700      from the right.  */
15701   i = 31;
15702   while (((val >>= 1) & 1) != 0)
15703     --i;
15704
15705   return i;
15706 }
15707
15708 int
15709 extract_ME (rtx op)
15710 {
15711   int i;
15712   unsigned long val = INT_LOWPART (op);
15713
15714   /* If the low bit is zero, the value is the first 1 bit we find from
15715      the right.  */
15716   if ((val & 1) == 0)
15717     {
15718       gcc_assert (val & 0xffffffff);
15719
15720       i = 30;
15721       while (((val >>= 1) & 1) == 0)
15722         --i;
15723
15724       return i;
15725     }
15726
15727   /* If the low bit is set and the high bit is not, or the mask is all
15728      1's, the value is 31.  */
15729   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
15730     return 31;
15731
15732   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15733      from the left.  */
15734   i = 0;
15735   while (((val <<= 1) & 0x80000000) != 0)
15736     ++i;
15737
15738   return i;
15739 }
15740
15741 /* Locate some local-dynamic symbol still in use by this function
15742    so that we can print its name in some tls_ld pattern.  */
15743
15744 static const char *
15745 rs6000_get_some_local_dynamic_name (void)
15746 {
15747   rtx insn;
15748
15749   if (cfun->machine->some_ld_name)
15750     return cfun->machine->some_ld_name;
15751
15752   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
15753     if (INSN_P (insn)
15754         && for_each_rtx (&PATTERN (insn),
15755                          rs6000_get_some_local_dynamic_name_1, 0))
15756       return cfun->machine->some_ld_name;
15757
15758   gcc_unreachable ();
15759 }
15760
15761 /* Helper function for rs6000_get_some_local_dynamic_name.  */
15762
15763 static int
15764 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
15765 {
15766   rtx x = *px;
15767
15768   if (GET_CODE (x) == SYMBOL_REF)
15769     {
15770       const char *str = XSTR (x, 0);
15771       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
15772         {
15773           cfun->machine->some_ld_name = str;
15774           return 1;
15775         }
15776     }
15777
15778   return 0;
15779 }
15780
15781 /* Write out a function code label.  */
15782
15783 void
15784 rs6000_output_function_entry (FILE *file, const char *fname)
15785 {
15786   if (fname[0] != '.')
15787     {
15788       switch (DEFAULT_ABI)
15789         {
15790         default:
15791           gcc_unreachable ();
15792
15793         case ABI_AIX:
15794           if (DOT_SYMBOLS)
15795             putc ('.', file);
15796           else
15797             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
15798           break;
15799
15800         case ABI_V4:
15801         case ABI_DARWIN:
15802           break;
15803         }
15804     }
15805
15806   RS6000_OUTPUT_BASENAME (file, fname);
15807 }
15808
15809 /* Print an operand.  Recognize special options, documented below.  */
15810
15811 #if TARGET_ELF
15812 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
15813 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
15814 #else
15815 #define SMALL_DATA_RELOC "sda21"
15816 #define SMALL_DATA_REG 0
15817 #endif
15818
15819 void
15820 print_operand (FILE *file, rtx x, int code)
15821 {
15822   int i;
15823   HOST_WIDE_INT val;
15824   unsigned HOST_WIDE_INT uval;
15825
15826   switch (code)
15827     {
15828     case '.':
15829       /* Write out an instruction after the call which may be replaced
15830          with glue code by the loader.  This depends on the AIX version.  */
15831       asm_fprintf (file, RS6000_CALL_GLUE);
15832       return;
15833
15834       /* %a is output_address.  */
15835
15836     case 'A':
15837       /* If X is a constant integer whose low-order 5 bits are zero,
15838          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
15839          in the AIX assembler where "sri" with a zero shift count
15840          writes a trash instruction.  */
15841       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
15842         putc ('l', file);
15843       else
15844         putc ('r', file);
15845       return;
15846
15847     case 'b':
15848       /* If constant, low-order 16 bits of constant, unsigned.
15849          Otherwise, write normally.  */
15850       if (INT_P (x))
15851         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
15852       else
15853         print_operand (file, x, 0);
15854       return;
15855
15856     case 'B':
15857       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
15858          for 64-bit mask direction.  */
15859       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
15860       return;
15861
15862       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
15863          output_operand.  */
15864
15865     case 'c':
15866       /* X is a CR register.  Print the number of the GT bit of the CR.  */
15867       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15868         output_operand_lossage ("invalid %%c value");
15869       else
15870         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
15871       return;
15872
15873     case 'D':
15874       /* Like 'J' but get to the GT bit only.  */
15875       gcc_assert (GET_CODE (x) == REG);
15876
15877       /* Bit 1 is GT bit.  */
15878       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
15879
15880       /* Add one for shift count in rlinm for scc.  */
15881       fprintf (file, "%d", i + 1);
15882       return;
15883
15884     case 'E':
15885       /* X is a CR register.  Print the number of the EQ bit of the CR */
15886       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15887         output_operand_lossage ("invalid %%E value");
15888       else
15889         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
15890       return;
15891
15892     case 'f':
15893       /* X is a CR register.  Print the shift count needed to move it
15894          to the high-order four bits.  */
15895       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15896         output_operand_lossage ("invalid %%f value");
15897       else
15898         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
15899       return;
15900
15901     case 'F':
15902       /* Similar, but print the count for the rotate in the opposite
15903          direction.  */
15904       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15905         output_operand_lossage ("invalid %%F value");
15906       else
15907         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
15908       return;
15909
15910     case 'G':
15911       /* X is a constant integer.  If it is negative, print "m",
15912          otherwise print "z".  This is to make an aze or ame insn.  */
15913       if (GET_CODE (x) != CONST_INT)
15914         output_operand_lossage ("invalid %%G value");
15915       else if (INTVAL (x) >= 0)
15916         putc ('z', file);
15917       else
15918         putc ('m', file);
15919       return;
15920
15921     case 'h':
15922       /* If constant, output low-order five bits.  Otherwise, write
15923          normally.  */
15924       if (INT_P (x))
15925         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
15926       else
15927         print_operand (file, x, 0);
15928       return;
15929
15930     case 'H':
15931       /* If constant, output low-order six bits.  Otherwise, write
15932          normally.  */
15933       if (INT_P (x))
15934         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
15935       else
15936         print_operand (file, x, 0);
15937       return;
15938
15939     case 'I':
15940       /* Print `i' if this is a constant, else nothing.  */
15941       if (INT_P (x))
15942         putc ('i', file);
15943       return;
15944
15945     case 'j':
15946       /* Write the bit number in CCR for jump.  */
15947       i = ccr_bit (x, 0);
15948       if (i == -1)
15949         output_operand_lossage ("invalid %%j code");
15950       else
15951         fprintf (file, "%d", i);
15952       return;
15953
15954     case 'J':
15955       /* Similar, but add one for shift count in rlinm for scc and pass
15956          scc flag to `ccr_bit'.  */
15957       i = ccr_bit (x, 1);
15958       if (i == -1)
15959         output_operand_lossage ("invalid %%J code");
15960       else
15961         /* If we want bit 31, write a shift count of zero, not 32.  */
15962         fprintf (file, "%d", i == 31 ? 0 : i + 1);
15963       return;
15964
15965     case 'k':
15966       /* X must be a constant.  Write the 1's complement of the
15967          constant.  */
15968       if (! INT_P (x))
15969         output_operand_lossage ("invalid %%k value");
15970       else
15971         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
15972       return;
15973
15974     case 'K':
15975       /* X must be a symbolic constant on ELF.  Write an
15976          expression suitable for an 'addi' that adds in the low 16
15977          bits of the MEM.  */
15978       if (GET_CODE (x) == CONST)
15979         {
15980           if (GET_CODE (XEXP (x, 0)) != PLUS
15981               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
15982                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
15983               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
15984             output_operand_lossage ("invalid %%K value");
15985         }
15986       print_operand_address (file, x);
15987       fputs ("@l", file);
15988       return;
15989
15990       /* %l is output_asm_label.  */
15991
15992     case 'L':
15993       /* Write second word of DImode or DFmode reference.  Works on register
15994          or non-indexed memory only.  */
15995       if (GET_CODE (x) == REG)
15996         fputs (reg_names[REGNO (x) + 1], file);
15997       else if (GET_CODE (x) == MEM)
15998         {
15999           /* Handle possible auto-increment.  Since it is pre-increment and
16000              we have already done it, we can just use an offset of word.  */
16001           if (GET_CODE (XEXP (x, 0)) == PRE_INC
16002               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
16003             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
16004                                            UNITS_PER_WORD));
16005           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16006             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
16007                                            UNITS_PER_WORD));
16008           else
16009             output_address (XEXP (adjust_address_nv (x, SImode,
16010                                                      UNITS_PER_WORD),
16011                                   0));
16012
16013           if (small_data_operand (x, GET_MODE (x)))
16014             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16015                      reg_names[SMALL_DATA_REG]);
16016         }
16017       return;
16018
16019     case 'm':
16020       /* MB value for a mask operand.  */
16021       if (! mask_operand (x, SImode))
16022         output_operand_lossage ("invalid %%m value");
16023
16024       fprintf (file, "%d", extract_MB (x));
16025       return;
16026
16027     case 'M':
16028       /* ME value for a mask operand.  */
16029       if (! mask_operand (x, SImode))
16030         output_operand_lossage ("invalid %%M value");
16031
16032       fprintf (file, "%d", extract_ME (x));
16033       return;
16034
16035       /* %n outputs the negative of its operand.  */
16036
16037     case 'N':
16038       /* Write the number of elements in the vector times 4.  */
16039       if (GET_CODE (x) != PARALLEL)
16040         output_operand_lossage ("invalid %%N value");
16041       else
16042         fprintf (file, "%d", XVECLEN (x, 0) * 4);
16043       return;
16044
16045     case 'O':
16046       /* Similar, but subtract 1 first.  */
16047       if (GET_CODE (x) != PARALLEL)
16048         output_operand_lossage ("invalid %%O value");
16049       else
16050         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
16051       return;
16052
16053     case 'p':
16054       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
16055       if (! INT_P (x)
16056           || INT_LOWPART (x) < 0
16057           || (i = exact_log2 (INT_LOWPART (x))) < 0)
16058         output_operand_lossage ("invalid %%p value");
16059       else
16060         fprintf (file, "%d", i);
16061       return;
16062
16063     case 'P':
16064       /* The operand must be an indirect memory reference.  The result
16065          is the register name.  */
16066       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
16067           || REGNO (XEXP (x, 0)) >= 32)
16068         output_operand_lossage ("invalid %%P value");
16069       else
16070         fputs (reg_names[REGNO (XEXP (x, 0))], file);
16071       return;
16072
16073     case 'q':
16074       /* This outputs the logical code corresponding to a boolean
16075          expression.  The expression may have one or both operands
16076          negated (if one, only the first one).  For condition register
16077          logical operations, it will also treat the negated
16078          CR codes as NOTs, but not handle NOTs of them.  */
16079       {
16080         const char *const *t = 0;
16081         const char *s;
16082         enum rtx_code code = GET_CODE (x);
16083         static const char * const tbl[3][3] = {
16084           { "and", "andc", "nor" },
16085           { "or", "orc", "nand" },
16086           { "xor", "eqv", "xor" } };
16087
16088         if (code == AND)
16089           t = tbl[0];
16090         else if (code == IOR)
16091           t = tbl[1];
16092         else if (code == XOR)
16093           t = tbl[2];
16094         else
16095           output_operand_lossage ("invalid %%q value");
16096
16097         if (GET_CODE (XEXP (x, 0)) != NOT)
16098           s = t[0];
16099         else
16100           {
16101             if (GET_CODE (XEXP (x, 1)) == NOT)
16102               s = t[2];
16103             else
16104               s = t[1];
16105           }
16106
16107         fputs (s, file);
16108       }
16109       return;
16110
16111     case 'Q':
16112       if (TARGET_MFCRF)
16113         fputc (',', file);
16114         /* FALLTHRU */
16115       else
16116         return;
16117
16118     case 'R':
16119       /* X is a CR register.  Print the mask for `mtcrf'.  */
16120       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
16121         output_operand_lossage ("invalid %%R value");
16122       else
16123         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
16124       return;
16125
16126     case 's':
16127       /* Low 5 bits of 32 - value */
16128       if (! INT_P (x))
16129         output_operand_lossage ("invalid %%s value");
16130       else
16131         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
16132       return;
16133
16134     case 'S':
16135       /* PowerPC64 mask position.  All 0's is excluded.
16136          CONST_INT 32-bit mask is considered sign-extended so any
16137          transition must occur within the CONST_INT, not on the boundary.  */
16138       if (! mask64_operand (x, DImode))
16139         output_operand_lossage ("invalid %%S value");
16140
16141       uval = INT_LOWPART (x);
16142
16143       if (uval & 1)     /* Clear Left */
16144         {
16145 #if HOST_BITS_PER_WIDE_INT > 64
16146           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
16147 #endif
16148           i = 64;
16149         }
16150       else              /* Clear Right */
16151         {
16152           uval = ~uval;
16153 #if HOST_BITS_PER_WIDE_INT > 64
16154           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
16155 #endif
16156           i = 63;
16157         }
16158       while (uval != 0)
16159         --i, uval >>= 1;
16160       gcc_assert (i >= 0);
16161       fprintf (file, "%d", i);
16162       return;
16163
16164     case 't':
16165       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
16166       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
16167
16168       /* Bit 3 is OV bit.  */
16169       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
16170
16171       /* If we want bit 31, write a shift count of zero, not 32.  */
16172       fprintf (file, "%d", i == 31 ? 0 : i + 1);
16173       return;
16174
16175     case 'T':
16176       /* Print the symbolic name of a branch target register.  */
16177       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
16178                                   && REGNO (x) != CTR_REGNO))
16179         output_operand_lossage ("invalid %%T value");
16180       else if (REGNO (x) == LR_REGNO)
16181         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
16182       else
16183         fputs ("ctr", file);
16184       return;
16185
16186     case 'u':
16187       /* High-order 16 bits of constant for use in unsigned operand.  */
16188       if (! INT_P (x))
16189         output_operand_lossage ("invalid %%u value");
16190       else
16191         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
16192                  (INT_LOWPART (x) >> 16) & 0xffff);
16193       return;
16194
16195     case 'v':
16196       /* High-order 16 bits of constant for use in signed operand.  */
16197       if (! INT_P (x))
16198         output_operand_lossage ("invalid %%v value");
16199       else
16200         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
16201                  (INT_LOWPART (x) >> 16) & 0xffff);
16202       return;
16203
16204     case 'U':
16205       /* Print `u' if this has an auto-increment or auto-decrement.  */
16206       if (GET_CODE (x) == MEM
16207           && (GET_CODE (XEXP (x, 0)) == PRE_INC
16208               || GET_CODE (XEXP (x, 0)) == PRE_DEC
16209               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
16210         putc ('u', file);
16211       return;
16212
16213     case 'V':
16214       /* Print the trap code for this operand.  */
16215       switch (GET_CODE (x))
16216         {
16217         case EQ:
16218           fputs ("eq", file);   /* 4 */
16219           break;
16220         case NE:
16221           fputs ("ne", file);   /* 24 */
16222           break;
16223         case LT:
16224           fputs ("lt", file);   /* 16 */
16225           break;
16226         case LE:
16227           fputs ("le", file);   /* 20 */
16228           break;
16229         case GT:
16230           fputs ("gt", file);   /* 8 */
16231           break;
16232         case GE:
16233           fputs ("ge", file);   /* 12 */
16234           break;
16235         case LTU:
16236           fputs ("llt", file);  /* 2 */
16237           break;
16238         case LEU:
16239           fputs ("lle", file);  /* 6 */
16240           break;
16241         case GTU:
16242           fputs ("lgt", file);  /* 1 */
16243           break;
16244         case GEU:
16245           fputs ("lge", file);  /* 5 */
16246           break;
16247         default:
16248           gcc_unreachable ();
16249         }
16250       break;
16251
16252     case 'w':
16253       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
16254          normally.  */
16255       if (INT_P (x))
16256         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
16257                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
16258       else
16259         print_operand (file, x, 0);
16260       return;
16261
16262     case 'W':
16263       /* MB value for a PowerPC64 rldic operand.  */
16264       val = (GET_CODE (x) == CONST_INT
16265              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
16266
16267       if (val < 0)
16268         i = -1;
16269       else
16270         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
16271           if ((val <<= 1) < 0)
16272             break;
16273
16274 #if HOST_BITS_PER_WIDE_INT == 32
16275       if (GET_CODE (x) == CONST_INT && i >= 0)
16276         i += 32;  /* zero-extend high-part was all 0's */
16277       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
16278         {
16279           val = CONST_DOUBLE_LOW (x);
16280
16281           gcc_assert (val);
16282           if (val < 0)
16283             --i;
16284           else
16285             for ( ; i < 64; i++)
16286               if ((val <<= 1) < 0)
16287                 break;
16288         }
16289 #endif
16290
16291       fprintf (file, "%d", i + 1);
16292       return;
16293
16294     case 'x':
16295       /* X is a FPR or Altivec register used in a VSX context.  */
16296       if (GET_CODE (x) != REG || !VSX_REGNO_P (REGNO (x)))
16297         output_operand_lossage ("invalid %%x value");
16298       else
16299         {
16300           int reg = REGNO (x);
16301           int vsx_reg = (FP_REGNO_P (reg)
16302                          ? reg - 32
16303                          : reg - FIRST_ALTIVEC_REGNO + 32);
16304
16305 #ifdef TARGET_REGNAMES      
16306           if (TARGET_REGNAMES)
16307             fprintf (file, "%%vs%d", vsx_reg);
16308           else
16309 #endif
16310             fprintf (file, "%d", vsx_reg);
16311         }
16312       return;
16313
16314     case 'X':
16315       if (GET_CODE (x) == MEM
16316           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
16317               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
16318                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
16319         putc ('x', file);
16320       return;
16321
16322     case 'Y':
16323       /* Like 'L', for third word of TImode  */
16324       if (GET_CODE (x) == REG)
16325         fputs (reg_names[REGNO (x) + 2], file);
16326       else if (GET_CODE (x) == MEM)
16327         {
16328           if (GET_CODE (XEXP (x, 0)) == PRE_INC
16329               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
16330             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
16331           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16332             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
16333           else
16334             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
16335           if (small_data_operand (x, GET_MODE (x)))
16336             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16337                      reg_names[SMALL_DATA_REG]);
16338         }
16339       return;
16340
16341     case 'z':
16342       /* X is a SYMBOL_REF.  Write out the name preceded by a
16343          period and without any trailing data in brackets.  Used for function
16344          names.  If we are configured for System V (or the embedded ABI) on
16345          the PowerPC, do not emit the period, since those systems do not use
16346          TOCs and the like.  */
16347       gcc_assert (GET_CODE (x) == SYMBOL_REF);
16348
16349       /* Mark the decl as referenced so that cgraph will output the
16350          function.  */
16351       if (SYMBOL_REF_DECL (x))
16352         mark_decl_referenced (SYMBOL_REF_DECL (x));
16353
16354       /* For macho, check to see if we need a stub.  */
16355       if (TARGET_MACHO)
16356         {
16357           const char *name = XSTR (x, 0);
16358 #if TARGET_MACHO
16359           if (darwin_emit_branch_islands
16360               && MACHOPIC_INDIRECT
16361               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
16362             name = machopic_indirection_name (x, /*stub_p=*/true);
16363 #endif
16364           assemble_name (file, name);
16365         }
16366       else if (!DOT_SYMBOLS)
16367         assemble_name (file, XSTR (x, 0));
16368       else
16369         rs6000_output_function_entry (file, XSTR (x, 0));
16370       return;
16371
16372     case 'Z':
16373       /* Like 'L', for last word of TImode.  */
16374       if (GET_CODE (x) == REG)
16375         fputs (reg_names[REGNO (x) + 3], file);
16376       else if (GET_CODE (x) == MEM)
16377         {
16378           if (GET_CODE (XEXP (x, 0)) == PRE_INC
16379               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
16380             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
16381           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16382             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
16383           else
16384             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
16385           if (small_data_operand (x, GET_MODE (x)))
16386             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16387                      reg_names[SMALL_DATA_REG]);
16388         }
16389       return;
16390
16391       /* Print AltiVec or SPE memory operand.  */
16392     case 'y':
16393       {
16394         rtx tmp;
16395
16396         gcc_assert (GET_CODE (x) == MEM);
16397
16398         tmp = XEXP (x, 0);
16399
16400         /* Ugly hack because %y is overloaded.  */
16401         if ((TARGET_SPE || TARGET_E500_DOUBLE)
16402             && (GET_MODE_SIZE (GET_MODE (x)) == 8
16403                 || GET_MODE (x) == TFmode
16404                 || GET_MODE (x) == TImode))
16405           {
16406             /* Handle [reg].  */
16407             if (GET_CODE (tmp) == REG)
16408               {
16409                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
16410                 break;
16411               }
16412             /* Handle [reg+UIMM].  */
16413             else if (GET_CODE (tmp) == PLUS &&
16414                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
16415               {
16416                 int x;
16417
16418                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
16419
16420                 x = INTVAL (XEXP (tmp, 1));
16421                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
16422                 break;
16423               }
16424
16425             /* Fall through.  Must be [reg+reg].  */
16426           }
16427         if (VECTOR_MEM_ALTIVEC_P (GET_MODE (x))
16428             && GET_CODE (tmp) == AND
16429             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
16430             && INTVAL (XEXP (tmp, 1)) == -16)
16431           tmp = XEXP (tmp, 0);
16432         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
16433                  && GET_CODE (tmp) == PRE_MODIFY)
16434           tmp = XEXP (tmp, 1);
16435         if (GET_CODE (tmp) == REG)
16436           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
16437         else
16438           {
16439             if (!GET_CODE (tmp) == PLUS
16440                 || !REG_P (XEXP (tmp, 0))
16441                 || !REG_P (XEXP (tmp, 1)))
16442               {
16443                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
16444                 break;
16445               }
16446
16447             if (REGNO (XEXP (tmp, 0)) == 0)
16448               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
16449                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
16450             else
16451               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
16452                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
16453           }
16454         break;
16455       }
16456
16457     case 0:
16458       if (GET_CODE (x) == REG)
16459         fprintf (file, "%s", reg_names[REGNO (x)]);
16460       else if (GET_CODE (x) == MEM)
16461         {
16462           /* We need to handle PRE_INC and PRE_DEC here, since we need to
16463              know the width from the mode.  */
16464           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
16465             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
16466                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
16467           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
16468             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
16469                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
16470           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16471             output_address (XEXP (XEXP (x, 0), 1));
16472           else
16473             output_address (XEXP (x, 0));
16474         }
16475       else
16476         {
16477           if (toc_relative_expr_p (x))
16478             /* This hack along with a corresponding hack in
16479                rs6000_output_addr_const_extra arranges to output addends
16480                where the assembler expects to find them.  eg.
16481                (const (plus (unspec [symbol_ref ("x") tocrel]) 4))
16482                without this hack would be output as "x@toc+4".  We
16483                want "x+4@toc".  */
16484             output_addr_const (file, tocrel_base);
16485           else
16486             output_addr_const (file, x);
16487         }
16488       return;
16489
16490     case '&':
16491       assemble_name (file, rs6000_get_some_local_dynamic_name ());
16492       return;
16493
16494     default:
16495       output_operand_lossage ("invalid %%xn code");
16496     }
16497 }
16498 \f
16499 /* Print the address of an operand.  */
16500
16501 void
16502 print_operand_address (FILE *file, rtx x)
16503 {
16504   if (GET_CODE (x) == REG)
16505     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
16506   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
16507            || GET_CODE (x) == LABEL_REF)
16508     {
16509       output_addr_const (file, x);
16510       if (small_data_operand (x, GET_MODE (x)))
16511         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16512                  reg_names[SMALL_DATA_REG]);
16513       else
16514         gcc_assert (!TARGET_TOC);
16515     }
16516   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
16517     {
16518       gcc_assert (REG_P (XEXP (x, 0)));
16519       if (REGNO (XEXP (x, 0)) == 0)
16520         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
16521                  reg_names[ REGNO (XEXP (x, 0)) ]);
16522       else
16523         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
16524                  reg_names[ REGNO (XEXP (x, 1)) ]);
16525     }
16526   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
16527     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
16528              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
16529 #if TARGET_MACHO
16530   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
16531            && CONSTANT_P (XEXP (x, 1)))
16532     {
16533       fprintf (file, "lo16(");
16534       output_addr_const (file, XEXP (x, 1));
16535       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16536     }
16537 #endif
16538   else if (legitimate_constant_pool_address_p (x, QImode, true))
16539     {
16540       /* This hack along with a corresponding hack in
16541          rs6000_output_addr_const_extra arranges to output addends
16542          where the assembler expects to find them.  eg.
16543          (lo_sum (reg 9)
16544          .       (const (plus (unspec [symbol_ref ("x") tocrel]) 8)))
16545          without this hack would be output as "x@toc+8@l(9)".  We
16546          want "x+8@toc@l(9)".  */
16547       output_addr_const (file, tocrel_base);
16548       if (GET_CODE (x) == LO_SUM)
16549         fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16550       else
16551         fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
16552     }
16553 #if TARGET_ELF
16554   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
16555            && CONSTANT_P (XEXP (x, 1)))
16556     {
16557       output_addr_const (file, XEXP (x, 1));
16558       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16559     }
16560 #endif
16561   else
16562     gcc_unreachable ();
16563 }
16564 \f
16565 /* Implement TARGET_OUTPUT_ADDR_CONST_EXTRA.  */
16566
16567 static bool
16568 rs6000_output_addr_const_extra (FILE *file, rtx x)
16569 {
16570   if (GET_CODE (x) == UNSPEC)
16571     switch (XINT (x, 1))
16572       {
16573       case UNSPEC_TOCREL:
16574         gcc_assert (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF);
16575         output_addr_const (file, XVECEXP (x, 0, 0));
16576         if (x == tocrel_base && tocrel_offset != const0_rtx)
16577           {
16578             if (INTVAL (tocrel_offset) >= 0)
16579               fprintf (file, "+");
16580             output_addr_const (file, tocrel_offset);
16581           }
16582         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
16583           {
16584             putc ('-', file);
16585             assemble_name (file, toc_label_name);
16586           }
16587         else if (TARGET_ELF)
16588           fputs ("@toc", file);
16589         return true;
16590
16591 #if TARGET_MACHO
16592       case UNSPEC_MACHOPIC_OFFSET:
16593         output_addr_const (file, XVECEXP (x, 0, 0));
16594         putc ('-', file);
16595         machopic_output_function_base_name (file);
16596         return true;
16597 #endif
16598       }
16599   return false;
16600 }
16601 \f
16602 /* Target hook for assembling integer objects.  The PowerPC version has
16603    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
16604    is defined.  It also needs to handle DI-mode objects on 64-bit
16605    targets.  */
16606
16607 static bool
16608 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
16609 {
16610 #ifdef RELOCATABLE_NEEDS_FIXUP
16611   /* Special handling for SI values.  */
16612   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
16613     {
16614       static int recurse = 0;
16615
16616       /* For -mrelocatable, we mark all addresses that need to be fixed up
16617          in the .fixup section.  */
16618       if (TARGET_RELOCATABLE
16619           && in_section != toc_section
16620           && in_section != text_section
16621           && !unlikely_text_section_p (in_section)
16622           && !recurse
16623           && GET_CODE (x) != CONST_INT
16624           && GET_CODE (x) != CONST_DOUBLE
16625           && CONSTANT_P (x))
16626         {
16627           char buf[256];
16628
16629           recurse = 1;
16630           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
16631           fixuplabelno++;
16632           ASM_OUTPUT_LABEL (asm_out_file, buf);
16633           fprintf (asm_out_file, "\t.long\t(");
16634           output_addr_const (asm_out_file, x);
16635           fprintf (asm_out_file, ")@fixup\n");
16636           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
16637           ASM_OUTPUT_ALIGN (asm_out_file, 2);
16638           fprintf (asm_out_file, "\t.long\t");
16639           assemble_name (asm_out_file, buf);
16640           fprintf (asm_out_file, "\n\t.previous\n");
16641           recurse = 0;
16642           return true;
16643         }
16644       /* Remove initial .'s to turn a -mcall-aixdesc function
16645          address into the address of the descriptor, not the function
16646          itself.  */
16647       else if (GET_CODE (x) == SYMBOL_REF
16648                && XSTR (x, 0)[0] == '.'
16649                && DEFAULT_ABI == ABI_AIX)
16650         {
16651           const char *name = XSTR (x, 0);
16652           while (*name == '.')
16653             name++;
16654
16655           fprintf (asm_out_file, "\t.long\t%s\n", name);
16656           return true;
16657         }
16658     }
16659 #endif /* RELOCATABLE_NEEDS_FIXUP */
16660   return default_assemble_integer (x, size, aligned_p);
16661 }
16662
16663 #ifdef HAVE_GAS_HIDDEN
16664 /* Emit an assembler directive to set symbol visibility for DECL to
16665    VISIBILITY_TYPE.  */
16666
16667 static void
16668 rs6000_assemble_visibility (tree decl, int vis)
16669 {
16670   /* Functions need to have their entry point symbol visibility set as
16671      well as their descriptor symbol visibility.  */
16672   if (DEFAULT_ABI == ABI_AIX
16673       && DOT_SYMBOLS
16674       && TREE_CODE (decl) == FUNCTION_DECL)
16675     {
16676       static const char * const visibility_types[] = {
16677         NULL, "internal", "hidden", "protected"
16678       };
16679
16680       const char *name, *type;
16681
16682       name = ((* targetm.strip_name_encoding)
16683               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
16684       type = visibility_types[vis];
16685
16686       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
16687       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
16688     }
16689   else
16690     default_assemble_visibility (decl, vis);
16691 }
16692 #endif
16693 \f
16694 enum rtx_code
16695 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
16696 {
16697   /* Reversal of FP compares takes care -- an ordered compare
16698      becomes an unordered compare and vice versa.  */
16699   if (mode == CCFPmode
16700       && (!flag_finite_math_only
16701           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
16702           || code == UNEQ || code == LTGT))
16703     return reverse_condition_maybe_unordered (code);
16704   else
16705     return reverse_condition (code);
16706 }
16707
16708 /* Generate a compare for CODE.  Return a brand-new rtx that
16709    represents the result of the compare.  */
16710
16711 static rtx
16712 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
16713 {
16714   enum machine_mode comp_mode;
16715   rtx compare_result;
16716   enum rtx_code code = GET_CODE (cmp);
16717   rtx op0 = XEXP (cmp, 0);
16718   rtx op1 = XEXP (cmp, 1);
16719
16720   if (FLOAT_MODE_P (mode))
16721     comp_mode = CCFPmode;
16722   else if (code == GTU || code == LTU
16723            || code == GEU || code == LEU)
16724     comp_mode = CCUNSmode;
16725   else if ((code == EQ || code == NE)
16726            && GET_CODE (op0) == SUBREG
16727            && GET_CODE (op1) == SUBREG
16728            && SUBREG_PROMOTED_UNSIGNED_P (op0)
16729            && SUBREG_PROMOTED_UNSIGNED_P (op1))
16730     /* These are unsigned values, perhaps there will be a later
16731        ordering compare that can be shared with this one.
16732        Unfortunately we cannot detect the signedness of the operands
16733        for non-subregs.  */
16734     comp_mode = CCUNSmode;
16735   else
16736     comp_mode = CCmode;
16737
16738   /* First, the compare.  */
16739   compare_result = gen_reg_rtx (comp_mode);
16740
16741   /* E500 FP compare instructions on the GPRs.  Yuck!  */
16742   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
16743       && FLOAT_MODE_P (mode))
16744     {
16745       rtx cmp, or_result, compare_result2;
16746       enum machine_mode op_mode = GET_MODE (op0);
16747
16748       if (op_mode == VOIDmode)
16749         op_mode = GET_MODE (op1);
16750
16751       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
16752          This explains the following mess.  */
16753
16754       switch (code)
16755         {
16756         case EQ: case UNEQ: case NE: case LTGT:
16757           switch (op_mode)
16758             {
16759             case SFmode:
16760               cmp = (flag_finite_math_only && !flag_trapping_math)
16761                 ? gen_tstsfeq_gpr (compare_result, op0, op1)
16762                 : gen_cmpsfeq_gpr (compare_result, op0, op1);
16763               break;
16764
16765             case DFmode:
16766               cmp = (flag_finite_math_only && !flag_trapping_math)
16767                 ? gen_tstdfeq_gpr (compare_result, op0, op1)
16768                 : gen_cmpdfeq_gpr (compare_result, op0, op1);
16769               break;
16770
16771             case TFmode:
16772               cmp = (flag_finite_math_only && !flag_trapping_math)
16773                 ? gen_tsttfeq_gpr (compare_result, op0, op1)
16774                 : gen_cmptfeq_gpr (compare_result, op0, op1);
16775               break;
16776
16777             default:
16778               gcc_unreachable ();
16779             }
16780           break;
16781
16782         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
16783           switch (op_mode)
16784             {
16785             case SFmode:
16786               cmp = (flag_finite_math_only && !flag_trapping_math)
16787                 ? gen_tstsfgt_gpr (compare_result, op0, op1)
16788                 : gen_cmpsfgt_gpr (compare_result, op0, op1);
16789               break;
16790
16791             case DFmode:
16792               cmp = (flag_finite_math_only && !flag_trapping_math)
16793                 ? gen_tstdfgt_gpr (compare_result, op0, op1)
16794                 : gen_cmpdfgt_gpr (compare_result, op0, op1);
16795               break;
16796
16797             case TFmode:
16798               cmp = (flag_finite_math_only && !flag_trapping_math)
16799                 ? gen_tsttfgt_gpr (compare_result, op0, op1)
16800                 : gen_cmptfgt_gpr (compare_result, op0, op1);
16801               break;
16802
16803             default:
16804               gcc_unreachable ();
16805             }
16806           break;
16807
16808         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
16809           switch (op_mode)
16810             {
16811             case SFmode:
16812               cmp = (flag_finite_math_only && !flag_trapping_math)
16813                 ? gen_tstsflt_gpr (compare_result, op0, op1)
16814                 : gen_cmpsflt_gpr (compare_result, op0, op1);
16815               break;
16816
16817             case DFmode:
16818               cmp = (flag_finite_math_only && !flag_trapping_math)
16819                 ? gen_tstdflt_gpr (compare_result, op0, op1)
16820                 : gen_cmpdflt_gpr (compare_result, op0, op1);
16821               break;
16822
16823             case TFmode:
16824               cmp = (flag_finite_math_only && !flag_trapping_math)
16825                 ? gen_tsttflt_gpr (compare_result, op0, op1)
16826                 : gen_cmptflt_gpr (compare_result, op0, op1);
16827               break;
16828
16829             default:
16830               gcc_unreachable ();
16831             }
16832           break;
16833         default:
16834           gcc_unreachable ();
16835         }
16836
16837       /* Synthesize LE and GE from LT/GT || EQ.  */
16838       if (code == LE || code == GE || code == LEU || code == GEU)
16839         {
16840           emit_insn (cmp);
16841
16842           switch (code)
16843             {
16844             case LE: code = LT; break;
16845             case GE: code = GT; break;
16846             case LEU: code = LT; break;
16847             case GEU: code = GT; break;
16848             default: gcc_unreachable ();
16849             }
16850
16851           compare_result2 = gen_reg_rtx (CCFPmode);
16852
16853           /* Do the EQ.  */
16854           switch (op_mode)
16855             {
16856             case SFmode:
16857               cmp = (flag_finite_math_only && !flag_trapping_math)
16858                 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
16859                 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
16860               break;
16861
16862             case DFmode:
16863               cmp = (flag_finite_math_only && !flag_trapping_math)
16864                 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
16865                 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
16866               break;
16867
16868             case TFmode:
16869               cmp = (flag_finite_math_only && !flag_trapping_math)
16870                 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
16871                 : gen_cmptfeq_gpr (compare_result2, op0, op1);
16872               break;
16873
16874             default:
16875               gcc_unreachable ();
16876             }
16877           emit_insn (cmp);
16878
16879           /* OR them together.  */
16880           or_result = gen_reg_rtx (CCFPmode);
16881           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
16882                                            compare_result2);
16883           compare_result = or_result;
16884           code = EQ;
16885         }
16886       else
16887         {
16888           if (code == NE || code == LTGT)
16889             code = NE;
16890           else
16891             code = EQ;
16892         }
16893
16894       emit_insn (cmp);
16895     }
16896   else
16897     {
16898       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
16899          CLOBBERs to match cmptf_internal2 pattern.  */
16900       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
16901           && GET_MODE (op0) == TFmode
16902           && !TARGET_IEEEQUAD
16903           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
16904         emit_insn (gen_rtx_PARALLEL (VOIDmode,
16905           gen_rtvec (10,
16906                      gen_rtx_SET (VOIDmode,
16907                                   compare_result,
16908                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
16909                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16910                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16911                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16912                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16913                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16914                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16915                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16916                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16917                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
16918       else if (GET_CODE (op1) == UNSPEC
16919                && XINT (op1, 1) == UNSPEC_SP_TEST)
16920         {
16921           rtx op1b = XVECEXP (op1, 0, 0);
16922           comp_mode = CCEQmode;
16923           compare_result = gen_reg_rtx (CCEQmode);
16924           if (TARGET_64BIT)
16925             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
16926           else
16927             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
16928         }
16929       else
16930         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
16931                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
16932     }
16933
16934   /* Some kinds of FP comparisons need an OR operation;
16935      under flag_finite_math_only we don't bother.  */
16936   if (FLOAT_MODE_P (mode)
16937       && !flag_finite_math_only
16938       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
16939       && (code == LE || code == GE
16940           || code == UNEQ || code == LTGT
16941           || code == UNGT || code == UNLT))
16942     {
16943       enum rtx_code or1, or2;
16944       rtx or1_rtx, or2_rtx, compare2_rtx;
16945       rtx or_result = gen_reg_rtx (CCEQmode);
16946
16947       switch (code)
16948         {
16949         case LE: or1 = LT;  or2 = EQ;  break;
16950         case GE: or1 = GT;  or2 = EQ;  break;
16951         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
16952         case LTGT: or1 = LT;  or2 = GT;  break;
16953         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
16954         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
16955         default:  gcc_unreachable ();
16956         }
16957       validate_condition_mode (or1, comp_mode);
16958       validate_condition_mode (or2, comp_mode);
16959       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
16960       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
16961       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
16962                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
16963                                       const_true_rtx);
16964       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
16965
16966       compare_result = or_result;
16967       code = EQ;
16968     }
16969
16970   validate_condition_mode (code, GET_MODE (compare_result));
16971
16972   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
16973 }
16974
16975
16976 /* Emit the RTL for an sISEL pattern.  */
16977
16978 void
16979 rs6000_emit_sISEL (enum machine_mode mode ATTRIBUTE_UNUSED, rtx operands[])
16980 {
16981   rs6000_emit_int_cmove (operands[0], operands[1], const1_rtx, const0_rtx);
16982 }
16983
16984 void
16985 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
16986 {
16987   rtx condition_rtx;
16988   enum machine_mode op_mode;
16989   enum rtx_code cond_code;
16990   rtx result = operands[0];
16991
16992   if (TARGET_ISEL && (mode == SImode || mode == DImode))
16993     {
16994       rs6000_emit_sISEL (mode, operands);
16995       return;
16996     }
16997
16998   condition_rtx = rs6000_generate_compare (operands[1], mode);
16999   cond_code = GET_CODE (condition_rtx);
17000
17001   if (FLOAT_MODE_P (mode)
17002       && !TARGET_FPRS && TARGET_HARD_FLOAT)
17003     {
17004       rtx t;
17005
17006       PUT_MODE (condition_rtx, SImode);
17007       t = XEXP (condition_rtx, 0);
17008
17009       gcc_assert (cond_code == NE || cond_code == EQ);
17010
17011       if (cond_code == NE)
17012         emit_insn (gen_e500_flip_gt_bit (t, t));
17013
17014       emit_insn (gen_move_from_CR_gt_bit (result, t));
17015       return;
17016     }
17017
17018   if (cond_code == NE
17019       || cond_code == GE || cond_code == LE
17020       || cond_code == GEU || cond_code == LEU
17021       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
17022     {
17023       rtx not_result = gen_reg_rtx (CCEQmode);
17024       rtx not_op, rev_cond_rtx;
17025       enum machine_mode cc_mode;
17026
17027       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
17028
17029       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
17030                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
17031       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
17032       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
17033       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
17034     }
17035
17036   op_mode = GET_MODE (XEXP (operands[1], 0));
17037   if (op_mode == VOIDmode)
17038     op_mode = GET_MODE (XEXP (operands[1], 1));
17039
17040   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
17041     {
17042       PUT_MODE (condition_rtx, DImode);
17043       convert_move (result, condition_rtx, 0);
17044     }
17045   else
17046     {
17047       PUT_MODE (condition_rtx, SImode);
17048       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
17049     }
17050 }
17051
17052 /* Emit a branch of kind CODE to location LOC.  */
17053
17054 void
17055 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
17056 {
17057   rtx condition_rtx, loc_ref;
17058
17059   condition_rtx = rs6000_generate_compare (operands[0], mode);
17060   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
17061   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
17062                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
17063                                                      loc_ref, pc_rtx)));
17064 }
17065
17066 /* Return the string to output a conditional branch to LABEL, which is
17067    the operand number of the label, or -1 if the branch is really a
17068    conditional return.
17069
17070    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
17071    condition code register and its mode specifies what kind of
17072    comparison we made.
17073
17074    REVERSED is nonzero if we should reverse the sense of the comparison.
17075
17076    INSN is the insn.  */
17077
17078 char *
17079 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
17080 {
17081   static char string[64];
17082   enum rtx_code code = GET_CODE (op);
17083   rtx cc_reg = XEXP (op, 0);
17084   enum machine_mode mode = GET_MODE (cc_reg);
17085   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
17086   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
17087   int really_reversed = reversed ^ need_longbranch;
17088   char *s = string;
17089   const char *ccode;
17090   const char *pred;
17091   rtx note;
17092
17093   validate_condition_mode (code, mode);
17094
17095   /* Work out which way this really branches.  We could use
17096      reverse_condition_maybe_unordered here always but this
17097      makes the resulting assembler clearer.  */
17098   if (really_reversed)
17099     {
17100       /* Reversal of FP compares takes care -- an ordered compare
17101          becomes an unordered compare and vice versa.  */
17102       if (mode == CCFPmode)
17103         code = reverse_condition_maybe_unordered (code);
17104       else
17105         code = reverse_condition (code);
17106     }
17107
17108   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
17109     {
17110       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
17111          to the GT bit.  */
17112       switch (code)
17113         {
17114         case EQ:
17115           /* Opposite of GT.  */
17116           code = GT;
17117           break;
17118
17119         case NE:
17120           code = UNLE;
17121           break;
17122
17123         default:
17124           gcc_unreachable ();
17125         }
17126     }
17127
17128   switch (code)
17129     {
17130       /* Not all of these are actually distinct opcodes, but
17131          we distinguish them for clarity of the resulting assembler.  */
17132     case NE: case LTGT:
17133       ccode = "ne"; break;
17134     case EQ: case UNEQ:
17135       ccode = "eq"; break;
17136     case GE: case GEU:
17137       ccode = "ge"; break;
17138     case GT: case GTU: case UNGT:
17139       ccode = "gt"; break;
17140     case LE: case LEU:
17141       ccode = "le"; break;
17142     case LT: case LTU: case UNLT:
17143       ccode = "lt"; break;
17144     case UNORDERED: ccode = "un"; break;
17145     case ORDERED: ccode = "nu"; break;
17146     case UNGE: ccode = "nl"; break;
17147     case UNLE: ccode = "ng"; break;
17148     default:
17149       gcc_unreachable ();
17150     }
17151
17152   /* Maybe we have a guess as to how likely the branch is.
17153      The old mnemonics don't have a way to specify this information.  */
17154   pred = "";
17155   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
17156   if (note != NULL_RTX)
17157     {
17158       /* PROB is the difference from 50%.  */
17159       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
17160
17161       /* Only hint for highly probable/improbable branches on newer
17162          cpus as static prediction overrides processor dynamic
17163          prediction.  For older cpus we may as well always hint, but
17164          assume not taken for branches that are very close to 50% as a
17165          mispredicted taken branch is more expensive than a
17166          mispredicted not-taken branch.  */
17167       if (rs6000_always_hint
17168           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
17169               && br_prob_note_reliable_p (note)))
17170         {
17171           if (abs (prob) > REG_BR_PROB_BASE / 20
17172               && ((prob > 0) ^ need_longbranch))
17173             pred = "+";
17174           else
17175             pred = "-";
17176         }
17177     }
17178
17179   if (label == NULL)
17180     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
17181   else
17182     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
17183
17184   /* We need to escape any '%' characters in the reg_names string.
17185      Assume they'd only be the first character....  */
17186   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
17187     *s++ = '%';
17188   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
17189
17190   if (label != NULL)
17191     {
17192       /* If the branch distance was too far, we may have to use an
17193          unconditional branch to go the distance.  */
17194       if (need_longbranch)
17195         s += sprintf (s, ",$+8\n\tb %s", label);
17196       else
17197         s += sprintf (s, ",%s", label);
17198     }
17199
17200   return string;
17201 }
17202
17203 /* Return the string to flip the GT bit on a CR.  */
17204 char *
17205 output_e500_flip_gt_bit (rtx dst, rtx src)
17206 {
17207   static char string[64];
17208   int a, b;
17209
17210   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
17211               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
17212
17213   /* GT bit.  */
17214   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
17215   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
17216
17217   sprintf (string, "crnot %d,%d", a, b);
17218   return string;
17219 }
17220
17221 /* Return insn for VSX or Altivec comparisons.  */
17222
17223 static rtx
17224 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
17225 {
17226   rtx mask;
17227   enum machine_mode mode = GET_MODE (op0);
17228
17229   switch (code)
17230     {
17231     default:
17232       break;
17233
17234     case GE:
17235       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
17236         return NULL_RTX;
17237
17238     case EQ:
17239     case GT:
17240     case GTU:
17241       mask = gen_reg_rtx (mode);
17242       emit_insn (gen_rtx_SET (VOIDmode,
17243                               mask,
17244                               gen_rtx_fmt_ee (code, mode, op0, op1)));
17245       return mask;
17246     }
17247
17248   return NULL_RTX;
17249 }
17250
17251 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
17252    DMODE is expected destination mode. This is a recursive function.  */
17253
17254 static rtx
17255 rs6000_emit_vector_compare (enum rtx_code rcode,
17256                             rtx op0, rtx op1,
17257                             enum machine_mode dmode)
17258 {
17259   rtx mask;
17260   bool swap_operands = false;
17261   bool try_again = false;
17262
17263   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
17264   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
17265
17266   /* See if the comparison works as is.  */
17267   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
17268   if (mask)
17269     return mask;
17270
17271   switch (rcode)
17272     {
17273     case LT:
17274       rcode = GT;
17275       swap_operands = true;
17276       try_again = true;
17277       break;
17278     case LTU:
17279       rcode = GTU;
17280       swap_operands = true;
17281       try_again = true;
17282       break;
17283     case NE:
17284     case UNLE:
17285     case UNLT:
17286     case UNGE:
17287     case UNGT:
17288       /* Invert condition and try again.
17289          e.g., A != B becomes ~(A==B).  */
17290       {
17291         enum rtx_code rev_code;
17292         enum insn_code nor_code;
17293         rtx mask2;
17294
17295         rev_code = reverse_condition_maybe_unordered (rcode);
17296         if (rev_code == UNKNOWN)
17297           return NULL_RTX;
17298
17299         nor_code = optab_handler (one_cmpl_optab, dmode);
17300         if (nor_code == CODE_FOR_nothing)
17301           return NULL_RTX;
17302
17303         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
17304         if (!mask2)
17305           return NULL_RTX;
17306
17307         mask = gen_reg_rtx (dmode);
17308         emit_insn (GEN_FCN (nor_code) (mask, mask2));
17309         return mask;
17310       }
17311       break;
17312     case GE:
17313     case GEU:
17314     case LE:
17315     case LEU:
17316       /* Try GT/GTU/LT/LTU OR EQ */
17317       {
17318         rtx c_rtx, eq_rtx;
17319         enum insn_code ior_code;
17320         enum rtx_code new_code;
17321
17322         switch (rcode)
17323           {
17324           case  GE:
17325             new_code = GT;
17326             break;
17327
17328           case GEU:
17329             new_code = GTU;
17330             break;
17331
17332           case LE:
17333             new_code = LT;
17334             break;
17335
17336           case LEU:
17337             new_code = LTU;
17338             break;
17339
17340           default:
17341             gcc_unreachable ();
17342           }
17343
17344         ior_code = optab_handler (ior_optab, dmode);
17345         if (ior_code == CODE_FOR_nothing)
17346           return NULL_RTX;
17347
17348         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
17349         if (!c_rtx)
17350           return NULL_RTX;
17351
17352         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
17353         if (!eq_rtx)
17354           return NULL_RTX;
17355
17356         mask = gen_reg_rtx (dmode);
17357         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
17358         return mask;
17359       }
17360       break;
17361     default:
17362       return NULL_RTX;
17363     }
17364
17365   if (try_again)
17366     {
17367       if (swap_operands)
17368         {
17369           rtx tmp;
17370           tmp = op0;
17371           op0 = op1;
17372           op1 = tmp;
17373         }
17374
17375       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
17376       if (mask)
17377         return mask;
17378     }
17379
17380   /* You only get two chances.  */
17381   return NULL_RTX;
17382 }
17383
17384 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
17385    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
17386    operands for the relation operation COND.  */
17387
17388 int
17389 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
17390                               rtx cond, rtx cc_op0, rtx cc_op1)
17391 {
17392   enum machine_mode dest_mode = GET_MODE (dest);
17393   enum rtx_code rcode = GET_CODE (cond);
17394   enum machine_mode cc_mode = CCmode;
17395   rtx mask;
17396   rtx cond2;
17397   rtx tmp;
17398   bool invert_move = false;
17399
17400   if (VECTOR_UNIT_NONE_P (dest_mode))
17401     return 0;
17402
17403   switch (rcode)
17404     {
17405       /* Swap operands if we can, and fall back to doing the operation as
17406          specified, and doing a NOR to invert the test.  */
17407     case NE:
17408     case UNLE:
17409     case UNLT:
17410     case UNGE:
17411     case UNGT:
17412       /* Invert condition and try again.
17413          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
17414       invert_move = true;
17415       rcode = reverse_condition_maybe_unordered (rcode);
17416       if (rcode == UNKNOWN)
17417         return 0;
17418       break;
17419
17420       /* Mark unsigned tests with CCUNSmode.  */
17421     case GTU:
17422     case GEU:
17423     case LTU:
17424     case LEU:
17425       cc_mode = CCUNSmode;
17426       break;
17427
17428     default:
17429       break;
17430     }
17431
17432   /* Get the vector mask for the given relational operations.  */
17433   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
17434
17435   if (!mask)
17436     return 0;
17437
17438   if (invert_move)
17439     {
17440       tmp = op_true;
17441       op_true = op_false;
17442       op_false = tmp;
17443     }
17444
17445   cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, const0_rtx);
17446   emit_insn (gen_rtx_SET (VOIDmode,
17447                           dest,
17448                           gen_rtx_IF_THEN_ELSE (dest_mode,
17449                                                 cond2,
17450                                                 op_true,
17451                                                 op_false)));
17452   return 1;
17453 }
17454
17455 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
17456    operands of the last comparison is nonzero/true, FALSE_COND if it
17457    is zero/false.  Return 0 if the hardware has no such operation.  */
17458
17459 int
17460 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17461 {
17462   enum rtx_code code = GET_CODE (op);
17463   rtx op0 = XEXP (op, 0);
17464   rtx op1 = XEXP (op, 1);
17465   REAL_VALUE_TYPE c1;
17466   enum machine_mode compare_mode = GET_MODE (op0);
17467   enum machine_mode result_mode = GET_MODE (dest);
17468   rtx temp;
17469   bool is_against_zero;
17470
17471   /* These modes should always match.  */
17472   if (GET_MODE (op1) != compare_mode
17473       /* In the isel case however, we can use a compare immediate, so
17474          op1 may be a small constant.  */
17475       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
17476     return 0;
17477   if (GET_MODE (true_cond) != result_mode)
17478     return 0;
17479   if (GET_MODE (false_cond) != result_mode)
17480     return 0;
17481
17482   /* First, work out if the hardware can do this at all, or
17483      if it's too slow....  */
17484   if (!FLOAT_MODE_P (compare_mode))
17485     {
17486       if (TARGET_ISEL)
17487         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
17488       return 0;
17489     }
17490   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
17491            && SCALAR_FLOAT_MODE_P (compare_mode))
17492     return 0;
17493
17494   is_against_zero = op1 == CONST0_RTX (compare_mode);
17495
17496   /* A floating-point subtract might overflow, underflow, or produce
17497      an inexact result, thus changing the floating-point flags, so it
17498      can't be generated if we care about that.  It's safe if one side
17499      of the construct is zero, since then no subtract will be
17500      generated.  */
17501   if (SCALAR_FLOAT_MODE_P (compare_mode)
17502       && flag_trapping_math && ! is_against_zero)
17503     return 0;
17504
17505   /* Eliminate half of the comparisons by switching operands, this
17506      makes the remaining code simpler.  */
17507   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
17508       || code == LTGT || code == LT || code == UNLE)
17509     {
17510       code = reverse_condition_maybe_unordered (code);
17511       temp = true_cond;
17512       true_cond = false_cond;
17513       false_cond = temp;
17514     }
17515
17516   /* UNEQ and LTGT take four instructions for a comparison with zero,
17517      it'll probably be faster to use a branch here too.  */
17518   if (code == UNEQ && HONOR_NANS (compare_mode))
17519     return 0;
17520
17521   if (GET_CODE (op1) == CONST_DOUBLE)
17522     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
17523
17524   /* We're going to try to implement comparisons by performing
17525      a subtract, then comparing against zero.  Unfortunately,
17526      Inf - Inf is NaN which is not zero, and so if we don't
17527      know that the operand is finite and the comparison
17528      would treat EQ different to UNORDERED, we can't do it.  */
17529   if (HONOR_INFINITIES (compare_mode)
17530       && code != GT && code != UNGE
17531       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
17532       /* Constructs of the form (a OP b ? a : b) are safe.  */
17533       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
17534           || (! rtx_equal_p (op0, true_cond)
17535               && ! rtx_equal_p (op1, true_cond))))
17536     return 0;
17537
17538   /* At this point we know we can use fsel.  */
17539
17540   /* Reduce the comparison to a comparison against zero.  */
17541   if (! is_against_zero)
17542     {
17543       temp = gen_reg_rtx (compare_mode);
17544       emit_insn (gen_rtx_SET (VOIDmode, temp,
17545                               gen_rtx_MINUS (compare_mode, op0, op1)));
17546       op0 = temp;
17547       op1 = CONST0_RTX (compare_mode);
17548     }
17549
17550   /* If we don't care about NaNs we can reduce some of the comparisons
17551      down to faster ones.  */
17552   if (! HONOR_NANS (compare_mode))
17553     switch (code)
17554       {
17555       case GT:
17556         code = LE;
17557         temp = true_cond;
17558         true_cond = false_cond;
17559         false_cond = temp;
17560         break;
17561       case UNGE:
17562         code = GE;
17563         break;
17564       case UNEQ:
17565         code = EQ;
17566         break;
17567       default:
17568         break;
17569       }
17570
17571   /* Now, reduce everything down to a GE.  */
17572   switch (code)
17573     {
17574     case GE:
17575       break;
17576
17577     case LE:
17578       temp = gen_reg_rtx (compare_mode);
17579       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17580       op0 = temp;
17581       break;
17582
17583     case ORDERED:
17584       temp = gen_reg_rtx (compare_mode);
17585       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
17586       op0 = temp;
17587       break;
17588
17589     case EQ:
17590       temp = gen_reg_rtx (compare_mode);
17591       emit_insn (gen_rtx_SET (VOIDmode, temp,
17592                               gen_rtx_NEG (compare_mode,
17593                                            gen_rtx_ABS (compare_mode, op0))));
17594       op0 = temp;
17595       break;
17596
17597     case UNGE:
17598       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
17599       temp = gen_reg_rtx (result_mode);
17600       emit_insn (gen_rtx_SET (VOIDmode, temp,
17601                               gen_rtx_IF_THEN_ELSE (result_mode,
17602                                                     gen_rtx_GE (VOIDmode,
17603                                                                 op0, op1),
17604                                                     true_cond, false_cond)));
17605       false_cond = true_cond;
17606       true_cond = temp;
17607
17608       temp = gen_reg_rtx (compare_mode);
17609       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17610       op0 = temp;
17611       break;
17612
17613     case GT:
17614       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
17615       temp = gen_reg_rtx (result_mode);
17616       emit_insn (gen_rtx_SET (VOIDmode, temp,
17617                               gen_rtx_IF_THEN_ELSE (result_mode,
17618                                                     gen_rtx_GE (VOIDmode,
17619                                                                 op0, op1),
17620                                                     true_cond, false_cond)));
17621       true_cond = false_cond;
17622       false_cond = temp;
17623
17624       temp = gen_reg_rtx (compare_mode);
17625       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17626       op0 = temp;
17627       break;
17628
17629     default:
17630       gcc_unreachable ();
17631     }
17632
17633   emit_insn (gen_rtx_SET (VOIDmode, dest,
17634                           gen_rtx_IF_THEN_ELSE (result_mode,
17635                                                 gen_rtx_GE (VOIDmode,
17636                                                             op0, op1),
17637                                                 true_cond, false_cond)));
17638   return 1;
17639 }
17640
17641 /* Same as above, but for ints (isel).  */
17642
17643 static int
17644 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17645 {
17646   rtx condition_rtx, cr;
17647   enum machine_mode mode = GET_MODE (dest);
17648   enum rtx_code cond_code;
17649   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
17650   bool signedp;
17651
17652   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
17653     return 0;
17654
17655   /* We still have to do the compare, because isel doesn't do a
17656      compare, it just looks at the CRx bits set by a previous compare
17657      instruction.  */
17658   condition_rtx = rs6000_generate_compare (op, mode);
17659   cond_code = GET_CODE (condition_rtx);
17660   cr = XEXP (condition_rtx, 0);
17661   signedp = GET_MODE (cr) == CCmode;
17662
17663   isel_func = (mode == SImode
17664                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
17665                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
17666
17667   switch (cond_code)
17668     {
17669     case LT: case GT: case LTU: case GTU: case EQ:
17670       /* isel handles these directly.  */
17671       break;
17672
17673     default:
17674       /* We need to swap the sense of the comparison.  */
17675       {
17676         rtx t = true_cond;
17677         true_cond = false_cond;
17678         false_cond = t;
17679         PUT_CODE (condition_rtx, reverse_condition (cond_code));
17680       }
17681       break;
17682     }
17683
17684   false_cond = force_reg (mode, false_cond);
17685   if (true_cond != const0_rtx)
17686     true_cond = force_reg (mode, true_cond);
17687
17688   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
17689
17690   return 1;
17691 }
17692
17693 const char *
17694 output_isel (rtx *operands)
17695 {
17696   enum rtx_code code;
17697
17698   code = GET_CODE (operands[1]);
17699
17700   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
17701     {
17702       gcc_assert (GET_CODE (operands[2]) == REG
17703                   && GET_CODE (operands[3]) == REG);
17704       PUT_CODE (operands[1], reverse_condition (code));
17705       return "isel %0,%3,%2,%j1";
17706     }
17707
17708   return "isel %0,%2,%3,%j1";
17709 }
17710
17711 void
17712 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
17713 {
17714   enum machine_mode mode = GET_MODE (op0);
17715   enum rtx_code c;
17716   rtx target;
17717
17718   /* VSX/altivec have direct min/max insns.  */
17719   if ((code == SMAX || code == SMIN)
17720       && (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
17721           || (mode == SFmode && VECTOR_UNIT_VSX_P (DFmode))))
17722     {
17723       emit_insn (gen_rtx_SET (VOIDmode,
17724                               dest,
17725                               gen_rtx_fmt_ee (code, mode, op0, op1)));
17726       return;
17727     }
17728
17729   if (code == SMAX || code == SMIN)
17730     c = GE;
17731   else
17732     c = GEU;
17733
17734   if (code == SMAX || code == UMAX)
17735     target = emit_conditional_move (dest, c, op0, op1, mode,
17736                                     op0, op1, mode, 0);
17737   else
17738     target = emit_conditional_move (dest, c, op0, op1, mode,
17739                                     op1, op0, mode, 0);
17740   gcc_assert (target);
17741   if (target != dest)
17742     emit_move_insn (dest, target);
17743 }
17744
17745 /* Emit instructions to perform a load-reserved/store-conditional operation.
17746    The operation performed is an atomic
17747    (set M (CODE:MODE M OP))
17748    If not NULL, BEFORE is atomically set to M before the operation, and
17749    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
17750    If SYNC_P then a memory barrier is emitted before the operation.
17751    Either OP or M may be wrapped in a NOT operation.  */
17752
17753 void
17754 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
17755                   rtx m, rtx op, rtx before_param, rtx after_param,
17756                   bool sync_p)
17757 {
17758   enum machine_mode used_mode;
17759   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
17760   rtx used_m;
17761   rtvec vec;
17762   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17763   rtx shift = NULL_RTX;
17764
17765   if (sync_p)
17766     emit_insn (gen_lwsync ());
17767
17768     used_m = m;
17769
17770   /* If this is smaller than SImode, we'll have to use SImode with
17771      adjustments.  */
17772   if (mode == QImode || mode == HImode)
17773     {
17774       rtx newop, oldop;
17775
17776       if (MEM_ALIGN (used_m) >= 32)
17777         {
17778           int ishift = 0;
17779           if (BYTES_BIG_ENDIAN)
17780             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
17781
17782           shift = GEN_INT (ishift);
17783           used_m = change_address (used_m, SImode, 0);
17784         }
17785       else
17786         {
17787           rtx addrSI, aligned_addr;
17788           int shift_mask = mode == QImode ? 0x18 : 0x10;
17789
17790           addrSI = gen_lowpart_common (SImode,
17791                                        force_reg (Pmode, XEXP (used_m, 0)));
17792           addrSI = force_reg (SImode, addrSI);
17793           shift = gen_reg_rtx (SImode);
17794
17795           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17796                                  GEN_INT (shift_mask)));
17797           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17798
17799           aligned_addr = expand_binop (Pmode, and_optab,
17800                                        XEXP (used_m, 0),
17801                                        GEN_INT (-4), NULL_RTX,
17802                                        1, OPTAB_LIB_WIDEN);
17803           used_m = change_address (used_m, SImode, aligned_addr);
17804           set_mem_align (used_m, 32);
17805         }
17806       /* It's safe to keep the old alias set of USED_M, because
17807          the operation is atomic and only affects the original
17808          USED_M.  */
17809       m = used_m;
17810
17811       if (GET_CODE (op) == NOT)
17812         {
17813           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
17814           oldop = gen_rtx_NOT (SImode, oldop);
17815         }
17816       else
17817         oldop = lowpart_subreg (SImode, op, mode);
17818
17819       switch (code)
17820         {
17821         case IOR:
17822         case XOR:
17823           newop = expand_binop (SImode, and_optab,
17824                                 oldop, GEN_INT (imask), NULL_RTX,
17825                                 1, OPTAB_LIB_WIDEN);
17826           emit_insn (gen_ashlsi3 (newop, newop, shift));
17827           break;
17828
17829         case NOT: /* NAND */
17830           newop = expand_binop (SImode, ior_optab,
17831                                 oldop, GEN_INT (~imask), NULL_RTX,
17832                                 1, OPTAB_LIB_WIDEN);
17833           emit_insn (gen_rotlsi3 (newop, newop, shift));
17834           break;
17835
17836         case AND:
17837           newop = expand_binop (SImode, ior_optab,
17838                                 oldop, GEN_INT (~imask), NULL_RTX,
17839                                 1, OPTAB_LIB_WIDEN);
17840           emit_insn (gen_rotlsi3 (newop, newop, shift));
17841           break;
17842
17843         case PLUS:
17844         case MINUS:
17845           {
17846             rtx mask;
17847
17848             newop = expand_binop (SImode, and_optab,
17849                                   oldop, GEN_INT (imask), NULL_RTX,
17850                                   1, OPTAB_LIB_WIDEN);
17851             emit_insn (gen_ashlsi3 (newop, newop, shift));
17852
17853             mask = gen_reg_rtx (SImode);
17854             emit_move_insn (mask, GEN_INT (imask));
17855             emit_insn (gen_ashlsi3 (mask, mask, shift));
17856
17857             if (code == PLUS)
17858               newop = gen_rtx_PLUS (SImode, m, newop);
17859             else
17860               newop = gen_rtx_MINUS (SImode, m, newop);
17861             newop = gen_rtx_AND (SImode, newop, mask);
17862             newop = gen_rtx_IOR (SImode, newop,
17863                                  gen_rtx_AND (SImode,
17864                                               gen_rtx_NOT (SImode, mask),
17865                                               m));
17866             break;
17867           }
17868
17869         default:
17870           gcc_unreachable ();
17871         }
17872
17873       op = newop;
17874       used_mode = SImode;
17875       before = gen_reg_rtx (used_mode);
17876       after = gen_reg_rtx (used_mode);
17877     }
17878   else
17879     {
17880       used_mode = mode;
17881       before = before_param;
17882       after = after_param;
17883
17884       if (before == NULL_RTX)
17885         before = gen_reg_rtx (used_mode);
17886       if (after == NULL_RTX)
17887         after = gen_reg_rtx (used_mode);
17888     }
17889
17890   if ((code == PLUS || code == MINUS)
17891       && used_mode != mode)
17892     the_op = op;  /* Computed above.  */
17893   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
17894     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
17895   else if (code == NOT)
17896     the_op = gen_rtx_fmt_ee (IOR, used_mode,
17897                              gen_rtx_NOT (used_mode, m),
17898                              gen_rtx_NOT (used_mode, op));
17899   else
17900     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
17901
17902   set_after = gen_rtx_SET (VOIDmode, after, the_op);
17903   set_before = gen_rtx_SET (VOIDmode, before, used_m);
17904   set_atomic = gen_rtx_SET (VOIDmode, used_m,
17905                             gen_rtx_UNSPEC (used_mode,
17906                                             gen_rtvec (1, the_op),
17907                                             UNSPEC_SYNC_OP));
17908   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
17909
17910   if ((code == PLUS || code == MINUS) && used_mode != mode)
17911     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
17912                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
17913   else
17914     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
17915   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
17916
17917   /* Shift and mask the return values properly.  */
17918   if (used_mode != mode && before_param)
17919     {
17920       emit_insn (gen_lshrsi3 (before, before, shift));
17921       convert_move (before_param, before, 1);
17922     }
17923
17924   if (used_mode != mode && after_param)
17925     {
17926       emit_insn (gen_lshrsi3 (after, after, shift));
17927       convert_move (after_param, after, 1);
17928     }
17929
17930   /* The previous sequence will end with a branch that's dependent on
17931      the conditional store, so placing an isync will ensure that no
17932      other instructions (especially, no load or store instructions)
17933      can start before the atomic operation completes.  */
17934   if (sync_p)
17935     emit_insn (gen_isync ());
17936 }
17937
17938 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
17939    COND is true.  Mark the jump as unlikely to be taken.  */
17940
17941 static void
17942 emit_unlikely_jump (rtx cond, rtx label)
17943 {
17944   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
17945   rtx x;
17946
17947   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
17948   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
17949   add_reg_note (x, REG_BR_PROB, very_unlikely);
17950 }
17951
17952 /* A subroutine of the atomic operation splitters.  Emit a load-locked
17953    instruction in MODE.  */
17954
17955 static void
17956 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
17957 {
17958   rtx (*fn) (rtx, rtx) = NULL;
17959   if (mode == SImode)
17960     fn = gen_load_locked_si;
17961   else if (mode == DImode)
17962     fn = gen_load_locked_di;
17963   emit_insn (fn (reg, mem));
17964 }
17965
17966 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
17967    instruction in MODE.  */
17968
17969 static void
17970 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
17971 {
17972   rtx (*fn) (rtx, rtx, rtx) = NULL;
17973   if (mode == SImode)
17974     fn = gen_store_conditional_si;
17975   else if (mode == DImode)
17976     fn = gen_store_conditional_di;
17977
17978   /* Emit sync before stwcx. to address PPC405 Erratum.  */
17979   if (PPC405_ERRATUM77)
17980     emit_insn (gen_memory_barrier ());
17981
17982   emit_insn (fn (res, mem, val));
17983 }
17984
17985 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
17986    to perform.  MEM is the memory on which to operate.  VAL is the second
17987    operand of the binary operator.  BEFORE and AFTER are optional locations to
17988    return the value of MEM either before of after the operation.  SCRATCH is
17989    a scratch register.  */
17990
17991 void
17992 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
17993                        rtx before, rtx after, rtx scratch)
17994 {
17995   enum machine_mode mode = GET_MODE (mem);
17996   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17997
17998   emit_insn (gen_lwsync ());
17999
18000   label = gen_label_rtx ();
18001   emit_label (label);
18002   label = gen_rtx_LABEL_REF (VOIDmode, label);
18003
18004   if (before == NULL_RTX)
18005     before = scratch;
18006   emit_load_locked (mode, before, mem);
18007
18008   if (code == NOT)
18009     x = gen_rtx_IOR (mode,
18010                      gen_rtx_NOT (mode, before),
18011                      gen_rtx_NOT (mode, val));
18012   else if (code == AND)
18013     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
18014   else
18015     x = gen_rtx_fmt_ee (code, mode, before, val);
18016
18017   if (after != NULL_RTX)
18018     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
18019   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
18020
18021   emit_store_conditional (mode, cond, mem, scratch);
18022
18023   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18024   emit_unlikely_jump (x, label);
18025
18026   emit_insn (gen_isync ());
18027 }
18028
18029 /* Expand an atomic compare and swap operation.  MEM is the memory on which
18030    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
18031    value to be stored.  SCRATCH is a scratch GPR.  */
18032
18033 void
18034 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
18035                                rtx scratch)
18036 {
18037   enum machine_mode mode = GET_MODE (mem);
18038   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18039
18040   emit_insn (gen_lwsync ());
18041
18042   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18043   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18044   emit_label (XEXP (label1, 0));
18045
18046   emit_load_locked (mode, retval, mem);
18047
18048   x = gen_rtx_COMPARE (CCmode, retval, oldval);
18049   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
18050
18051   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18052   emit_unlikely_jump (x, label2);
18053
18054   emit_move_insn (scratch, newval);
18055   emit_store_conditional (mode, cond, mem, scratch);
18056
18057   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18058   emit_unlikely_jump (x, label1);
18059
18060   emit_insn (gen_isync ());
18061   emit_label (XEXP (label2, 0));
18062 }
18063
18064 /* Expand an atomic test and set operation.  MEM is the memory on which
18065    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
18066
18067 void
18068 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
18069 {
18070   enum machine_mode mode = GET_MODE (mem);
18071   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18072
18073   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18074   emit_label (XEXP (label, 0));
18075
18076   emit_load_locked (mode, retval, mem);
18077   emit_move_insn (scratch, val);
18078   emit_store_conditional (mode, cond, mem, scratch);
18079
18080   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18081   emit_unlikely_jump (x, label);
18082
18083   emit_insn (gen_isync ());
18084 }
18085
18086 void
18087 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
18088 {
18089   enum machine_mode mode = GET_MODE (mem);
18090   rtx addrSI, align, wdst, shift, mask;
18091   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
18092   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
18093
18094   /* Shift amount for subword relative to aligned word.  */
18095   addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
18096   addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
18097   shift = gen_reg_rtx (SImode);
18098   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
18099                          GEN_INT (shift_mask)));
18100   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
18101
18102   /* Shift and mask old value into position within word.  */
18103   oldval = convert_modes (SImode, mode, oldval, 1);
18104   oldval = expand_binop (SImode, and_optab,
18105                          oldval, GEN_INT (imask), NULL_RTX,
18106                          1, OPTAB_LIB_WIDEN);
18107   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
18108
18109   /* Shift and mask new value into position within word.  */
18110   newval = convert_modes (SImode, mode, newval, 1);
18111   newval = expand_binop (SImode, and_optab,
18112                          newval, GEN_INT (imask), NULL_RTX,
18113                          1, OPTAB_LIB_WIDEN);
18114   emit_insn (gen_ashlsi3 (newval, newval, shift));
18115
18116   /* Mask for insertion.  */
18117   mask = gen_reg_rtx (SImode);
18118   emit_move_insn (mask, GEN_INT (imask));
18119   emit_insn (gen_ashlsi3 (mask, mask, shift));
18120
18121   /* Address of aligned word containing subword.  */
18122   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
18123                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
18124   mem = change_address (mem, SImode, align);
18125   set_mem_align (mem, 32);
18126   MEM_VOLATILE_P (mem) = 1;
18127
18128   wdst = gen_reg_rtx (SImode);
18129   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
18130                                                     oldval, newval, mem));
18131
18132   /* Shift the result back.  */
18133   emit_insn (gen_lshrsi3 (wdst, wdst, shift));
18134
18135   emit_move_insn (dst, gen_lowpart (mode, wdst));
18136 }
18137
18138 void
18139 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
18140                                   rtx oldval, rtx newval, rtx mem,
18141                                   rtx scratch)
18142 {
18143   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18144
18145   emit_insn (gen_lwsync ());
18146   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18147   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18148   emit_label (XEXP (label1, 0));
18149
18150   emit_load_locked (SImode, scratch, mem);
18151
18152   /* Mask subword within loaded value for comparison with oldval.
18153      Use UNSPEC_AND to avoid clobber.*/
18154   emit_insn (gen_rtx_SET (SImode, dest,
18155                           gen_rtx_UNSPEC (SImode,
18156                                           gen_rtvec (2, scratch, mask),
18157                                           UNSPEC_AND)));
18158
18159   x = gen_rtx_COMPARE (CCmode, dest, oldval);
18160   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
18161
18162   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18163   emit_unlikely_jump (x, label2);
18164
18165   /* Clear subword within loaded value for insertion of new value.  */
18166   emit_insn (gen_rtx_SET (SImode, scratch,
18167                           gen_rtx_AND (SImode,
18168                                        gen_rtx_NOT (SImode, mask), scratch)));
18169   emit_insn (gen_iorsi3 (scratch, scratch, newval));
18170   emit_store_conditional (SImode, cond, mem, scratch);
18171
18172   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18173   emit_unlikely_jump (x, label1);
18174
18175   emit_insn (gen_isync ());
18176   emit_label (XEXP (label2, 0));
18177 }
18178
18179
18180   /* Emit instructions to move SRC to DST.  Called by splitters for
18181    multi-register moves.  It will emit at most one instruction for
18182    each register that is accessed; that is, it won't emit li/lis pairs
18183    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
18184    register.  */
18185
18186 void
18187 rs6000_split_multireg_move (rtx dst, rtx src)
18188 {
18189   /* The register number of the first register being moved.  */
18190   int reg;
18191   /* The mode that is to be moved.  */
18192   enum machine_mode mode;
18193   /* The mode that the move is being done in, and its size.  */
18194   enum machine_mode reg_mode;
18195   int reg_mode_size;
18196   /* The number of registers that will be moved.  */
18197   int nregs;
18198
18199   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
18200   mode = GET_MODE (dst);
18201   nregs = hard_regno_nregs[reg][mode];
18202   if (FP_REGNO_P (reg))
18203     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : 
18204         ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
18205   else if (ALTIVEC_REGNO_P (reg))
18206     reg_mode = V16QImode;
18207   else if (TARGET_E500_DOUBLE && mode == TFmode)
18208     reg_mode = DFmode;
18209   else
18210     reg_mode = word_mode;
18211   reg_mode_size = GET_MODE_SIZE (reg_mode);
18212
18213   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
18214
18215   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
18216     {
18217       /* Move register range backwards, if we might have destructive
18218          overlap.  */
18219       int i;
18220       for (i = nregs - 1; i >= 0; i--)
18221         emit_insn (gen_rtx_SET (VOIDmode,
18222                                 simplify_gen_subreg (reg_mode, dst, mode,
18223                                                      i * reg_mode_size),
18224                                 simplify_gen_subreg (reg_mode, src, mode,
18225                                                      i * reg_mode_size)));
18226     }
18227   else
18228     {
18229       int i;
18230       int j = -1;
18231       bool used_update = false;
18232       rtx restore_basereg = NULL_RTX;
18233
18234       if (MEM_P (src) && INT_REGNO_P (reg))
18235         {
18236           rtx breg;
18237
18238           if (GET_CODE (XEXP (src, 0)) == PRE_INC
18239               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
18240             {
18241               rtx delta_rtx;
18242               breg = XEXP (XEXP (src, 0), 0);
18243               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
18244                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
18245                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
18246               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
18247               src = replace_equiv_address (src, breg);
18248             }
18249           else if (! rs6000_offsettable_memref_p (src))
18250             {
18251               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
18252                 {
18253                   rtx basereg = XEXP (XEXP (src, 0), 0);
18254                   if (TARGET_UPDATE)
18255                     {
18256                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
18257                       emit_insn (gen_rtx_SET (VOIDmode, ndst,
18258                                  gen_rtx_MEM (reg_mode, XEXP (src, 0))));
18259                       used_update = true;
18260                     }
18261                   else
18262                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
18263                                XEXP (XEXP (src, 0), 1)));
18264                   src = replace_equiv_address (src, basereg);
18265                 }
18266               else
18267                 {
18268                   rtx basereg = gen_rtx_REG (Pmode, reg);
18269                   emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
18270                   src = replace_equiv_address (src, basereg);
18271                 }
18272             }
18273
18274           breg = XEXP (src, 0);
18275           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
18276             breg = XEXP (breg, 0);
18277
18278           /* If the base register we are using to address memory is
18279              also a destination reg, then change that register last.  */
18280           if (REG_P (breg)
18281               && REGNO (breg) >= REGNO (dst)
18282               && REGNO (breg) < REGNO (dst) + nregs)
18283             j = REGNO (breg) - REGNO (dst);
18284         }
18285       else if (MEM_P (dst) && INT_REGNO_P (reg))
18286         {
18287           rtx breg;
18288
18289           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
18290               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
18291             {
18292               rtx delta_rtx;
18293               breg = XEXP (XEXP (dst, 0), 0);
18294               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
18295                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
18296                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
18297
18298               /* We have to update the breg before doing the store.
18299                  Use store with update, if available.  */
18300
18301               if (TARGET_UPDATE)
18302                 {
18303                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
18304                   emit_insn (TARGET_32BIT
18305                              ? (TARGET_POWERPC64
18306                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
18307                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
18308                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
18309                   used_update = true;
18310                 }
18311               else
18312                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
18313               dst = replace_equiv_address (dst, breg);
18314             }
18315           else if (!rs6000_offsettable_memref_p (dst)
18316                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
18317             {
18318               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
18319                 {
18320                   rtx basereg = XEXP (XEXP (dst, 0), 0);
18321                   if (TARGET_UPDATE)
18322                     {
18323                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
18324                       emit_insn (gen_rtx_SET (VOIDmode,
18325                                  gen_rtx_MEM (reg_mode, XEXP (dst, 0)), nsrc));
18326                       used_update = true;
18327                     }
18328                   else
18329                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
18330                                XEXP (XEXP (dst, 0), 1)));
18331                   dst = replace_equiv_address (dst, basereg);
18332                 }
18333               else
18334                 {
18335                   rtx basereg = XEXP (XEXP (dst, 0), 0);
18336                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
18337                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
18338                               && REG_P (basereg)
18339                               && REG_P (offsetreg)
18340                               && REGNO (basereg) != REGNO (offsetreg));
18341                   if (REGNO (basereg) == 0)
18342                     {
18343                       rtx tmp = offsetreg;
18344                       offsetreg = basereg;
18345                       basereg = tmp;
18346                     }
18347                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
18348                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
18349                   dst = replace_equiv_address (dst, basereg);
18350                 }
18351             }
18352           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
18353             gcc_assert (rs6000_offsettable_memref_p (dst));
18354         }
18355
18356       for (i = 0; i < nregs; i++)
18357         {
18358           /* Calculate index to next subword.  */
18359           ++j;
18360           if (j == nregs)
18361             j = 0;
18362
18363           /* If compiler already emitted move of first word by
18364              store with update, no need to do anything.  */
18365           if (j == 0 && used_update)
18366             continue;
18367
18368           emit_insn (gen_rtx_SET (VOIDmode,
18369                                   simplify_gen_subreg (reg_mode, dst, mode,
18370                                                        j * reg_mode_size),
18371                                   simplify_gen_subreg (reg_mode, src, mode,
18372                                                        j * reg_mode_size)));
18373         }
18374       if (restore_basereg != NULL_RTX)
18375         emit_insn (restore_basereg);
18376     }
18377 }
18378
18379 \f
18380 /* This page contains routines that are used to determine what the
18381    function prologue and epilogue code will do and write them out.  */
18382
18383 /* Return the first fixed-point register that is required to be
18384    saved. 32 if none.  */
18385
18386 int
18387 first_reg_to_save (void)
18388 {
18389   int first_reg;
18390
18391   /* Find lowest numbered live register.  */
18392   for (first_reg = 13; first_reg <= 31; first_reg++)
18393     if (df_regs_ever_live_p (first_reg)
18394         && (! call_used_regs[first_reg]
18395             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
18396                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
18397                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
18398                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
18399       break;
18400
18401 #if TARGET_MACHO
18402   if (flag_pic
18403       && crtl->uses_pic_offset_table
18404       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
18405     return RS6000_PIC_OFFSET_TABLE_REGNUM;
18406 #endif
18407
18408   return first_reg;
18409 }
18410
18411 /* Similar, for FP regs.  */
18412
18413 int
18414 first_fp_reg_to_save (void)
18415 {
18416   int first_reg;
18417
18418   /* Find lowest numbered live register.  */
18419   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
18420     if (df_regs_ever_live_p (first_reg))
18421       break;
18422
18423   return first_reg;
18424 }
18425
18426 /* Similar, for AltiVec regs.  */
18427
18428 static int
18429 first_altivec_reg_to_save (void)
18430 {
18431   int i;
18432
18433   /* Stack frame remains as is unless we are in AltiVec ABI.  */
18434   if (! TARGET_ALTIVEC_ABI)
18435     return LAST_ALTIVEC_REGNO + 1;
18436
18437   /* On Darwin, the unwind routines are compiled without
18438      TARGET_ALTIVEC, and use save_world to save/restore the
18439      altivec registers when necessary.  */
18440   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
18441       && ! TARGET_ALTIVEC)
18442     return FIRST_ALTIVEC_REGNO + 20;
18443
18444   /* Find lowest numbered live register.  */
18445   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
18446     if (df_regs_ever_live_p (i))
18447       break;
18448
18449   return i;
18450 }
18451
18452 /* Return a 32-bit mask of the AltiVec registers we need to set in
18453    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
18454    the 32-bit word is 0.  */
18455
18456 static unsigned int
18457 compute_vrsave_mask (void)
18458 {
18459   unsigned int i, mask = 0;
18460
18461   /* On Darwin, the unwind routines are compiled without
18462      TARGET_ALTIVEC, and use save_world to save/restore the
18463      call-saved altivec registers when necessary.  */
18464   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
18465       && ! TARGET_ALTIVEC)
18466     mask |= 0xFFF;
18467
18468   /* First, find out if we use _any_ altivec registers.  */
18469   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
18470     if (df_regs_ever_live_p (i))
18471       mask |= ALTIVEC_REG_BIT (i);
18472
18473   if (mask == 0)
18474     return mask;
18475
18476   /* Next, remove the argument registers from the set.  These must
18477      be in the VRSAVE mask set by the caller, so we don't need to add
18478      them in again.  More importantly, the mask we compute here is
18479      used to generate CLOBBERs in the set_vrsave insn, and we do not
18480      wish the argument registers to die.  */
18481   for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
18482     mask &= ~ALTIVEC_REG_BIT (i);
18483
18484   /* Similarly, remove the return value from the set.  */
18485   {
18486     bool yes = false;
18487     diddle_return_value (is_altivec_return_reg, &yes);
18488     if (yes)
18489       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
18490   }
18491
18492   return mask;
18493 }
18494
18495 /* For a very restricted set of circumstances, we can cut down the
18496    size of prologues/epilogues by calling our own save/restore-the-world
18497    routines.  */
18498
18499 static void
18500 compute_save_world_info (rs6000_stack_t *info_ptr)
18501 {
18502   info_ptr->world_save_p = 1;
18503   info_ptr->world_save_p
18504     = (WORLD_SAVE_P (info_ptr)
18505        && DEFAULT_ABI == ABI_DARWIN
18506        && ! (cfun->calls_setjmp && flag_exceptions)
18507        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
18508        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
18509        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
18510        && info_ptr->cr_save_p);
18511
18512   /* This will not work in conjunction with sibcalls.  Make sure there
18513      are none.  (This check is expensive, but seldom executed.) */
18514   if (WORLD_SAVE_P (info_ptr))
18515     {
18516       rtx insn;
18517       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
18518         if ( GET_CODE (insn) == CALL_INSN
18519              && SIBLING_CALL_P (insn))
18520           {
18521             info_ptr->world_save_p = 0;
18522             break;
18523           }
18524     }
18525
18526   if (WORLD_SAVE_P (info_ptr))
18527     {
18528       /* Even if we're not touching VRsave, make sure there's room on the
18529          stack for it, if it looks like we're calling SAVE_WORLD, which
18530          will attempt to save it. */
18531       info_ptr->vrsave_size  = 4;
18532
18533       /* If we are going to save the world, we need to save the link register too.  */
18534       info_ptr->lr_save_p = 1;
18535
18536       /* "Save" the VRsave register too if we're saving the world.  */
18537       if (info_ptr->vrsave_mask == 0)
18538         info_ptr->vrsave_mask = compute_vrsave_mask ();
18539
18540       /* Because the Darwin register save/restore routines only handle
18541          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
18542          check.  */
18543       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
18544                   && (info_ptr->first_altivec_reg_save
18545                       >= FIRST_SAVED_ALTIVEC_REGNO));
18546     }
18547   return;
18548 }
18549
18550
18551 static void
18552 is_altivec_return_reg (rtx reg, void *xyes)
18553 {
18554   bool *yes = (bool *) xyes;
18555   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
18556     *yes = true;
18557 }
18558
18559 \f
18560 /* Determine the strategy for savings/restoring registers.  */
18561
18562 enum {
18563   SAVRES_MULTIPLE = 0x1,
18564   SAVE_INLINE_FPRS = 0x2,
18565   SAVE_INLINE_GPRS = 0x4,
18566   REST_INLINE_FPRS = 0x8,
18567   REST_INLINE_GPRS = 0x10,
18568   SAVE_NOINLINE_GPRS_SAVES_LR = 0x20,
18569   SAVE_NOINLINE_FPRS_SAVES_LR = 0x40,
18570   REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x80
18571 };
18572
18573 static int
18574 rs6000_savres_strategy (rs6000_stack_t *info,
18575                         bool using_static_chain_p)
18576 {
18577   int strategy = 0;
18578
18579   if (TARGET_MULTIPLE
18580       && !TARGET_POWERPC64
18581       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
18582       && info->first_gp_reg_save < 31
18583       && no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true))
18584     strategy |= SAVRES_MULTIPLE;
18585
18586   if (crtl->calls_eh_return
18587       || cfun->machine->ra_need_lr
18588       || info->total_size > 32767)
18589     strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
18590                  | SAVE_INLINE_GPRS | REST_INLINE_GPRS);
18591
18592   if (info->first_fp_reg_save == 64
18593       || FP_SAVE_INLINE (info->first_fp_reg_save)
18594       /* The out-of-line FP routines use double-precision stores;
18595          we can't use those routines if we don't have such stores.  */
18596       || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT)
18597       || !no_global_regs_above (info->first_fp_reg_save, /*gpr=*/false))
18598     strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
18599
18600   if (info->first_gp_reg_save == 32
18601       || GP_SAVE_INLINE (info->first_gp_reg_save)
18602       || !((strategy & SAVRES_MULTIPLE)
18603            || no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true)))
18604     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
18605
18606   /* Don't bother to try to save things out-of-line if r11 is occupied
18607      by the static chain.  It would require too much fiddling and the
18608      static chain is rarely used anyway.  */
18609   if (using_static_chain_p)
18610     strategy |= SAVE_INLINE_FPRS | SAVE_INLINE_GPRS;
18611
18612   /* If we are going to use store multiple, then don't even bother
18613      with the out-of-line routines, since the store-multiple
18614      instruction will always be smaller.  */
18615   if ((strategy & SAVRES_MULTIPLE))
18616     strategy |= SAVE_INLINE_GPRS;
18617
18618   /* The situation is more complicated with load multiple.  We'd
18619      prefer to use the out-of-line routines for restores, since the
18620      "exit" out-of-line routines can handle the restore of LR and the
18621      frame teardown.  However if doesn't make sense to use the
18622      out-of-line routine if that is the only reason we'd need to save
18623      LR, and we can't use the "exit" out-of-line gpr restore if we
18624      have saved some fprs; In those cases it is advantageous to use
18625      load multiple when available.  */
18626   if ((strategy & SAVRES_MULTIPLE)
18627       && (!info->lr_save_p
18628           || info->first_fp_reg_save != 64))
18629     strategy |= REST_INLINE_GPRS;
18630
18631   /* We can only use load multiple or the out-of-line routines to
18632      restore if we've used store multiple or out-of-line routines
18633      in the prologue, i.e. if we've saved all the registers from
18634      first_gp_reg_save.  Otherwise, we risk loading garbage.  */
18635   if ((strategy & (SAVE_INLINE_GPRS | SAVRES_MULTIPLE)) == SAVE_INLINE_GPRS)
18636     strategy |= REST_INLINE_GPRS;
18637
18638   /* Saving CR interferes with the exit routines used on the SPE, so
18639      just punt here.  */
18640   if (TARGET_SPE_ABI
18641       && info->spe_64bit_regs_used
18642       && info->cr_save_p)
18643     strategy |= REST_INLINE_GPRS;
18644
18645 #ifdef POWERPC_LINUX
18646   if (TARGET_64BIT)
18647     {
18648       if (!(strategy & SAVE_INLINE_FPRS))
18649         strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
18650       else if (!(strategy & SAVE_INLINE_GPRS)
18651                && info->first_fp_reg_save == 64)
18652         strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
18653     }
18654 #else
18655   if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
18656     strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
18657 #endif
18658   return strategy;
18659 }
18660
18661 /* Calculate the stack information for the current function.  This is
18662    complicated by having two separate calling sequences, the AIX calling
18663    sequence and the V.4 calling sequence.
18664
18665    AIX (and Darwin/Mac OS X) stack frames look like:
18666                                                           32-bit  64-bit
18667         SP----> +---------------------------------------+
18668                 | back chain to caller                  | 0       0
18669                 +---------------------------------------+
18670                 | saved CR                              | 4       8 (8-11)
18671                 +---------------------------------------+
18672                 | saved LR                              | 8       16
18673                 +---------------------------------------+
18674                 | reserved for compilers                | 12      24
18675                 +---------------------------------------+
18676                 | reserved for binders                  | 16      32
18677                 +---------------------------------------+
18678                 | saved TOC pointer                     | 20      40
18679                 +---------------------------------------+
18680                 | Parameter save area (P)               | 24      48
18681                 +---------------------------------------+
18682                 | Alloca space (A)                      | 24+P    etc.
18683                 +---------------------------------------+
18684                 | Local variable space (L)              | 24+P+A
18685                 +---------------------------------------+
18686                 | Float/int conversion temporary (X)    | 24+P+A+L
18687                 +---------------------------------------+
18688                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
18689                 +---------------------------------------+
18690                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
18691                 +---------------------------------------+
18692                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
18693                 +---------------------------------------+
18694                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
18695                 +---------------------------------------+
18696                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
18697                 +---------------------------------------+
18698         old SP->| back chain to caller's caller         |
18699                 +---------------------------------------+
18700
18701    The required alignment for AIX configurations is two words (i.e., 8
18702    or 16 bytes).
18703
18704
18705    V.4 stack frames look like:
18706
18707         SP----> +---------------------------------------+
18708                 | back chain to caller                  | 0
18709                 +---------------------------------------+
18710                 | caller's saved LR                     | 4
18711                 +---------------------------------------+
18712                 | Parameter save area (P)               | 8
18713                 +---------------------------------------+
18714                 | Alloca space (A)                      | 8+P
18715                 +---------------------------------------+
18716                 | Varargs save area (V)                 | 8+P+A
18717                 +---------------------------------------+
18718                 | Local variable space (L)              | 8+P+A+V
18719                 +---------------------------------------+
18720                 | Float/int conversion temporary (X)    | 8+P+A+V+L
18721                 +---------------------------------------+
18722                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
18723                 +---------------------------------------+
18724                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
18725                 +---------------------------------------+
18726                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
18727                 +---------------------------------------+
18728                 | SPE: area for 64-bit GP registers     |
18729                 +---------------------------------------+
18730                 | SPE alignment padding                 |
18731                 +---------------------------------------+
18732                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
18733                 +---------------------------------------+
18734                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
18735                 +---------------------------------------+
18736                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
18737                 +---------------------------------------+
18738         old SP->| back chain to caller's caller         |
18739                 +---------------------------------------+
18740
18741    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
18742    given.  (But note below and in sysv4.h that we require only 8 and
18743    may round up the size of our stack frame anyways.  The historical
18744    reason is early versions of powerpc-linux which didn't properly
18745    align the stack at program startup.  A happy side-effect is that
18746    -mno-eabi libraries can be used with -meabi programs.)
18747
18748    The EABI configuration defaults to the V.4 layout.  However,
18749    the stack alignment requirements may differ.  If -mno-eabi is not
18750    given, the required stack alignment is 8 bytes; if -mno-eabi is
18751    given, the required alignment is 16 bytes.  (But see V.4 comment
18752    above.)  */
18753
18754 #ifndef ABI_STACK_BOUNDARY
18755 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
18756 #endif
18757
18758 static rs6000_stack_t *
18759 rs6000_stack_info (void)
18760 {
18761 #ifdef ENABLE_CHECKING
18762   static rs6000_stack_t info_save;
18763 #endif
18764   rs6000_stack_t *info_ptr = &stack_info;
18765   int reg_size = TARGET_32BIT ? 4 : 8;
18766   int ehrd_size;
18767   int save_align;
18768   int first_gp;
18769   HOST_WIDE_INT non_fixed_size;
18770   bool using_static_chain_p;
18771
18772 #ifdef ENABLE_CHECKING
18773   memcpy (&info_save, &stack_info, sizeof stack_info);
18774 #else
18775   if (reload_completed && info_ptr->reload_completed)
18776     return info_ptr;
18777 #endif
18778
18779   memset (&stack_info, 0, sizeof (stack_info));
18780   info_ptr->reload_completed = reload_completed;
18781
18782   if (TARGET_SPE)
18783     {
18784       /* Cache value so we don't rescan instruction chain over and over.  */
18785       if (cfun->machine->insn_chain_scanned_p == 0)
18786         cfun->machine->insn_chain_scanned_p
18787           = spe_func_has_64bit_regs_p () + 1;
18788       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
18789     }
18790
18791   /* Select which calling sequence.  */
18792   info_ptr->abi = DEFAULT_ABI;
18793
18794   /* Calculate which registers need to be saved & save area size.  */
18795   info_ptr->first_gp_reg_save = first_reg_to_save ();
18796   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
18797      even if it currently looks like we won't.  Reload may need it to
18798      get at a constant; if so, it will have already created a constant
18799      pool entry for it.  */
18800   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
18801        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
18802        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
18803       && crtl->uses_const_pool
18804       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
18805     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
18806   else
18807     first_gp = info_ptr->first_gp_reg_save;
18808
18809   info_ptr->gp_size = reg_size * (32 - first_gp);
18810
18811   /* For the SPE, we have an additional upper 32-bits on each GPR.
18812      Ideally we should save the entire 64-bits only when the upper
18813      half is used in SIMD instructions.  Since we only record
18814      registers live (not the size they are used in), this proves
18815      difficult because we'd have to traverse the instruction chain at
18816      the right time, taking reload into account.  This is a real pain,
18817      so we opt to save the GPRs in 64-bits always if but one register
18818      gets used in 64-bits.  Otherwise, all the registers in the frame
18819      get saved in 32-bits.
18820
18821      So... since when we save all GPRs (except the SP) in 64-bits, the
18822      traditional GP save area will be empty.  */
18823   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18824     info_ptr->gp_size = 0;
18825
18826   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
18827   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
18828
18829   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
18830   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
18831                                  - info_ptr->first_altivec_reg_save);
18832
18833   /* Does this function call anything?  */
18834   info_ptr->calls_p = (! current_function_is_leaf
18835                        || cfun->machine->ra_needs_full_frame);
18836
18837   /* Determine if we need to save the condition code registers.  */
18838   if (df_regs_ever_live_p (CR2_REGNO)
18839       || df_regs_ever_live_p (CR3_REGNO)
18840       || df_regs_ever_live_p (CR4_REGNO))
18841     {
18842       info_ptr->cr_save_p = 1;
18843       if (DEFAULT_ABI == ABI_V4)
18844         info_ptr->cr_size = reg_size;
18845     }
18846
18847   /* If the current function calls __builtin_eh_return, then we need
18848      to allocate stack space for registers that will hold data for
18849      the exception handler.  */
18850   if (crtl->calls_eh_return)
18851     {
18852       unsigned int i;
18853       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
18854         continue;
18855
18856       /* SPE saves EH registers in 64-bits.  */
18857       ehrd_size = i * (TARGET_SPE_ABI
18858                        && info_ptr->spe_64bit_regs_used != 0
18859                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
18860     }
18861   else
18862     ehrd_size = 0;
18863
18864   /* Determine various sizes.  */
18865   info_ptr->reg_size     = reg_size;
18866   info_ptr->fixed_size   = RS6000_SAVE_AREA;
18867   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
18868   info_ptr->parm_size    = RS6000_ALIGN (crtl->outgoing_args_size,
18869                                          TARGET_ALTIVEC ? 16 : 8);
18870   if (FRAME_GROWS_DOWNWARD)
18871     info_ptr->vars_size
18872       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
18873                        + info_ptr->parm_size,
18874                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
18875          - (info_ptr->fixed_size + info_ptr->vars_size
18876             + info_ptr->parm_size);
18877
18878   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18879     info_ptr->spe_gp_size = 8 * (32 - first_gp);
18880   else
18881     info_ptr->spe_gp_size = 0;
18882
18883   if (TARGET_ALTIVEC_ABI)
18884     info_ptr->vrsave_mask = compute_vrsave_mask ();
18885   else
18886     info_ptr->vrsave_mask = 0;
18887
18888   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
18889     info_ptr->vrsave_size  = 4;
18890   else
18891     info_ptr->vrsave_size  = 0;
18892
18893   compute_save_world_info (info_ptr);
18894
18895   /* Calculate the offsets.  */
18896   switch (DEFAULT_ABI)
18897     {
18898     case ABI_NONE:
18899     default:
18900       gcc_unreachable ();
18901
18902     case ABI_AIX:
18903     case ABI_DARWIN:
18904       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18905       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18906
18907       if (TARGET_ALTIVEC_ABI)
18908         {
18909           info_ptr->vrsave_save_offset
18910             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
18911
18912           /* Align stack so vector save area is on a quadword boundary.
18913              The padding goes above the vectors.  */
18914           if (info_ptr->altivec_size != 0)
18915             info_ptr->altivec_padding_size
18916               = info_ptr->vrsave_save_offset & 0xF;
18917           else
18918             info_ptr->altivec_padding_size = 0;
18919
18920           info_ptr->altivec_save_offset
18921             = info_ptr->vrsave_save_offset
18922             - info_ptr->altivec_padding_size
18923             - info_ptr->altivec_size;
18924           gcc_assert (info_ptr->altivec_size == 0
18925                       || info_ptr->altivec_save_offset % 16 == 0);
18926
18927           /* Adjust for AltiVec case.  */
18928           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
18929         }
18930       else
18931         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
18932       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
18933       info_ptr->lr_save_offset   = 2*reg_size;
18934       break;
18935
18936     case ABI_V4:
18937       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18938       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18939       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
18940
18941       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18942         {
18943           /* Align stack so SPE GPR save area is aligned on a
18944              double-word boundary.  */
18945           if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
18946             info_ptr->spe_padding_size
18947               = 8 - (-info_ptr->cr_save_offset % 8);
18948           else
18949             info_ptr->spe_padding_size = 0;
18950
18951           info_ptr->spe_gp_save_offset
18952             = info_ptr->cr_save_offset
18953             - info_ptr->spe_padding_size
18954             - info_ptr->spe_gp_size;
18955
18956           /* Adjust for SPE case.  */
18957           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
18958         }
18959       else if (TARGET_ALTIVEC_ABI)
18960         {
18961           info_ptr->vrsave_save_offset
18962             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
18963
18964           /* Align stack so vector save area is on a quadword boundary.  */
18965           if (info_ptr->altivec_size != 0)
18966             info_ptr->altivec_padding_size
18967               = 16 - (-info_ptr->vrsave_save_offset % 16);
18968           else
18969             info_ptr->altivec_padding_size = 0;
18970
18971           info_ptr->altivec_save_offset
18972             = info_ptr->vrsave_save_offset
18973             - info_ptr->altivec_padding_size
18974             - info_ptr->altivec_size;
18975
18976           /* Adjust for AltiVec case.  */
18977           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
18978         }
18979       else
18980         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
18981       info_ptr->ehrd_offset      -= ehrd_size;
18982       info_ptr->lr_save_offset   = reg_size;
18983       break;
18984     }
18985
18986   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
18987   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
18988                                          + info_ptr->gp_size
18989                                          + info_ptr->altivec_size
18990                                          + info_ptr->altivec_padding_size
18991                                          + info_ptr->spe_gp_size
18992                                          + info_ptr->spe_padding_size
18993                                          + ehrd_size
18994                                          + info_ptr->cr_size
18995                                          + info_ptr->vrsave_size,
18996                                          save_align);
18997
18998   non_fixed_size         = (info_ptr->vars_size
18999                             + info_ptr->parm_size
19000                             + info_ptr->save_size);
19001
19002   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
19003                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
19004
19005   /* Determine if we need to save the link register.  */
19006   if (info_ptr->calls_p
19007       || (DEFAULT_ABI == ABI_AIX
19008           && crtl->profile
19009           && !TARGET_PROFILE_KERNEL)
19010       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
19011 #ifdef TARGET_RELOCATABLE
19012       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
19013 #endif
19014       || rs6000_ra_ever_killed ())
19015     info_ptr->lr_save_p = 1;
19016
19017   using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
19018                           && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
19019                           && call_used_regs[STATIC_CHAIN_REGNUM]);
19020   info_ptr->savres_strategy = rs6000_savres_strategy (info_ptr,
19021                                                       using_static_chain_p);
19022
19023   if (!(info_ptr->savres_strategy & SAVE_INLINE_GPRS)
19024       || !(info_ptr->savres_strategy & SAVE_INLINE_FPRS)
19025       || !(info_ptr->savres_strategy & REST_INLINE_GPRS)
19026       || !(info_ptr->savres_strategy & REST_INLINE_FPRS))
19027     info_ptr->lr_save_p = 1;
19028
19029   if (info_ptr->lr_save_p)
19030     df_set_regs_ever_live (LR_REGNO, true);
19031
19032   /* Determine if we need to allocate any stack frame:
19033
19034      For AIX we need to push the stack if a frame pointer is needed
19035      (because the stack might be dynamically adjusted), if we are
19036      debugging, if we make calls, or if the sum of fp_save, gp_save,
19037      and local variables are more than the space needed to save all
19038      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
19039      + 18*8 = 288 (GPR13 reserved).
19040
19041      For V.4 we don't have the stack cushion that AIX uses, but assume
19042      that the debugger can handle stackless frames.  */
19043
19044   if (info_ptr->calls_p)
19045     info_ptr->push_p = 1;
19046
19047   else if (DEFAULT_ABI == ABI_V4)
19048     info_ptr->push_p = non_fixed_size != 0;
19049
19050   else if (frame_pointer_needed)
19051     info_ptr->push_p = 1;
19052
19053   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
19054     info_ptr->push_p = 1;
19055
19056   else
19057     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
19058
19059   /* Zero offsets if we're not saving those registers.  */
19060   if (info_ptr->fp_size == 0)
19061     info_ptr->fp_save_offset = 0;
19062
19063   if (info_ptr->gp_size == 0)
19064     info_ptr->gp_save_offset = 0;
19065
19066   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
19067     info_ptr->altivec_save_offset = 0;
19068
19069   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
19070     info_ptr->vrsave_save_offset = 0;
19071
19072   if (! TARGET_SPE_ABI
19073       || info_ptr->spe_64bit_regs_used == 0
19074       || info_ptr->spe_gp_size == 0)
19075     info_ptr->spe_gp_save_offset = 0;
19076
19077   if (! info_ptr->lr_save_p)
19078     info_ptr->lr_save_offset = 0;
19079
19080   if (! info_ptr->cr_save_p)
19081     info_ptr->cr_save_offset = 0;
19082
19083 #ifdef ENABLE_CHECKING
19084   gcc_assert (!(reload_completed && info_save.reload_completed)
19085               || memcmp (&info_save, &stack_info, sizeof stack_info) == 0);
19086 #endif
19087   return info_ptr;
19088 }
19089
19090 /* Return true if the current function uses any GPRs in 64-bit SIMD
19091    mode.  */
19092
19093 static bool
19094 spe_func_has_64bit_regs_p (void)
19095 {
19096   rtx insns, insn;
19097
19098   /* Functions that save and restore all the call-saved registers will
19099      need to save/restore the registers in 64-bits.  */
19100   if (crtl->calls_eh_return
19101       || cfun->calls_setjmp
19102       || crtl->has_nonlocal_goto)
19103     return true;
19104
19105   insns = get_insns ();
19106
19107   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
19108     {
19109       if (INSN_P (insn))
19110         {
19111           rtx i;
19112
19113           /* FIXME: This should be implemented with attributes...
19114
19115                  (set_attr "spe64" "true")....then,
19116                  if (get_spe64(insn)) return true;
19117
19118              It's the only reliable way to do the stuff below.  */
19119
19120           i = PATTERN (insn);
19121           if (GET_CODE (i) == SET)
19122             {
19123               enum machine_mode mode = GET_MODE (SET_SRC (i));
19124
19125               if (SPE_VECTOR_MODE (mode))
19126                 return true;
19127               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
19128                 return true;
19129             }
19130         }
19131     }
19132
19133   return false;
19134 }
19135
19136 static void
19137 debug_stack_info (rs6000_stack_t *info)
19138 {
19139   const char *abi_string;
19140
19141   if (! info)
19142     info = rs6000_stack_info ();
19143
19144   fprintf (stderr, "\nStack information for function %s:\n",
19145            ((current_function_decl && DECL_NAME (current_function_decl))
19146             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
19147             : "<unknown>"));
19148
19149   switch (info->abi)
19150     {
19151     default:             abi_string = "Unknown";        break;
19152     case ABI_NONE:       abi_string = "NONE";           break;
19153     case ABI_AIX:        abi_string = "AIX";            break;
19154     case ABI_DARWIN:     abi_string = "Darwin";         break;
19155     case ABI_V4:         abi_string = "V.4";            break;
19156     }
19157
19158   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
19159
19160   if (TARGET_ALTIVEC_ABI)
19161     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
19162
19163   if (TARGET_SPE_ABI)
19164     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
19165
19166   if (info->first_gp_reg_save != 32)
19167     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
19168
19169   if (info->first_fp_reg_save != 64)
19170     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
19171
19172   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
19173     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
19174              info->first_altivec_reg_save);
19175
19176   if (info->lr_save_p)
19177     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
19178
19179   if (info->cr_save_p)
19180     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
19181
19182   if (info->vrsave_mask)
19183     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
19184
19185   if (info->push_p)
19186     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
19187
19188   if (info->calls_p)
19189     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
19190
19191   if (info->gp_save_offset)
19192     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
19193
19194   if (info->fp_save_offset)
19195     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
19196
19197   if (info->altivec_save_offset)
19198     fprintf (stderr, "\taltivec_save_offset = %5d\n",
19199              info->altivec_save_offset);
19200
19201   if (info->spe_gp_save_offset)
19202     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
19203              info->spe_gp_save_offset);
19204
19205   if (info->vrsave_save_offset)
19206     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
19207              info->vrsave_save_offset);
19208
19209   if (info->lr_save_offset)
19210     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
19211
19212   if (info->cr_save_offset)
19213     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
19214
19215   if (info->varargs_save_offset)
19216     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
19217
19218   if (info->total_size)
19219     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
19220              info->total_size);
19221
19222   if (info->vars_size)
19223     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
19224              info->vars_size);
19225
19226   if (info->parm_size)
19227     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
19228
19229   if (info->fixed_size)
19230     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
19231
19232   if (info->gp_size)
19233     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
19234
19235   if (info->spe_gp_size)
19236     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
19237
19238   if (info->fp_size)
19239     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
19240
19241   if (info->altivec_size)
19242     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
19243
19244   if (info->vrsave_size)
19245     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
19246
19247   if (info->altivec_padding_size)
19248     fprintf (stderr, "\taltivec_padding_size= %5d\n",
19249              info->altivec_padding_size);
19250
19251   if (info->spe_padding_size)
19252     fprintf (stderr, "\tspe_padding_size    = %5d\n",
19253              info->spe_padding_size);
19254
19255   if (info->cr_size)
19256     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
19257
19258   if (info->save_size)
19259     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
19260
19261   if (info->reg_size != 4)
19262     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
19263
19264   fprintf (stderr, "\n");
19265 }
19266
19267 rtx
19268 rs6000_return_addr (int count, rtx frame)
19269 {
19270   /* Currently we don't optimize very well between prolog and body
19271      code and for PIC code the code can be actually quite bad, so
19272      don't try to be too clever here.  */
19273   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
19274     {
19275       cfun->machine->ra_needs_full_frame = 1;
19276
19277       return
19278         gen_rtx_MEM
19279           (Pmode,
19280            memory_address
19281            (Pmode,
19282             plus_constant (copy_to_reg
19283                            (gen_rtx_MEM (Pmode,
19284                                          memory_address (Pmode, frame))),
19285                            RETURN_ADDRESS_OFFSET)));
19286     }
19287
19288   cfun->machine->ra_need_lr = 1;
19289   return get_hard_reg_initial_val (Pmode, LR_REGNO);
19290 }
19291
19292 /* Say whether a function is a candidate for sibcall handling or not.
19293    We do not allow indirect calls to be optimized into sibling calls.
19294    Also, we can't do it if there are any vector parameters; there's
19295    nowhere to put the VRsave code so it works; note that functions with
19296    vector parameters are required to have a prototype, so the argument
19297    type info must be available here.  (The tail recursion case can work
19298    with vector parameters, but there's no way to distinguish here.) */
19299 static bool
19300 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
19301 {
19302   tree type;
19303   if (decl)
19304     {
19305       if (TARGET_ALTIVEC_VRSAVE)
19306         {
19307           for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
19308                type; type = TREE_CHAIN (type))
19309             {
19310               if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
19311                 return false;
19312             }
19313         }
19314       if (DEFAULT_ABI == ABI_DARWIN
19315           || ((*targetm.binds_local_p) (decl)
19316               && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
19317         {
19318           tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
19319
19320           if (!lookup_attribute ("longcall", attr_list)
19321               || lookup_attribute ("shortcall", attr_list))
19322             return true;
19323         }
19324     }
19325   return false;
19326 }
19327
19328 /* NULL if INSN insn is valid within a low-overhead loop.
19329    Otherwise return why doloop cannot be applied.
19330    PowerPC uses the COUNT register for branch on table instructions.  */
19331
19332 static const char *
19333 rs6000_invalid_within_doloop (const_rtx insn)
19334 {
19335   if (CALL_P (insn))
19336     return "Function call in the loop.";
19337
19338   if (JUMP_P (insn)
19339       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
19340           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
19341     return "Computed branch in the loop.";
19342
19343   return NULL;
19344 }
19345
19346 static int
19347 rs6000_ra_ever_killed (void)
19348 {
19349   rtx top;
19350   rtx reg;
19351   rtx insn;
19352
19353   if (cfun->is_thunk)
19354     return 0;
19355
19356   if (cfun->machine->lr_save_state)
19357     return cfun->machine->lr_save_state - 1;
19358
19359   /* regs_ever_live has LR marked as used if any sibcalls are present,
19360      but this should not force saving and restoring in the
19361      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
19362      clobbers LR, so that is inappropriate.  */
19363
19364   /* Also, the prologue can generate a store into LR that
19365      doesn't really count, like this:
19366
19367         move LR->R0
19368         bcl to set PIC register
19369         move LR->R31
19370         move R0->LR
19371
19372      When we're called from the epilogue, we need to avoid counting
19373      this as a store.  */
19374
19375   push_topmost_sequence ();
19376   top = get_insns ();
19377   pop_topmost_sequence ();
19378   reg = gen_rtx_REG (Pmode, LR_REGNO);
19379
19380   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
19381     {
19382       if (INSN_P (insn))
19383         {
19384           if (CALL_P (insn))
19385             {
19386               if (!SIBLING_CALL_P (insn))
19387                 return 1;
19388             }
19389           else if (find_regno_note (insn, REG_INC, LR_REGNO))
19390             return 1;
19391           else if (set_of (reg, insn) != NULL_RTX
19392                    && !prologue_epilogue_contains (insn))
19393             return 1;
19394         }
19395     }
19396   return 0;
19397 }
19398 \f
19399 /* Emit instructions needed to load the TOC register.
19400    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
19401    a constant pool; or for SVR4 -fpic.  */
19402
19403 void
19404 rs6000_emit_load_toc_table (int fromprolog)
19405 {
19406   rtx dest;
19407   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
19408
19409   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
19410     {
19411       char buf[30];
19412       rtx lab, tmp1, tmp2, got;
19413
19414       lab = gen_label_rtx ();
19415       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
19416       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19417       if (flag_pic == 2)
19418         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
19419       else
19420         got = rs6000_got_sym ();
19421       tmp1 = tmp2 = dest;
19422       if (!fromprolog)
19423         {
19424           tmp1 = gen_reg_rtx (Pmode);
19425           tmp2 = gen_reg_rtx (Pmode);
19426         }
19427       emit_insn (gen_load_toc_v4_PIC_1 (lab));
19428       emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
19429       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
19430       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
19431     }
19432   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
19433     {
19434       emit_insn (gen_load_toc_v4_pic_si ());
19435       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
19436     }
19437   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
19438     {
19439       char buf[30];
19440       rtx temp0 = (fromprolog
19441                    ? gen_rtx_REG (Pmode, 0)
19442                    : gen_reg_rtx (Pmode));
19443
19444       if (fromprolog)
19445         {
19446           rtx symF, symL;
19447
19448           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
19449           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19450
19451           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
19452           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19453
19454           emit_insn (gen_load_toc_v4_PIC_1 (symF));
19455           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
19456           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
19457         }
19458       else
19459         {
19460           rtx tocsym, lab;
19461
19462           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
19463           lab = gen_label_rtx ();
19464           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
19465           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
19466           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
19467         }
19468       emit_insn (gen_addsi3 (dest, temp0, dest));
19469     }
19470   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
19471     {
19472       /* This is for AIX code running in non-PIC ELF32.  */
19473       char buf[30];
19474       rtx realsym;
19475       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
19476       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19477
19478       emit_insn (gen_elf_high (dest, realsym));
19479       emit_insn (gen_elf_low (dest, dest, realsym));
19480     }
19481   else
19482     {
19483       gcc_assert (DEFAULT_ABI == ABI_AIX);
19484
19485       if (TARGET_32BIT)
19486         emit_insn (gen_load_toc_aix_si (dest));
19487       else
19488         emit_insn (gen_load_toc_aix_di (dest));
19489     }
19490 }
19491
19492 /* Emit instructions to restore the link register after determining where
19493    its value has been stored.  */
19494
19495 void
19496 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
19497 {
19498   rs6000_stack_t *info = rs6000_stack_info ();
19499   rtx operands[2];
19500
19501   operands[0] = source;
19502   operands[1] = scratch;
19503
19504   if (info->lr_save_p)
19505     {
19506       rtx frame_rtx = stack_pointer_rtx;
19507       HOST_WIDE_INT sp_offset = 0;
19508       rtx tmp;
19509
19510       if (frame_pointer_needed
19511           || cfun->calls_alloca
19512           || info->total_size > 32767)
19513         {
19514           tmp = gen_frame_mem (Pmode, frame_rtx);
19515           emit_move_insn (operands[1], tmp);
19516           frame_rtx = operands[1];
19517         }
19518       else if (info->push_p)
19519         sp_offset = info->total_size;
19520
19521       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
19522       tmp = gen_frame_mem (Pmode, tmp);
19523       emit_move_insn (tmp, operands[0]);
19524     }
19525   else
19526     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
19527
19528   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
19529      state of lr_save_p so any change from here on would be a bug.  In
19530      particular, stop rs6000_ra_ever_killed from considering the SET
19531      of lr we may have added just above.  */ 
19532   cfun->machine->lr_save_state = info->lr_save_p + 1;
19533 }
19534
19535 static GTY(()) alias_set_type set = -1;
19536
19537 alias_set_type
19538 get_TOC_alias_set (void)
19539 {
19540   if (set == -1)
19541     set = new_alias_set ();
19542   return set;
19543 }
19544
19545 /* This returns nonzero if the current function uses the TOC.  This is
19546    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
19547    is generated by the ABI_V4 load_toc_* patterns.  */
19548 #if TARGET_ELF
19549 static int
19550 uses_TOC (void)
19551 {
19552   rtx insn;
19553
19554   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
19555     if (INSN_P (insn))
19556       {
19557         rtx pat = PATTERN (insn);
19558         int i;
19559
19560         if (GET_CODE (pat) == PARALLEL)
19561           for (i = 0; i < XVECLEN (pat, 0); i++)
19562             {
19563               rtx sub = XVECEXP (pat, 0, i);
19564               if (GET_CODE (sub) == USE)
19565                 {
19566                   sub = XEXP (sub, 0);
19567                   if (GET_CODE (sub) == UNSPEC
19568                       && XINT (sub, 1) == UNSPEC_TOC)
19569                     return 1;
19570                 }
19571             }
19572       }
19573   return 0;
19574 }
19575 #endif
19576
19577 rtx
19578 create_TOC_reference (rtx symbol, rtx largetoc_reg)
19579 {
19580   rtx tocrel, tocreg;
19581
19582   if (TARGET_DEBUG_ADDR)
19583     {
19584       if (GET_CODE (symbol) == SYMBOL_REF)
19585         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
19586                  XSTR (symbol, 0));
19587       else
19588         {
19589           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
19590                    GET_RTX_NAME (GET_CODE (symbol)));
19591           debug_rtx (symbol);
19592         }
19593     }
19594
19595   if (!can_create_pseudo_p ())
19596     df_set_regs_ever_live (TOC_REGISTER, true);
19597
19598   tocrel = gen_rtx_CONST (Pmode,
19599                           gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol),
19600                                           UNSPEC_TOCREL));
19601   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
19602   if (TARGET_CMODEL != CMODEL_SMALL)
19603     {
19604       rtx hi = gen_rtx_PLUS (Pmode, tocreg, gen_rtx_HIGH (Pmode, tocrel));
19605       if (largetoc_reg != NULL)
19606         {
19607           emit_move_insn (largetoc_reg, hi);
19608           hi = largetoc_reg;
19609         }
19610       return gen_rtx_LO_SUM (Pmode, hi, copy_rtx (tocrel));
19611     }
19612   else
19613     return gen_rtx_PLUS (Pmode, tocreg, tocrel);
19614 }
19615
19616 /* Issue assembly directives that create a reference to the given DWARF
19617    FRAME_TABLE_LABEL from the current function section.  */
19618 void
19619 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
19620 {
19621   fprintf (asm_out_file, "\t.ref %s\n",
19622            TARGET_STRIP_NAME_ENCODING (frame_table_label));
19623 }
19624 \f
19625 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
19626    and the change to the stack pointer.  */
19627
19628 static void
19629 rs6000_emit_stack_tie (void)
19630 {
19631   rtx mem = gen_frame_mem (BLKmode,
19632                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
19633
19634   emit_insn (gen_stack_tie (mem));
19635 }
19636
19637 /* Emit the correct code for allocating stack space, as insns.
19638    If COPY_REG, make sure a copy of the old frame is left there.
19639    The generated code may use hard register 0 as a temporary.  */
19640
19641 static void
19642 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg)
19643 {
19644   rtx insn;
19645   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19646   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
19647   rtx todec = gen_int_mode (-size, Pmode);
19648   rtx par, set, mem;
19649
19650   if (INTVAL (todec) != -size)
19651     {
19652       warning (0, "stack frame too large");
19653       emit_insn (gen_trap ());
19654       return;
19655     }
19656
19657   if (crtl->limit_stack)
19658     {
19659       if (REG_P (stack_limit_rtx)
19660           && REGNO (stack_limit_rtx) > 1
19661           && REGNO (stack_limit_rtx) <= 31)
19662         {
19663           emit_insn (gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size)));
19664           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19665                                     const0_rtx));
19666         }
19667       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
19668                && TARGET_32BIT
19669                && DEFAULT_ABI == ABI_V4)
19670         {
19671           rtx toload = gen_rtx_CONST (VOIDmode,
19672                                       gen_rtx_PLUS (Pmode,
19673                                                     stack_limit_rtx,
19674                                                     GEN_INT (size)));
19675
19676           emit_insn (gen_elf_high (tmp_reg, toload));
19677           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
19678           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19679                                     const0_rtx));
19680         }
19681       else
19682         warning (0, "stack limit expression is not supported");
19683     }
19684
19685   if (copy_reg)
19686     emit_move_insn (copy_reg, stack_reg);
19687
19688   if (size > 32767)
19689     {
19690       /* Need a note here so that try_split doesn't get confused.  */
19691       if (get_last_insn () == NULL_RTX)
19692         emit_note (NOTE_INSN_DELETED);
19693       insn = emit_move_insn (tmp_reg, todec);
19694       try_split (PATTERN (insn), insn, 0);
19695       todec = tmp_reg;
19696     }
19697   
19698   insn = emit_insn (TARGET_32BIT
19699                     ? gen_movsi_update_stack (stack_reg, stack_reg,
19700                                         todec, stack_reg)
19701                     : gen_movdi_di_update_stack (stack_reg, stack_reg,
19702                                            todec, stack_reg));
19703   /* Since we didn't use gen_frame_mem to generate the MEM, grab
19704      it now and set the alias set/attributes. The above gen_*_update
19705      calls will generate a PARALLEL with the MEM set being the first
19706      operation. */
19707   par = PATTERN (insn);
19708   gcc_assert (GET_CODE (par) == PARALLEL);
19709   set = XVECEXP (par, 0, 0);
19710   gcc_assert (GET_CODE (set) == SET);
19711   mem = SET_DEST (set);
19712   gcc_assert (MEM_P (mem));
19713   MEM_NOTRAP_P (mem) = 1;
19714   set_mem_alias_set (mem, get_frame_alias_set ());
19715
19716   RTX_FRAME_RELATED_P (insn) = 1;
19717   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
19718                 gen_rtx_SET (VOIDmode, stack_reg,
19719                              gen_rtx_PLUS (Pmode, stack_reg,
19720                                            GEN_INT (-size))));
19721 }
19722
19723 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
19724
19725 #if PROBE_INTERVAL > 32768
19726 #error Cannot use indexed addressing mode for stack probing
19727 #endif
19728
19729 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
19730    inclusive.  These are offsets from the current stack pointer.  */
19731
19732 static void
19733 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
19734 {
19735   /* See if we have a constant small number of probes to generate.  If so,
19736      that's the easy case.  */
19737   if (first + size <= 32768)
19738     {
19739       HOST_WIDE_INT i;
19740
19741       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
19742          it exceeds SIZE.  If only one probe is needed, this will not
19743          generate any code.  Then probe at FIRST + SIZE.  */
19744       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
19745         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
19746
19747       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
19748     }
19749
19750   /* Otherwise, do the same as above, but in a loop.  Note that we must be
19751      extra careful with variables wrapping around because we might be at
19752      the very top (or the very bottom) of the address space and we have
19753      to be able to handle this case properly; in particular, we use an
19754      equality test for the loop condition.  */
19755   else
19756     {
19757       HOST_WIDE_INT rounded_size;
19758       rtx r12 = gen_rtx_REG (Pmode, 12);
19759       rtx r0 = gen_rtx_REG (Pmode, 0);
19760
19761       /* Sanity check for the addressing mode we're going to use.  */
19762       gcc_assert (first <= 32768);
19763
19764       /* Step 1: round SIZE to the previous multiple of the interval.  */
19765
19766       rounded_size = size & -PROBE_INTERVAL;
19767
19768
19769       /* Step 2: compute initial and final value of the loop counter.  */
19770
19771       /* TEST_ADDR = SP + FIRST.  */
19772       emit_insn (gen_rtx_SET (VOIDmode, r12,
19773                               plus_constant (stack_pointer_rtx, -first)));
19774
19775       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
19776       if (rounded_size > 32768)
19777         {
19778           emit_move_insn (r0, GEN_INT (-rounded_size));
19779           emit_insn (gen_rtx_SET (VOIDmode, r0,
19780                                   gen_rtx_PLUS (Pmode, r12, r0)));
19781         }
19782       else
19783         emit_insn (gen_rtx_SET (VOIDmode, r0,
19784                                 plus_constant (r12, -rounded_size)));
19785
19786
19787       /* Step 3: the loop
19788
19789          while (TEST_ADDR != LAST_ADDR)
19790            {
19791              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
19792              probe at TEST_ADDR
19793            }
19794
19795          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
19796          until it is equal to ROUNDED_SIZE.  */
19797
19798       if (TARGET_64BIT)
19799         emit_insn (gen_probe_stack_rangedi (r12, r12, r0));
19800       else
19801         emit_insn (gen_probe_stack_rangesi (r12, r12, r0));
19802
19803
19804       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
19805          that SIZE is equal to ROUNDED_SIZE.  */
19806
19807       if (size != rounded_size)
19808         emit_stack_probe (plus_constant (r12, rounded_size - size));
19809     }
19810 }
19811
19812 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
19813    absolute addresses.  */
19814
19815 const char *
19816 output_probe_stack_range (rtx reg1, rtx reg2)
19817 {
19818   static int labelno = 0;
19819   char loop_lab[32], end_lab[32];
19820   rtx xops[2];
19821
19822   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
19823   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
19824
19825   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
19826
19827   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
19828   xops[0] = reg1;
19829   xops[1] = reg2;
19830   if (TARGET_64BIT)
19831     output_asm_insn ("{cmp|cmpd} 0,%0,%1", xops);
19832   else
19833     output_asm_insn ("{cmp|cmpw} 0,%0,%1", xops);
19834
19835   fputs ("\tbeq 0,", asm_out_file);
19836   assemble_name_raw (asm_out_file, end_lab);
19837   fputc ('\n', asm_out_file);
19838
19839   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
19840   xops[1] = GEN_INT (-PROBE_INTERVAL);
19841   output_asm_insn ("{cal %0,%1(%0)|addi %0,%0,%1}", xops);
19842
19843   /* Probe at TEST_ADDR and branch.  */
19844   output_asm_insn ("{st|stw} 0,0(%0)", xops);
19845   fprintf (asm_out_file, "\tb ");
19846   assemble_name_raw (asm_out_file, loop_lab);
19847   fputc ('\n', asm_out_file);
19848
19849   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
19850
19851   return "";
19852 }
19853
19854 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
19855    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
19856    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
19857    deduce these equivalences by itself so it wasn't necessary to hold
19858    its hand so much.  */
19859
19860 static void
19861 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
19862                       rtx reg2, rtx rreg)
19863 {
19864   rtx real, temp;
19865
19866   /* copy_rtx will not make unique copies of registers, so we need to
19867      ensure we don't have unwanted sharing here.  */
19868   if (reg == reg2)
19869     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19870
19871   if (reg == rreg)
19872     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19873
19874   real = copy_rtx (PATTERN (insn));
19875
19876   if (reg2 != NULL_RTX)
19877     real = replace_rtx (real, reg2, rreg);
19878
19879   real = replace_rtx (real, reg,
19880                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
19881                                                         STACK_POINTER_REGNUM),
19882                                     GEN_INT (val)));
19883
19884   /* We expect that 'real' is either a SET or a PARALLEL containing
19885      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
19886      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
19887
19888   if (GET_CODE (real) == SET)
19889     {
19890       rtx set = real;
19891
19892       temp = simplify_rtx (SET_SRC (set));
19893       if (temp)
19894         SET_SRC (set) = temp;
19895       temp = simplify_rtx (SET_DEST (set));
19896       if (temp)
19897         SET_DEST (set) = temp;
19898       if (GET_CODE (SET_DEST (set)) == MEM)
19899         {
19900           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19901           if (temp)
19902             XEXP (SET_DEST (set), 0) = temp;
19903         }
19904     }
19905   else
19906     {
19907       int i;
19908
19909       gcc_assert (GET_CODE (real) == PARALLEL);
19910       for (i = 0; i < XVECLEN (real, 0); i++)
19911         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
19912           {
19913             rtx set = XVECEXP (real, 0, i);
19914
19915             temp = simplify_rtx (SET_SRC (set));
19916             if (temp)
19917               SET_SRC (set) = temp;
19918             temp = simplify_rtx (SET_DEST (set));
19919             if (temp)
19920               SET_DEST (set) = temp;
19921             if (GET_CODE (SET_DEST (set)) == MEM)
19922               {
19923                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19924                 if (temp)
19925                   XEXP (SET_DEST (set), 0) = temp;
19926               }
19927             RTX_FRAME_RELATED_P (set) = 1;
19928           }
19929     }
19930
19931   RTX_FRAME_RELATED_P (insn) = 1;
19932   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
19933 }
19934
19935 /* Returns an insn that has a vrsave set operation with the
19936    appropriate CLOBBERs.  */
19937
19938 static rtx
19939 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
19940 {
19941   int nclobs, i;
19942   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
19943   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
19944
19945   clobs[0]
19946     = gen_rtx_SET (VOIDmode,
19947                    vrsave,
19948                    gen_rtx_UNSPEC_VOLATILE (SImode,
19949                                             gen_rtvec (2, reg, vrsave),
19950                                             UNSPECV_SET_VRSAVE));
19951
19952   nclobs = 1;
19953
19954   /* We need to clobber the registers in the mask so the scheduler
19955      does not move sets to VRSAVE before sets of AltiVec registers.
19956
19957      However, if the function receives nonlocal gotos, reload will set
19958      all call saved registers live.  We will end up with:
19959
19960         (set (reg 999) (mem))
19961         (parallel [ (set (reg vrsave) (unspec blah))
19962                     (clobber (reg 999))])
19963
19964      The clobber will cause the store into reg 999 to be dead, and
19965      flow will attempt to delete an epilogue insn.  In this case, we
19966      need an unspec use/set of the register.  */
19967
19968   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
19969     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
19970       {
19971         if (!epiloguep || call_used_regs [i])
19972           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
19973                                              gen_rtx_REG (V4SImode, i));
19974         else
19975           {
19976             rtx reg = gen_rtx_REG (V4SImode, i);
19977
19978             clobs[nclobs++]
19979               = gen_rtx_SET (VOIDmode,
19980                              reg,
19981                              gen_rtx_UNSPEC (V4SImode,
19982                                              gen_rtvec (1, reg), 27));
19983           }
19984       }
19985
19986   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
19987
19988   for (i = 0; i < nclobs; ++i)
19989     XVECEXP (insn, 0, i) = clobs[i];
19990
19991   return insn;
19992 }
19993
19994 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
19995    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
19996
19997 static void
19998 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
19999                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
20000 {
20001   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
20002   rtx replacea, replaceb;
20003
20004   int_rtx = GEN_INT (offset);
20005
20006   /* Some cases that need register indexed addressing.  */
20007   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
20008       || (TARGET_VSX && VSX_VECTOR_MODE (mode))
20009       || (TARGET_E500_DOUBLE && mode == DFmode)
20010       || (TARGET_SPE_ABI
20011           && SPE_VECTOR_MODE (mode)
20012           && !SPE_CONST_OFFSET_OK (offset)))
20013     {
20014       /* Whomever calls us must make sure r11 is available in the
20015          flow path of instructions in the prologue.  */
20016       offset_rtx = gen_rtx_REG (Pmode, 11);
20017       emit_move_insn (offset_rtx, int_rtx);
20018
20019       replacea = offset_rtx;
20020       replaceb = int_rtx;
20021     }
20022   else
20023     {
20024       offset_rtx = int_rtx;
20025       replacea = NULL_RTX;
20026       replaceb = NULL_RTX;
20027     }
20028
20029   reg = gen_rtx_REG (mode, regno);
20030   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
20031   mem = gen_frame_mem (mode, addr);
20032
20033   insn = emit_move_insn (mem, reg);
20034
20035   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
20036 }
20037
20038 /* Emit an offset memory reference suitable for a frame store, while
20039    converting to a valid addressing mode.  */
20040
20041 static rtx
20042 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
20043 {
20044   rtx int_rtx, offset_rtx;
20045
20046   int_rtx = GEN_INT (offset);
20047
20048   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
20049       || (TARGET_E500_DOUBLE && mode == DFmode))
20050     {
20051       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
20052       emit_move_insn (offset_rtx, int_rtx);
20053     }
20054   else
20055     offset_rtx = int_rtx;
20056
20057   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
20058 }
20059
20060 /* Look for user-defined global regs.  We should not save and restore these,
20061    and cannot use stmw/lmw if there are any in its range.  */
20062
20063 static bool
20064 no_global_regs_above (int first, bool gpr)
20065 {
20066   int i;
20067   int last = gpr ? 32 : 64;
20068   for (i = first; i < last; i++)
20069     if (global_regs[i])
20070       return false;
20071   return true;
20072 }
20073
20074 #ifndef TARGET_FIX_AND_CONTINUE
20075 #define TARGET_FIX_AND_CONTINUE 0
20076 #endif
20077
20078 /* It's really GPR 13 and FPR 14, but we need the smaller of the two.  */
20079 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
20080 #define LAST_SAVRES_REGISTER 31
20081 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
20082
20083 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
20084
20085 /* Temporary holding space for an out-of-line register save/restore
20086    routine name.  */
20087 static char savres_routine_name[30];
20088
20089 /* Return the name for an out-of-line register save/restore routine.
20090    We are saving/restoring GPRs if GPR is true.  */
20091
20092 static char *
20093 rs6000_savres_routine_name (rs6000_stack_t *info, int regno,
20094                             bool savep, bool gpr, bool lr)
20095 {
20096   const char *prefix = "";
20097   const char *suffix = "";
20098
20099   /* Different targets are supposed to define
20100      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
20101      routine name could be defined with:
20102
20103      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
20104
20105      This is a nice idea in practice, but in reality, things are
20106      complicated in several ways:
20107
20108      - ELF targets have save/restore routines for GPRs.
20109
20110      - SPE targets use different prefixes for 32/64-bit registers, and
20111        neither of them fit neatly in the FOO_{PREFIX,SUFFIX} regimen.
20112
20113      - PPC64 ELF targets have routines for save/restore of GPRs that
20114        differ in what they do with the link register, so having a set
20115        prefix doesn't work.  (We only use one of the save routines at
20116        the moment, though.)
20117
20118      - PPC32 elf targets have "exit" versions of the restore routines
20119        that restore the link register and can save some extra space.
20120        These require an extra suffix.  (There are also "tail" versions
20121        of the restore routines and "GOT" versions of the save routines,
20122        but we don't generate those at present.  Same problems apply,
20123        though.)
20124
20125      We deal with all this by synthesizing our own prefix/suffix and
20126      using that for the simple sprintf call shown above.  */
20127   if (TARGET_SPE)
20128     {
20129       /* No floating point saves on the SPE.  */
20130       gcc_assert (gpr);
20131
20132       if (savep)
20133         prefix = info->spe_64bit_regs_used ? "_save64gpr_" : "_save32gpr_";
20134       else
20135         prefix = info->spe_64bit_regs_used ? "_rest64gpr_" : "_rest32gpr_";
20136
20137       if (lr)
20138         suffix = "_x";
20139     }
20140   else if (DEFAULT_ABI == ABI_V4)
20141     {
20142       if (TARGET_64BIT)
20143         goto aix_names;
20144
20145       if (gpr)
20146         prefix = savep ? "_savegpr_" : "_restgpr_";
20147       else
20148         prefix = savep ? "_savefpr_" : "_restfpr_";
20149
20150       if (lr)
20151         suffix = "_x";
20152     }
20153   else if (DEFAULT_ABI == ABI_AIX)
20154     {
20155 #ifndef POWERPC_LINUX
20156       /* No out-of-line save/restore routines for GPRs on AIX.  */
20157       gcc_assert (!TARGET_AIX || !gpr);
20158 #endif
20159
20160     aix_names:
20161       if (gpr)
20162         prefix = (savep
20163                   ? (lr ? "_savegpr0_" : "_savegpr1_")
20164                   : (lr ? "_restgpr0_" : "_restgpr1_"));
20165 #ifdef POWERPC_LINUX
20166       else if (lr)
20167         prefix = (savep ? "_savefpr_" : "_restfpr_");
20168 #endif
20169       else
20170         {
20171           prefix = savep ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
20172           suffix = savep ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
20173         }
20174     }
20175   else if (DEFAULT_ABI == ABI_DARWIN)
20176     sorry ("out-of-line save/restore routines not supported on Darwin");
20177
20178   sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
20179
20180   return savres_routine_name;
20181 }
20182
20183 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
20184    We are saving/restoring GPRs if GPR is true.  */
20185
20186 static rtx
20187 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep,
20188                            bool gpr, bool lr)
20189 {
20190   int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
20191   rtx sym;
20192   int select = ((savep ? 1 : 0) << 2
20193                 | ((TARGET_SPE_ABI
20194                     /* On the SPE, we never have any FPRs, but we do have
20195                        32/64-bit versions of the routines.  */
20196                     ? (info->spe_64bit_regs_used ? 1 : 0)
20197                     : (gpr ? 1 : 0)) << 1)
20198                 | (lr ? 1: 0));
20199
20200   /* Don't generate bogus routine names.  */
20201   gcc_assert (FIRST_SAVRES_REGISTER <= regno
20202               && regno <= LAST_SAVRES_REGISTER);
20203
20204   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
20205
20206   if (sym == NULL)
20207     {
20208       char *name;
20209
20210       name = rs6000_savres_routine_name (info, regno, savep, gpr, lr);
20211
20212       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
20213         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
20214       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
20215     }
20216
20217   return sym;
20218 }
20219
20220 /* Emit a sequence of insns, including a stack tie if needed, for
20221    resetting the stack pointer.  If SAVRES is true, then don't reset the
20222    stack pointer, but move the base of the frame into r11 for use by
20223    out-of-line register restore routines.  */
20224
20225 static rtx
20226 rs6000_emit_stack_reset (rs6000_stack_t *info,
20227                          rtx sp_reg_rtx, rtx frame_reg_rtx,
20228                          int sp_offset, bool savres)
20229 {
20230   /* This blockage is needed so that sched doesn't decide to move
20231      the sp change before the register restores.  */
20232   if (frame_reg_rtx != sp_reg_rtx
20233       || (TARGET_SPE_ABI
20234           && info->spe_64bit_regs_used != 0
20235           && info->first_gp_reg_save != 32))
20236     rs6000_emit_stack_tie ();
20237   
20238   if (frame_reg_rtx != sp_reg_rtx)
20239     {
20240       if (sp_offset != 0)
20241         {
20242           rtx dest_reg = savres ? gen_rtx_REG (Pmode, 11) : sp_reg_rtx;
20243           return emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx,
20244                                            GEN_INT (sp_offset)));
20245         }
20246       else if (!savres)
20247         return emit_move_insn (sp_reg_rtx, frame_reg_rtx);
20248     }
20249   else if (sp_offset != 0)
20250     {
20251       /* If we are restoring registers out-of-line, we will be using the
20252          "exit" variants of the restore routines, which will reset the
20253          stack for us.  But we do need to point r11 into the right place
20254          for those routines.  */
20255       rtx dest_reg = (savres
20256                       ? gen_rtx_REG (Pmode, 11)
20257                       : sp_reg_rtx);
20258
20259       rtx insn = emit_insn (gen_add3_insn (dest_reg, sp_reg_rtx,
20260                                            GEN_INT (sp_offset)));
20261       if (!savres)
20262         return insn;
20263     }
20264   return NULL_RTX;
20265 }
20266
20267 /* Construct a parallel rtx describing the effect of a call to an
20268    out-of-line register save/restore routine.  */
20269
20270 static rtx
20271 rs6000_make_savres_rtx (rs6000_stack_t *info,
20272                         rtx frame_reg_rtx, int save_area_offset,
20273                         enum machine_mode reg_mode,
20274                         bool savep, bool gpr, bool lr)
20275 {
20276   int i;
20277   int offset, start_reg, end_reg, n_regs;
20278   int reg_size = GET_MODE_SIZE (reg_mode);
20279   rtx sym;
20280   rtvec p;
20281
20282   offset = 0;
20283   start_reg = (gpr
20284                ? info->first_gp_reg_save
20285                : info->first_fp_reg_save);
20286   end_reg = gpr ? 32 : 64;
20287   n_regs = end_reg - start_reg;
20288   p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
20289
20290   if (!savep && lr)
20291     RTVEC_ELT (p, offset++) = gen_rtx_RETURN (VOIDmode);
20292
20293   RTVEC_ELT (p, offset++)
20294     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
20295
20296   sym = rs6000_savres_routine_sym (info, savep, gpr, lr);
20297   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
20298   RTVEC_ELT (p, offset++)
20299     = gen_rtx_USE (VOIDmode,
20300                    gen_rtx_REG (Pmode, DEFAULT_ABI != ABI_AIX ? 11
20301                                        : gpr && !lr ? 12
20302                                        : 1));
20303
20304   for (i = 0; i < end_reg - start_reg; i++)
20305     {
20306       rtx addr, reg, mem;
20307       reg = gen_rtx_REG (reg_mode, start_reg + i);
20308       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20309                            GEN_INT (save_area_offset + reg_size*i));
20310       mem = gen_frame_mem (reg_mode, addr);
20311
20312       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
20313                                                savep ? mem : reg,
20314                                                savep ? reg : mem);
20315     }
20316
20317   if (savep && lr)
20318     {
20319       rtx addr, reg, mem;
20320       reg = gen_rtx_REG (Pmode, 0);
20321       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20322                            GEN_INT (info->lr_save_offset));
20323       mem = gen_frame_mem (Pmode, addr);
20324       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode, mem, reg);
20325     }
20326
20327   return gen_rtx_PARALLEL (VOIDmode, p);
20328 }
20329
20330 /* Determine whether the gp REG is really used.  */
20331
20332 static bool
20333 rs6000_reg_live_or_pic_offset_p (int reg)
20334 {
20335   /* If the function calls eh_return, claim used all the registers that would
20336      be checked for liveness otherwise.  This is required for the PIC offset
20337      register with -mminimal-toc on AIX, as it is advertised as "fixed" for
20338      register allocation purposes in this case.  */
20339
20340   return (((crtl->calls_eh_return || df_regs_ever_live_p (reg))
20341            && (!call_used_regs[reg]
20342                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
20343                    && !TARGET_SINGLE_PIC_BASE
20344                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
20345           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
20346               && !TARGET_SINGLE_PIC_BASE
20347               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
20348                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
20349 }
20350
20351 /* Emit function prologue as insns.  */
20352
20353 void
20354 rs6000_emit_prologue (void)
20355 {
20356   rs6000_stack_t *info = rs6000_stack_info ();
20357   enum machine_mode reg_mode = Pmode;
20358   int reg_size = TARGET_32BIT ? 4 : 8;
20359   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
20360   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
20361   rtx frame_reg_rtx = sp_reg_rtx;
20362   rtx cr_save_rtx = NULL_RTX;
20363   rtx insn;
20364   int strategy;
20365   int saving_FPRs_inline;
20366   int saving_GPRs_inline;
20367   int using_store_multiple;
20368   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
20369                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
20370                               && call_used_regs[STATIC_CHAIN_REGNUM]);
20371   HOST_WIDE_INT sp_offset = 0;
20372
20373   if (flag_stack_usage)
20374     current_function_static_stack_size = info->total_size;
20375
20376   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && info->total_size)
20377     rs6000_emit_probe_stack_range (STACK_CHECK_PROTECT, info->total_size);
20378
20379   if (TARGET_FIX_AND_CONTINUE)
20380     {
20381       /* gdb on darwin arranges to forward a function from the old
20382          address by modifying the first 5 instructions of the function
20383          to branch to the overriding function.  This is necessary to
20384          permit function pointers that point to the old function to
20385          actually forward to the new function.  */
20386       emit_insn (gen_nop ());
20387       emit_insn (gen_nop ());
20388       emit_insn (gen_nop ());
20389       emit_insn (gen_nop ());
20390       emit_insn (gen_nop ());
20391     }
20392
20393   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
20394     {
20395       reg_mode = V2SImode;
20396       reg_size = 8;
20397     }
20398
20399   strategy = info->savres_strategy;
20400   using_store_multiple = strategy & SAVRES_MULTIPLE;
20401   saving_FPRs_inline = strategy & SAVE_INLINE_FPRS;
20402   saving_GPRs_inline = strategy & SAVE_INLINE_GPRS;
20403
20404   /* For V.4, update stack before we do any saving and set back pointer.  */
20405   if (! WORLD_SAVE_P (info)
20406       && info->push_p
20407       && (DEFAULT_ABI == ABI_V4
20408           || crtl->calls_eh_return))
20409     {
20410       bool need_r11 = (TARGET_SPE
20411                        ? (!saving_GPRs_inline
20412                           && info->spe_64bit_regs_used == 0)
20413                        : (!saving_FPRs_inline || !saving_GPRs_inline));
20414       rtx copy_reg = need_r11 ? gen_rtx_REG (Pmode, 11) : NULL;
20415
20416       if (info->total_size < 32767)
20417         sp_offset = info->total_size;
20418       else if (need_r11)
20419         frame_reg_rtx = copy_reg;
20420       else if (info->cr_save_p
20421                || info->lr_save_p
20422                || info->first_fp_reg_save < 64
20423                || info->first_gp_reg_save < 32
20424                || info->altivec_size != 0
20425                || info->vrsave_mask != 0
20426                || crtl->calls_eh_return)
20427         {
20428           copy_reg = frame_ptr_rtx;
20429           frame_reg_rtx = copy_reg;
20430         }
20431       else
20432         {
20433           /* The prologue won't be saving any regs so there is no need
20434              to set up a frame register to access any frame save area.
20435              We also won't be using sp_offset anywhere below, but set
20436              the correct value anyway to protect against future
20437              changes to this function.  */
20438           sp_offset = info->total_size;
20439         }
20440       rs6000_emit_allocate_stack (info->total_size, copy_reg);
20441       if (frame_reg_rtx != sp_reg_rtx)
20442         rs6000_emit_stack_tie ();
20443     }
20444
20445   /* Handle world saves specially here.  */
20446   if (WORLD_SAVE_P (info))
20447     {
20448       int i, j, sz;
20449       rtx treg;
20450       rtvec p;
20451       rtx reg0;
20452
20453       /* save_world expects lr in r0. */
20454       reg0 = gen_rtx_REG (Pmode, 0);
20455       if (info->lr_save_p)
20456         {
20457           insn = emit_move_insn (reg0,
20458                                  gen_rtx_REG (Pmode, LR_REGNO));
20459           RTX_FRAME_RELATED_P (insn) = 1;
20460         }
20461
20462       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
20463          assumptions about the offsets of various bits of the stack
20464          frame.  */
20465       gcc_assert (info->gp_save_offset == -220
20466                   && info->fp_save_offset == -144
20467                   && info->lr_save_offset == 8
20468                   && info->cr_save_offset == 4
20469                   && info->push_p
20470                   && info->lr_save_p
20471                   && (!crtl->calls_eh_return
20472                        || info->ehrd_offset == -432)
20473                   && info->vrsave_save_offset == -224
20474                   && info->altivec_save_offset == -416);
20475
20476       treg = gen_rtx_REG (SImode, 11);
20477       emit_move_insn (treg, GEN_INT (-info->total_size));
20478
20479       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
20480          in R11.  It also clobbers R12, so beware!  */
20481
20482       /* Preserve CR2 for save_world prologues */
20483       sz = 5;
20484       sz += 32 - info->first_gp_reg_save;
20485       sz += 64 - info->first_fp_reg_save;
20486       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
20487       p = rtvec_alloc (sz);
20488       j = 0;
20489       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
20490                                             gen_rtx_REG (SImode,
20491                                                          LR_REGNO));
20492       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
20493                                         gen_rtx_SYMBOL_REF (Pmode,
20494                                                             "*save_world"));
20495       /* We do floats first so that the instruction pattern matches
20496          properly.  */
20497       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20498         {
20499           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20500                                    ? DFmode : SFmode), 
20501                                  info->first_fp_reg_save + i);
20502           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20503                                    GEN_INT (info->fp_save_offset
20504                                             + sp_offset + 8 * i));
20505           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20506                                      ? DFmode : SFmode), addr);
20507
20508           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20509         }
20510       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
20511         {
20512           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
20513           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20514                                    GEN_INT (info->altivec_save_offset
20515                                             + sp_offset + 16 * i));
20516           rtx mem = gen_frame_mem (V4SImode, addr);
20517
20518           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20519         }
20520       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20521         {
20522           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20523           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20524                                    GEN_INT (info->gp_save_offset
20525                                             + sp_offset + reg_size * i));
20526           rtx mem = gen_frame_mem (reg_mode, addr);
20527
20528           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20529         }
20530
20531       {
20532         /* CR register traditionally saved as CR2.  */
20533         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20534         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20535                                  GEN_INT (info->cr_save_offset
20536                                           + sp_offset));
20537         rtx mem = gen_frame_mem (reg_mode, addr);
20538
20539         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20540       }
20541       /* Explain about use of R0.  */
20542       if (info->lr_save_p)
20543         {
20544           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20545                                    GEN_INT (info->lr_save_offset
20546                                             + sp_offset));
20547           rtx mem = gen_frame_mem (reg_mode, addr);
20548
20549           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
20550         }
20551       /* Explain what happens to the stack pointer.  */
20552       {
20553         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
20554         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
20555       }
20556
20557       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20558       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20559                             treg, GEN_INT (-info->total_size));
20560       sp_offset = info->total_size;
20561     }
20562
20563   /* If we use the link register, get it into r0.  */
20564   if (!WORLD_SAVE_P (info) && info->lr_save_p)
20565     {
20566       rtx addr, reg, mem;
20567
20568       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
20569                              gen_rtx_REG (Pmode, LR_REGNO));
20570       RTX_FRAME_RELATED_P (insn) = 1;
20571
20572       if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
20573                         | SAVE_NOINLINE_FPRS_SAVES_LR)))
20574         {
20575           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20576                                GEN_INT (info->lr_save_offset + sp_offset));
20577           reg = gen_rtx_REG (Pmode, 0);
20578           mem = gen_rtx_MEM (Pmode, addr);
20579           /* This should not be of rs6000_sr_alias_set, because of
20580              __builtin_return_address.  */
20581
20582           insn = emit_move_insn (mem, reg);
20583           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20584                                 NULL_RTX, NULL_RTX);
20585         }
20586     }
20587
20588   /* If we need to save CR, put it into r12 or r11.  */
20589   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
20590     {
20591       rtx set;
20592
20593       cr_save_rtx
20594         = gen_rtx_REG (SImode, DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline
20595                        ? 11 : 12);
20596       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20597       RTX_FRAME_RELATED_P (insn) = 1;
20598       /* Now, there's no way that dwarf2out_frame_debug_expr is going
20599          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
20600          But that's OK.  All we have to do is specify that _one_ condition
20601          code register is saved in this stack slot.  The thrower's epilogue
20602          will then restore all the call-saved registers.
20603          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
20604       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
20605                          gen_rtx_REG (SImode, CR2_REGNO));
20606       add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20607     }
20608
20609   /* Do any required saving of fpr's.  If only one or two to save, do
20610      it ourselves.  Otherwise, call function.  */
20611   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
20612     {
20613       int i;
20614       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20615         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
20616              && ! call_used_regs[info->first_fp_reg_save+i]))
20617           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, 
20618                            (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20619                             ? DFmode : SFmode,
20620                            info->first_fp_reg_save + i,
20621                            info->fp_save_offset + sp_offset + 8 * i,
20622                            info->total_size);
20623     }
20624   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
20625     {
20626       rtx par;
20627
20628       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20629                                     info->fp_save_offset + sp_offset,
20630                                     DFmode,
20631                                     /*savep=*/true, /*gpr=*/false,
20632                                     /*lr=*/(strategy
20633                                             & SAVE_NOINLINE_FPRS_SAVES_LR)
20634                                            != 0);
20635       insn = emit_insn (par);
20636       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20637                             NULL_RTX, NULL_RTX);
20638     }
20639
20640   /* Save GPRs.  This is done as a PARALLEL if we are using
20641      the store-multiple instructions.  */
20642   if (!WORLD_SAVE_P (info)
20643       && TARGET_SPE_ABI
20644       && info->spe_64bit_regs_used != 0
20645       && info->first_gp_reg_save != 32)
20646     {
20647       int i;
20648       rtx spe_save_area_ptr;
20649  
20650       /* Determine whether we can address all of the registers that need
20651          to be saved with an offset from the stack pointer that fits in
20652          the small const field for SPE memory instructions.  */
20653       int spe_regs_addressable_via_sp
20654         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
20655                                + (32 - info->first_gp_reg_save - 1) * reg_size)
20656            && saving_GPRs_inline);
20657       int spe_offset;
20658  
20659       if (spe_regs_addressable_via_sp)
20660         {
20661           spe_save_area_ptr = frame_reg_rtx;
20662           spe_offset = info->spe_gp_save_offset + sp_offset;
20663         }
20664       else
20665         {
20666           /* Make r11 point to the start of the SPE save area.  We need
20667              to be careful here if r11 is holding the static chain.  If
20668              it is, then temporarily save it in r0.  We would use r0 as
20669              our base register here, but using r0 as a base register in
20670              loads and stores means something different from what we
20671              would like.  */
20672           int ool_adjust = (saving_GPRs_inline
20673                             ? 0
20674                             : (info->first_gp_reg_save
20675                                - (FIRST_SAVRES_REGISTER+1))*8);
20676           HOST_WIDE_INT offset = (info->spe_gp_save_offset
20677                                   + sp_offset - ool_adjust);
20678
20679           if (using_static_chain_p)
20680             {
20681               rtx r0 = gen_rtx_REG (Pmode, 0);
20682               gcc_assert (info->first_gp_reg_save > 11);
20683  
20684               emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
20685             }
20686  
20687           spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
20688           insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
20689                                         frame_reg_rtx,
20690                                         GEN_INT (offset)));
20691           /* We need to make sure the move to r11 gets noted for
20692              properly outputting unwind information.  */
20693           if (!saving_GPRs_inline)
20694             rs6000_frame_related (insn, frame_reg_rtx, offset,
20695                                   NULL_RTX, NULL_RTX);
20696           spe_offset = 0;
20697         }
20698  
20699       if (saving_GPRs_inline)
20700         {
20701           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20702             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20703               {
20704                 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20705                 rtx offset, addr, mem;
20706
20707                 /* We're doing all this to ensure that the offset fits into
20708                    the immediate offset of 'evstdd'.  */
20709                 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
20710  
20711                 offset = GEN_INT (reg_size * i + spe_offset);
20712                 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
20713                 mem = gen_rtx_MEM (V2SImode, addr);
20714   
20715                 insn = emit_move_insn (mem, reg);
20716            
20717                 rs6000_frame_related (insn, spe_save_area_ptr,
20718                                       info->spe_gp_save_offset
20719                                       + sp_offset + reg_size * i,
20720                                       offset, const0_rtx);
20721               }
20722         }
20723       else
20724         {
20725           rtx par;
20726
20727           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
20728                                         0, reg_mode,
20729                                         /*savep=*/true, /*gpr=*/true,
20730                                         /*lr=*/false);
20731           insn = emit_insn (par);
20732           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20733                                 NULL_RTX, NULL_RTX);
20734         }
20735                                         
20736  
20737       /* Move the static chain pointer back.  */
20738       if (using_static_chain_p && !spe_regs_addressable_via_sp)
20739         emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
20740     }
20741   else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
20742     {
20743       rtx par;
20744
20745       /* Need to adjust r11 (r12) if we saved any FPRs.  */
20746       if (info->first_fp_reg_save != 64)
20747         {
20748           rtx dest_reg = gen_rtx_REG (reg_mode, DEFAULT_ABI == ABI_AIX
20749                                       ? 12 : 11);
20750           rtx offset = GEN_INT (sp_offset
20751                                 + (-8 * (64-info->first_fp_reg_save)));
20752           emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx, offset));
20753         }
20754
20755       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20756                                     info->gp_save_offset + sp_offset,
20757                                     reg_mode,
20758                                     /*savep=*/true, /*gpr=*/true,
20759                                     /*lr=*/(strategy
20760                                             & SAVE_NOINLINE_GPRS_SAVES_LR)
20761                                            != 0);
20762       insn = emit_insn (par);
20763       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20764                             NULL_RTX, NULL_RTX);
20765     }
20766   else if (!WORLD_SAVE_P (info) && using_store_multiple)
20767     {
20768       rtvec p;
20769       int i;
20770       p = rtvec_alloc (32 - info->first_gp_reg_save);
20771       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20772         {
20773           rtx addr, reg, mem;
20774           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20775           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20776                                GEN_INT (info->gp_save_offset
20777                                         + sp_offset
20778                                         + reg_size * i));
20779           mem = gen_frame_mem (reg_mode, addr);
20780
20781           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
20782         }
20783       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20784       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20785                             NULL_RTX, NULL_RTX);
20786     }
20787   else if (!WORLD_SAVE_P (info))
20788     {
20789       int i;
20790       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20791         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20792           {
20793             rtx addr, reg, mem;
20794             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20795
20796             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20797                                  GEN_INT (info->gp_save_offset
20798                                           + sp_offset
20799                                           + reg_size * i));
20800             mem = gen_frame_mem (reg_mode, addr);
20801
20802             insn = emit_move_insn (mem, reg);
20803             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20804                                   NULL_RTX, NULL_RTX);
20805           }
20806     }
20807
20808   /* ??? There's no need to emit actual instructions here, but it's the
20809      easiest way to get the frame unwind information emitted.  */
20810   if (crtl->calls_eh_return)
20811     {
20812       unsigned int i, regno;
20813
20814       for (i = 0; ; ++i)
20815         {
20816           regno = EH_RETURN_DATA_REGNO (i);
20817           if (regno == INVALID_REGNUM)
20818             break;
20819
20820           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
20821                            info->ehrd_offset + sp_offset
20822                            + reg_size * (int) i,
20823                            info->total_size);
20824         }
20825     }
20826
20827   /* In AIX ABI we need to make sure r2 is really saved.  */
20828   if (TARGET_AIX && crtl->calls_eh_return)
20829     {
20830       rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
20831       long toc_restore_insn;
20832
20833       gcc_assert (frame_reg_rtx == frame_ptr_rtx
20834                   || frame_reg_rtx == sp_reg_rtx);
20835       tmp_reg = gen_rtx_REG (Pmode, 11);
20836       tmp_reg_si = gen_rtx_REG (SImode, 11);
20837       if (using_static_chain_p)
20838         emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
20839       gcc_assert (saving_GPRs_inline && saving_FPRs_inline);
20840       emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
20841       /* Peek at instruction to which this function returns.  If it's
20842          restoring r2, then we know we've already saved r2.  We can't
20843          unconditionally save r2 because the value we have will already
20844          be updated if we arrived at this function via a plt call or
20845          toc adjusting stub.  */
20846       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
20847       toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
20848       hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
20849       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
20850       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
20851       validate_condition_mode (EQ, CCUNSmode);
20852       lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
20853       emit_insn (gen_rtx_SET (VOIDmode, compare_result,
20854                               gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
20855       toc_save_done = gen_label_rtx ();
20856       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
20857                                    gen_rtx_EQ (VOIDmode, compare_result,
20858                                                const0_rtx),
20859                                    gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
20860                                    pc_rtx);
20861       jump = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, jump));
20862       JUMP_LABEL (jump) = toc_save_done;
20863       LABEL_NUSES (toc_save_done) += 1;
20864
20865       emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, 2,
20866                        sp_offset + 5 * reg_size, info->total_size);
20867       emit_label (toc_save_done);
20868       if (using_static_chain_p)
20869         emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
20870     }
20871
20872   /* Save CR if we use any that must be preserved.  */
20873   if (!WORLD_SAVE_P (info) && info->cr_save_p)
20874     {
20875       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20876                                GEN_INT (info->cr_save_offset + sp_offset));
20877       rtx mem = gen_frame_mem (SImode, addr);
20878       /* See the large comment above about why CR2_REGNO is used.  */
20879       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
20880
20881       /* If r12 was used to hold the original sp, copy cr into r0 now
20882          that it's free.  */
20883       if (REGNO (frame_reg_rtx) == 12)
20884         {
20885           rtx set;
20886
20887           cr_save_rtx = gen_rtx_REG (SImode, 0);
20888           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20889           RTX_FRAME_RELATED_P (insn) = 1;
20890           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
20891           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20892         }
20893       insn = emit_move_insn (mem, cr_save_rtx);
20894
20895       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20896                             NULL_RTX, NULL_RTX);
20897     }
20898
20899   /* Update stack and set back pointer unless this is V.4,
20900      for which it was done previously.  */
20901   if (!WORLD_SAVE_P (info) && info->push_p
20902       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
20903     {
20904       rtx copy_reg = NULL;
20905
20906       if (info->total_size < 32767)
20907         sp_offset = info->total_size;
20908       else if (info->altivec_size != 0
20909                || info->vrsave_mask != 0)
20910         {
20911           copy_reg = frame_ptr_rtx;
20912           frame_reg_rtx = copy_reg;
20913         }
20914       else
20915         sp_offset = info->total_size;
20916       rs6000_emit_allocate_stack (info->total_size, copy_reg);
20917       if (frame_reg_rtx != sp_reg_rtx)
20918         rs6000_emit_stack_tie ();
20919     }
20920
20921   /* Set frame pointer, if needed.  */
20922   if (frame_pointer_needed)
20923     {
20924       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
20925                              sp_reg_rtx);
20926       RTX_FRAME_RELATED_P (insn) = 1;
20927     }
20928
20929   /* Save AltiVec registers if needed.  Save here because the red zone does
20930      not include AltiVec registers.  */
20931   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
20932     {
20933       int i;
20934
20935       /* There should be a non inline version of this, for when we
20936          are saving lots of vector registers.  */
20937       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20938         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20939           {
20940             rtx areg, savereg, mem;
20941             int offset;
20942
20943             offset = info->altivec_save_offset + sp_offset
20944               + 16 * (i - info->first_altivec_reg_save);
20945
20946             savereg = gen_rtx_REG (V4SImode, i);
20947
20948             areg = gen_rtx_REG (Pmode, 0);
20949             emit_move_insn (areg, GEN_INT (offset));
20950
20951             /* AltiVec addressing mode is [reg+reg].  */
20952             mem = gen_frame_mem (V4SImode,
20953                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
20954
20955             insn = emit_move_insn (mem, savereg);
20956
20957             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20958                                   areg, GEN_INT (offset));
20959           }
20960     }
20961
20962   /* VRSAVE is a bit vector representing which AltiVec registers
20963      are used.  The OS uses this to determine which vector
20964      registers to save on a context switch.  We need to save
20965      VRSAVE on the stack frame, add whatever AltiVec registers we
20966      used in this function, and do the corresponding magic in the
20967      epilogue.  */
20968
20969   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
20970       && info->vrsave_mask != 0)
20971     {
20972       rtx reg, mem, vrsave;
20973       int offset;
20974
20975       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
20976          as frame_reg_rtx and r11 as the static chain pointer for
20977          nested functions.  */
20978       reg = gen_rtx_REG (SImode, 0);
20979       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
20980       if (TARGET_MACHO)
20981         emit_insn (gen_get_vrsave_internal (reg));
20982       else
20983         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
20984
20985       if (!WORLD_SAVE_P (info))
20986         {
20987           /* Save VRSAVE.  */
20988           offset = info->vrsave_save_offset + sp_offset;
20989           mem = gen_frame_mem (SImode,
20990                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
20991                                              GEN_INT (offset)));
20992           insn = emit_move_insn (mem, reg);
20993         }
20994
20995       /* Include the registers in the mask.  */
20996       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
20997
20998       insn = emit_insn (generate_set_vrsave (reg, info, 0));
20999     }
21000
21001   if (TARGET_SINGLE_PIC_BASE)
21002     return; /* Do not set PIC register */
21003
21004   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
21005   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
21006       || (DEFAULT_ABI == ABI_V4
21007           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
21008           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
21009     {
21010       /* If emit_load_toc_table will use the link register, we need to save
21011          it.  We use R12 for this purpose because emit_load_toc_table
21012          can use register 0.  This allows us to use a plain 'blr' to return
21013          from the procedure more often.  */
21014       int save_LR_around_toc_setup = (TARGET_ELF
21015                                       && DEFAULT_ABI != ABI_AIX
21016                                       && flag_pic
21017                                       && ! info->lr_save_p
21018                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
21019       if (save_LR_around_toc_setup)
21020         {
21021           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
21022
21023           insn = emit_move_insn (frame_ptr_rtx, lr);
21024           RTX_FRAME_RELATED_P (insn) = 1;
21025
21026           rs6000_emit_load_toc_table (TRUE);
21027
21028           insn = emit_move_insn (lr, frame_ptr_rtx);
21029           RTX_FRAME_RELATED_P (insn) = 1;
21030         }
21031       else
21032         rs6000_emit_load_toc_table (TRUE);
21033     }
21034
21035 #if TARGET_MACHO
21036   if (DEFAULT_ABI == ABI_DARWIN
21037       && flag_pic && crtl->uses_pic_offset_table)
21038     {
21039       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
21040       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
21041
21042       /* Save and restore LR locally around this call (in R0).  */
21043       if (!info->lr_save_p)
21044         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
21045
21046       emit_insn (gen_load_macho_picbase (src));
21047
21048       emit_move_insn (gen_rtx_REG (Pmode,
21049                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
21050                       lr);
21051
21052       if (!info->lr_save_p)
21053         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
21054     }
21055 #endif
21056 }
21057
21058 /* Write function prologue.  */
21059
21060 static void
21061 rs6000_output_function_prologue (FILE *file,
21062                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21063 {
21064   rs6000_stack_t *info = rs6000_stack_info ();
21065
21066   if (TARGET_DEBUG_STACK)
21067     debug_stack_info (info);
21068
21069   /* Write .extern for any function we will call to save and restore
21070      fp values.  */
21071   if (info->first_fp_reg_save < 64)
21072     {
21073       char *name;
21074       int regno = info->first_fp_reg_save - 32;
21075
21076       if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
21077         {
21078           name = rs6000_savres_routine_name (info, regno, /*savep=*/true,
21079                                              /*gpr=*/false, /*lr=*/false);
21080           fprintf (file, "\t.extern %s\n", name);
21081         }
21082       if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
21083         {
21084           name = rs6000_savres_routine_name (info, regno, /*savep=*/false,
21085                                              /*gpr=*/false, /*lr=*/true);
21086           fprintf (file, "\t.extern %s\n", name);
21087         }
21088     }
21089
21090   /* Write .extern for AIX common mode routines, if needed.  */
21091   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
21092     {
21093       fputs ("\t.extern __mulh\n", file);
21094       fputs ("\t.extern __mull\n", file);
21095       fputs ("\t.extern __divss\n", file);
21096       fputs ("\t.extern __divus\n", file);
21097       fputs ("\t.extern __quoss\n", file);
21098       fputs ("\t.extern __quous\n", file);
21099       common_mode_defined = 1;
21100     }
21101
21102   if (! HAVE_prologue)
21103     {
21104       rtx prologue;
21105
21106       start_sequence ();
21107
21108       /* A NOTE_INSN_DELETED is supposed to be at the start and end of
21109          the "toplevel" insn chain.  */
21110       emit_note (NOTE_INSN_DELETED);
21111       rs6000_emit_prologue ();
21112       emit_note (NOTE_INSN_DELETED);
21113
21114       /* Expand INSN_ADDRESSES so final() doesn't crash.  */
21115       {
21116         rtx insn;
21117         unsigned addr = 0;
21118         for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
21119           {
21120             INSN_ADDRESSES_NEW (insn, addr);
21121             addr += 4;
21122           }
21123       }
21124
21125       prologue = get_insns ();
21126       end_sequence ();
21127
21128       if (TARGET_DEBUG_STACK)
21129         debug_rtx_list (prologue, 100);
21130
21131       emit_insn_before_noloc (prologue, BB_HEAD (ENTRY_BLOCK_PTR->next_bb),
21132                               ENTRY_BLOCK_PTR);
21133     }
21134
21135   rs6000_pic_labelno++;
21136 }
21137
21138 /* Non-zero if vmx regs are restored before the frame pop, zero if
21139    we restore after the pop when possible.  */
21140 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
21141
21142 /* Reload CR from REG.  */
21143
21144 static void
21145 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
21146 {
21147   int count = 0;
21148   int i;
21149
21150   if (using_mfcr_multiple)
21151     {
21152       for (i = 0; i < 8; i++)
21153         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
21154           count++;
21155       gcc_assert (count);
21156     }
21157
21158   if (using_mfcr_multiple && count > 1)
21159     {
21160       rtvec p;
21161       int ndx;
21162
21163       p = rtvec_alloc (count);
21164
21165       ndx = 0;
21166       for (i = 0; i < 8; i++)
21167         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
21168           {
21169             rtvec r = rtvec_alloc (2);
21170             RTVEC_ELT (r, 0) = reg;
21171             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
21172             RTVEC_ELT (p, ndx) =
21173               gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
21174                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
21175             ndx++;
21176           }
21177       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21178       gcc_assert (ndx == count);
21179     }
21180   else
21181     for (i = 0; i < 8; i++)
21182       if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
21183         {
21184           emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
21185                                                        CR0_REGNO+i),
21186                                           reg));
21187         }
21188 }
21189
21190 /* Return true if OFFSET from stack pointer can be clobbered by signals.
21191    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
21192    below stack pointer not cloberred by signals.  */
21193
21194 static inline bool
21195 offset_below_red_zone_p (HOST_WIDE_INT offset)
21196 {
21197   return offset < (DEFAULT_ABI == ABI_V4
21198                    ? 0
21199                    : TARGET_32BIT ? -220 : -288);
21200 }
21201
21202 /* Emit function epilogue as insns.  */
21203
21204 void
21205 rs6000_emit_epilogue (int sibcall)
21206 {
21207   rs6000_stack_t *info;
21208   int restoring_GPRs_inline;
21209   int restoring_FPRs_inline;
21210   int using_load_multiple;
21211   int using_mtcr_multiple;
21212   int use_backchain_to_restore_sp;
21213   int restore_lr;
21214   int strategy;
21215   int sp_offset = 0;
21216   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
21217   rtx frame_reg_rtx = sp_reg_rtx;
21218   rtx cfa_restores = NULL_RTX;
21219   rtx insn;
21220   rtx cr_save_reg = NULL_RTX;
21221   enum machine_mode reg_mode = Pmode;
21222   int reg_size = TARGET_32BIT ? 4 : 8;
21223   int i;
21224
21225   info = rs6000_stack_info ();
21226
21227   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
21228     {
21229       reg_mode = V2SImode;
21230       reg_size = 8;
21231     }
21232
21233   strategy = info->savres_strategy;
21234   using_load_multiple = strategy & SAVRES_MULTIPLE;
21235   restoring_FPRs_inline = sibcall || (strategy & REST_INLINE_FPRS);
21236   restoring_GPRs_inline = sibcall || (strategy & REST_INLINE_GPRS);
21237   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
21238                          || rs6000_cpu == PROCESSOR_PPC603
21239                          || rs6000_cpu == PROCESSOR_PPC750
21240                          || optimize_size);
21241   /* Restore via the backchain when we have a large frame, since this
21242      is more efficient than an addis, addi pair.  The second condition
21243      here will not trigger at the moment;  We don't actually need a
21244      frame pointer for alloca, but the generic parts of the compiler
21245      give us one anyway.  */
21246   use_backchain_to_restore_sp = (info->total_size > 32767
21247                                  || info->total_size
21248                                      + (info->lr_save_p ? info->lr_save_offset : 0)
21249                                        > 32767
21250                                  || (cfun->calls_alloca
21251                                      && !frame_pointer_needed));
21252   restore_lr = (info->lr_save_p
21253                 && (restoring_FPRs_inline
21254                     || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
21255                 && (restoring_GPRs_inline
21256                     || info->first_fp_reg_save < 64));
21257
21258   if (WORLD_SAVE_P (info))
21259     {
21260       int i, j;
21261       char rname[30];
21262       const char *alloc_rname;
21263       rtvec p;
21264
21265       /* eh_rest_world_r10 will return to the location saved in the LR
21266          stack slot (which is not likely to be our caller.)
21267          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
21268          rest_world is similar, except any R10 parameter is ignored.
21269          The exception-handling stuff that was here in 2.95 is no
21270          longer necessary.  */
21271
21272       p = rtvec_alloc (9
21273                        + 1
21274                        + 32 - info->first_gp_reg_save
21275                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
21276                        + 63 + 1 - info->first_fp_reg_save);
21277
21278       strcpy (rname, ((crtl->calls_eh_return) ?
21279                       "*eh_rest_world_r10" : "*rest_world"));
21280       alloc_rname = ggc_strdup (rname);
21281
21282       j = 0;
21283       RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
21284       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
21285                                         gen_rtx_REG (Pmode,
21286                                                      LR_REGNO));
21287       RTVEC_ELT (p, j++)
21288         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
21289       /* The instruction pattern requires a clobber here;
21290          it is shared with the restVEC helper. */
21291       RTVEC_ELT (p, j++)
21292         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
21293
21294       {
21295         /* CR register traditionally saved as CR2.  */
21296         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
21297         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21298                                  GEN_INT (info->cr_save_offset));
21299         rtx mem = gen_frame_mem (reg_mode, addr);
21300
21301         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21302       }
21303
21304       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21305         {
21306           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21307           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21308                                    GEN_INT (info->gp_save_offset
21309                                             + reg_size * i));
21310           rtx mem = gen_frame_mem (reg_mode, addr);
21311
21312           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21313         }
21314       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
21315         {
21316           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
21317           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21318                                    GEN_INT (info->altivec_save_offset
21319                                             + 16 * i));
21320           rtx mem = gen_frame_mem (V4SImode, addr);
21321
21322           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21323         }
21324       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
21325         {
21326           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21327                                    ? DFmode : SFmode), 
21328                                  info->first_fp_reg_save + i);
21329           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21330                                    GEN_INT (info->fp_save_offset
21331                                             + 8 * i));
21332           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21333                                      ? DFmode : SFmode), addr);
21334
21335           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21336         }
21337       RTVEC_ELT (p, j++)
21338         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
21339       RTVEC_ELT (p, j++)
21340         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
21341       RTVEC_ELT (p, j++)
21342         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
21343       RTVEC_ELT (p, j++)
21344         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
21345       RTVEC_ELT (p, j++)
21346         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
21347       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21348
21349       return;
21350     }
21351
21352   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
21353   if (info->push_p)
21354     sp_offset = info->total_size;
21355
21356   /* Restore AltiVec registers if we must do so before adjusting the
21357      stack.  */
21358   if (TARGET_ALTIVEC_ABI
21359       && info->altivec_size != 0
21360       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21361           || (DEFAULT_ABI != ABI_V4
21362               && offset_below_red_zone_p (info->altivec_save_offset))))
21363     {
21364       int i;
21365
21366       if (use_backchain_to_restore_sp)
21367         {
21368           frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21369           emit_move_insn (frame_reg_rtx,
21370                           gen_rtx_MEM (Pmode, sp_reg_rtx));
21371           sp_offset = 0;
21372         }
21373       else if (frame_pointer_needed)
21374         frame_reg_rtx = hard_frame_pointer_rtx;
21375
21376       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
21377         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
21378           {
21379             rtx addr, areg, mem, reg;
21380
21381             areg = gen_rtx_REG (Pmode, 0);
21382             emit_move_insn
21383               (areg, GEN_INT (info->altivec_save_offset
21384                               + sp_offset
21385                               + 16 * (i - info->first_altivec_reg_save)));
21386
21387             /* AltiVec addressing mode is [reg+reg].  */
21388             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
21389             mem = gen_frame_mem (V4SImode, addr);
21390
21391             reg = gen_rtx_REG (V4SImode, i);
21392             emit_move_insn (reg, mem);
21393             if (offset_below_red_zone_p (info->altivec_save_offset
21394                                          + (i - info->first_altivec_reg_save)
21395                                            * 16))
21396               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21397                                              cfa_restores);
21398           }
21399     }
21400
21401   /* Restore VRSAVE if we must do so before adjusting the stack.  */
21402   if (TARGET_ALTIVEC
21403       && TARGET_ALTIVEC_VRSAVE
21404       && info->vrsave_mask != 0
21405       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21406           || (DEFAULT_ABI != ABI_V4
21407               && offset_below_red_zone_p (info->vrsave_save_offset))))
21408     {
21409       rtx addr, mem, reg;
21410
21411       if (frame_reg_rtx == sp_reg_rtx)
21412         {
21413           if (use_backchain_to_restore_sp)
21414             {
21415               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21416               emit_move_insn (frame_reg_rtx,
21417                               gen_rtx_MEM (Pmode, sp_reg_rtx));
21418               sp_offset = 0;
21419             }
21420           else if (frame_pointer_needed)
21421             frame_reg_rtx = hard_frame_pointer_rtx;
21422         }
21423
21424       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21425                            GEN_INT (info->vrsave_save_offset + sp_offset));
21426       mem = gen_frame_mem (SImode, addr);
21427       reg = gen_rtx_REG (SImode, 12);
21428       emit_move_insn (reg, mem);
21429
21430       emit_insn (generate_set_vrsave (reg, info, 1));
21431     }
21432
21433   insn = NULL_RTX;
21434   /* If we have a large stack frame, restore the old stack pointer
21435      using the backchain.  */
21436   if (use_backchain_to_restore_sp)
21437     {
21438       if (frame_reg_rtx == sp_reg_rtx)
21439         {
21440           /* Under V.4, don't reset the stack pointer until after we're done
21441              loading the saved registers.  */
21442           if (DEFAULT_ABI == ABI_V4)
21443             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21444
21445           insn = emit_move_insn (frame_reg_rtx,
21446                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
21447           sp_offset = 0;
21448         }
21449       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21450                && DEFAULT_ABI == ABI_V4)
21451         /* frame_reg_rtx has been set up by the altivec restore.  */
21452         ;
21453       else
21454         {
21455           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
21456           frame_reg_rtx = sp_reg_rtx;
21457         }
21458     }
21459   /* If we have a frame pointer, we can restore the old stack pointer
21460      from it.  */
21461   else if (frame_pointer_needed)
21462     {
21463       frame_reg_rtx = sp_reg_rtx;
21464       if (DEFAULT_ABI == ABI_V4)
21465         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21466       /* Prevent reordering memory accesses against stack pointer restore.  */
21467       else if (cfun->calls_alloca
21468                || offset_below_red_zone_p (-info->total_size))
21469         {
21470           rtx mem1 = gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx);
21471           rtx mem2 = gen_rtx_MEM (BLKmode, sp_reg_rtx);
21472           MEM_NOTRAP_P (mem1) = 1;
21473           MEM_NOTRAP_P (mem2) = 1;
21474           emit_insn (gen_frame_tie (mem1, mem2));
21475         }
21476
21477       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
21478                                        GEN_INT (info->total_size)));
21479       sp_offset = 0;
21480     }
21481   else if (info->push_p
21482            && DEFAULT_ABI != ABI_V4
21483            && !crtl->calls_eh_return)
21484     {
21485       /* Prevent reordering memory accesses against stack pointer restore.  */
21486       if (cfun->calls_alloca
21487           || offset_below_red_zone_p (-info->total_size))
21488         {
21489           rtx mem = gen_rtx_MEM (BLKmode, sp_reg_rtx);
21490           MEM_NOTRAP_P (mem) = 1;
21491           emit_insn (gen_stack_tie (mem));
21492         }
21493       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
21494                                        GEN_INT (info->total_size)));
21495       sp_offset = 0;
21496     }
21497   if (insn && frame_reg_rtx == sp_reg_rtx)
21498     {
21499       if (cfa_restores)
21500         {
21501           REG_NOTES (insn) = cfa_restores;
21502           cfa_restores = NULL_RTX;
21503         }
21504       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21505       RTX_FRAME_RELATED_P (insn) = 1;
21506     }
21507
21508   /* Restore AltiVec registers if we have not done so already.  */
21509   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21510       && TARGET_ALTIVEC_ABI
21511       && info->altivec_size != 0
21512       && (DEFAULT_ABI == ABI_V4
21513           || !offset_below_red_zone_p (info->altivec_save_offset)))
21514     {
21515       int i;
21516
21517       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
21518         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
21519           {
21520             rtx addr, areg, mem, reg;
21521
21522             areg = gen_rtx_REG (Pmode, 0);
21523             emit_move_insn
21524               (areg, GEN_INT (info->altivec_save_offset
21525                               + sp_offset
21526                               + 16 * (i - info->first_altivec_reg_save)));
21527
21528             /* AltiVec addressing mode is [reg+reg].  */
21529             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
21530             mem = gen_frame_mem (V4SImode, addr);
21531
21532             reg = gen_rtx_REG (V4SImode, i);
21533             emit_move_insn (reg, mem);
21534             if (DEFAULT_ABI == ABI_V4)
21535               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21536                                              cfa_restores);
21537           }
21538     }
21539
21540   /* Restore VRSAVE if we have not done so already.  */
21541   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21542       && TARGET_ALTIVEC
21543       && TARGET_ALTIVEC_VRSAVE
21544       && info->vrsave_mask != 0
21545       && (DEFAULT_ABI == ABI_V4
21546           || !offset_below_red_zone_p (info->vrsave_save_offset)))
21547     {
21548       rtx addr, mem, reg;
21549
21550       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21551                            GEN_INT (info->vrsave_save_offset + sp_offset));
21552       mem = gen_frame_mem (SImode, addr);
21553       reg = gen_rtx_REG (SImode, 12);
21554       emit_move_insn (reg, mem);
21555
21556       emit_insn (generate_set_vrsave (reg, info, 1));
21557     }
21558
21559   /* Get the old lr if we saved it.  If we are restoring registers
21560      out-of-line, then the out-of-line routines can do this for us.  */
21561   if (restore_lr && restoring_GPRs_inline)
21562     {
21563       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21564                                       info->lr_save_offset + sp_offset);
21565
21566       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21567     }
21568
21569   /* Get the old cr if we saved it.  */
21570   if (info->cr_save_p)
21571     {
21572       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21573                                GEN_INT (info->cr_save_offset + sp_offset));
21574       rtx mem = gen_frame_mem (SImode, addr);
21575
21576       cr_save_reg = gen_rtx_REG (SImode,
21577                                  DEFAULT_ABI == ABI_AIX
21578                                  && !restoring_GPRs_inline
21579                                  && info->first_fp_reg_save < 64
21580                                  ? 11 : 12);
21581       emit_move_insn (cr_save_reg, mem);
21582     }
21583
21584   /* Set LR here to try to overlap restores below.  LR is always saved
21585      above incoming stack, so it never needs REG_CFA_RESTORE.  */
21586   if (restore_lr && restoring_GPRs_inline)
21587     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21588                     gen_rtx_REG (Pmode, 0));
21589
21590   /* Load exception handler data registers, if needed.  */
21591   if (crtl->calls_eh_return)
21592     {
21593       unsigned int i, regno;
21594
21595       if (TARGET_AIX)
21596         {
21597           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21598                                    GEN_INT (sp_offset + 5 * reg_size));
21599           rtx mem = gen_frame_mem (reg_mode, addr);
21600
21601           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
21602         }
21603
21604       for (i = 0; ; ++i)
21605         {
21606           rtx mem;
21607
21608           regno = EH_RETURN_DATA_REGNO (i);
21609           if (regno == INVALID_REGNUM)
21610             break;
21611
21612           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
21613                                       info->ehrd_offset + sp_offset
21614                                       + reg_size * (int) i);
21615
21616           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
21617         }
21618     }
21619
21620   /* Restore GPRs.  This is done as a PARALLEL if we are using
21621      the load-multiple instructions.  */
21622   if (TARGET_SPE_ABI
21623       && info->spe_64bit_regs_used != 0
21624       && info->first_gp_reg_save != 32)
21625     {
21626       /* Determine whether we can address all of the registers that need
21627          to be saved with an offset from the stack pointer that fits in
21628          the small const field for SPE memory instructions.  */
21629       int spe_regs_addressable_via_sp
21630         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
21631                                + (32 - info->first_gp_reg_save - 1) * reg_size)
21632            && restoring_GPRs_inline);
21633       int spe_offset;
21634
21635       if (spe_regs_addressable_via_sp)
21636         spe_offset = info->spe_gp_save_offset + sp_offset;
21637       else
21638         {
21639           rtx old_frame_reg_rtx = frame_reg_rtx;
21640           /* Make r11 point to the start of the SPE save area.  We worried about
21641              not clobbering it when we were saving registers in the prologue.
21642              There's no need to worry here because the static chain is passed
21643              anew to every function.  */
21644           int ool_adjust = (restoring_GPRs_inline
21645                             ? 0
21646                             : (info->first_gp_reg_save
21647                                - (FIRST_SAVRES_REGISTER+1))*8);
21648
21649           if (frame_reg_rtx == sp_reg_rtx)
21650             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21651           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
21652                                  GEN_INT (info->spe_gp_save_offset
21653                                           + sp_offset
21654                                           - ool_adjust)));
21655           /* Keep the invariant that frame_reg_rtx + sp_offset points
21656              at the top of the stack frame.  */
21657           sp_offset = -info->spe_gp_save_offset;
21658
21659           spe_offset = 0;
21660         }
21661
21662       if (restoring_GPRs_inline)
21663         {
21664           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21665             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21666               {
21667                 rtx offset, addr, mem, reg;
21668
21669                 /* We're doing all this to ensure that the immediate offset
21670                    fits into the immediate field of 'evldd'.  */
21671                 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
21672
21673                 offset = GEN_INT (spe_offset + reg_size * i);
21674                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
21675                 mem = gen_rtx_MEM (V2SImode, addr);
21676                 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21677
21678                 insn = emit_move_insn (reg, mem);
21679                 if (DEFAULT_ABI == ABI_V4)
21680                   {
21681                     if (frame_pointer_needed
21682                         && info->first_gp_reg_save + i
21683                            == HARD_FRAME_POINTER_REGNUM)
21684                       {
21685                         add_reg_note (insn, REG_CFA_DEF_CFA,
21686                                       plus_constant (frame_reg_rtx,
21687                                                      sp_offset));
21688                         RTX_FRAME_RELATED_P (insn) = 1;
21689                       }
21690
21691                     cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21692                                                    cfa_restores);
21693                   }
21694               }
21695         }
21696       else
21697         {
21698           rtx par;
21699
21700           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
21701                                         0, reg_mode,
21702                                         /*savep=*/false, /*gpr=*/true,
21703                                         /*lr=*/true);
21704           emit_jump_insn (par);
21705           /* We don't want anybody else emitting things after we jumped
21706              back.  */
21707           return;
21708         }
21709     }
21710   else if (!restoring_GPRs_inline)
21711     {
21712       /* We are jumping to an out-of-line function.  */
21713       bool can_use_exit = info->first_fp_reg_save == 64;
21714       rtx par;
21715
21716       /* Emit stack reset code if we need it.  */
21717       if (can_use_exit)
21718         rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21719                                  sp_offset, can_use_exit);
21720       else
21721         {
21722           emit_insn (gen_add3_insn (gen_rtx_REG (Pmode, DEFAULT_ABI == ABI_AIX
21723                                                         ? 12 : 11),
21724                                     frame_reg_rtx,
21725                                     GEN_INT (sp_offset - info->fp_size)));
21726           if (REGNO (frame_reg_rtx) == 11)
21727             sp_offset += info->fp_size;
21728         }
21729
21730       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
21731                                     info->gp_save_offset, reg_mode,
21732                                     /*savep=*/false, /*gpr=*/true,
21733                                     /*lr=*/can_use_exit);
21734
21735       if (can_use_exit)
21736         {
21737           if (info->cr_save_p)
21738             {
21739               rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21740               if (DEFAULT_ABI == ABI_V4)
21741                 cfa_restores
21742                   = alloc_reg_note (REG_CFA_RESTORE,
21743                                     gen_rtx_REG (SImode, CR2_REGNO),
21744                                     cfa_restores);
21745             }
21746
21747           emit_jump_insn (par);
21748
21749           /* We don't want anybody else emitting things after we jumped
21750              back.  */
21751           return;
21752         }
21753
21754       insn = emit_insn (par);
21755       if (DEFAULT_ABI == ABI_V4)
21756         {
21757           if (frame_pointer_needed)
21758             {
21759               add_reg_note (insn, REG_CFA_DEF_CFA,
21760                             plus_constant (frame_reg_rtx, sp_offset));
21761               RTX_FRAME_RELATED_P (insn) = 1;
21762             }
21763
21764           for (i = info->first_gp_reg_save; i < 32; i++)
21765             cfa_restores
21766               = alloc_reg_note (REG_CFA_RESTORE,
21767                                 gen_rtx_REG (reg_mode, i), cfa_restores);
21768         }
21769     }
21770   else if (using_load_multiple)
21771     {
21772       rtvec p;
21773       p = rtvec_alloc (32 - info->first_gp_reg_save);
21774       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21775         {
21776           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21777                                    GEN_INT (info->gp_save_offset
21778                                             + sp_offset
21779                                             + reg_size * i));
21780           rtx mem = gen_frame_mem (reg_mode, addr);
21781           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21782
21783           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, reg, mem);
21784           if (DEFAULT_ABI == ABI_V4)
21785             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21786                                            cfa_restores);
21787         }
21788       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21789       if (DEFAULT_ABI == ABI_V4 && frame_pointer_needed)
21790         {
21791           add_reg_note (insn, REG_CFA_DEF_CFA,
21792                         plus_constant (frame_reg_rtx, sp_offset));
21793           RTX_FRAME_RELATED_P (insn) = 1;
21794         }
21795     }
21796   else
21797     {
21798       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21799         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21800           {
21801             rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21802                                      GEN_INT (info->gp_save_offset
21803                                               + sp_offset
21804                                               + reg_size * i));
21805             rtx mem = gen_frame_mem (reg_mode, addr);
21806             rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21807
21808             insn = emit_move_insn (reg, mem);
21809             if (DEFAULT_ABI == ABI_V4)
21810               {
21811                 if (frame_pointer_needed
21812                     && info->first_gp_reg_save + i
21813                        == HARD_FRAME_POINTER_REGNUM)
21814                   {
21815                     add_reg_note (insn, REG_CFA_DEF_CFA,
21816                                   plus_constant (frame_reg_rtx, sp_offset));
21817                     RTX_FRAME_RELATED_P (insn) = 1;
21818                   }
21819
21820                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21821                                                cfa_restores);
21822               }
21823           }
21824     }
21825
21826   if (restore_lr && !restoring_GPRs_inline)
21827     {
21828       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21829                                      info->lr_save_offset + sp_offset);
21830
21831       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21832       emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21833                       gen_rtx_REG (Pmode, 0));
21834     }
21835
21836   /* Restore fpr's if we need to do it without calling a function.  */
21837   if (restoring_FPRs_inline)
21838     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21839       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
21840            && ! call_used_regs[info->first_fp_reg_save+i]))
21841         {
21842           rtx addr, mem, reg;
21843           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21844                                GEN_INT (info->fp_save_offset
21845                                         + sp_offset
21846                                         + 8 * i));
21847           mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21848                                  ? DFmode : SFmode), addr);
21849           reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21850                                ? DFmode : SFmode),
21851                              info->first_fp_reg_save + i);
21852
21853           emit_move_insn (reg, mem);
21854           if (DEFAULT_ABI == ABI_V4)
21855             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21856                                            cfa_restores);
21857         }
21858
21859   /* If we saved cr, restore it here.  Just those that were used.  */
21860   if (info->cr_save_p)
21861     {
21862       rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21863       if (DEFAULT_ABI == ABI_V4)
21864         cfa_restores
21865           = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, CR2_REGNO),
21866                             cfa_restores);
21867     }
21868
21869   /* If this is V.4, unwind the stack pointer after all of the loads
21870      have been done.  */
21871   insn = rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21872                                   sp_offset, !restoring_FPRs_inline);
21873   if (insn)
21874     {
21875       if (cfa_restores)
21876         {
21877           REG_NOTES (insn) = cfa_restores;
21878           cfa_restores = NULL_RTX;
21879         }
21880       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21881       RTX_FRAME_RELATED_P (insn) = 1;
21882     }
21883
21884   if (crtl->calls_eh_return)
21885     {
21886       rtx sa = EH_RETURN_STACKADJ_RTX;
21887       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
21888     }
21889
21890   if (!sibcall)
21891     {
21892       rtvec p;
21893       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
21894       if (! restoring_FPRs_inline)
21895         p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
21896       else
21897         p = rtvec_alloc (2);
21898
21899       RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
21900       RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
21901                           ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
21902                           : gen_rtx_CLOBBER (VOIDmode,
21903                                              gen_rtx_REG (Pmode, 65)));
21904
21905       /* If we have to restore more than two FP registers, branch to the
21906          restore function.  It will return to our caller.  */
21907       if (! restoring_FPRs_inline)
21908         {
21909           int i;
21910           rtx sym;
21911
21912           sym = rs6000_savres_routine_sym (info,
21913                                            /*savep=*/false,
21914                                            /*gpr=*/false,
21915                                            /*lr=*/lr);
21916           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
21917           RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
21918                                           gen_rtx_REG (Pmode,
21919                                                        DEFAULT_ABI == ABI_AIX
21920                                                        ? 1 : 11));
21921           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21922             {
21923               rtx addr, mem;
21924               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
21925                                    GEN_INT (info->fp_save_offset + 8*i));
21926               mem = gen_frame_mem (DFmode, addr);
21927
21928               RTVEC_ELT (p, i+4) =
21929                 gen_rtx_SET (VOIDmode,
21930                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
21931                              mem);
21932             }
21933         }
21934
21935       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21936     }
21937 }
21938
21939 /* Write function epilogue.  */
21940
21941 static void
21942 rs6000_output_function_epilogue (FILE *file,
21943                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21944 {
21945   if (! HAVE_epilogue)
21946     {
21947       rtx insn = get_last_insn ();
21948       /* If the last insn was a BARRIER, we don't have to write anything except
21949          the trace table.  */
21950       if (GET_CODE (insn) == NOTE)
21951         insn = prev_nonnote_insn (insn);
21952       if (insn == 0 ||  GET_CODE (insn) != BARRIER)
21953         {
21954           /* This is slightly ugly, but at least we don't have two
21955              copies of the epilogue-emitting code.  */
21956           start_sequence ();
21957
21958           /* A NOTE_INSN_DELETED is supposed to be at the start
21959              and end of the "toplevel" insn chain.  */
21960           emit_note (NOTE_INSN_DELETED);
21961           rs6000_emit_epilogue (FALSE);
21962           emit_note (NOTE_INSN_DELETED);
21963
21964           /* Expand INSN_ADDRESSES so final() doesn't crash.  */
21965           {
21966             rtx insn;
21967             unsigned addr = 0;
21968             for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
21969               {
21970                 INSN_ADDRESSES_NEW (insn, addr);
21971                 addr += 4;
21972               }
21973           }
21974
21975           if (TARGET_DEBUG_STACK)
21976             debug_rtx_list (get_insns (), 100);
21977           final (get_insns (), file, FALSE);
21978           end_sequence ();
21979         }
21980     }
21981
21982 #if TARGET_MACHO
21983   macho_branch_islands ();
21984   /* Mach-O doesn't support labels at the end of objects, so if
21985      it looks like we might want one, insert a NOP.  */
21986   {
21987     rtx insn = get_last_insn ();
21988     while (insn
21989            && NOTE_P (insn)
21990            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
21991       insn = PREV_INSN (insn);
21992     if (insn
21993         && (LABEL_P (insn)
21994             || (NOTE_P (insn)
21995                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
21996       fputs ("\tnop\n", file);
21997   }
21998 #endif
21999
22000   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
22001      on its format.
22002
22003      We don't output a traceback table if -finhibit-size-directive was
22004      used.  The documentation for -finhibit-size-directive reads
22005      ``don't output a @code{.size} assembler directive, or anything
22006      else that would cause trouble if the function is split in the
22007      middle, and the two halves are placed at locations far apart in
22008      memory.''  The traceback table has this property, since it
22009      includes the offset from the start of the function to the
22010      traceback table itself.
22011
22012      System V.4 Powerpc's (and the embedded ABI derived from it) use a
22013      different traceback table.  */
22014   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
22015       && rs6000_traceback != traceback_none && !cfun->is_thunk)
22016     {
22017       const char *fname = NULL;
22018       const char *language_string = lang_hooks.name;
22019       int fixed_parms = 0, float_parms = 0, parm_info = 0;
22020       int i;
22021       int optional_tbtab;
22022       rs6000_stack_t *info = rs6000_stack_info ();
22023
22024       if (rs6000_traceback == traceback_full)
22025         optional_tbtab = 1;
22026       else if (rs6000_traceback == traceback_part)
22027         optional_tbtab = 0;
22028       else
22029         optional_tbtab = !optimize_size && !TARGET_ELF;
22030
22031       if (optional_tbtab)
22032         {
22033           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
22034           while (*fname == '.') /* V.4 encodes . in the name */
22035             fname++;
22036
22037           /* Need label immediately before tbtab, so we can compute
22038              its offset from the function start.  */
22039           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
22040           ASM_OUTPUT_LABEL (file, fname);
22041         }
22042
22043       /* The .tbtab pseudo-op can only be used for the first eight
22044          expressions, since it can't handle the possibly variable
22045          length fields that follow.  However, if you omit the optional
22046          fields, the assembler outputs zeros for all optional fields
22047          anyways, giving each variable length field is minimum length
22048          (as defined in sys/debug.h).  Thus we can not use the .tbtab
22049          pseudo-op at all.  */
22050
22051       /* An all-zero word flags the start of the tbtab, for debuggers
22052          that have to find it by searching forward from the entry
22053          point or from the current pc.  */
22054       fputs ("\t.long 0\n", file);
22055
22056       /* Tbtab format type.  Use format type 0.  */
22057       fputs ("\t.byte 0,", file);
22058
22059       /* Language type.  Unfortunately, there does not seem to be any
22060          official way to discover the language being compiled, so we
22061          use language_string.
22062          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
22063          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
22064          a number, so for now use 9.  LTO and Go aren't assigned numbers
22065          either, so for now use 0.  */
22066       if (! strcmp (language_string, "GNU C")
22067           || ! strcmp (language_string, "GNU GIMPLE")
22068           || ! strcmp (language_string, "GNU Go"))
22069         i = 0;
22070       else if (! strcmp (language_string, "GNU F77")
22071                || ! strcmp (language_string, "GNU Fortran"))
22072         i = 1;
22073       else if (! strcmp (language_string, "GNU Pascal"))
22074         i = 2;
22075       else if (! strcmp (language_string, "GNU Ada"))
22076         i = 3;
22077       else if (! strcmp (language_string, "GNU C++")
22078                || ! strcmp (language_string, "GNU Objective-C++"))
22079         i = 9;
22080       else if (! strcmp (language_string, "GNU Java"))
22081         i = 13;
22082       else if (! strcmp (language_string, "GNU Objective-C"))
22083         i = 14;
22084       else
22085         gcc_unreachable ();
22086       fprintf (file, "%d,", i);
22087
22088       /* 8 single bit fields: global linkage (not set for C extern linkage,
22089          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
22090          from start of procedure stored in tbtab, internal function, function
22091          has controlled storage, function has no toc, function uses fp,
22092          function logs/aborts fp operations.  */
22093       /* Assume that fp operations are used if any fp reg must be saved.  */
22094       fprintf (file, "%d,",
22095                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
22096
22097       /* 6 bitfields: function is interrupt handler, name present in
22098          proc table, function calls alloca, on condition directives
22099          (controls stack walks, 3 bits), saves condition reg, saves
22100          link reg.  */
22101       /* The `function calls alloca' bit seems to be set whenever reg 31 is
22102          set up as a frame pointer, even when there is no alloca call.  */
22103       fprintf (file, "%d,",
22104                ((optional_tbtab << 6)
22105                 | ((optional_tbtab & frame_pointer_needed) << 5)
22106                 | (info->cr_save_p << 1)
22107                 | (info->lr_save_p)));
22108
22109       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
22110          (6 bits).  */
22111       fprintf (file, "%d,",
22112                (info->push_p << 7) | (64 - info->first_fp_reg_save));
22113
22114       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
22115       fprintf (file, "%d,", (32 - first_reg_to_save ()));
22116
22117       if (optional_tbtab)
22118         {
22119           /* Compute the parameter info from the function decl argument
22120              list.  */
22121           tree decl;
22122           int next_parm_info_bit = 31;
22123
22124           for (decl = DECL_ARGUMENTS (current_function_decl);
22125                decl; decl = DECL_CHAIN (decl))
22126             {
22127               rtx parameter = DECL_INCOMING_RTL (decl);
22128               enum machine_mode mode = GET_MODE (parameter);
22129
22130               if (GET_CODE (parameter) == REG)
22131                 {
22132                   if (SCALAR_FLOAT_MODE_P (mode))
22133                     {
22134                       int bits;
22135
22136                       float_parms++;
22137
22138                       switch (mode)
22139                         {
22140                         case SFmode:
22141                         case SDmode:
22142                           bits = 0x2;
22143                           break;
22144
22145                         case DFmode:
22146                         case DDmode:
22147                         case TFmode:
22148                         case TDmode:
22149                           bits = 0x3;
22150                           break;
22151
22152                         default:
22153                           gcc_unreachable ();
22154                         }
22155
22156                       /* If only one bit will fit, don't or in this entry.  */
22157                       if (next_parm_info_bit > 0)
22158                         parm_info |= (bits << (next_parm_info_bit - 1));
22159                       next_parm_info_bit -= 2;
22160                     }
22161                   else
22162                     {
22163                       fixed_parms += ((GET_MODE_SIZE (mode)
22164                                        + (UNITS_PER_WORD - 1))
22165                                       / UNITS_PER_WORD);
22166                       next_parm_info_bit -= 1;
22167                     }
22168                 }
22169             }
22170         }
22171
22172       /* Number of fixed point parameters.  */
22173       /* This is actually the number of words of fixed point parameters; thus
22174          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
22175       fprintf (file, "%d,", fixed_parms);
22176
22177       /* 2 bitfields: number of floating point parameters (7 bits), parameters
22178          all on stack.  */
22179       /* This is actually the number of fp registers that hold parameters;
22180          and thus the maximum value is 13.  */
22181       /* Set parameters on stack bit if parameters are not in their original
22182          registers, regardless of whether they are on the stack?  Xlc
22183          seems to set the bit when not optimizing.  */
22184       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
22185
22186       if (! optional_tbtab)
22187         return;
22188
22189       /* Optional fields follow.  Some are variable length.  */
22190
22191       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
22192          11 double float.  */
22193       /* There is an entry for each parameter in a register, in the order that
22194          they occur in the parameter list.  Any intervening arguments on the
22195          stack are ignored.  If the list overflows a long (max possible length
22196          34 bits) then completely leave off all elements that don't fit.  */
22197       /* Only emit this long if there was at least one parameter.  */
22198       if (fixed_parms || float_parms)
22199         fprintf (file, "\t.long %d\n", parm_info);
22200
22201       /* Offset from start of code to tb table.  */
22202       fputs ("\t.long ", file);
22203       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
22204       RS6000_OUTPUT_BASENAME (file, fname);
22205       putc ('-', file);
22206       rs6000_output_function_entry (file, fname);
22207       putc ('\n', file);
22208
22209       /* Interrupt handler mask.  */
22210       /* Omit this long, since we never set the interrupt handler bit
22211          above.  */
22212
22213       /* Number of CTL (controlled storage) anchors.  */
22214       /* Omit this long, since the has_ctl bit is never set above.  */
22215
22216       /* Displacement into stack of each CTL anchor.  */
22217       /* Omit this list of longs, because there are no CTL anchors.  */
22218
22219       /* Length of function name.  */
22220       if (*fname == '*')
22221         ++fname;
22222       fprintf (file, "\t.short %d\n", (int) strlen (fname));
22223
22224       /* Function name.  */
22225       assemble_string (fname, strlen (fname));
22226
22227       /* Register for alloca automatic storage; this is always reg 31.
22228          Only emit this if the alloca bit was set above.  */
22229       if (frame_pointer_needed)
22230         fputs ("\t.byte 31\n", file);
22231
22232       fputs ("\t.align 2\n", file);
22233     }
22234 }
22235 \f
22236 /* A C compound statement that outputs the assembler code for a thunk
22237    function, used to implement C++ virtual function calls with
22238    multiple inheritance.  The thunk acts as a wrapper around a virtual
22239    function, adjusting the implicit object parameter before handing
22240    control off to the real function.
22241
22242    First, emit code to add the integer DELTA to the location that
22243    contains the incoming first argument.  Assume that this argument
22244    contains a pointer, and is the one used to pass the `this' pointer
22245    in C++.  This is the incoming argument *before* the function
22246    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
22247    values of all other incoming arguments.
22248
22249    After the addition, emit code to jump to FUNCTION, which is a
22250    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
22251    not touch the return address.  Hence returning from FUNCTION will
22252    return to whoever called the current `thunk'.
22253
22254    The effect must be as if FUNCTION had been called directly with the
22255    adjusted first argument.  This macro is responsible for emitting
22256    all of the code for a thunk function; output_function_prologue()
22257    and output_function_epilogue() are not invoked.
22258
22259    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
22260    been extracted from it.)  It might possibly be useful on some
22261    targets, but probably not.
22262
22263    If you do not define this macro, the target-independent code in the
22264    C++ frontend will generate a less efficient heavyweight thunk that
22265    calls FUNCTION instead of jumping to it.  The generic approach does
22266    not support varargs.  */
22267
22268 static void
22269 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
22270                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
22271                         tree function)
22272 {
22273   rtx this_rtx, insn, funexp;
22274
22275   reload_completed = 1;
22276   epilogue_completed = 1;
22277
22278   /* Mark the end of the (empty) prologue.  */
22279   emit_note (NOTE_INSN_PROLOGUE_END);
22280
22281   /* Find the "this" pointer.  If the function returns a structure,
22282      the structure return pointer is in r3.  */
22283   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
22284     this_rtx = gen_rtx_REG (Pmode, 4);
22285   else
22286     this_rtx = gen_rtx_REG (Pmode, 3);
22287
22288   /* Apply the constant offset, if required.  */
22289   if (delta)
22290     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
22291
22292   /* Apply the offset from the vtable, if required.  */
22293   if (vcall_offset)
22294     {
22295       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
22296       rtx tmp = gen_rtx_REG (Pmode, 12);
22297
22298       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
22299       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
22300         {
22301           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
22302           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
22303         }
22304       else
22305         {
22306           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
22307
22308           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
22309         }
22310       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
22311     }
22312
22313   /* Generate a tail call to the target function.  */
22314   if (!TREE_USED (function))
22315     {
22316       assemble_external (function);
22317       TREE_USED (function) = 1;
22318     }
22319   funexp = XEXP (DECL_RTL (function), 0);
22320   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
22321
22322 #if TARGET_MACHO
22323   if (MACHOPIC_INDIRECT)
22324     funexp = machopic_indirect_call_target (funexp);
22325 #endif
22326
22327   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
22328      generate sibcall RTL explicitly.  */
22329   insn = emit_call_insn (
22330            gen_rtx_PARALLEL (VOIDmode,
22331              gen_rtvec (4,
22332                         gen_rtx_CALL (VOIDmode,
22333                                       funexp, const0_rtx),
22334                         gen_rtx_USE (VOIDmode, const0_rtx),
22335                         gen_rtx_USE (VOIDmode,
22336                                      gen_rtx_REG (SImode,
22337                                                   LR_REGNO)),
22338                         gen_rtx_RETURN (VOIDmode))));
22339   SIBLING_CALL_P (insn) = 1;
22340   emit_barrier ();
22341
22342   /* Run just enough of rest_of_compilation to get the insns emitted.
22343      There's not really enough bulk here to make other passes such as
22344      instruction scheduling worth while.  Note that use_thunk calls
22345      assemble_start_function and assemble_end_function.  */
22346   insn = get_insns ();
22347   insn_locators_alloc ();
22348   shorten_branches (insn);
22349   final_start_function (insn, file, 1);
22350   final (insn, file, 1);
22351   final_end_function ();
22352
22353   reload_completed = 0;
22354   epilogue_completed = 0;
22355 }
22356 \f
22357 /* A quick summary of the various types of 'constant-pool tables'
22358    under PowerPC:
22359
22360    Target       Flags           Name            One table per
22361    AIX          (none)          AIX TOC         object file
22362    AIX          -mfull-toc      AIX TOC         object file
22363    AIX          -mminimal-toc   AIX minimal TOC translation unit
22364    SVR4/EABI    (none)          SVR4 SDATA      object file
22365    SVR4/EABI    -fpic           SVR4 pic        object file
22366    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
22367    SVR4/EABI    -mrelocatable   EABI TOC        function
22368    SVR4/EABI    -maix           AIX TOC         object file
22369    SVR4/EABI    -maix -mminimal-toc
22370                                 AIX minimal TOC translation unit
22371
22372    Name                 Reg.    Set by  entries       contains:
22373                                         made by  addrs? fp?     sum?
22374
22375    AIX TOC              2       crt0    as       Y      option  option
22376    AIX minimal TOC      30      prolog  gcc      Y      Y       option
22377    SVR4 SDATA           13      crt0    gcc      N      Y       N
22378    SVR4 pic             30      prolog  ld       Y      not yet N
22379    SVR4 PIC             30      prolog  gcc      Y      option  option
22380    EABI TOC             30      prolog  gcc      Y      option  option
22381
22382 */
22383
22384 /* Hash functions for the hash table.  */
22385
22386 static unsigned
22387 rs6000_hash_constant (rtx k)
22388 {
22389   enum rtx_code code = GET_CODE (k);
22390   enum machine_mode mode = GET_MODE (k);
22391   unsigned result = (code << 3) ^ mode;
22392   const char *format;
22393   int flen, fidx;
22394
22395   format = GET_RTX_FORMAT (code);
22396   flen = strlen (format);
22397   fidx = 0;
22398
22399   switch (code)
22400     {
22401     case LABEL_REF:
22402       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
22403
22404     case CONST_DOUBLE:
22405       if (mode != VOIDmode)
22406         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
22407       flen = 2;
22408       break;
22409
22410     case CODE_LABEL:
22411       fidx = 3;
22412       break;
22413
22414     default:
22415       break;
22416     }
22417
22418   for (; fidx < flen; fidx++)
22419     switch (format[fidx])
22420       {
22421       case 's':
22422         {
22423           unsigned i, len;
22424           const char *str = XSTR (k, fidx);
22425           len = strlen (str);
22426           result = result * 613 + len;
22427           for (i = 0; i < len; i++)
22428             result = result * 613 + (unsigned) str[i];
22429           break;
22430         }
22431       case 'u':
22432       case 'e':
22433         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
22434         break;
22435       case 'i':
22436       case 'n':
22437         result = result * 613 + (unsigned) XINT (k, fidx);
22438         break;
22439       case 'w':
22440         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
22441           result = result * 613 + (unsigned) XWINT (k, fidx);
22442         else
22443           {
22444             size_t i;
22445             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
22446               result = result * 613 + (unsigned) (XWINT (k, fidx)
22447                                                   >> CHAR_BIT * i);
22448           }
22449         break;
22450       case '0':
22451         break;
22452       default:
22453         gcc_unreachable ();
22454       }
22455
22456   return result;
22457 }
22458
22459 static unsigned
22460 toc_hash_function (const void *hash_entry)
22461 {
22462   const struct toc_hash_struct *thc =
22463     (const struct toc_hash_struct *) hash_entry;
22464   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
22465 }
22466
22467 /* Compare H1 and H2 for equivalence.  */
22468
22469 static int
22470 toc_hash_eq (const void *h1, const void *h2)
22471 {
22472   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
22473   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
22474
22475   if (((const struct toc_hash_struct *) h1)->key_mode
22476       != ((const struct toc_hash_struct *) h2)->key_mode)
22477     return 0;
22478
22479   return rtx_equal_p (r1, r2);
22480 }
22481
22482 /* These are the names given by the C++ front-end to vtables, and
22483    vtable-like objects.  Ideally, this logic should not be here;
22484    instead, there should be some programmatic way of inquiring as
22485    to whether or not an object is a vtable.  */
22486
22487 #define VTABLE_NAME_P(NAME)                             \
22488   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
22489   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
22490   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
22491   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
22492   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
22493
22494 #ifdef NO_DOLLAR_IN_LABEL
22495 /* Return a GGC-allocated character string translating dollar signs in
22496    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
22497
22498 const char *
22499 rs6000_xcoff_strip_dollar (const char *name)
22500 {
22501   char *strip, *p;
22502   int len;
22503
22504   p = strchr (name, '$');
22505
22506   if (p == 0 || p == name)
22507     return name;
22508
22509   len = strlen (name);
22510   strip = (char *) alloca (len + 1);
22511   strcpy (strip, name);
22512   p = strchr (strip, '$');
22513   while (p)
22514     {
22515       *p = '_';
22516       p = strchr (p + 1, '$');
22517     }
22518
22519   return ggc_alloc_string (strip, len);
22520 }
22521 #endif
22522
22523 void
22524 rs6000_output_symbol_ref (FILE *file, rtx x)
22525 {
22526   /* Currently C++ toc references to vtables can be emitted before it
22527      is decided whether the vtable is public or private.  If this is
22528      the case, then the linker will eventually complain that there is
22529      a reference to an unknown section.  Thus, for vtables only,
22530      we emit the TOC reference to reference the symbol and not the
22531      section.  */
22532   const char *name = XSTR (x, 0);
22533
22534   if (VTABLE_NAME_P (name))
22535     {
22536       RS6000_OUTPUT_BASENAME (file, name);
22537     }
22538   else
22539     assemble_name (file, name);
22540 }
22541
22542 /* Output a TOC entry.  We derive the entry name from what is being
22543    written.  */
22544
22545 void
22546 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
22547 {
22548   char buf[256];
22549   const char *name = buf;
22550   rtx base = x;
22551   HOST_WIDE_INT offset = 0;
22552
22553   gcc_assert (!TARGET_NO_TOC);
22554
22555   /* When the linker won't eliminate them, don't output duplicate
22556      TOC entries (this happens on AIX if there is any kind of TOC,
22557      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
22558      CODE_LABELs.  */
22559   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
22560     {
22561       struct toc_hash_struct *h;
22562       void * * found;
22563
22564       /* Create toc_hash_table.  This can't be done at TARGET_OPTION_OVERRIDE
22565          time because GGC is not initialized at that point.  */
22566       if (toc_hash_table == NULL)
22567         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
22568                                           toc_hash_eq, NULL);
22569
22570       h = ggc_alloc_toc_hash_struct ();
22571       h->key = x;
22572       h->key_mode = mode;
22573       h->labelno = labelno;
22574
22575       found = htab_find_slot (toc_hash_table, h, INSERT);
22576       if (*found == NULL)
22577         *found = h;
22578       else  /* This is indeed a duplicate.
22579                Set this label equal to that label.  */
22580         {
22581           fputs ("\t.set ", file);
22582           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22583           fprintf (file, "%d,", labelno);
22584           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22585           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
22586                                               found)->labelno));
22587           return;
22588         }
22589     }
22590
22591   /* If we're going to put a double constant in the TOC, make sure it's
22592      aligned properly when strict alignment is on.  */
22593   if (GET_CODE (x) == CONST_DOUBLE
22594       && STRICT_ALIGNMENT
22595       && GET_MODE_BITSIZE (mode) >= 64
22596       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
22597     ASM_OUTPUT_ALIGN (file, 3);
22598   }
22599
22600   (*targetm.asm_out.internal_label) (file, "LC", labelno);
22601
22602   /* Handle FP constants specially.  Note that if we have a minimal
22603      TOC, things we put here aren't actually in the TOC, so we can allow
22604      FP constants.  */
22605   if (GET_CODE (x) == CONST_DOUBLE &&
22606       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
22607     {
22608       REAL_VALUE_TYPE rv;
22609       long k[4];
22610
22611       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22612       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22613         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
22614       else
22615         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
22616
22617       if (TARGET_64BIT)
22618         {
22619           if (TARGET_MINIMAL_TOC)
22620             fputs (DOUBLE_INT_ASM_OP, file);
22621           else
22622             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22623                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22624                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22625           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
22626                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22627                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22628           return;
22629         }
22630       else
22631         {
22632           if (TARGET_MINIMAL_TOC)
22633             fputs ("\t.long ", file);
22634           else
22635             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22636                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22637                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22638           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
22639                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22640                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22641           return;
22642         }
22643     }
22644   else if (GET_CODE (x) == CONST_DOUBLE &&
22645            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
22646     {
22647       REAL_VALUE_TYPE rv;
22648       long k[2];
22649
22650       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22651
22652       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22653         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
22654       else
22655         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
22656
22657       if (TARGET_64BIT)
22658         {
22659           if (TARGET_MINIMAL_TOC)
22660             fputs (DOUBLE_INT_ASM_OP, file);
22661           else
22662             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22663                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22664           fprintf (file, "0x%lx%08lx\n",
22665                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22666           return;
22667         }
22668       else
22669         {
22670           if (TARGET_MINIMAL_TOC)
22671             fputs ("\t.long ", file);
22672           else
22673             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22674                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22675           fprintf (file, "0x%lx,0x%lx\n",
22676                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22677           return;
22678         }
22679     }
22680   else if (GET_CODE (x) == CONST_DOUBLE &&
22681            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
22682     {
22683       REAL_VALUE_TYPE rv;
22684       long l;
22685
22686       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22687       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22688         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
22689       else
22690         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
22691
22692       if (TARGET_64BIT)
22693         {
22694           if (TARGET_MINIMAL_TOC)
22695             fputs (DOUBLE_INT_ASM_OP, file);
22696           else
22697             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22698           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
22699           return;
22700         }
22701       else
22702         {
22703           if (TARGET_MINIMAL_TOC)
22704             fputs ("\t.long ", file);
22705           else
22706             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22707           fprintf (file, "0x%lx\n", l & 0xffffffff);
22708           return;
22709         }
22710     }
22711   else if (GET_MODE (x) == VOIDmode
22712            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
22713     {
22714       unsigned HOST_WIDE_INT low;
22715       HOST_WIDE_INT high;
22716
22717       if (GET_CODE (x) == CONST_DOUBLE)
22718         {
22719           low = CONST_DOUBLE_LOW (x);
22720           high = CONST_DOUBLE_HIGH (x);
22721         }
22722       else
22723 #if HOST_BITS_PER_WIDE_INT == 32
22724         {
22725           low = INTVAL (x);
22726           high = (low & 0x80000000) ? ~0 : 0;
22727         }
22728 #else
22729         {
22730           low = INTVAL (x) & 0xffffffff;
22731           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
22732         }
22733 #endif
22734
22735       /* TOC entries are always Pmode-sized, but since this
22736          is a bigendian machine then if we're putting smaller
22737          integer constants in the TOC we have to pad them.
22738          (This is still a win over putting the constants in
22739          a separate constant pool, because then we'd have
22740          to have both a TOC entry _and_ the actual constant.)
22741
22742          For a 32-bit target, CONST_INT values are loaded and shifted
22743          entirely within `low' and can be stored in one TOC entry.  */
22744
22745       /* It would be easy to make this work, but it doesn't now.  */
22746       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
22747
22748       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
22749         {
22750 #if HOST_BITS_PER_WIDE_INT == 32
22751           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
22752                          POINTER_SIZE, &low, &high, 0);
22753 #else
22754           low |= high << 32;
22755           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
22756           high = (HOST_WIDE_INT) low >> 32;
22757           low &= 0xffffffff;
22758 #endif
22759         }
22760
22761       if (TARGET_64BIT)
22762         {
22763           if (TARGET_MINIMAL_TOC)
22764             fputs (DOUBLE_INT_ASM_OP, file);
22765           else
22766             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22767                      (long) high & 0xffffffff, (long) low & 0xffffffff);
22768           fprintf (file, "0x%lx%08lx\n",
22769                    (long) high & 0xffffffff, (long) low & 0xffffffff);
22770           return;
22771         }
22772       else
22773         {
22774           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
22775             {
22776               if (TARGET_MINIMAL_TOC)
22777                 fputs ("\t.long ", file);
22778               else
22779                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22780                          (long) high & 0xffffffff, (long) low & 0xffffffff);
22781               fprintf (file, "0x%lx,0x%lx\n",
22782                        (long) high & 0xffffffff, (long) low & 0xffffffff);
22783             }
22784           else
22785             {
22786               if (TARGET_MINIMAL_TOC)
22787                 fputs ("\t.long ", file);
22788               else
22789                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
22790               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
22791             }
22792           return;
22793         }
22794     }
22795
22796   if (GET_CODE (x) == CONST)
22797     {
22798       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
22799                   && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
22800
22801       base = XEXP (XEXP (x, 0), 0);
22802       offset = INTVAL (XEXP (XEXP (x, 0), 1));
22803     }
22804
22805   switch (GET_CODE (base))
22806     {
22807     case SYMBOL_REF:
22808       name = XSTR (base, 0);
22809       break;
22810
22811     case LABEL_REF:
22812       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
22813                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
22814       break;
22815
22816     case CODE_LABEL:
22817       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
22818       break;
22819
22820     default:
22821       gcc_unreachable ();
22822     }
22823
22824   if (TARGET_MINIMAL_TOC)
22825     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
22826   else
22827     {
22828       fputs ("\t.tc ", file);
22829       RS6000_OUTPUT_BASENAME (file, name);
22830
22831       if (offset < 0)
22832         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
22833       else if (offset)
22834         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
22835
22836       fputs ("[TC],", file);
22837     }
22838
22839   /* Currently C++ toc references to vtables can be emitted before it
22840      is decided whether the vtable is public or private.  If this is
22841      the case, then the linker will eventually complain that there is
22842      a TOC reference to an unknown section.  Thus, for vtables only,
22843      we emit the TOC reference to reference the symbol and not the
22844      section.  */
22845   if (VTABLE_NAME_P (name))
22846     {
22847       RS6000_OUTPUT_BASENAME (file, name);
22848       if (offset < 0)
22849         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
22850       else if (offset > 0)
22851         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
22852     }
22853   else
22854     output_addr_const (file, x);
22855   putc ('\n', file);
22856 }
22857 \f
22858 /* Output an assembler pseudo-op to write an ASCII string of N characters
22859    starting at P to FILE.
22860
22861    On the RS/6000, we have to do this using the .byte operation and
22862    write out special characters outside the quoted string.
22863    Also, the assembler is broken; very long strings are truncated,
22864    so we must artificially break them up early.  */
22865
22866 void
22867 output_ascii (FILE *file, const char *p, int n)
22868 {
22869   char c;
22870   int i, count_string;
22871   const char *for_string = "\t.byte \"";
22872   const char *for_decimal = "\t.byte ";
22873   const char *to_close = NULL;
22874
22875   count_string = 0;
22876   for (i = 0; i < n; i++)
22877     {
22878       c = *p++;
22879       if (c >= ' ' && c < 0177)
22880         {
22881           if (for_string)
22882             fputs (for_string, file);
22883           putc (c, file);
22884
22885           /* Write two quotes to get one.  */
22886           if (c == '"')
22887             {
22888               putc (c, file);
22889               ++count_string;
22890             }
22891
22892           for_string = NULL;
22893           for_decimal = "\"\n\t.byte ";
22894           to_close = "\"\n";
22895           ++count_string;
22896
22897           if (count_string >= 512)
22898             {
22899               fputs (to_close, file);
22900
22901               for_string = "\t.byte \"";
22902               for_decimal = "\t.byte ";
22903               to_close = NULL;
22904               count_string = 0;
22905             }
22906         }
22907       else
22908         {
22909           if (for_decimal)
22910             fputs (for_decimal, file);
22911           fprintf (file, "%d", c);
22912
22913           for_string = "\n\t.byte \"";
22914           for_decimal = ", ";
22915           to_close = "\n";
22916           count_string = 0;
22917         }
22918     }
22919
22920   /* Now close the string if we have written one.  Then end the line.  */
22921   if (to_close)
22922     fputs (to_close, file);
22923 }
22924 \f
22925 /* Generate a unique section name for FILENAME for a section type
22926    represented by SECTION_DESC.  Output goes into BUF.
22927
22928    SECTION_DESC can be any string, as long as it is different for each
22929    possible section type.
22930
22931    We name the section in the same manner as xlc.  The name begins with an
22932    underscore followed by the filename (after stripping any leading directory
22933    names) with the last period replaced by the string SECTION_DESC.  If
22934    FILENAME does not contain a period, SECTION_DESC is appended to the end of
22935    the name.  */
22936
22937 void
22938 rs6000_gen_section_name (char **buf, const char *filename,
22939                          const char *section_desc)
22940 {
22941   const char *q, *after_last_slash, *last_period = 0;
22942   char *p;
22943   int len;
22944
22945   after_last_slash = filename;
22946   for (q = filename; *q; q++)
22947     {
22948       if (*q == '/')
22949         after_last_slash = q + 1;
22950       else if (*q == '.')
22951         last_period = q;
22952     }
22953
22954   len = strlen (after_last_slash) + strlen (section_desc) + 2;
22955   *buf = (char *) xmalloc (len);
22956
22957   p = *buf;
22958   *p++ = '_';
22959
22960   for (q = after_last_slash; *q; q++)
22961     {
22962       if (q == last_period)
22963         {
22964           strcpy (p, section_desc);
22965           p += strlen (section_desc);
22966           break;
22967         }
22968
22969       else if (ISALNUM (*q))
22970         *p++ = *q;
22971     }
22972
22973   if (last_period == 0)
22974     strcpy (p, section_desc);
22975   else
22976     *p = '\0';
22977 }
22978 \f
22979 /* Emit profile function.  */
22980
22981 void
22982 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
22983 {
22984   /* Non-standard profiling for kernels, which just saves LR then calls
22985      _mcount without worrying about arg saves.  The idea is to change
22986      the function prologue as little as possible as it isn't easy to
22987      account for arg save/restore code added just for _mcount.  */
22988   if (TARGET_PROFILE_KERNEL)
22989     return;
22990
22991   if (DEFAULT_ABI == ABI_AIX)
22992     {
22993 #ifndef NO_PROFILE_COUNTERS
22994 # define NO_PROFILE_COUNTERS 0
22995 #endif
22996       if (NO_PROFILE_COUNTERS)
22997         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22998                            LCT_NORMAL, VOIDmode, 0);
22999       else
23000         {
23001           char buf[30];
23002           const char *label_name;
23003           rtx fun;
23004
23005           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
23006           label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
23007           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
23008
23009           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
23010                              LCT_NORMAL, VOIDmode, 1, fun, Pmode);
23011         }
23012     }
23013   else if (DEFAULT_ABI == ABI_DARWIN)
23014     {
23015       const char *mcount_name = RS6000_MCOUNT;
23016       int caller_addr_regno = LR_REGNO;
23017
23018       /* Be conservative and always set this, at least for now.  */
23019       crtl->uses_pic_offset_table = 1;
23020
23021 #if TARGET_MACHO
23022       /* For PIC code, set up a stub and collect the caller's address
23023          from r0, which is where the prologue puts it.  */
23024       if (MACHOPIC_INDIRECT
23025           && crtl->uses_pic_offset_table)
23026         caller_addr_regno = 0;
23027 #endif
23028       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
23029                          LCT_NORMAL, VOIDmode, 1,
23030                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
23031     }
23032 }
23033
23034 /* Write function profiler code.  */
23035
23036 void
23037 output_function_profiler (FILE *file, int labelno)
23038 {
23039   char buf[100];
23040
23041   switch (DEFAULT_ABI)
23042     {
23043     default:
23044       gcc_unreachable ();
23045
23046     case ABI_V4:
23047       if (!TARGET_32BIT)
23048         {
23049           warning (0, "no profiling of 64-bit code for this ABI");
23050           return;
23051         }
23052       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
23053       fprintf (file, "\tmflr %s\n", reg_names[0]);
23054       if (NO_PROFILE_COUNTERS)
23055         {
23056           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23057                        reg_names[0], reg_names[1]);
23058         }
23059       else if (TARGET_SECURE_PLT && flag_pic)
23060         {
23061           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
23062                        reg_names[0], reg_names[1]);
23063           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
23064           asm_fprintf (file, "\t{cau|addis} %s,%s,",
23065                        reg_names[12], reg_names[12]);
23066           assemble_name (file, buf);
23067           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
23068           assemble_name (file, buf);
23069           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
23070         }
23071       else if (flag_pic == 1)
23072         {
23073           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
23074           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23075                        reg_names[0], reg_names[1]);
23076           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
23077           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
23078           assemble_name (file, buf);
23079           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
23080         }
23081       else if (flag_pic > 1)
23082         {
23083           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23084                        reg_names[0], reg_names[1]);
23085           /* Now, we need to get the address of the label.  */
23086           fputs ("\tbcl 20,31,1f\n\t.long ", file);
23087           assemble_name (file, buf);
23088           fputs ("-.\n1:", file);
23089           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
23090           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
23091                        reg_names[0], reg_names[11]);
23092           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
23093                        reg_names[0], reg_names[0], reg_names[11]);
23094         }
23095       else
23096         {
23097           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
23098           assemble_name (file, buf);
23099           fputs ("@ha\n", file);
23100           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23101                        reg_names[0], reg_names[1]);
23102           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
23103           assemble_name (file, buf);
23104           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
23105         }
23106
23107       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
23108       fprintf (file, "\tbl %s%s\n",
23109                RS6000_MCOUNT, flag_pic ? "@plt" : "");
23110       break;
23111
23112     case ABI_AIX:
23113     case ABI_DARWIN:
23114       if (!TARGET_PROFILE_KERNEL)
23115         {
23116           /* Don't do anything, done in output_profile_hook ().  */
23117         }
23118       else
23119         {
23120           gcc_assert (!TARGET_32BIT);
23121
23122           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
23123           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
23124
23125           if (cfun->static_chain_decl != NULL)
23126             {
23127               asm_fprintf (file, "\tstd %s,24(%s)\n",
23128                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
23129               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
23130               asm_fprintf (file, "\tld %s,24(%s)\n",
23131                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
23132             }
23133           else
23134             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
23135         }
23136       break;
23137     }
23138 }
23139
23140 \f
23141
23142 /* The following variable value is the last issued insn.  */
23143
23144 static rtx last_scheduled_insn;
23145
23146 /* The following variable helps to balance issuing of load and
23147    store instructions */
23148
23149 static int load_store_pendulum;
23150
23151 /* Power4 load update and store update instructions are cracked into a
23152    load or store and an integer insn which are executed in the same cycle.
23153    Branches have their own dispatch slot which does not count against the
23154    GCC issue rate, but it changes the program flow so there are no other
23155    instructions to issue in this cycle.  */
23156
23157 static int
23158 rs6000_variable_issue_1 (rtx insn, int more)
23159 {
23160   last_scheduled_insn = insn;
23161   if (GET_CODE (PATTERN (insn)) == USE
23162       || GET_CODE (PATTERN (insn)) == CLOBBER)
23163     {
23164       cached_can_issue_more = more;
23165       return cached_can_issue_more;
23166     }
23167
23168   if (insn_terminates_group_p (insn, current_group))
23169     {
23170       cached_can_issue_more = 0;
23171       return cached_can_issue_more;
23172     }
23173
23174   /* If no reservation, but reach here */
23175   if (recog_memoized (insn) < 0)
23176     return more;
23177
23178   if (rs6000_sched_groups)
23179     {
23180       if (is_microcoded_insn (insn))
23181         cached_can_issue_more = 0;
23182       else if (is_cracked_insn (insn))
23183         cached_can_issue_more = more > 2 ? more - 2 : 0;
23184       else
23185         cached_can_issue_more = more - 1;
23186
23187       return cached_can_issue_more;
23188     }
23189
23190   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
23191     return 0;
23192
23193   cached_can_issue_more = more - 1;
23194   return cached_can_issue_more;
23195 }
23196
23197 static int
23198 rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
23199 {
23200   int r = rs6000_variable_issue_1 (insn, more);
23201   if (verbose)
23202     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
23203   return r;
23204 }
23205
23206 /* Adjust the cost of a scheduling dependency.  Return the new cost of
23207    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
23208
23209 static int
23210 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
23211 {
23212   enum attr_type attr_type;
23213
23214   if (! recog_memoized (insn))
23215     return 0;
23216
23217   switch (REG_NOTE_KIND (link))
23218     {
23219     case REG_DEP_TRUE:
23220       {
23221         /* Data dependency; DEP_INSN writes a register that INSN reads
23222            some cycles later.  */
23223
23224         /* Separate a load from a narrower, dependent store.  */
23225         if (rs6000_sched_groups
23226             && GET_CODE (PATTERN (insn)) == SET
23227             && GET_CODE (PATTERN (dep_insn)) == SET
23228             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
23229             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
23230             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
23231                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
23232           return cost + 14;
23233
23234         attr_type = get_attr_type (insn);
23235
23236         switch (attr_type)
23237           {
23238           case TYPE_JMPREG:
23239             /* Tell the first scheduling pass about the latency between
23240                a mtctr and bctr (and mtlr and br/blr).  The first
23241                scheduling pass will not know about this latency since
23242                the mtctr instruction, which has the latency associated
23243                to it, will be generated by reload.  */
23244             return TARGET_POWER ? 5 : 4;
23245           case TYPE_BRANCH:
23246             /* Leave some extra cycles between a compare and its
23247                dependent branch, to inhibit expensive mispredicts.  */
23248             if ((rs6000_cpu_attr == CPU_PPC603
23249                  || rs6000_cpu_attr == CPU_PPC604
23250                  || rs6000_cpu_attr == CPU_PPC604E
23251                  || rs6000_cpu_attr == CPU_PPC620
23252                  || rs6000_cpu_attr == CPU_PPC630
23253                  || rs6000_cpu_attr == CPU_PPC750
23254                  || rs6000_cpu_attr == CPU_PPC7400
23255                  || rs6000_cpu_attr == CPU_PPC7450
23256                  || rs6000_cpu_attr == CPU_POWER4
23257                  || rs6000_cpu_attr == CPU_POWER5
23258                  || rs6000_cpu_attr == CPU_POWER7
23259                  || rs6000_cpu_attr == CPU_CELL)
23260                 && recog_memoized (dep_insn)
23261                 && (INSN_CODE (dep_insn) >= 0))
23262
23263               switch (get_attr_type (dep_insn))
23264                 {
23265                 case TYPE_CMP:
23266                 case TYPE_COMPARE:
23267                 case TYPE_DELAYED_COMPARE:
23268                 case TYPE_IMUL_COMPARE:
23269                 case TYPE_LMUL_COMPARE:
23270                 case TYPE_FPCOMPARE:
23271                 case TYPE_CR_LOGICAL:
23272                 case TYPE_DELAYED_CR:
23273                   return cost + 2;
23274                 default:
23275                   break;
23276                 }
23277             break;
23278
23279           case TYPE_STORE:
23280           case TYPE_STORE_U:
23281           case TYPE_STORE_UX:
23282           case TYPE_FPSTORE:
23283           case TYPE_FPSTORE_U:
23284           case TYPE_FPSTORE_UX:
23285             if ((rs6000_cpu == PROCESSOR_POWER6)
23286                 && recog_memoized (dep_insn)
23287                 && (INSN_CODE (dep_insn) >= 0))
23288               {
23289
23290                 if (GET_CODE (PATTERN (insn)) != SET)
23291                   /* If this happens, we have to extend this to schedule
23292                      optimally.  Return default for now.  */
23293                   return cost;
23294
23295                 /* Adjust the cost for the case where the value written
23296                    by a fixed point operation is used as the address
23297                    gen value on a store. */
23298                 switch (get_attr_type (dep_insn))
23299                   {
23300                   case TYPE_LOAD:
23301                   case TYPE_LOAD_U:
23302                   case TYPE_LOAD_UX:
23303                   case TYPE_CNTLZ:
23304                     {
23305                       if (! store_data_bypass_p (dep_insn, insn))
23306                         return 4;
23307                       break;
23308                     }
23309                   case TYPE_LOAD_EXT:
23310                   case TYPE_LOAD_EXT_U:
23311                   case TYPE_LOAD_EXT_UX:
23312                   case TYPE_VAR_SHIFT_ROTATE:
23313                   case TYPE_VAR_DELAYED_COMPARE:
23314                     {
23315                       if (! store_data_bypass_p (dep_insn, insn))
23316                         return 6;
23317                       break;
23318                     }
23319                   case TYPE_INTEGER:
23320                   case TYPE_COMPARE:
23321                   case TYPE_FAST_COMPARE:
23322                   case TYPE_EXTS:
23323                   case TYPE_SHIFT:
23324                   case TYPE_INSERT_WORD:
23325                   case TYPE_INSERT_DWORD:
23326                   case TYPE_FPLOAD_U:
23327                   case TYPE_FPLOAD_UX:
23328                   case TYPE_STORE_U:
23329                   case TYPE_STORE_UX:
23330                   case TYPE_FPSTORE_U:
23331                   case TYPE_FPSTORE_UX:
23332                     {
23333                       if (! store_data_bypass_p (dep_insn, insn))
23334                         return 3;
23335                       break;
23336                     }
23337                   case TYPE_IMUL:
23338                   case TYPE_IMUL2:
23339                   case TYPE_IMUL3:
23340                   case TYPE_LMUL:
23341                   case TYPE_IMUL_COMPARE:
23342                   case TYPE_LMUL_COMPARE:
23343                     {
23344                       if (! store_data_bypass_p (dep_insn, insn))
23345                         return 17;
23346                       break;
23347                     }
23348                   case TYPE_IDIV:
23349                     {
23350                       if (! store_data_bypass_p (dep_insn, insn))
23351                         return 45;
23352                       break;
23353                     }
23354                   case TYPE_LDIV:
23355                     {
23356                       if (! store_data_bypass_p (dep_insn, insn))
23357                         return 57;
23358                       break;
23359                     }
23360                   default:
23361                     break;
23362                   }
23363               }
23364             break;
23365
23366           case TYPE_LOAD:
23367           case TYPE_LOAD_U:
23368           case TYPE_LOAD_UX:
23369           case TYPE_LOAD_EXT:
23370           case TYPE_LOAD_EXT_U:
23371           case TYPE_LOAD_EXT_UX:
23372             if ((rs6000_cpu == PROCESSOR_POWER6)
23373                 && recog_memoized (dep_insn)
23374                 && (INSN_CODE (dep_insn) >= 0))
23375               {
23376
23377                 /* Adjust the cost for the case where the value written
23378                    by a fixed point instruction is used within the address
23379                    gen portion of a subsequent load(u)(x) */
23380                 switch (get_attr_type (dep_insn))
23381                   {
23382                   case TYPE_LOAD:
23383                   case TYPE_LOAD_U:
23384                   case TYPE_LOAD_UX:
23385                   case TYPE_CNTLZ:
23386                     {
23387                       if (set_to_load_agen (dep_insn, insn))
23388                         return 4;
23389                       break;
23390                     }
23391                   case TYPE_LOAD_EXT:
23392                   case TYPE_LOAD_EXT_U:
23393                   case TYPE_LOAD_EXT_UX:
23394                   case TYPE_VAR_SHIFT_ROTATE:
23395                   case TYPE_VAR_DELAYED_COMPARE:
23396                     {
23397                       if (set_to_load_agen (dep_insn, insn))
23398                         return 6;
23399                       break;
23400                     }
23401                   case TYPE_INTEGER:
23402                   case TYPE_COMPARE:
23403                   case TYPE_FAST_COMPARE:
23404                   case TYPE_EXTS:
23405                   case TYPE_SHIFT:
23406                   case TYPE_INSERT_WORD:
23407                   case TYPE_INSERT_DWORD:
23408                   case TYPE_FPLOAD_U:
23409                   case TYPE_FPLOAD_UX:
23410                   case TYPE_STORE_U:
23411                   case TYPE_STORE_UX:
23412                   case TYPE_FPSTORE_U:
23413                   case TYPE_FPSTORE_UX:
23414                     {
23415                       if (set_to_load_agen (dep_insn, insn))
23416                         return 3;
23417                       break;
23418                     }
23419                   case TYPE_IMUL:
23420                   case TYPE_IMUL2:
23421                   case TYPE_IMUL3:
23422                   case TYPE_LMUL:
23423                   case TYPE_IMUL_COMPARE:
23424                   case TYPE_LMUL_COMPARE:
23425                     {
23426                       if (set_to_load_agen (dep_insn, insn))
23427                         return 17;
23428                       break;
23429                     }
23430                   case TYPE_IDIV:
23431                     {
23432                       if (set_to_load_agen (dep_insn, insn))
23433                         return 45;
23434                       break;
23435                     }
23436                   case TYPE_LDIV:
23437                     {
23438                       if (set_to_load_agen (dep_insn, insn))
23439                         return 57;
23440                       break;
23441                     }
23442                   default:
23443                     break;
23444                   }
23445               }
23446             break;
23447
23448           case TYPE_FPLOAD:
23449             if ((rs6000_cpu == PROCESSOR_POWER6)
23450                 && recog_memoized (dep_insn)
23451                 && (INSN_CODE (dep_insn) >= 0)
23452                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
23453               return 2;
23454
23455           default:
23456             break;
23457           }
23458
23459         /* Fall out to return default cost.  */
23460       }
23461       break;
23462
23463     case REG_DEP_OUTPUT:
23464       /* Output dependency; DEP_INSN writes a register that INSN writes some
23465          cycles later.  */
23466       if ((rs6000_cpu == PROCESSOR_POWER6)
23467           && recog_memoized (dep_insn)
23468           && (INSN_CODE (dep_insn) >= 0))
23469         {
23470           attr_type = get_attr_type (insn);
23471
23472           switch (attr_type)
23473             {
23474             case TYPE_FP:
23475               if (get_attr_type (dep_insn) == TYPE_FP)
23476                 return 1;
23477               break;
23478             case TYPE_FPLOAD:
23479               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
23480                 return 2;
23481               break;
23482             default:
23483               break;
23484             }
23485         }
23486     case REG_DEP_ANTI:
23487       /* Anti dependency; DEP_INSN reads a register that INSN writes some
23488          cycles later.  */
23489       return 0;
23490
23491     default:
23492       gcc_unreachable ();
23493     }
23494
23495   return cost;
23496 }
23497
23498 /* Debug version of rs6000_adjust_cost.  */
23499
23500 static int
23501 rs6000_debug_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
23502 {
23503   int ret = rs6000_adjust_cost (insn, link, dep_insn, cost);
23504
23505   if (ret != cost)
23506     {
23507       const char *dep;
23508
23509       switch (REG_NOTE_KIND (link))
23510         {
23511         default:             dep = "unknown depencency"; break;
23512         case REG_DEP_TRUE:   dep = "data dependency";    break;
23513         case REG_DEP_OUTPUT: dep = "output dependency";  break;
23514         case REG_DEP_ANTI:   dep = "anti depencency";    break;
23515         }
23516
23517       fprintf (stderr,
23518                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
23519                "%s, insn:\n", ret, cost, dep);
23520
23521       debug_rtx (insn);
23522     }
23523
23524   return ret;
23525 }
23526
23527 /* The function returns a true if INSN is microcoded.
23528    Return false otherwise.  */
23529
23530 static bool
23531 is_microcoded_insn (rtx insn)
23532 {
23533   if (!insn || !NONDEBUG_INSN_P (insn)
23534       || GET_CODE (PATTERN (insn)) == USE
23535       || GET_CODE (PATTERN (insn)) == CLOBBER)
23536     return false;
23537
23538   if (rs6000_cpu_attr == CPU_CELL)
23539     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
23540
23541   if (rs6000_sched_groups)
23542     {
23543       enum attr_type type = get_attr_type (insn);
23544       if (type == TYPE_LOAD_EXT_U
23545           || type == TYPE_LOAD_EXT_UX
23546           || type == TYPE_LOAD_UX
23547           || type == TYPE_STORE_UX
23548           || type == TYPE_MFCR)
23549         return true;
23550     }
23551
23552   return false;
23553 }
23554
23555 /* The function returns true if INSN is cracked into 2 instructions
23556    by the processor (and therefore occupies 2 issue slots).  */
23557
23558 static bool
23559 is_cracked_insn (rtx insn)
23560 {
23561   if (!insn || !NONDEBUG_INSN_P (insn)
23562       || GET_CODE (PATTERN (insn)) == USE
23563       || GET_CODE (PATTERN (insn)) == CLOBBER)
23564     return false;
23565
23566   if (rs6000_sched_groups)
23567     {
23568       enum attr_type type = get_attr_type (insn);
23569       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
23570           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
23571           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
23572           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
23573           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
23574           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
23575           || type == TYPE_IDIV || type == TYPE_LDIV
23576           || type == TYPE_INSERT_WORD)
23577         return true;
23578     }
23579
23580   return false;
23581 }
23582
23583 /* The function returns true if INSN can be issued only from
23584    the branch slot.  */
23585
23586 static bool
23587 is_branch_slot_insn (rtx insn)
23588 {
23589   if (!insn || !NONDEBUG_INSN_P (insn)
23590       || GET_CODE (PATTERN (insn)) == USE
23591       || GET_CODE (PATTERN (insn)) == CLOBBER)
23592     return false;
23593
23594   if (rs6000_sched_groups)
23595     {
23596       enum attr_type type = get_attr_type (insn);
23597       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
23598         return true;
23599       return false;
23600     }
23601
23602   return false;
23603 }
23604
23605 /* The function returns true if out_inst sets a value that is
23606    used in the address generation computation of in_insn */
23607 static bool
23608 set_to_load_agen (rtx out_insn, rtx in_insn)
23609 {
23610   rtx out_set, in_set;
23611
23612   /* For performance reasons, only handle the simple case where
23613      both loads are a single_set. */
23614   out_set = single_set (out_insn);
23615   if (out_set)
23616     {
23617       in_set = single_set (in_insn);
23618       if (in_set)
23619         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
23620     }
23621
23622   return false;
23623 }
23624
23625 /* The function returns true if the target storage location of
23626    out_insn is adjacent to the target storage location of in_insn */
23627 /* Return 1 if memory locations are adjacent.  */
23628
23629 static bool
23630 adjacent_mem_locations (rtx insn1, rtx insn2)
23631 {
23632
23633   rtx a = get_store_dest (PATTERN (insn1));
23634   rtx b = get_store_dest (PATTERN (insn2));
23635
23636   if ((GET_CODE (XEXP (a, 0)) == REG
23637        || (GET_CODE (XEXP (a, 0)) == PLUS
23638            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
23639       && (GET_CODE (XEXP (b, 0)) == REG
23640           || (GET_CODE (XEXP (b, 0)) == PLUS
23641               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
23642     {
23643       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
23644       rtx reg0, reg1;
23645
23646       if (GET_CODE (XEXP (a, 0)) == PLUS)
23647         {
23648           reg0 = XEXP (XEXP (a, 0), 0);
23649           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
23650         }
23651       else
23652         reg0 = XEXP (a, 0);
23653
23654       if (GET_CODE (XEXP (b, 0)) == PLUS)
23655         {
23656           reg1 = XEXP (XEXP (b, 0), 0);
23657           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
23658         }
23659       else
23660         reg1 = XEXP (b, 0);
23661
23662       val_diff = val1 - val0;
23663
23664       return ((REGNO (reg0) == REGNO (reg1))
23665               && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
23666                   || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
23667     }
23668
23669   return false;
23670 }
23671
23672 /* A C statement (sans semicolon) to update the integer scheduling
23673    priority INSN_PRIORITY (INSN). Increase the priority to execute the
23674    INSN earlier, reduce the priority to execute INSN later.  Do not
23675    define this macro if you do not need to adjust the scheduling
23676    priorities of insns.  */
23677
23678 static int
23679 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
23680 {
23681   /* On machines (like the 750) which have asymmetric integer units,
23682      where one integer unit can do multiply and divides and the other
23683      can't, reduce the priority of multiply/divide so it is scheduled
23684      before other integer operations.  */
23685
23686 #if 0
23687   if (! INSN_P (insn))
23688     return priority;
23689
23690   if (GET_CODE (PATTERN (insn)) == USE)
23691     return priority;
23692
23693   switch (rs6000_cpu_attr) {
23694   case CPU_PPC750:
23695     switch (get_attr_type (insn))
23696       {
23697       default:
23698         break;
23699
23700       case TYPE_IMUL:
23701       case TYPE_IDIV:
23702         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
23703                  priority, priority);
23704         if (priority >= 0 && priority < 0x01000000)
23705           priority >>= 3;
23706         break;
23707       }
23708   }
23709 #endif
23710
23711   if (insn_must_be_first_in_group (insn)
23712       && reload_completed
23713       && current_sched_info->sched_max_insns_priority
23714       && rs6000_sched_restricted_insns_priority)
23715     {
23716
23717       /* Prioritize insns that can be dispatched only in the first
23718          dispatch slot.  */
23719       if (rs6000_sched_restricted_insns_priority == 1)
23720         /* Attach highest priority to insn. This means that in
23721            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
23722            precede 'priority' (critical path) considerations.  */
23723         return current_sched_info->sched_max_insns_priority;
23724       else if (rs6000_sched_restricted_insns_priority == 2)
23725         /* Increase priority of insn by a minimal amount. This means that in
23726            haifa-sched.c:ready_sort(), only 'priority' (critical path)
23727            considerations precede dispatch-slot restriction considerations.  */
23728         return (priority + 1);
23729     }
23730
23731   if (rs6000_cpu == PROCESSOR_POWER6
23732       && ((load_store_pendulum == -2 && is_load_insn (insn))
23733           || (load_store_pendulum == 2 && is_store_insn (insn))))
23734     /* Attach highest priority to insn if the scheduler has just issued two
23735        stores and this instruction is a load, or two loads and this instruction
23736        is a store. Power6 wants loads and stores scheduled alternately
23737        when possible */
23738     return current_sched_info->sched_max_insns_priority;
23739
23740   return priority;
23741 }
23742
23743 /* Return true if the instruction is nonpipelined on the Cell. */
23744 static bool
23745 is_nonpipeline_insn (rtx insn)
23746 {
23747   enum attr_type type;
23748   if (!insn || !NONDEBUG_INSN_P (insn)
23749       || GET_CODE (PATTERN (insn)) == USE
23750       || GET_CODE (PATTERN (insn)) == CLOBBER)
23751     return false;
23752
23753   type = get_attr_type (insn);
23754   if (type == TYPE_IMUL
23755       || type == TYPE_IMUL2
23756       || type == TYPE_IMUL3
23757       || type == TYPE_LMUL
23758       || type == TYPE_IDIV
23759       || type == TYPE_LDIV
23760       || type == TYPE_SDIV
23761       || type == TYPE_DDIV
23762       || type == TYPE_SSQRT
23763       || type == TYPE_DSQRT
23764       || type == TYPE_MFCR
23765       || type == TYPE_MFCRF
23766       || type == TYPE_MFJMPR)
23767     {
23768       return true;
23769     }
23770   return false;
23771 }
23772
23773
23774 /* Return how many instructions the machine can issue per cycle.  */
23775
23776 static int
23777 rs6000_issue_rate (void)
23778 {
23779   /* Unless scheduling for register pressure, use issue rate of 1 for
23780      first scheduling pass to decrease degradation.  */
23781   if (!reload_completed && !flag_sched_pressure)
23782     return 1;
23783
23784   switch (rs6000_cpu_attr) {
23785   case CPU_RIOS1:  /* ? */
23786   case CPU_RS64A:
23787   case CPU_PPC601: /* ? */
23788   case CPU_PPC7450:
23789     return 3;
23790   case CPU_PPC440:
23791   case CPU_PPC603:
23792   case CPU_PPC750:
23793   case CPU_PPC7400:
23794   case CPU_PPC8540:
23795   case CPU_CELL:
23796   case CPU_PPCE300C2:
23797   case CPU_PPCE300C3:
23798   case CPU_PPCE500MC:
23799   case CPU_PPCE500MC64:
23800   case CPU_TITAN:
23801     return 2;
23802   case CPU_RIOS2:
23803   case CPU_PPC476:
23804   case CPU_PPC604:
23805   case CPU_PPC604E:
23806   case CPU_PPC620:
23807   case CPU_PPC630:
23808     return 4;
23809   case CPU_POWER4:
23810   case CPU_POWER5:
23811   case CPU_POWER6:
23812   case CPU_POWER7:
23813     return 5;
23814   default:
23815     return 1;
23816   }
23817 }
23818
23819 /* Return how many instructions to look ahead for better insn
23820    scheduling.  */
23821
23822 static int
23823 rs6000_use_sched_lookahead (void)
23824 {
23825   if (rs6000_cpu_attr == CPU_PPC8540)
23826     return 4;
23827   if (rs6000_cpu_attr == CPU_CELL)
23828     return (reload_completed ? 8 : 0);
23829   return 0;
23830 }
23831
23832 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
23833 static int
23834 rs6000_use_sched_lookahead_guard (rtx insn)
23835 {
23836   if (rs6000_cpu_attr != CPU_CELL)
23837     return 1;
23838
23839    if (insn == NULL_RTX || !INSN_P (insn))
23840      abort ();
23841
23842   if (!reload_completed
23843       || is_nonpipeline_insn (insn)
23844       || is_microcoded_insn (insn))
23845     return 0;
23846
23847   return 1;
23848 }
23849
23850 /* Determine is PAT refers to memory.  */
23851
23852 static bool
23853 is_mem_ref (rtx pat)
23854 {
23855   const char * fmt;
23856   int i, j;
23857   bool ret = false;
23858
23859   /* stack_tie does not produce any real memory traffic.  */
23860   if (GET_CODE (pat) == UNSPEC
23861       && XINT (pat, 1) == UNSPEC_TIE)
23862     return false;
23863
23864   if (GET_CODE (pat) == MEM)
23865     return true;
23866
23867   /* Recursively process the pattern.  */
23868   fmt = GET_RTX_FORMAT (GET_CODE (pat));
23869
23870   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
23871     {
23872       if (fmt[i] == 'e')
23873         ret |= is_mem_ref (XEXP (pat, i));
23874       else if (fmt[i] == 'E')
23875         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
23876           ret |= is_mem_ref (XVECEXP (pat, i, j));
23877     }
23878
23879   return ret;
23880 }
23881
23882 /* Determine if PAT is a PATTERN of a load insn.  */
23883
23884 static bool
23885 is_load_insn1 (rtx pat)
23886 {
23887   if (!pat || pat == NULL_RTX)
23888     return false;
23889
23890   if (GET_CODE (pat) == SET)
23891     return is_mem_ref (SET_SRC (pat));
23892
23893   if (GET_CODE (pat) == PARALLEL)
23894     {
23895       int i;
23896
23897       for (i = 0; i < XVECLEN (pat, 0); i++)
23898         if (is_load_insn1 (XVECEXP (pat, 0, i)))
23899           return true;
23900     }
23901
23902   return false;
23903 }
23904
23905 /* Determine if INSN loads from memory.  */
23906
23907 static bool
23908 is_load_insn (rtx insn)
23909 {
23910   if (!insn || !INSN_P (insn))
23911     return false;
23912
23913   if (GET_CODE (insn) == CALL_INSN)
23914     return false;
23915
23916   return is_load_insn1 (PATTERN (insn));
23917 }
23918
23919 /* Determine if PAT is a PATTERN of a store insn.  */
23920
23921 static bool
23922 is_store_insn1 (rtx pat)
23923 {
23924   if (!pat || pat == NULL_RTX)
23925     return false;
23926
23927   if (GET_CODE (pat) == SET)
23928     return is_mem_ref (SET_DEST (pat));
23929
23930   if (GET_CODE (pat) == PARALLEL)
23931     {
23932       int i;
23933
23934       for (i = 0; i < XVECLEN (pat, 0); i++)
23935         if (is_store_insn1 (XVECEXP (pat, 0, i)))
23936           return true;
23937     }
23938
23939   return false;
23940 }
23941
23942 /* Determine if INSN stores to memory.  */
23943
23944 static bool
23945 is_store_insn (rtx insn)
23946 {
23947   if (!insn || !INSN_P (insn))
23948     return false;
23949
23950   return is_store_insn1 (PATTERN (insn));
23951 }
23952
23953 /* Return the dest of a store insn.  */
23954
23955 static rtx
23956 get_store_dest (rtx pat)
23957 {
23958   gcc_assert (is_store_insn1 (pat));
23959
23960   if (GET_CODE (pat) == SET)
23961     return SET_DEST (pat);
23962   else if (GET_CODE (pat) == PARALLEL)
23963     {
23964       int i;
23965
23966       for (i = 0; i < XVECLEN (pat, 0); i++)
23967         {
23968           rtx inner_pat = XVECEXP (pat, 0, i);
23969           if (GET_CODE (inner_pat) == SET
23970               && is_mem_ref (SET_DEST (inner_pat)))
23971             return inner_pat;
23972         }
23973     }
23974   /* We shouldn't get here, because we should have either a simple
23975      store insn or a store with update which are covered above.  */
23976   gcc_unreachable();
23977 }
23978
23979 /* Returns whether the dependence between INSN and NEXT is considered
23980    costly by the given target.  */
23981
23982 static bool
23983 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
23984 {
23985   rtx insn;
23986   rtx next;
23987
23988   /* If the flag is not enabled - no dependence is considered costly;
23989      allow all dependent insns in the same group.
23990      This is the most aggressive option.  */
23991   if (rs6000_sched_costly_dep == no_dep_costly)
23992     return false;
23993
23994   /* If the flag is set to 1 - a dependence is always considered costly;
23995      do not allow dependent instructions in the same group.
23996      This is the most conservative option.  */
23997   if (rs6000_sched_costly_dep == all_deps_costly)
23998     return true;
23999
24000   insn = DEP_PRO (dep);
24001   next = DEP_CON (dep);
24002
24003   if (rs6000_sched_costly_dep == store_to_load_dep_costly
24004       && is_load_insn (next)
24005       && is_store_insn (insn))
24006     /* Prevent load after store in the same group.  */
24007     return true;
24008
24009   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
24010       && is_load_insn (next)
24011       && is_store_insn (insn)
24012       && DEP_TYPE (dep) == REG_DEP_TRUE)
24013      /* Prevent load after store in the same group if it is a true
24014         dependence.  */
24015      return true;
24016
24017   /* The flag is set to X; dependences with latency >= X are considered costly,
24018      and will not be scheduled in the same group.  */
24019   if (rs6000_sched_costly_dep <= max_dep_latency
24020       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
24021     return true;
24022
24023   return false;
24024 }
24025
24026 /* Return the next insn after INSN that is found before TAIL is reached,
24027    skipping any "non-active" insns - insns that will not actually occupy
24028    an issue slot.  Return NULL_RTX if such an insn is not found.  */
24029
24030 static rtx
24031 get_next_active_insn (rtx insn, rtx tail)
24032 {
24033   if (insn == NULL_RTX || insn == tail)
24034     return NULL_RTX;
24035
24036   while (1)
24037     {
24038       insn = NEXT_INSN (insn);
24039       if (insn == NULL_RTX || insn == tail)
24040         return NULL_RTX;
24041
24042       if (CALL_P (insn)
24043           || JUMP_P (insn)
24044           || (NONJUMP_INSN_P (insn)
24045               && GET_CODE (PATTERN (insn)) != USE
24046               && GET_CODE (PATTERN (insn)) != CLOBBER
24047               && INSN_CODE (insn) != CODE_FOR_stack_tie))
24048         break;
24049     }
24050   return insn;
24051 }
24052
24053 /* We are about to begin issuing insns for this clock cycle. */
24054
24055 static int
24056 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
24057                         rtx *ready ATTRIBUTE_UNUSED,
24058                         int *pn_ready ATTRIBUTE_UNUSED,
24059                         int clock_var ATTRIBUTE_UNUSED)
24060 {
24061   int n_ready = *pn_ready;
24062
24063   if (sched_verbose)
24064     fprintf (dump, "// rs6000_sched_reorder :\n");
24065
24066   /* Reorder the ready list, if the second to last ready insn
24067      is a nonepipeline insn.  */
24068   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
24069   {
24070     if (is_nonpipeline_insn (ready[n_ready - 1])
24071         && (recog_memoized (ready[n_ready - 2]) > 0))
24072       /* Simply swap first two insns.  */
24073       {
24074         rtx tmp = ready[n_ready - 1];
24075         ready[n_ready - 1] = ready[n_ready - 2];
24076         ready[n_ready - 2] = tmp;
24077       }
24078   }
24079
24080   if (rs6000_cpu == PROCESSOR_POWER6)
24081     load_store_pendulum = 0;
24082
24083   return rs6000_issue_rate ();
24084 }
24085
24086 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
24087
24088 static int
24089 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
24090                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
24091 {
24092   if (sched_verbose)
24093     fprintf (dump, "// rs6000_sched_reorder2 :\n");
24094
24095   /* For Power6, we need to handle some special cases to try and keep the
24096      store queue from overflowing and triggering expensive flushes.
24097
24098      This code monitors how load and store instructions are being issued
24099      and skews the ready list one way or the other to increase the likelihood
24100      that a desired instruction is issued at the proper time.
24101
24102      A couple of things are done.  First, we maintain a "load_store_pendulum"
24103      to track the current state of load/store issue.
24104
24105        - If the pendulum is at zero, then no loads or stores have been
24106          issued in the current cycle so we do nothing.
24107
24108        - If the pendulum is 1, then a single load has been issued in this
24109          cycle and we attempt to locate another load in the ready list to
24110          issue with it.
24111
24112        - If the pendulum is -2, then two stores have already been
24113          issued in this cycle, so we increase the priority of the first load
24114          in the ready list to increase it's likelihood of being chosen first
24115          in the next cycle.
24116
24117        - If the pendulum is -1, then a single store has been issued in this
24118          cycle and we attempt to locate another store in the ready list to
24119          issue with it, preferring a store to an adjacent memory location to
24120          facilitate store pairing in the store queue.
24121
24122        - If the pendulum is 2, then two loads have already been
24123          issued in this cycle, so we increase the priority of the first store
24124          in the ready list to increase it's likelihood of being chosen first
24125          in the next cycle.
24126
24127        - If the pendulum < -2 or > 2, then do nothing.
24128
24129        Note: This code covers the most common scenarios.  There exist non
24130              load/store instructions which make use of the LSU and which
24131              would need to be accounted for to strictly model the behavior
24132              of the machine.  Those instructions are currently unaccounted
24133              for to help minimize compile time overhead of this code.
24134    */
24135   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
24136     {
24137       int pos;
24138       int i;
24139       rtx tmp;
24140
24141       if (is_store_insn (last_scheduled_insn))
24142         /* Issuing a store, swing the load_store_pendulum to the left */
24143         load_store_pendulum--;
24144       else if (is_load_insn (last_scheduled_insn))
24145         /* Issuing a load, swing the load_store_pendulum to the right */
24146         load_store_pendulum++;
24147       else
24148         return cached_can_issue_more;
24149
24150       /* If the pendulum is balanced, or there is only one instruction on
24151          the ready list, then all is well, so return. */
24152       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
24153         return cached_can_issue_more;
24154
24155       if (load_store_pendulum == 1)
24156         {
24157           /* A load has been issued in this cycle.  Scan the ready list
24158              for another load to issue with it */
24159           pos = *pn_ready-1;
24160
24161           while (pos >= 0)
24162             {
24163               if (is_load_insn (ready[pos]))
24164                 {
24165                   /* Found a load.  Move it to the head of the ready list,
24166                      and adjust it's priority so that it is more likely to
24167                      stay there */
24168                   tmp = ready[pos];
24169                   for (i=pos; i<*pn_ready-1; i++)
24170                     ready[i] = ready[i + 1];
24171                   ready[*pn_ready-1] = tmp;
24172
24173                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
24174                     INSN_PRIORITY (tmp)++;
24175                   break;
24176                 }
24177               pos--;
24178             }
24179         }
24180       else if (load_store_pendulum == -2)
24181         {
24182           /* Two stores have been issued in this cycle.  Increase the
24183              priority of the first load in the ready list to favor it for
24184              issuing in the next cycle. */
24185           pos = *pn_ready-1;
24186
24187           while (pos >= 0)
24188             {
24189               if (is_load_insn (ready[pos])
24190                   && !sel_sched_p ()
24191                   && INSN_PRIORITY_KNOWN (ready[pos]))
24192                 {
24193                   INSN_PRIORITY (ready[pos])++;
24194
24195                   /* Adjust the pendulum to account for the fact that a load
24196                      was found and increased in priority.  This is to prevent
24197                      increasing the priority of multiple loads */
24198                   load_store_pendulum--;
24199
24200                   break;
24201                 }
24202               pos--;
24203             }
24204         }
24205       else if (load_store_pendulum == -1)
24206         {
24207           /* A store has been issued in this cycle.  Scan the ready list for
24208              another store to issue with it, preferring a store to an adjacent
24209              memory location */
24210           int first_store_pos = -1;
24211
24212           pos = *pn_ready-1;
24213
24214           while (pos >= 0)
24215             {
24216               if (is_store_insn (ready[pos]))
24217                 {
24218                   /* Maintain the index of the first store found on the
24219                      list */
24220                   if (first_store_pos == -1)
24221                     first_store_pos = pos;
24222
24223                   if (is_store_insn (last_scheduled_insn)
24224                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
24225                     {
24226                       /* Found an adjacent store.  Move it to the head of the
24227                          ready list, and adjust it's priority so that it is
24228                          more likely to stay there */
24229                       tmp = ready[pos];
24230                       for (i=pos; i<*pn_ready-1; i++)
24231                         ready[i] = ready[i + 1];
24232                       ready[*pn_ready-1] = tmp;
24233
24234                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
24235                         INSN_PRIORITY (tmp)++;
24236
24237                       first_store_pos = -1;
24238
24239                       break;
24240                     };
24241                 }
24242               pos--;
24243             }
24244
24245           if (first_store_pos >= 0)
24246             {
24247               /* An adjacent store wasn't found, but a non-adjacent store was,
24248                  so move the non-adjacent store to the front of the ready
24249                  list, and adjust its priority so that it is more likely to
24250                  stay there. */
24251               tmp = ready[first_store_pos];
24252               for (i=first_store_pos; i<*pn_ready-1; i++)
24253                 ready[i] = ready[i + 1];
24254               ready[*pn_ready-1] = tmp;
24255               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
24256                 INSN_PRIORITY (tmp)++;
24257             }
24258         }
24259       else if (load_store_pendulum == 2)
24260        {
24261            /* Two loads have been issued in this cycle.  Increase the priority
24262               of the first store in the ready list to favor it for issuing in
24263               the next cycle. */
24264           pos = *pn_ready-1;
24265
24266           while (pos >= 0)
24267             {
24268               if (is_store_insn (ready[pos])
24269                   && !sel_sched_p ()
24270                   && INSN_PRIORITY_KNOWN (ready[pos]))
24271                 {
24272                   INSN_PRIORITY (ready[pos])++;
24273
24274                   /* Adjust the pendulum to account for the fact that a store
24275                      was found and increased in priority.  This is to prevent
24276                      increasing the priority of multiple stores */
24277                   load_store_pendulum++;
24278
24279                   break;
24280                 }
24281               pos--;
24282             }
24283         }
24284     }
24285
24286   return cached_can_issue_more;
24287 }
24288
24289 /* Return whether the presence of INSN causes a dispatch group termination
24290    of group WHICH_GROUP.
24291
24292    If WHICH_GROUP == current_group, this function will return true if INSN
24293    causes the termination of the current group (i.e, the dispatch group to
24294    which INSN belongs). This means that INSN will be the last insn in the
24295    group it belongs to.
24296
24297    If WHICH_GROUP == previous_group, this function will return true if INSN
24298    causes the termination of the previous group (i.e, the dispatch group that
24299    precedes the group to which INSN belongs).  This means that INSN will be
24300    the first insn in the group it belongs to).  */
24301
24302 static bool
24303 insn_terminates_group_p (rtx insn, enum group_termination which_group)
24304 {
24305   bool first, last;
24306
24307   if (! insn)
24308     return false;
24309
24310   first = insn_must_be_first_in_group (insn);
24311   last = insn_must_be_last_in_group (insn);
24312
24313   if (first && last)
24314     return true;
24315
24316   if (which_group == current_group)
24317     return last;
24318   else if (which_group == previous_group)
24319     return first;
24320
24321   return false;
24322 }
24323
24324
24325 static bool
24326 insn_must_be_first_in_group (rtx insn)
24327 {
24328   enum attr_type type;
24329
24330   if (!insn
24331       || GET_CODE (insn) == NOTE
24332       || DEBUG_INSN_P (insn)
24333       || GET_CODE (PATTERN (insn)) == USE
24334       || GET_CODE (PATTERN (insn)) == CLOBBER)
24335     return false;
24336
24337   switch (rs6000_cpu)
24338     {
24339     case PROCESSOR_POWER5:
24340       if (is_cracked_insn (insn))
24341         return true;
24342     case PROCESSOR_POWER4:
24343       if (is_microcoded_insn (insn))
24344         return true;
24345
24346       if (!rs6000_sched_groups)
24347         return false;
24348
24349       type = get_attr_type (insn);
24350
24351       switch (type)
24352         {
24353         case TYPE_MFCR:
24354         case TYPE_MFCRF:
24355         case TYPE_MTCR:
24356         case TYPE_DELAYED_CR:
24357         case TYPE_CR_LOGICAL:
24358         case TYPE_MTJMPR:
24359         case TYPE_MFJMPR:
24360         case TYPE_IDIV:
24361         case TYPE_LDIV:
24362         case TYPE_LOAD_L:
24363         case TYPE_STORE_C:
24364         case TYPE_ISYNC:
24365         case TYPE_SYNC:
24366           return true;
24367         default:
24368           break;
24369         }
24370       break;
24371     case PROCESSOR_POWER6:
24372       type = get_attr_type (insn);
24373
24374       switch (type)
24375         {
24376         case TYPE_INSERT_DWORD:
24377         case TYPE_EXTS:
24378         case TYPE_CNTLZ:
24379         case TYPE_SHIFT:
24380         case TYPE_VAR_SHIFT_ROTATE:
24381         case TYPE_TRAP:
24382         case TYPE_IMUL:
24383         case TYPE_IMUL2:
24384         case TYPE_IMUL3:
24385         case TYPE_LMUL:
24386         case TYPE_IDIV:
24387         case TYPE_INSERT_WORD:
24388         case TYPE_DELAYED_COMPARE:
24389         case TYPE_IMUL_COMPARE:
24390         case TYPE_LMUL_COMPARE:
24391         case TYPE_FPCOMPARE:
24392         case TYPE_MFCR:
24393         case TYPE_MTCR:
24394         case TYPE_MFJMPR:
24395         case TYPE_MTJMPR:
24396         case TYPE_ISYNC:
24397         case TYPE_SYNC:
24398         case TYPE_LOAD_L:
24399         case TYPE_STORE_C:
24400         case TYPE_LOAD_U:
24401         case TYPE_LOAD_UX:
24402         case TYPE_LOAD_EXT_UX:
24403         case TYPE_STORE_U:
24404         case TYPE_STORE_UX:
24405         case TYPE_FPLOAD_U:
24406         case TYPE_FPLOAD_UX:
24407         case TYPE_FPSTORE_U:
24408         case TYPE_FPSTORE_UX:
24409           return true;
24410         default:
24411           break;
24412         }
24413       break;
24414     case PROCESSOR_POWER7:
24415       type = get_attr_type (insn);
24416
24417       switch (type)
24418         {
24419         case TYPE_CR_LOGICAL:
24420         case TYPE_MFCR:
24421         case TYPE_MFCRF:
24422         case TYPE_MTCR:
24423         case TYPE_IDIV:
24424         case TYPE_LDIV:
24425         case TYPE_COMPARE:
24426         case TYPE_DELAYED_COMPARE:
24427         case TYPE_VAR_DELAYED_COMPARE:
24428         case TYPE_ISYNC:
24429         case TYPE_LOAD_L:
24430         case TYPE_STORE_C:
24431         case TYPE_LOAD_U:
24432         case TYPE_LOAD_UX:
24433         case TYPE_LOAD_EXT:
24434         case TYPE_LOAD_EXT_U:
24435         case TYPE_LOAD_EXT_UX:
24436         case TYPE_STORE_U:
24437         case TYPE_STORE_UX:
24438         case TYPE_FPLOAD_U:
24439         case TYPE_FPLOAD_UX:
24440         case TYPE_FPSTORE_U:
24441         case TYPE_FPSTORE_UX:
24442         case TYPE_MFJMPR:
24443         case TYPE_MTJMPR:
24444           return true;
24445         default:
24446           break;
24447         }
24448       break;
24449     default:
24450       break;
24451     }
24452
24453   return false;
24454 }
24455
24456 static bool
24457 insn_must_be_last_in_group (rtx insn)
24458 {
24459   enum attr_type type;
24460
24461   if (!insn
24462       || GET_CODE (insn) == NOTE
24463       || DEBUG_INSN_P (insn)
24464       || GET_CODE (PATTERN (insn)) == USE
24465       || GET_CODE (PATTERN (insn)) == CLOBBER)
24466     return false;
24467
24468   switch (rs6000_cpu) {
24469   case PROCESSOR_POWER4:
24470   case PROCESSOR_POWER5:
24471     if (is_microcoded_insn (insn))
24472       return true;
24473
24474     if (is_branch_slot_insn (insn))
24475       return true;
24476
24477     break;
24478   case PROCESSOR_POWER6:
24479     type = get_attr_type (insn);
24480
24481     switch (type)
24482       {
24483       case TYPE_EXTS:
24484       case TYPE_CNTLZ:
24485       case TYPE_SHIFT:
24486       case TYPE_VAR_SHIFT_ROTATE:
24487       case TYPE_TRAP:
24488       case TYPE_IMUL:
24489       case TYPE_IMUL2:
24490       case TYPE_IMUL3:
24491       case TYPE_LMUL:
24492       case TYPE_IDIV:
24493       case TYPE_DELAYED_COMPARE:
24494       case TYPE_IMUL_COMPARE:
24495       case TYPE_LMUL_COMPARE:
24496       case TYPE_FPCOMPARE:
24497       case TYPE_MFCR:
24498       case TYPE_MTCR:
24499       case TYPE_MFJMPR:
24500       case TYPE_MTJMPR:
24501       case TYPE_ISYNC:
24502       case TYPE_SYNC:
24503       case TYPE_LOAD_L:
24504       case TYPE_STORE_C:
24505         return true;
24506       default:
24507         break;
24508     }
24509     break;
24510   case PROCESSOR_POWER7:
24511     type = get_attr_type (insn);
24512
24513     switch (type)
24514       {
24515       case TYPE_ISYNC:
24516       case TYPE_SYNC:
24517       case TYPE_LOAD_L:
24518       case TYPE_STORE_C:
24519       case TYPE_LOAD_EXT_U:
24520       case TYPE_LOAD_EXT_UX:
24521       case TYPE_STORE_UX:
24522         return true;
24523       default:
24524         break;
24525     }
24526     break;
24527   default:
24528     break;
24529   }
24530
24531   return false;
24532 }
24533
24534 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
24535    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
24536
24537 static bool
24538 is_costly_group (rtx *group_insns, rtx next_insn)
24539 {
24540   int i;
24541   int issue_rate = rs6000_issue_rate ();
24542
24543   for (i = 0; i < issue_rate; i++)
24544     {
24545       sd_iterator_def sd_it;
24546       dep_t dep;
24547       rtx insn = group_insns[i];
24548
24549       if (!insn)
24550         continue;
24551
24552       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
24553         {
24554           rtx next = DEP_CON (dep);
24555
24556           if (next == next_insn
24557               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
24558             return true;
24559         }
24560     }
24561
24562   return false;
24563 }
24564
24565 /* Utility of the function redefine_groups.
24566    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
24567    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
24568    to keep it "far" (in a separate group) from GROUP_INSNS, following
24569    one of the following schemes, depending on the value of the flag
24570    -minsert_sched_nops = X:
24571    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
24572        in order to force NEXT_INSN into a separate group.
24573    (2) X < sched_finish_regroup_exact: insert exactly X nops.
24574    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
24575    insertion (has a group just ended, how many vacant issue slots remain in the
24576    last group, and how many dispatch groups were encountered so far).  */
24577
24578 static int
24579 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
24580                  rtx next_insn, bool *group_end, int can_issue_more,
24581                  int *group_count)
24582 {
24583   rtx nop;
24584   bool force;
24585   int issue_rate = rs6000_issue_rate ();
24586   bool end = *group_end;
24587   int i;
24588
24589   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
24590     return can_issue_more;
24591
24592   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
24593     return can_issue_more;
24594
24595   force = is_costly_group (group_insns, next_insn);
24596   if (!force)
24597     return can_issue_more;
24598
24599   if (sched_verbose > 6)
24600     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
24601              *group_count ,can_issue_more);
24602
24603   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
24604     {
24605       if (*group_end)
24606         can_issue_more = 0;
24607
24608       /* Since only a branch can be issued in the last issue_slot, it is
24609          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
24610          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
24611          in this case the last nop will start a new group and the branch
24612          will be forced to the new group.  */
24613       if (can_issue_more && !is_branch_slot_insn (next_insn))
24614         can_issue_more--;
24615
24616       while (can_issue_more > 0)
24617         {
24618           nop = gen_nop ();
24619           emit_insn_before (nop, next_insn);
24620           can_issue_more--;
24621         }
24622
24623       *group_end = true;
24624       return 0;
24625     }
24626
24627   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
24628     {
24629       int n_nops = rs6000_sched_insert_nops;
24630
24631       /* Nops can't be issued from the branch slot, so the effective
24632          issue_rate for nops is 'issue_rate - 1'.  */
24633       if (can_issue_more == 0)
24634         can_issue_more = issue_rate;
24635       can_issue_more--;
24636       if (can_issue_more == 0)
24637         {
24638           can_issue_more = issue_rate - 1;
24639           (*group_count)++;
24640           end = true;
24641           for (i = 0; i < issue_rate; i++)
24642             {
24643               group_insns[i] = 0;
24644             }
24645         }
24646
24647       while (n_nops > 0)
24648         {
24649           nop = gen_nop ();
24650           emit_insn_before (nop, next_insn);
24651           if (can_issue_more == issue_rate - 1) /* new group begins */
24652             end = false;
24653           can_issue_more--;
24654           if (can_issue_more == 0)
24655             {
24656               can_issue_more = issue_rate - 1;
24657               (*group_count)++;
24658               end = true;
24659               for (i = 0; i < issue_rate; i++)
24660                 {
24661                   group_insns[i] = 0;
24662                 }
24663             }
24664           n_nops--;
24665         }
24666
24667       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
24668       can_issue_more++;
24669
24670       /* Is next_insn going to start a new group?  */
24671       *group_end
24672         = (end
24673            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24674            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24675            || (can_issue_more < issue_rate &&
24676                insn_terminates_group_p (next_insn, previous_group)));
24677       if (*group_end && end)
24678         (*group_count)--;
24679
24680       if (sched_verbose > 6)
24681         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
24682                  *group_count, can_issue_more);
24683       return can_issue_more;
24684     }
24685
24686   return can_issue_more;
24687 }
24688
24689 /* This function tries to synch the dispatch groups that the compiler "sees"
24690    with the dispatch groups that the processor dispatcher is expected to
24691    form in practice.  It tries to achieve this synchronization by forcing the
24692    estimated processor grouping on the compiler (as opposed to the function
24693    'pad_goups' which tries to force the scheduler's grouping on the processor).
24694
24695    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
24696    examines the (estimated) dispatch groups that will be formed by the processor
24697    dispatcher.  It marks these group boundaries to reflect the estimated
24698    processor grouping, overriding the grouping that the scheduler had marked.
24699    Depending on the value of the flag '-minsert-sched-nops' this function can
24700    force certain insns into separate groups or force a certain distance between
24701    them by inserting nops, for example, if there exists a "costly dependence"
24702    between the insns.
24703
24704    The function estimates the group boundaries that the processor will form as
24705    follows:  It keeps track of how many vacant issue slots are available after
24706    each insn.  A subsequent insn will start a new group if one of the following
24707    4 cases applies:
24708    - no more vacant issue slots remain in the current dispatch group.
24709    - only the last issue slot, which is the branch slot, is vacant, but the next
24710      insn is not a branch.
24711    - only the last 2 or less issue slots, including the branch slot, are vacant,
24712      which means that a cracked insn (which occupies two issue slots) can't be
24713      issued in this group.
24714    - less than 'issue_rate' slots are vacant, and the next insn always needs to
24715      start a new group.  */
24716
24717 static int
24718 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24719 {
24720   rtx insn, next_insn;
24721   int issue_rate;
24722   int can_issue_more;
24723   int slot, i;
24724   bool group_end;
24725   int group_count = 0;
24726   rtx *group_insns;
24727
24728   /* Initialize.  */
24729   issue_rate = rs6000_issue_rate ();
24730   group_insns = XALLOCAVEC (rtx, issue_rate);
24731   for (i = 0; i < issue_rate; i++)
24732     {
24733       group_insns[i] = 0;
24734     }
24735   can_issue_more = issue_rate;
24736   slot = 0;
24737   insn = get_next_active_insn (prev_head_insn, tail);
24738   group_end = false;
24739
24740   while (insn != NULL_RTX)
24741     {
24742       slot = (issue_rate - can_issue_more);
24743       group_insns[slot] = insn;
24744       can_issue_more =
24745         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24746       if (insn_terminates_group_p (insn, current_group))
24747         can_issue_more = 0;
24748
24749       next_insn = get_next_active_insn (insn, tail);
24750       if (next_insn == NULL_RTX)
24751         return group_count + 1;
24752
24753       /* Is next_insn going to start a new group?  */
24754       group_end
24755         = (can_issue_more == 0
24756            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24757            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24758            || (can_issue_more < issue_rate &&
24759                insn_terminates_group_p (next_insn, previous_group)));
24760
24761       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
24762                                         next_insn, &group_end, can_issue_more,
24763                                         &group_count);
24764
24765       if (group_end)
24766         {
24767           group_count++;
24768           can_issue_more = 0;
24769           for (i = 0; i < issue_rate; i++)
24770             {
24771               group_insns[i] = 0;
24772             }
24773         }
24774
24775       if (GET_MODE (next_insn) == TImode && can_issue_more)
24776         PUT_MODE (next_insn, VOIDmode);
24777       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
24778         PUT_MODE (next_insn, TImode);
24779
24780       insn = next_insn;
24781       if (can_issue_more == 0)
24782         can_issue_more = issue_rate;
24783     } /* while */
24784
24785   return group_count;
24786 }
24787
24788 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
24789    dispatch group boundaries that the scheduler had marked.  Pad with nops
24790    any dispatch groups which have vacant issue slots, in order to force the
24791    scheduler's grouping on the processor dispatcher.  The function
24792    returns the number of dispatch groups found.  */
24793
24794 static int
24795 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24796 {
24797   rtx insn, next_insn;
24798   rtx nop;
24799   int issue_rate;
24800   int can_issue_more;
24801   int group_end;
24802   int group_count = 0;
24803
24804   /* Initialize issue_rate.  */
24805   issue_rate = rs6000_issue_rate ();
24806   can_issue_more = issue_rate;
24807
24808   insn = get_next_active_insn (prev_head_insn, tail);
24809   next_insn = get_next_active_insn (insn, tail);
24810
24811   while (insn != NULL_RTX)
24812     {
24813       can_issue_more =
24814         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24815
24816       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
24817
24818       if (next_insn == NULL_RTX)
24819         break;
24820
24821       if (group_end)
24822         {
24823           /* If the scheduler had marked group termination at this location
24824              (between insn and next_insn), and neither insn nor next_insn will
24825              force group termination, pad the group with nops to force group
24826              termination.  */
24827           if (can_issue_more
24828               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
24829               && !insn_terminates_group_p (insn, current_group)
24830               && !insn_terminates_group_p (next_insn, previous_group))
24831             {
24832               if (!is_branch_slot_insn (next_insn))
24833                 can_issue_more--;
24834
24835               while (can_issue_more)
24836                 {
24837                   nop = gen_nop ();
24838                   emit_insn_before (nop, next_insn);
24839                   can_issue_more--;
24840                 }
24841             }
24842
24843           can_issue_more = issue_rate;
24844           group_count++;
24845         }
24846
24847       insn = next_insn;
24848       next_insn = get_next_active_insn (insn, tail);
24849     }
24850
24851   return group_count;
24852 }
24853
24854 /* We're beginning a new block.  Initialize data structures as necessary.  */
24855
24856 static void
24857 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
24858                      int sched_verbose ATTRIBUTE_UNUSED,
24859                      int max_ready ATTRIBUTE_UNUSED)
24860 {
24861   last_scheduled_insn = NULL_RTX;
24862   load_store_pendulum = 0;
24863 }
24864
24865 /* The following function is called at the end of scheduling BB.
24866    After reload, it inserts nops at insn group bundling.  */
24867
24868 static void
24869 rs6000_sched_finish (FILE *dump, int sched_verbose)
24870 {
24871   int n_groups;
24872
24873   if (sched_verbose)
24874     fprintf (dump, "=== Finishing schedule.\n");
24875
24876   if (reload_completed && rs6000_sched_groups)
24877     {
24878       /* Do not run sched_finish hook when selective scheduling enabled.  */
24879       if (sel_sched_p ())
24880         return;
24881
24882       if (rs6000_sched_insert_nops == sched_finish_none)
24883         return;
24884
24885       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
24886         n_groups = pad_groups (dump, sched_verbose,
24887                                current_sched_info->prev_head,
24888                                current_sched_info->next_tail);
24889       else
24890         n_groups = redefine_groups (dump, sched_verbose,
24891                                     current_sched_info->prev_head,
24892                                     current_sched_info->next_tail);
24893
24894       if (sched_verbose >= 6)
24895         {
24896           fprintf (dump, "ngroups = %d\n", n_groups);
24897           print_rtl (dump, current_sched_info->prev_head);
24898           fprintf (dump, "Done finish_sched\n");
24899         }
24900     }
24901 }
24902
24903 struct _rs6000_sched_context
24904 {
24905   short cached_can_issue_more;
24906   rtx last_scheduled_insn;
24907   int load_store_pendulum;
24908 };
24909
24910 typedef struct _rs6000_sched_context rs6000_sched_context_def;
24911 typedef rs6000_sched_context_def *rs6000_sched_context_t;
24912
24913 /* Allocate store for new scheduling context.  */
24914 static void *
24915 rs6000_alloc_sched_context (void)
24916 {
24917   return xmalloc (sizeof (rs6000_sched_context_def));
24918 }
24919
24920 /* If CLEAN_P is true then initializes _SC with clean data,
24921    and from the global context otherwise.  */
24922 static void
24923 rs6000_init_sched_context (void *_sc, bool clean_p)
24924 {
24925   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24926
24927   if (clean_p)
24928     {
24929       sc->cached_can_issue_more = 0;
24930       sc->last_scheduled_insn = NULL_RTX;
24931       sc->load_store_pendulum = 0;
24932     }
24933   else
24934     {
24935       sc->cached_can_issue_more = cached_can_issue_more;
24936       sc->last_scheduled_insn = last_scheduled_insn;
24937       sc->load_store_pendulum = load_store_pendulum;
24938     }
24939 }
24940
24941 /* Sets the global scheduling context to the one pointed to by _SC.  */
24942 static void
24943 rs6000_set_sched_context (void *_sc)
24944 {
24945   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24946
24947   gcc_assert (sc != NULL);
24948
24949   cached_can_issue_more = sc->cached_can_issue_more;
24950   last_scheduled_insn = sc->last_scheduled_insn;
24951   load_store_pendulum = sc->load_store_pendulum;
24952 }
24953
24954 /* Free _SC.  */
24955 static void
24956 rs6000_free_sched_context (void *_sc)
24957 {
24958   gcc_assert (_sc != NULL);
24959
24960   free (_sc);
24961 }
24962
24963 \f
24964 /* Length in units of the trampoline for entering a nested function.  */
24965
24966 int
24967 rs6000_trampoline_size (void)
24968 {
24969   int ret = 0;
24970
24971   switch (DEFAULT_ABI)
24972     {
24973     default:
24974       gcc_unreachable ();
24975
24976     case ABI_AIX:
24977       ret = (TARGET_32BIT) ? 12 : 24;
24978       break;
24979
24980     case ABI_DARWIN:
24981     case ABI_V4:
24982       ret = (TARGET_32BIT) ? 40 : 48;
24983       break;
24984     }
24985
24986   return ret;
24987 }
24988
24989 /* Emit RTL insns to initialize the variable parts of a trampoline.
24990    FNADDR is an RTX for the address of the function's pure code.
24991    CXT is an RTX for the static chain value for the function.  */
24992
24993 static void
24994 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
24995 {
24996   int regsize = (TARGET_32BIT) ? 4 : 8;
24997   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
24998   rtx ctx_reg = force_reg (Pmode, cxt);
24999   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
25000
25001   switch (DEFAULT_ABI)
25002     {
25003     default:
25004       gcc_unreachable ();
25005
25006     /* Under AIX, just build the 3 word function descriptor */
25007     case ABI_AIX:
25008       {
25009         rtx fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
25010         rtx fn_reg = gen_reg_rtx (Pmode);
25011         rtx toc_reg = gen_reg_rtx (Pmode);
25012
25013   /* Macro to shorten the code expansions below.  */
25014 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
25015
25016         m_tramp = replace_equiv_address (m_tramp, addr);
25017
25018         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
25019         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
25020         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
25021         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
25022         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
25023
25024 # undef MEM_PLUS
25025       }
25026       break;
25027
25028     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
25029     case ABI_DARWIN:
25030     case ABI_V4:
25031       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
25032                          LCT_NORMAL, VOIDmode, 4,
25033                          addr, Pmode,
25034                          GEN_INT (rs6000_trampoline_size ()), SImode,
25035                          fnaddr, Pmode,
25036                          ctx_reg, Pmode);
25037       break;
25038     }
25039 }
25040
25041 \f
25042 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
25043    identifier as an argument, so the front end shouldn't look it up.  */
25044
25045 static bool
25046 rs6000_attribute_takes_identifier_p (const_tree attr_id)
25047 {
25048   return is_attribute_p ("altivec", attr_id);
25049 }
25050
25051 /* Handle the "altivec" attribute.  The attribute may have
25052    arguments as follows:
25053
25054         __attribute__((altivec(vector__)))
25055         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
25056         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
25057
25058   and may appear more than once (e.g., 'vector bool char') in a
25059   given declaration.  */
25060
25061 static tree
25062 rs6000_handle_altivec_attribute (tree *node,
25063                                  tree name ATTRIBUTE_UNUSED,
25064                                  tree args,
25065                                  int flags ATTRIBUTE_UNUSED,
25066                                  bool *no_add_attrs)
25067 {
25068   tree type = *node, result = NULL_TREE;
25069   enum machine_mode mode;
25070   int unsigned_p;
25071   char altivec_type
25072     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
25073         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
25074        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
25075        : '?');
25076
25077   while (POINTER_TYPE_P (type)
25078          || TREE_CODE (type) == FUNCTION_TYPE
25079          || TREE_CODE (type) == METHOD_TYPE
25080          || TREE_CODE (type) == ARRAY_TYPE)
25081     type = TREE_TYPE (type);
25082
25083   mode = TYPE_MODE (type);
25084
25085   /* Check for invalid AltiVec type qualifiers.  */
25086   if (type == long_double_type_node)
25087     error ("use of %<long double%> in AltiVec types is invalid");
25088   else if (type == boolean_type_node)
25089     error ("use of boolean types in AltiVec types is invalid");
25090   else if (TREE_CODE (type) == COMPLEX_TYPE)
25091     error ("use of %<complex%> in AltiVec types is invalid");
25092   else if (DECIMAL_FLOAT_MODE_P (mode))
25093     error ("use of decimal floating point types in AltiVec types is invalid");
25094   else if (!TARGET_VSX)
25095     {
25096       if (type == long_unsigned_type_node || type == long_integer_type_node)
25097         {
25098           if (TARGET_64BIT)
25099             error ("use of %<long%> in AltiVec types is invalid for "
25100                    "64-bit code without -mvsx");
25101           else if (rs6000_warn_altivec_long)
25102             warning (0, "use of %<long%> in AltiVec types is deprecated; "
25103                      "use %<int%>");
25104         }
25105       else if (type == long_long_unsigned_type_node
25106                || type == long_long_integer_type_node)
25107         error ("use of %<long long%> in AltiVec types is invalid without "
25108                "-mvsx");
25109       else if (type == double_type_node)
25110         error ("use of %<double%> in AltiVec types is invalid without -mvsx");
25111     }
25112
25113   switch (altivec_type)
25114     {
25115     case 'v':
25116       unsigned_p = TYPE_UNSIGNED (type);
25117       switch (mode)
25118         {
25119         case DImode:
25120           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
25121           break;
25122         case SImode:
25123           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
25124           break;
25125         case HImode:
25126           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
25127           break;
25128         case QImode:
25129           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
25130           break;
25131         case SFmode: result = V4SF_type_node; break;
25132         case DFmode: result = V2DF_type_node; break;
25133           /* If the user says 'vector int bool', we may be handed the 'bool'
25134              attribute _before_ the 'vector' attribute, and so select the
25135              proper type in the 'b' case below.  */
25136         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
25137         case V2DImode: case V2DFmode:
25138           result = type;
25139         default: break;
25140         }
25141       break;
25142     case 'b':
25143       switch (mode)
25144         {
25145         case DImode: case V2DImode: result = bool_V2DI_type_node; break;
25146         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
25147         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
25148         case QImode: case V16QImode: result = bool_V16QI_type_node;
25149         default: break;
25150         }
25151       break;
25152     case 'p':
25153       switch (mode)
25154         {
25155         case V8HImode: result = pixel_V8HI_type_node;
25156         default: break;
25157         }
25158     default: break;
25159     }
25160
25161   /* Propagate qualifiers attached to the element type
25162      onto the vector type.  */
25163   if (result && result != type && TYPE_QUALS (type))
25164     result = build_qualified_type (result, TYPE_QUALS (type));
25165
25166   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
25167
25168   if (result)
25169     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
25170
25171   return NULL_TREE;
25172 }
25173
25174 /* AltiVec defines four built-in scalar types that serve as vector
25175    elements; we must teach the compiler how to mangle them.  */
25176
25177 static const char *
25178 rs6000_mangle_type (const_tree type)
25179 {
25180   type = TYPE_MAIN_VARIANT (type);
25181
25182   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
25183       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
25184     return NULL;
25185
25186   if (type == bool_char_type_node) return "U6__boolc";
25187   if (type == bool_short_type_node) return "U6__bools";
25188   if (type == pixel_type_node) return "u7__pixel";
25189   if (type == bool_int_type_node) return "U6__booli";
25190   if (type == bool_long_type_node) return "U6__booll";
25191
25192   /* Mangle IBM extended float long double as `g' (__float128) on
25193      powerpc*-linux where long-double-64 previously was the default.  */
25194   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
25195       && TARGET_ELF
25196       && TARGET_LONG_DOUBLE_128
25197       && !TARGET_IEEEQUAD)
25198     return "g";
25199
25200   /* For all other types, use normal C++ mangling.  */
25201   return NULL;
25202 }
25203
25204 /* Handle a "longcall" or "shortcall" attribute; arguments as in
25205    struct attribute_spec.handler.  */
25206
25207 static tree
25208 rs6000_handle_longcall_attribute (tree *node, tree name,
25209                                   tree args ATTRIBUTE_UNUSED,
25210                                   int flags ATTRIBUTE_UNUSED,
25211                                   bool *no_add_attrs)
25212 {
25213   if (TREE_CODE (*node) != FUNCTION_TYPE
25214       && TREE_CODE (*node) != FIELD_DECL
25215       && TREE_CODE (*node) != TYPE_DECL)
25216     {
25217       warning (OPT_Wattributes, "%qE attribute only applies to functions",
25218                name);
25219       *no_add_attrs = true;
25220     }
25221
25222   return NULL_TREE;
25223 }
25224
25225 /* Set longcall attributes on all functions declared when
25226    rs6000_default_long_calls is true.  */
25227 static void
25228 rs6000_set_default_type_attributes (tree type)
25229 {
25230   if (rs6000_default_long_calls
25231       && (TREE_CODE (type) == FUNCTION_TYPE
25232           || TREE_CODE (type) == METHOD_TYPE))
25233     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
25234                                         NULL_TREE,
25235                                         TYPE_ATTRIBUTES (type));
25236
25237 #if TARGET_MACHO
25238   darwin_set_default_type_attributes (type);
25239 #endif
25240 }
25241
25242 /* Return a reference suitable for calling a function with the
25243    longcall attribute.  */
25244
25245 rtx
25246 rs6000_longcall_ref (rtx call_ref)
25247 {
25248   const char *call_name;
25249   tree node;
25250
25251   if (GET_CODE (call_ref) != SYMBOL_REF)
25252     return call_ref;
25253
25254   /* System V adds '.' to the internal name, so skip them.  */
25255   call_name = XSTR (call_ref, 0);
25256   if (*call_name == '.')
25257     {
25258       while (*call_name == '.')
25259         call_name++;
25260
25261       node = get_identifier (call_name);
25262       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
25263     }
25264
25265   return force_reg (Pmode, call_ref);
25266 }
25267 \f
25268 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
25269 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
25270 #endif
25271
25272 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
25273    struct attribute_spec.handler.  */
25274 static tree
25275 rs6000_handle_struct_attribute (tree *node, tree name,
25276                                 tree args ATTRIBUTE_UNUSED,
25277                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
25278 {
25279   tree *type = NULL;
25280   if (DECL_P (*node))
25281     {
25282       if (TREE_CODE (*node) == TYPE_DECL)
25283         type = &TREE_TYPE (*node);
25284     }
25285   else
25286     type = node;
25287
25288   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
25289                  || TREE_CODE (*type) == UNION_TYPE)))
25290     {
25291       warning (OPT_Wattributes, "%qE attribute ignored", name);
25292       *no_add_attrs = true;
25293     }
25294
25295   else if ((is_attribute_p ("ms_struct", name)
25296             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
25297            || ((is_attribute_p ("gcc_struct", name)
25298                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
25299     {
25300       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
25301                name);
25302       *no_add_attrs = true;
25303     }
25304
25305   return NULL_TREE;
25306 }
25307
25308 static bool
25309 rs6000_ms_bitfield_layout_p (const_tree record_type)
25310 {
25311   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
25312           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
25313     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
25314 }
25315 \f
25316 #ifdef USING_ELFOS_H
25317
25318 /* A get_unnamed_section callback, used for switching to toc_section.  */
25319
25320 static void
25321 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
25322 {
25323   if (DEFAULT_ABI == ABI_AIX
25324       && TARGET_MINIMAL_TOC
25325       && !TARGET_RELOCATABLE)
25326     {
25327       if (!toc_initialized)
25328         {
25329           toc_initialized = 1;
25330           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
25331           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
25332           fprintf (asm_out_file, "\t.tc ");
25333           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
25334           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
25335           fprintf (asm_out_file, "\n");
25336
25337           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25338           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
25339           fprintf (asm_out_file, " = .+32768\n");
25340         }
25341       else
25342         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25343     }
25344   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
25345     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
25346   else
25347     {
25348       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25349       if (!toc_initialized)
25350         {
25351           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
25352           fprintf (asm_out_file, " = .+32768\n");
25353           toc_initialized = 1;
25354         }
25355     }
25356 }
25357
25358 /* Implement TARGET_ASM_INIT_SECTIONS.  */
25359
25360 static void
25361 rs6000_elf_asm_init_sections (void)
25362 {
25363   toc_section
25364     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
25365
25366   sdata2_section
25367     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
25368                            SDATA2_SECTION_ASM_OP);
25369 }
25370
25371 /* Implement TARGET_SELECT_RTX_SECTION.  */
25372
25373 static section *
25374 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
25375                                unsigned HOST_WIDE_INT align)
25376 {
25377   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
25378     return toc_section;
25379   else
25380     return default_elf_select_rtx_section (mode, x, align);
25381 }
25382 \f
25383 /* For a SYMBOL_REF, set generic flags and then perform some
25384    target-specific processing.
25385
25386    When the AIX ABI is requested on a non-AIX system, replace the
25387    function name with the real name (with a leading .) rather than the
25388    function descriptor name.  This saves a lot of overriding code to
25389    read the prefixes.  */
25390
25391 static void
25392 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
25393 {
25394   default_encode_section_info (decl, rtl, first);
25395
25396   if (first
25397       && TREE_CODE (decl) == FUNCTION_DECL
25398       && !TARGET_AIX
25399       && DEFAULT_ABI == ABI_AIX)
25400     {
25401       rtx sym_ref = XEXP (rtl, 0);
25402       size_t len = strlen (XSTR (sym_ref, 0));
25403       char *str = XALLOCAVEC (char, len + 2);
25404       str[0] = '.';
25405       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
25406       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
25407     }
25408 }
25409
25410 static inline bool
25411 compare_section_name (const char *section, const char *templ)
25412 {
25413   int len;
25414
25415   len = strlen (templ);
25416   return (strncmp (section, templ, len) == 0
25417           && (section[len] == 0 || section[len] == '.'));
25418 }
25419
25420 bool
25421 rs6000_elf_in_small_data_p (const_tree decl)
25422 {
25423   if (rs6000_sdata == SDATA_NONE)
25424     return false;
25425
25426   /* We want to merge strings, so we never consider them small data.  */
25427   if (TREE_CODE (decl) == STRING_CST)
25428     return false;
25429
25430   /* Functions are never in the small data area.  */
25431   if (TREE_CODE (decl) == FUNCTION_DECL)
25432     return false;
25433
25434   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
25435     {
25436       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
25437       if (compare_section_name (section, ".sdata")
25438           || compare_section_name (section, ".sdata2")
25439           || compare_section_name (section, ".gnu.linkonce.s")
25440           || compare_section_name (section, ".sbss")
25441           || compare_section_name (section, ".sbss2")
25442           || compare_section_name (section, ".gnu.linkonce.sb")
25443           || strcmp (section, ".PPC.EMB.sdata0") == 0
25444           || strcmp (section, ".PPC.EMB.sbss0") == 0)
25445         return true;
25446     }
25447   else
25448     {
25449       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
25450
25451       if (size > 0
25452           && size <= g_switch_value
25453           /* If it's not public, and we're not going to reference it there,
25454              there's no need to put it in the small data section.  */
25455           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
25456         return true;
25457     }
25458
25459   return false;
25460 }
25461
25462 #endif /* USING_ELFOS_H */
25463 \f
25464 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
25465
25466 static bool
25467 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
25468 {
25469   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
25470 }
25471 \f
25472 /* Return a REG that occurs in ADDR with coefficient 1.
25473    ADDR can be effectively incremented by incrementing REG.
25474
25475    r0 is special and we must not select it as an address
25476    register by this routine since our caller will try to
25477    increment the returned register via an "la" instruction.  */
25478
25479 rtx
25480 find_addr_reg (rtx addr)
25481 {
25482   while (GET_CODE (addr) == PLUS)
25483     {
25484       if (GET_CODE (XEXP (addr, 0)) == REG
25485           && REGNO (XEXP (addr, 0)) != 0)
25486         addr = XEXP (addr, 0);
25487       else if (GET_CODE (XEXP (addr, 1)) == REG
25488                && REGNO (XEXP (addr, 1)) != 0)
25489         addr = XEXP (addr, 1);
25490       else if (CONSTANT_P (XEXP (addr, 0)))
25491         addr = XEXP (addr, 1);
25492       else if (CONSTANT_P (XEXP (addr, 1)))
25493         addr = XEXP (addr, 0);
25494       else
25495         gcc_unreachable ();
25496     }
25497   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
25498   return addr;
25499 }
25500
25501 void
25502 rs6000_fatal_bad_address (rtx op)
25503 {
25504   fatal_insn ("bad address", op);
25505 }
25506
25507 #if TARGET_MACHO
25508
25509 typedef struct branch_island_d {
25510   tree function_name;
25511   tree label_name;
25512   int line_number;
25513 } branch_island;
25514
25515 DEF_VEC_O(branch_island);
25516 DEF_VEC_ALLOC_O(branch_island,gc);
25517
25518 static VEC(branch_island,gc) *branch_islands;
25519
25520 /* Remember to generate a branch island for far calls to the given
25521    function.  */
25522
25523 static void
25524 add_compiler_branch_island (tree label_name, tree function_name,
25525                             int line_number)
25526 {
25527   branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
25528
25529   bi->function_name = function_name;
25530   bi->label_name = label_name;
25531   bi->line_number = line_number;
25532 }
25533
25534 /* Generate far-jump branch islands for everything recorded in
25535    branch_islands.  Invoked immediately after the last instruction of
25536    the epilogue has been emitted; the branch islands must be appended
25537    to, and contiguous with, the function body.  Mach-O stubs are
25538    generated in machopic_output_stub().  */
25539
25540 static void
25541 macho_branch_islands (void)
25542 {
25543   char tmp_buf[512];
25544
25545   while (!VEC_empty (branch_island, branch_islands))
25546     {
25547       branch_island *bi = VEC_last (branch_island, branch_islands);
25548       const char *label = IDENTIFIER_POINTER (bi->label_name);
25549       const char *name = IDENTIFIER_POINTER (bi->function_name);
25550       char name_buf[512];
25551       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
25552       if (name[0] == '*' || name[0] == '&')
25553         strcpy (name_buf, name+1);
25554       else
25555         {
25556           name_buf[0] = '_';
25557           strcpy (name_buf+1, name);
25558         }
25559       strcpy (tmp_buf, "\n");
25560       strcat (tmp_buf, label);
25561 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25562       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25563         dbxout_stabd (N_SLINE, bi->line_number);
25564 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25565       if (flag_pic)
25566         {
25567           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
25568           strcat (tmp_buf, label);
25569           strcat (tmp_buf, "_pic\n");
25570           strcat (tmp_buf, label);
25571           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
25572
25573           strcat (tmp_buf, "\taddis r11,r11,ha16(");
25574           strcat (tmp_buf, name_buf);
25575           strcat (tmp_buf, " - ");
25576           strcat (tmp_buf, label);
25577           strcat (tmp_buf, "_pic)\n");
25578
25579           strcat (tmp_buf, "\tmtlr r0\n");
25580
25581           strcat (tmp_buf, "\taddi r12,r11,lo16(");
25582           strcat (tmp_buf, name_buf);
25583           strcat (tmp_buf, " - ");
25584           strcat (tmp_buf, label);
25585           strcat (tmp_buf, "_pic)\n");
25586
25587           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
25588         }
25589       else
25590         {
25591           strcat (tmp_buf, ":\nlis r12,hi16(");
25592           strcat (tmp_buf, name_buf);
25593           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
25594           strcat (tmp_buf, name_buf);
25595           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
25596         }
25597       output_asm_insn (tmp_buf, 0);
25598 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25599       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25600         dbxout_stabd (N_SLINE, bi->line_number);
25601 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25602       VEC_pop (branch_island, branch_islands);
25603     }
25604 }
25605
25606 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
25607    already there or not.  */
25608
25609 static int
25610 no_previous_def (tree function_name)
25611 {
25612   branch_island *bi;
25613   unsigned ix;
25614
25615   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25616     if (function_name == bi->function_name)
25617       return 0;
25618   return 1;
25619 }
25620
25621 /* GET_PREV_LABEL gets the label name from the previous definition of
25622    the function.  */
25623
25624 static tree
25625 get_prev_label (tree function_name)
25626 {
25627   branch_island *bi;
25628   unsigned ix;
25629
25630   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25631     if (function_name == bi->function_name)
25632       return bi->label_name;
25633   return NULL_TREE;
25634 }
25635
25636 /* INSN is either a function call or a millicode call.  It may have an
25637    unconditional jump in its delay slot.
25638
25639    CALL_DEST is the routine we are calling.  */
25640
25641 char *
25642 output_call (rtx insn, rtx *operands, int dest_operand_number,
25643              int cookie_operand_number)
25644 {
25645   static char buf[256];
25646   if (darwin_emit_branch_islands
25647       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
25648       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
25649     {
25650       tree labelname;
25651       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
25652
25653       if (no_previous_def (funname))
25654         {
25655           rtx label_rtx = gen_label_rtx ();
25656           char *label_buf, temp_buf[256];
25657           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
25658                                        CODE_LABEL_NUMBER (label_rtx));
25659           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
25660           labelname = get_identifier (label_buf);
25661           add_compiler_branch_island (labelname, funname, insn_line (insn));
25662         }
25663       else
25664         labelname = get_prev_label (funname);
25665
25666       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
25667          instruction will reach 'foo', otherwise link as 'bl L42'".
25668          "L42" should be a 'branch island', that will do a far jump to
25669          'foo'.  Branch islands are generated in
25670          macho_branch_islands().  */
25671       sprintf (buf, "jbsr %%z%d,%.246s",
25672                dest_operand_number, IDENTIFIER_POINTER (labelname));
25673     }
25674   else
25675     sprintf (buf, "bl %%z%d", dest_operand_number);
25676   return buf;
25677 }
25678
25679 /* Generate PIC and indirect symbol stubs.  */
25680
25681 void
25682 machopic_output_stub (FILE *file, const char *symb, const char *stub)
25683 {
25684   unsigned int length;
25685   char *symbol_name, *lazy_ptr_name;
25686   char *local_label_0;
25687   static int label = 0;
25688
25689   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
25690   symb = (*targetm.strip_name_encoding) (symb);
25691
25692
25693   length = strlen (symb);
25694   symbol_name = XALLOCAVEC (char, length + 32);
25695   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
25696
25697   lazy_ptr_name = XALLOCAVEC (char, length + 32);
25698   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
25699
25700   if (flag_pic == 2)
25701     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
25702   else
25703     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
25704
25705   if (flag_pic == 2)
25706     {
25707       fprintf (file, "\t.align 5\n");
25708
25709       fprintf (file, "%s:\n", stub);
25710       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25711
25712       label++;
25713       local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
25714       sprintf (local_label_0, "\"L%011d$spb\"", label);
25715
25716       fprintf (file, "\tmflr r0\n");
25717       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
25718       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
25719       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
25720                lazy_ptr_name, local_label_0);
25721       fprintf (file, "\tmtlr r0\n");
25722       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
25723                (TARGET_64BIT ? "ldu" : "lwzu"),
25724                lazy_ptr_name, local_label_0);
25725       fprintf (file, "\tmtctr r12\n");
25726       fprintf (file, "\tbctr\n");
25727     }
25728   else
25729     {
25730       fprintf (file, "\t.align 4\n");
25731
25732       fprintf (file, "%s:\n", stub);
25733       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25734
25735       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
25736       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
25737                (TARGET_64BIT ? "ldu" : "lwzu"),
25738                lazy_ptr_name);
25739       fprintf (file, "\tmtctr r12\n");
25740       fprintf (file, "\tbctr\n");
25741     }
25742
25743   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
25744   fprintf (file, "%s:\n", lazy_ptr_name);
25745   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25746   fprintf (file, "%sdyld_stub_binding_helper\n",
25747            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
25748 }
25749
25750 /* Legitimize PIC addresses.  If the address is already
25751    position-independent, we return ORIG.  Newly generated
25752    position-independent addresses go into a reg.  This is REG if non
25753    zero, otherwise we allocate register(s) as necessary.  */
25754
25755 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
25756
25757 rtx
25758 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
25759                                         rtx reg)
25760 {
25761   rtx base, offset;
25762
25763   if (reg == NULL && ! reload_in_progress && ! reload_completed)
25764     reg = gen_reg_rtx (Pmode);
25765
25766   if (GET_CODE (orig) == CONST)
25767     {
25768       rtx reg_temp;
25769
25770       if (GET_CODE (XEXP (orig, 0)) == PLUS
25771           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
25772         return orig;
25773
25774       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
25775
25776       /* Use a different reg for the intermediate value, as
25777          it will be marked UNCHANGING.  */
25778       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
25779       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
25780                                                      Pmode, reg_temp);
25781       offset =
25782         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
25783                                                 Pmode, reg);
25784
25785       if (GET_CODE (offset) == CONST_INT)
25786         {
25787           if (SMALL_INT (offset))
25788             return plus_constant (base, INTVAL (offset));
25789           else if (! reload_in_progress && ! reload_completed)
25790             offset = force_reg (Pmode, offset);
25791           else
25792             {
25793               rtx mem = force_const_mem (Pmode, orig);
25794               return machopic_legitimize_pic_address (mem, Pmode, reg);
25795             }
25796         }
25797       return gen_rtx_PLUS (Pmode, base, offset);
25798     }
25799
25800   /* Fall back on generic machopic code.  */
25801   return machopic_legitimize_pic_address (orig, mode, reg);
25802 }
25803
25804 /* Output a .machine directive for the Darwin assembler, and call
25805    the generic start_file routine.  */
25806
25807 static void
25808 rs6000_darwin_file_start (void)
25809 {
25810   static const struct
25811   {
25812     const char *arg;
25813     const char *name;
25814     int if_set;
25815   } mapping[] = {
25816     { "ppc64", "ppc64", MASK_64BIT },
25817     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
25818     { "power4", "ppc970", 0 },
25819     { "G5", "ppc970", 0 },
25820     { "7450", "ppc7450", 0 },
25821     { "7400", "ppc7400", MASK_ALTIVEC },
25822     { "G4", "ppc7400", 0 },
25823     { "750", "ppc750", 0 },
25824     { "740", "ppc750", 0 },
25825     { "G3", "ppc750", 0 },
25826     { "604e", "ppc604e", 0 },
25827     { "604", "ppc604", 0 },
25828     { "603e", "ppc603", 0 },
25829     { "603", "ppc603", 0 },
25830     { "601", "ppc601", 0 },
25831     { NULL, "ppc", 0 } };
25832   const char *cpu_id = "";
25833   size_t i;
25834
25835   rs6000_file_start ();
25836   darwin_file_start ();
25837
25838   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
25839   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
25840     if (rs6000_select[i].set_arch_p && rs6000_select[i].string
25841         && rs6000_select[i].string[0] != '\0')
25842       cpu_id = rs6000_select[i].string;
25843
25844   /* Look through the mapping array.  Pick the first name that either
25845      matches the argument, has a bit set in IF_SET that is also set
25846      in the target flags, or has a NULL name.  */
25847
25848   i = 0;
25849   while (mapping[i].arg != NULL
25850          && strcmp (mapping[i].arg, cpu_id) != 0
25851          && (mapping[i].if_set & target_flags) == 0)
25852     i++;
25853
25854   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
25855 }
25856
25857 #endif /* TARGET_MACHO */
25858
25859 #if TARGET_ELF
25860 static int
25861 rs6000_elf_reloc_rw_mask (void)
25862 {
25863   if (flag_pic)
25864     return 3;
25865   else if (DEFAULT_ABI == ABI_AIX)
25866     return 2;
25867   else
25868     return 0;
25869 }
25870
25871 /* Record an element in the table of global constructors.  SYMBOL is
25872    a SYMBOL_REF of the function to be called; PRIORITY is a number
25873    between 0 and MAX_INIT_PRIORITY.
25874
25875    This differs from default_named_section_asm_out_constructor in
25876    that we have special handling for -mrelocatable.  */
25877
25878 static void
25879 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
25880 {
25881   const char *section = ".ctors";
25882   char buf[16];
25883
25884   if (priority != DEFAULT_INIT_PRIORITY)
25885     {
25886       sprintf (buf, ".ctors.%.5u",
25887                /* Invert the numbering so the linker puts us in the proper
25888                   order; constructors are run from right to left, and the
25889                   linker sorts in increasing order.  */
25890                MAX_INIT_PRIORITY - priority);
25891       section = buf;
25892     }
25893
25894   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25895   assemble_align (POINTER_SIZE);
25896
25897   if (TARGET_RELOCATABLE)
25898     {
25899       fputs ("\t.long (", asm_out_file);
25900       output_addr_const (asm_out_file, symbol);
25901       fputs (")@fixup\n", asm_out_file);
25902     }
25903   else
25904     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25905 }
25906
25907 static void
25908 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
25909 {
25910   const char *section = ".dtors";
25911   char buf[16];
25912
25913   if (priority != DEFAULT_INIT_PRIORITY)
25914     {
25915       sprintf (buf, ".dtors.%.5u",
25916                /* Invert the numbering so the linker puts us in the proper
25917                   order; constructors are run from right to left, and the
25918                   linker sorts in increasing order.  */
25919                MAX_INIT_PRIORITY - priority);
25920       section = buf;
25921     }
25922
25923   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25924   assemble_align (POINTER_SIZE);
25925
25926   if (TARGET_RELOCATABLE)
25927     {
25928       fputs ("\t.long (", asm_out_file);
25929       output_addr_const (asm_out_file, symbol);
25930       fputs (")@fixup\n", asm_out_file);
25931     }
25932   else
25933     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25934 }
25935
25936 void
25937 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
25938 {
25939   if (TARGET_64BIT)
25940     {
25941       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
25942       ASM_OUTPUT_LABEL (file, name);
25943       fputs (DOUBLE_INT_ASM_OP, file);
25944       rs6000_output_function_entry (file, name);
25945       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
25946       if (DOT_SYMBOLS)
25947         {
25948           fputs ("\t.size\t", file);
25949           assemble_name (file, name);
25950           fputs (",24\n\t.type\t.", file);
25951           assemble_name (file, name);
25952           fputs (",@function\n", file);
25953           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
25954             {
25955               fputs ("\t.globl\t.", file);
25956               assemble_name (file, name);
25957               putc ('\n', file);
25958             }
25959         }
25960       else
25961         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25962       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25963       rs6000_output_function_entry (file, name);
25964       fputs (":\n", file);
25965       return;
25966     }
25967
25968   if (TARGET_RELOCATABLE
25969       && !TARGET_SECURE_PLT
25970       && (get_pool_size () != 0 || crtl->profile)
25971       && uses_TOC ())
25972     {
25973       char buf[256];
25974
25975       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
25976
25977       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
25978       fprintf (file, "\t.long ");
25979       assemble_name (file, buf);
25980       putc ('-', file);
25981       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
25982       assemble_name (file, buf);
25983       putc ('\n', file);
25984     }
25985
25986   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25987   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25988
25989   if (DEFAULT_ABI == ABI_AIX)
25990     {
25991       const char *desc_name, *orig_name;
25992
25993       orig_name = (*targetm.strip_name_encoding) (name);
25994       desc_name = orig_name;
25995       while (*desc_name == '.')
25996         desc_name++;
25997
25998       if (TREE_PUBLIC (decl))
25999         fprintf (file, "\t.globl %s\n", desc_name);
26000
26001       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
26002       fprintf (file, "%s:\n", desc_name);
26003       fprintf (file, "\t.long %s\n", orig_name);
26004       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
26005       if (DEFAULT_ABI == ABI_AIX)
26006         fputs ("\t.long 0\n", file);
26007       fprintf (file, "\t.previous\n");
26008     }
26009   ASM_OUTPUT_LABEL (file, name);
26010 }
26011
26012 static void
26013 rs6000_elf_file_end (void)
26014 {
26015 #ifdef HAVE_AS_GNU_ATTRIBUTE
26016   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
26017     {
26018       if (rs6000_passes_float)
26019         fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
26020                  ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1 
26021                   : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3 
26022                   : 2));
26023       if (rs6000_passes_vector)
26024         fprintf (asm_out_file, "\t.gnu_attribute 8, %d\n",
26025                  (TARGET_ALTIVEC_ABI ? 2
26026                   : TARGET_SPE_ABI ? 3
26027                   : 1));
26028       if (rs6000_returns_struct)
26029         fprintf (asm_out_file, "\t.gnu_attribute 12, %d\n",
26030                  aix_struct_return ? 2 : 1);
26031     }
26032 #endif
26033 #ifdef POWERPC_LINUX
26034   if (TARGET_32BIT)
26035     file_end_indicate_exec_stack ();
26036 #endif
26037 }
26038 #endif
26039
26040 #if TARGET_XCOFF
26041 static void
26042 rs6000_xcoff_asm_output_anchor (rtx symbol)
26043 {
26044   char buffer[100];
26045
26046   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
26047            SYMBOL_REF_BLOCK_OFFSET (symbol));
26048   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
26049 }
26050
26051 static void
26052 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
26053 {
26054   fputs (GLOBAL_ASM_OP, stream);
26055   RS6000_OUTPUT_BASENAME (stream, name);
26056   putc ('\n', stream);
26057 }
26058
26059 /* A get_unnamed_decl callback, used for read-only sections.  PTR
26060    points to the section string variable.  */
26061
26062 static void
26063 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
26064 {
26065   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
26066            *(const char *const *) directive,
26067            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
26068 }
26069
26070 /* Likewise for read-write sections.  */
26071
26072 static void
26073 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
26074 {
26075   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
26076            *(const char *const *) directive,
26077            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
26078 }
26079
26080 /* A get_unnamed_section callback, used for switching to toc_section.  */
26081
26082 static void
26083 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
26084 {
26085   if (TARGET_MINIMAL_TOC)
26086     {
26087       /* toc_section is always selected at least once from
26088          rs6000_xcoff_file_start, so this is guaranteed to
26089          always be defined once and only once in each file.  */
26090       if (!toc_initialized)
26091         {
26092           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
26093           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
26094           toc_initialized = 1;
26095         }
26096       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
26097                (TARGET_32BIT ? "" : ",3"));
26098     }
26099   else
26100     fputs ("\t.toc\n", asm_out_file);
26101 }
26102
26103 /* Implement TARGET_ASM_INIT_SECTIONS.  */
26104
26105 static void
26106 rs6000_xcoff_asm_init_sections (void)
26107 {
26108   read_only_data_section
26109     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
26110                            &xcoff_read_only_section_name);
26111
26112   private_data_section
26113     = get_unnamed_section (SECTION_WRITE,
26114                            rs6000_xcoff_output_readwrite_section_asm_op,
26115                            &xcoff_private_data_section_name);
26116
26117   read_only_private_data_section
26118     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
26119                            &xcoff_private_data_section_name);
26120
26121   toc_section
26122     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
26123
26124   readonly_data_section = read_only_data_section;
26125   exception_section = data_section;
26126 }
26127
26128 static int
26129 rs6000_xcoff_reloc_rw_mask (void)
26130 {
26131   return 3;
26132 }
26133
26134 static void
26135 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
26136                                 tree decl ATTRIBUTE_UNUSED)
26137 {
26138   int smclass;
26139   static const char * const suffix[3] = { "PR", "RO", "RW" };
26140
26141   if (flags & SECTION_CODE)
26142     smclass = 0;
26143   else if (flags & SECTION_WRITE)
26144     smclass = 2;
26145   else
26146     smclass = 1;
26147
26148   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
26149            (flags & SECTION_CODE) ? "." : "",
26150            name, suffix[smclass], flags & SECTION_ENTSIZE);
26151 }
26152
26153 static section *
26154 rs6000_xcoff_select_section (tree decl, int reloc,
26155                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
26156 {
26157   if (decl_readonly_section (decl, reloc))
26158     {
26159       if (TREE_PUBLIC (decl))
26160         return read_only_data_section;
26161       else
26162         return read_only_private_data_section;
26163     }
26164   else
26165     {
26166       if (TREE_PUBLIC (decl))
26167         return data_section;
26168       else
26169         return private_data_section;
26170     }
26171 }
26172
26173 static void
26174 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
26175 {
26176   const char *name;
26177
26178   /* Use select_section for private and uninitialized data.  */
26179   if (!TREE_PUBLIC (decl)
26180       || DECL_COMMON (decl)
26181       || DECL_INITIAL (decl) == NULL_TREE
26182       || DECL_INITIAL (decl) == error_mark_node
26183       || (flag_zero_initialized_in_bss
26184           && initializer_zerop (DECL_INITIAL (decl))))
26185     return;
26186
26187   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
26188   name = (*targetm.strip_name_encoding) (name);
26189   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
26190 }
26191
26192 /* Select section for constant in constant pool.
26193
26194    On RS/6000, all constants are in the private read-only data area.
26195    However, if this is being placed in the TOC it must be output as a
26196    toc entry.  */
26197
26198 static section *
26199 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
26200                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
26201 {
26202   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
26203     return toc_section;
26204   else
26205     return read_only_private_data_section;
26206 }
26207
26208 /* Remove any trailing [DS] or the like from the symbol name.  */
26209
26210 static const char *
26211 rs6000_xcoff_strip_name_encoding (const char *name)
26212 {
26213   size_t len;
26214   if (*name == '*')
26215     name++;
26216   len = strlen (name);
26217   if (name[len - 1] == ']')
26218     return ggc_alloc_string (name, len - 4);
26219   else
26220     return name;
26221 }
26222
26223 /* Section attributes.  AIX is always PIC.  */
26224
26225 static unsigned int
26226 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
26227 {
26228   unsigned int align;
26229   unsigned int flags = default_section_type_flags (decl, name, reloc);
26230
26231   /* Align to at least UNIT size.  */
26232   if (flags & SECTION_CODE)
26233     align = MIN_UNITS_PER_WORD;
26234   else
26235     /* Increase alignment of large objects if not already stricter.  */
26236     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
26237                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
26238                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
26239
26240   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
26241 }
26242
26243 /* Output at beginning of assembler file.
26244
26245    Initialize the section names for the RS/6000 at this point.
26246
26247    Specify filename, including full path, to assembler.
26248
26249    We want to go into the TOC section so at least one .toc will be emitted.
26250    Also, in order to output proper .bs/.es pairs, we need at least one static
26251    [RW] section emitted.
26252
26253    Finally, declare mcount when profiling to make the assembler happy.  */
26254
26255 static void
26256 rs6000_xcoff_file_start (void)
26257 {
26258   rs6000_gen_section_name (&xcoff_bss_section_name,
26259                            main_input_filename, ".bss_");
26260   rs6000_gen_section_name (&xcoff_private_data_section_name,
26261                            main_input_filename, ".rw_");
26262   rs6000_gen_section_name (&xcoff_read_only_section_name,
26263                            main_input_filename, ".ro_");
26264
26265   fputs ("\t.file\t", asm_out_file);
26266   output_quoted_string (asm_out_file, main_input_filename);
26267   fputc ('\n', asm_out_file);
26268   if (write_symbols != NO_DEBUG)
26269     switch_to_section (private_data_section);
26270   switch_to_section (text_section);
26271   if (profile_flag)
26272     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
26273   rs6000_file_start ();
26274 }
26275
26276 /* Output at end of assembler file.
26277    On the RS/6000, referencing data should automatically pull in text.  */
26278
26279 static void
26280 rs6000_xcoff_file_end (void)
26281 {
26282   switch_to_section (text_section);
26283   fputs ("_section_.text:\n", asm_out_file);
26284   switch_to_section (data_section);
26285   fputs (TARGET_32BIT
26286          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
26287          asm_out_file);
26288 }
26289 #endif /* TARGET_XCOFF */
26290
26291 /* Compute a (partial) cost for rtx X.  Return true if the complete
26292    cost has been computed, and false if subexpressions should be
26293    scanned.  In either case, *TOTAL contains the cost result.  */
26294
26295 static bool
26296 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
26297                   bool speed)
26298 {
26299   enum machine_mode mode = GET_MODE (x);
26300
26301   switch (code)
26302     {
26303       /* On the RS/6000, if it is valid in the insn, it is free.  */
26304     case CONST_INT:
26305       if (((outer_code == SET
26306             || outer_code == PLUS
26307             || outer_code == MINUS)
26308            && (satisfies_constraint_I (x)
26309                || satisfies_constraint_L (x)))
26310           || (outer_code == AND
26311               && (satisfies_constraint_K (x)
26312                   || (mode == SImode
26313                       ? satisfies_constraint_L (x)
26314                       : satisfies_constraint_J (x))
26315                   || mask_operand (x, mode)
26316                   || (mode == DImode
26317                       && mask64_operand (x, DImode))))
26318           || ((outer_code == IOR || outer_code == XOR)
26319               && (satisfies_constraint_K (x)
26320                   || (mode == SImode
26321                       ? satisfies_constraint_L (x)
26322                       : satisfies_constraint_J (x))))
26323           || outer_code == ASHIFT
26324           || outer_code == ASHIFTRT
26325           || outer_code == LSHIFTRT
26326           || outer_code == ROTATE
26327           || outer_code == ROTATERT
26328           || outer_code == ZERO_EXTRACT
26329           || (outer_code == MULT
26330               && satisfies_constraint_I (x))
26331           || ((outer_code == DIV || outer_code == UDIV
26332                || outer_code == MOD || outer_code == UMOD)
26333               && exact_log2 (INTVAL (x)) >= 0)
26334           || (outer_code == COMPARE
26335               && (satisfies_constraint_I (x)
26336                   || satisfies_constraint_K (x)))
26337           || ((outer_code == EQ || outer_code == NE)
26338               && (satisfies_constraint_I (x)
26339                   || satisfies_constraint_K (x)
26340                   || (mode == SImode
26341                       ? satisfies_constraint_L (x)
26342                       : satisfies_constraint_J (x))))
26343           || (outer_code == GTU
26344               && satisfies_constraint_I (x))
26345           || (outer_code == LTU
26346               && satisfies_constraint_P (x)))
26347         {
26348           *total = 0;
26349           return true;
26350         }
26351       else if ((outer_code == PLUS
26352                 && reg_or_add_cint_operand (x, VOIDmode))
26353                || (outer_code == MINUS
26354                    && reg_or_sub_cint_operand (x, VOIDmode))
26355                || ((outer_code == SET
26356                     || outer_code == IOR
26357                     || outer_code == XOR)
26358                    && (INTVAL (x)
26359                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
26360         {
26361           *total = COSTS_N_INSNS (1);
26362           return true;
26363         }
26364       /* FALLTHRU */
26365
26366     case CONST_DOUBLE:
26367       if (mode == DImode && code == CONST_DOUBLE)
26368         {
26369           if ((outer_code == IOR || outer_code == XOR)
26370               && CONST_DOUBLE_HIGH (x) == 0
26371               && (CONST_DOUBLE_LOW (x)
26372                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
26373             {
26374               *total = 0;
26375               return true;
26376             }
26377           else if ((outer_code == AND && and64_2_operand (x, DImode))
26378                    || ((outer_code == SET
26379                         || outer_code == IOR
26380                         || outer_code == XOR)
26381                        && CONST_DOUBLE_HIGH (x) == 0))
26382             {
26383               *total = COSTS_N_INSNS (1);
26384               return true;
26385             }
26386         }
26387       /* FALLTHRU */
26388
26389     case CONST:
26390     case HIGH:
26391     case SYMBOL_REF:
26392     case MEM:
26393       /* When optimizing for size, MEM should be slightly more expensive
26394          than generating address, e.g., (plus (reg) (const)).
26395          L1 cache latency is about two instructions.  */
26396       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
26397       return true;
26398
26399     case LABEL_REF:
26400       *total = 0;
26401       return true;
26402
26403     case PLUS:
26404     case MINUS:
26405       if (FLOAT_MODE_P (mode))
26406         *total = rs6000_cost->fp;
26407       else
26408         *total = COSTS_N_INSNS (1);
26409       return false;
26410
26411     case MULT:
26412       if (GET_CODE (XEXP (x, 1)) == CONST_INT
26413           && satisfies_constraint_I (XEXP (x, 1)))
26414         {
26415           if (INTVAL (XEXP (x, 1)) >= -256
26416               && INTVAL (XEXP (x, 1)) <= 255)
26417             *total = rs6000_cost->mulsi_const9;
26418           else
26419             *total = rs6000_cost->mulsi_const;
26420         }
26421       else if (mode == SFmode)
26422         *total = rs6000_cost->fp;
26423       else if (FLOAT_MODE_P (mode))
26424         *total = rs6000_cost->dmul;
26425       else if (mode == DImode)
26426         *total = rs6000_cost->muldi;
26427       else
26428         *total = rs6000_cost->mulsi;
26429       return false;
26430
26431     case FMA:
26432       if (mode == SFmode)
26433         *total = rs6000_cost->fp;
26434       else
26435         *total = rs6000_cost->dmul;
26436       break;
26437
26438     case DIV:
26439     case MOD:
26440       if (FLOAT_MODE_P (mode))
26441         {
26442           *total = mode == DFmode ? rs6000_cost->ddiv
26443                                   : rs6000_cost->sdiv;
26444           return false;
26445         }
26446       /* FALLTHRU */
26447
26448     case UDIV:
26449     case UMOD:
26450       if (GET_CODE (XEXP (x, 1)) == CONST_INT
26451           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
26452         {
26453           if (code == DIV || code == MOD)
26454             /* Shift, addze */
26455             *total = COSTS_N_INSNS (2);
26456           else
26457             /* Shift */
26458             *total = COSTS_N_INSNS (1);
26459         }
26460       else
26461         {
26462           if (GET_MODE (XEXP (x, 1)) == DImode)
26463             *total = rs6000_cost->divdi;
26464           else
26465             *total = rs6000_cost->divsi;
26466         }
26467       /* Add in shift and subtract for MOD. */
26468       if (code == MOD || code == UMOD)
26469         *total += COSTS_N_INSNS (2);
26470       return false;
26471
26472     case CTZ:
26473     case FFS:
26474       *total = COSTS_N_INSNS (4);
26475       return false;
26476
26477     case POPCOUNT:
26478       *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
26479       return false;
26480
26481     case PARITY:
26482       *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
26483       return false;
26484
26485     case NOT:
26486       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
26487         {
26488           *total = 0;
26489           return false;
26490         }
26491       /* FALLTHRU */
26492
26493     case AND:
26494     case CLZ:
26495     case IOR:
26496     case XOR:
26497     case ZERO_EXTRACT:
26498       *total = COSTS_N_INSNS (1);
26499       return false;
26500
26501     case ASHIFT:
26502     case ASHIFTRT:
26503     case LSHIFTRT:
26504     case ROTATE:
26505     case ROTATERT:
26506       /* Handle mul_highpart.  */
26507       if (outer_code == TRUNCATE
26508           && GET_CODE (XEXP (x, 0)) == MULT)
26509         {
26510           if (mode == DImode)
26511             *total = rs6000_cost->muldi;
26512           else
26513             *total = rs6000_cost->mulsi;
26514           return true;
26515         }
26516       else if (outer_code == AND)
26517         *total = 0;
26518       else
26519         *total = COSTS_N_INSNS (1);
26520       return false;
26521
26522     case SIGN_EXTEND:
26523     case ZERO_EXTEND:
26524       if (GET_CODE (XEXP (x, 0)) == MEM)
26525         *total = 0;
26526       else
26527         *total = COSTS_N_INSNS (1);
26528       return false;
26529
26530     case COMPARE:
26531     case NEG:
26532     case ABS:
26533       if (!FLOAT_MODE_P (mode))
26534         {
26535           *total = COSTS_N_INSNS (1);
26536           return false;
26537         }
26538       /* FALLTHRU */
26539
26540     case FLOAT:
26541     case UNSIGNED_FLOAT:
26542     case FIX:
26543     case UNSIGNED_FIX:
26544     case FLOAT_TRUNCATE:
26545       *total = rs6000_cost->fp;
26546       return false;
26547
26548     case FLOAT_EXTEND:
26549       if (mode == DFmode)
26550         *total = 0;
26551       else
26552         *total = rs6000_cost->fp;
26553       return false;
26554
26555     case UNSPEC:
26556       switch (XINT (x, 1))
26557         {
26558         case UNSPEC_FRSP:
26559           *total = rs6000_cost->fp;
26560           return true;
26561
26562         default:
26563           break;
26564         }
26565       break;
26566
26567     case CALL:
26568     case IF_THEN_ELSE:
26569       if (!speed)
26570         {
26571           *total = COSTS_N_INSNS (1);
26572           return true;
26573         }
26574       else if (FLOAT_MODE_P (mode)
26575                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
26576         {
26577           *total = rs6000_cost->fp;
26578           return false;
26579         }
26580       break;
26581
26582     case EQ:
26583     case GTU:
26584     case LTU:
26585       /* Carry bit requires mode == Pmode.
26586          NEG or PLUS already counted so only add one.  */
26587       if (mode == Pmode
26588           && (outer_code == NEG || outer_code == PLUS))
26589         {
26590           *total = COSTS_N_INSNS (1);
26591           return true;
26592         }
26593       if (outer_code == SET)
26594         {
26595           if (XEXP (x, 1) == const0_rtx)
26596             {
26597               if (TARGET_ISEL && !TARGET_MFCRF)
26598                 *total = COSTS_N_INSNS (8);
26599               else
26600                 *total = COSTS_N_INSNS (2);
26601               return true;
26602             }
26603           else if (mode == Pmode)
26604             {
26605               *total = COSTS_N_INSNS (3);
26606               return false;
26607             }
26608         }
26609       /* FALLTHRU */
26610
26611     case GT:
26612     case LT:
26613     case UNORDERED:
26614       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
26615         {
26616           if (TARGET_ISEL && !TARGET_MFCRF)
26617             *total = COSTS_N_INSNS (8);
26618           else
26619             *total = COSTS_N_INSNS (2);
26620           return true;
26621         }
26622       /* CC COMPARE.  */
26623       if (outer_code == COMPARE)
26624         {
26625           *total = 0;
26626           return true;
26627         }
26628       break;
26629
26630     default:
26631       break;
26632     }
26633
26634   return false;
26635 }
26636
26637 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
26638
26639 static bool
26640 rs6000_debug_rtx_costs (rtx x, int code, int outer_code, int *total,
26641                         bool speed)
26642 {
26643   bool ret = rs6000_rtx_costs (x, code, outer_code, total, speed);
26644
26645   fprintf (stderr,
26646            "\nrs6000_rtx_costs, return = %s, code = %s, outer_code = %s, "
26647            "total = %d, speed = %s, x:\n",
26648            ret ? "complete" : "scan inner",
26649            GET_RTX_NAME (code),
26650            GET_RTX_NAME (outer_code),
26651            *total,
26652            speed ? "true" : "false");
26653
26654   debug_rtx (x);
26655
26656   return ret;
26657 }
26658
26659 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
26660
26661 static int
26662 rs6000_debug_address_cost (rtx x, bool speed)
26663 {
26664   int ret = TARGET_ADDRESS_COST (x, speed);
26665
26666   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
26667            ret, speed ? "true" : "false");
26668   debug_rtx (x);
26669
26670   return ret;
26671 }
26672
26673
26674 /* A C expression returning the cost of moving data from a register of class
26675    CLASS1 to one of CLASS2.  */
26676
26677 static int
26678 rs6000_register_move_cost (enum machine_mode mode,
26679                            reg_class_t from, reg_class_t to)
26680 {
26681   int ret;
26682
26683   /*  Moves from/to GENERAL_REGS.  */
26684   if (reg_classes_intersect_p (to, GENERAL_REGS)
26685       || reg_classes_intersect_p (from, GENERAL_REGS))
26686     {
26687       if (! reg_classes_intersect_p (to, GENERAL_REGS))
26688         from = to;
26689
26690       if (from == FLOAT_REGS || from == ALTIVEC_REGS || from == VSX_REGS)
26691         ret = (rs6000_memory_move_cost (mode, from, false)
26692                + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
26693
26694       /* It's more expensive to move CR_REGS than CR0_REGS because of the
26695          shift.  */
26696       else if (from == CR_REGS)
26697         ret = 4;
26698
26699       /* Power6 has slower LR/CTR moves so make them more expensive than
26700          memory in order to bias spills to memory .*/
26701       else if (rs6000_cpu == PROCESSOR_POWER6
26702                && reg_classes_intersect_p (from, LINK_OR_CTR_REGS))
26703         ret = 6 * hard_regno_nregs[0][mode];
26704
26705       else
26706         /* A move will cost one instruction per GPR moved.  */
26707         ret = 2 * hard_regno_nregs[0][mode];
26708     }
26709
26710   /* If we have VSX, we can easily move between FPR or Altivec registers.  */
26711   else if (VECTOR_UNIT_VSX_P (mode)
26712            && reg_classes_intersect_p (to, VSX_REGS)
26713            && reg_classes_intersect_p (from, VSX_REGS))
26714     ret = 2 * hard_regno_nregs[32][mode];
26715
26716   /* Moving between two similar registers is just one instruction.  */
26717   else if (reg_classes_intersect_p (to, from))
26718     ret = (mode == TFmode || mode == TDmode) ? 4 : 2;
26719
26720   /* Everything else has to go through GENERAL_REGS.  */
26721   else
26722     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
26723            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
26724
26725   if (TARGET_DEBUG_COST)
26726     fprintf (stderr,
26727              "rs6000_register_move_cost:, ret=%d, mode=%s, from=%s, to=%s\n",
26728              ret, GET_MODE_NAME (mode), reg_class_names[from],
26729              reg_class_names[to]);
26730
26731   return ret;
26732 }
26733
26734 /* A C expressions returning the cost of moving data of MODE from a register to
26735    or from memory.  */
26736
26737 static int
26738 rs6000_memory_move_cost (enum machine_mode mode, reg_class_t rclass,
26739                          bool in ATTRIBUTE_UNUSED)
26740 {
26741   int ret;
26742
26743   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
26744     ret = 4 * hard_regno_nregs[0][mode];
26745   else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
26746     ret = 4 * hard_regno_nregs[32][mode];
26747   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
26748     ret = 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
26749   else
26750     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
26751
26752   if (TARGET_DEBUG_COST)
26753     fprintf (stderr,
26754              "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
26755              ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
26756
26757   return ret;
26758 }
26759
26760 /* Returns a code for a target-specific builtin that implements
26761    reciprocal of the function, or NULL_TREE if not available.  */
26762
26763 static tree
26764 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
26765                            bool sqrt ATTRIBUTE_UNUSED)
26766 {
26767   if (optimize_insn_for_size_p ())
26768     return NULL_TREE;
26769
26770   if (md_fn)
26771     switch (fn)
26772       {
26773       case VSX_BUILTIN_XVSQRTDP:
26774         if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
26775           return NULL_TREE;
26776
26777         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
26778
26779       case VSX_BUILTIN_XVSQRTSP:
26780         if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
26781           return NULL_TREE;
26782
26783         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V4SF];
26784
26785       default:
26786         return NULL_TREE;
26787       }
26788
26789   else
26790     switch (fn)
26791       {
26792       case BUILT_IN_SQRT:
26793         if (!RS6000_RECIP_AUTO_RSQRTE_P (DFmode))
26794           return NULL_TREE;
26795
26796         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRT];
26797
26798       case BUILT_IN_SQRTF:
26799         if (!RS6000_RECIP_AUTO_RSQRTE_P (SFmode))
26800           return NULL_TREE;
26801
26802         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
26803
26804       default:
26805         return NULL_TREE;
26806       }
26807 }
26808
26809 /* Load up a constant.  If the mode is a vector mode, splat the value across
26810    all of the vector elements.  */
26811
26812 static rtx
26813 rs6000_load_constant_and_splat (enum machine_mode mode, REAL_VALUE_TYPE dconst)
26814 {
26815   rtx reg;
26816
26817   if (mode == SFmode || mode == DFmode)
26818     {
26819       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, mode);
26820       reg = force_reg (mode, d);
26821     }
26822   else if (mode == V4SFmode)
26823     {
26824       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, SFmode);
26825       rtvec v = gen_rtvec (4, d, d, d, d);
26826       reg = gen_reg_rtx (mode);
26827       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26828     }
26829   else if (mode == V2DFmode)
26830     {
26831       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, DFmode);
26832       rtvec v = gen_rtvec (2, d, d);
26833       reg = gen_reg_rtx (mode);
26834       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26835     }
26836   else
26837     gcc_unreachable ();
26838
26839   return reg;
26840 }
26841
26842 /* Generate an FMA instruction.  */
26843
26844 static void
26845 rs6000_emit_madd (rtx target, rtx m1, rtx m2, rtx a)
26846 {
26847   enum machine_mode mode = GET_MODE (target);
26848   rtx dst;
26849
26850   dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26851   gcc_assert (dst != NULL);
26852
26853   if (dst != target)
26854     emit_move_insn (target, dst);
26855 }
26856
26857 /* Generate a FMSUB instruction: dst = fma(m1, m2, -a).  */
26858
26859 static void
26860 rs6000_emit_msub (rtx target, rtx m1, rtx m2, rtx a)
26861 {
26862   enum machine_mode mode = GET_MODE (target);
26863   rtx dst;
26864
26865   /* Altivec does not support fms directly;
26866      generate in terms of fma in that case.  */
26867   if (optab_handler (fms_optab, mode) != CODE_FOR_nothing)
26868     dst = expand_ternary_op (mode, fms_optab, m1, m2, a, target, 0);
26869   else
26870     {
26871       a = expand_unop (mode, neg_optab, a, NULL_RTX, 0);
26872       dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26873     }
26874   gcc_assert (dst != NULL);
26875
26876   if (dst != target)
26877     emit_move_insn (target, dst);
26878 }
26879     
26880 /* Generate a FNMSUB instruction: dst = -fma(m1, m2, -a).  */
26881
26882 static void
26883 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
26884 {
26885   enum machine_mode mode = GET_MODE (dst);
26886   rtx r;
26887
26888   /* This is a tad more complicated, since the fnma_optab is for
26889      a different expression: fma(-m1, m2, a), which is the same
26890      thing except in the case of signed zeros.
26891
26892      Fortunately we know that if FMA is supported that FNMSUB is
26893      also supported in the ISA.  Just expand it directly.  */
26894
26895   gcc_assert (optab_handler (fma_optab, mode) != CODE_FOR_nothing);
26896
26897   r = gen_rtx_NEG (mode, a);
26898   r = gen_rtx_FMA (mode, m1, m2, r);
26899   r = gen_rtx_NEG (mode, r);
26900   emit_insn (gen_rtx_SET (VOIDmode, dst, r));
26901 }
26902
26903 /* Newton-Raphson approximation of floating point divide with just 2 passes
26904    (either single precision floating point, or newer machines with higher
26905    accuracy estimates).  Support both scalar and vector divide.  Assumes no
26906    trapping math and finite arguments.  */
26907
26908 static void
26909 rs6000_emit_swdiv_high_precision (rtx dst, rtx n, rtx d)
26910 {
26911   enum machine_mode mode = GET_MODE (dst);
26912   rtx x0, e0, e1, y1, u0, v0;
26913   enum insn_code code = optab_handler (smul_optab, mode);
26914   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26915   rtx one = rs6000_load_constant_and_splat (mode, dconst1);
26916
26917   gcc_assert (code != CODE_FOR_nothing);
26918
26919   /* x0 = 1./d estimate */
26920   x0 = gen_reg_rtx (mode);
26921   emit_insn (gen_rtx_SET (VOIDmode, x0,
26922                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26923                                           UNSPEC_FRES)));
26924
26925   e0 = gen_reg_rtx (mode);
26926   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - (d * x0) */
26927
26928   e1 = gen_reg_rtx (mode);
26929   rs6000_emit_madd (e1, e0, e0, e0);            /* e1 = (e0 * e0) + e0 */
26930
26931   y1 = gen_reg_rtx (mode);
26932   rs6000_emit_madd (y1, e1, x0, x0);            /* y1 = (e1 * x0) + x0 */
26933
26934   u0 = gen_reg_rtx (mode);
26935   emit_insn (gen_mul (u0, n, y1));              /* u0 = n * y1 */
26936
26937   v0 = gen_reg_rtx (mode);
26938   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - (d * u0) */
26939
26940   rs6000_emit_madd (dst, v0, y1, u0);           /* dst = (v0 * y1) + u0 */
26941 }
26942
26943 /* Newton-Raphson approximation of floating point divide that has a low
26944    precision estimate.  Assumes no trapping math and finite arguments.  */
26945
26946 static void
26947 rs6000_emit_swdiv_low_precision (rtx dst, rtx n, rtx d)
26948 {
26949   enum machine_mode mode = GET_MODE (dst);
26950   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
26951   enum insn_code code = optab_handler (smul_optab, mode);
26952   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26953
26954   gcc_assert (code != CODE_FOR_nothing);
26955
26956   one = rs6000_load_constant_and_splat (mode, dconst1);
26957
26958   /* x0 = 1./d estimate */
26959   x0 = gen_reg_rtx (mode);
26960   emit_insn (gen_rtx_SET (VOIDmode, x0,
26961                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26962                                           UNSPEC_FRES)));
26963
26964   e0 = gen_reg_rtx (mode);
26965   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - d * x0 */
26966
26967   y1 = gen_reg_rtx (mode);
26968   rs6000_emit_madd (y1, e0, x0, x0);            /* y1 = x0 + e0 * x0 */
26969
26970   e1 = gen_reg_rtx (mode);
26971   emit_insn (gen_mul (e1, e0, e0));             /* e1 = e0 * e0 */
26972
26973   y2 = gen_reg_rtx (mode);
26974   rs6000_emit_madd (y2, e1, y1, y1);            /* y2 = y1 + e1 * y1 */
26975
26976   e2 = gen_reg_rtx (mode);
26977   emit_insn (gen_mul (e2, e1, e1));             /* e2 = e1 * e1 */
26978
26979   y3 = gen_reg_rtx (mode);
26980   rs6000_emit_madd (y3, e2, y2, y2);            /* y3 = y2 + e2 * y2 */
26981
26982   u0 = gen_reg_rtx (mode);
26983   emit_insn (gen_mul (u0, n, y3));              /* u0 = n * y3 */
26984
26985   v0 = gen_reg_rtx (mode);
26986   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - d * u0 */
26987
26988   rs6000_emit_madd (dst, v0, y3, u0);           /* dst = u0 + v0 * y3 */
26989 }
26990
26991 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
26992    add a reg_note saying that this was a division.  Support both scalar and
26993    vector divide.  Assumes no trapping math and finite arguments.  */
26994
26995 void
26996 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
26997 {
26998   enum machine_mode mode = GET_MODE (dst);
26999
27000   if (RS6000_RECIP_HIGH_PRECISION_P (mode))
27001     rs6000_emit_swdiv_high_precision (dst, n, d);
27002   else
27003     rs6000_emit_swdiv_low_precision (dst, n, d);
27004
27005   if (note_p)
27006     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
27007 }
27008
27009 /* Newton-Raphson approximation of single/double-precision floating point
27010    rsqrt.  Assumes no trapping math and finite arguments.  */
27011
27012 void
27013 rs6000_emit_swrsqrt (rtx dst, rtx src)
27014 {
27015   enum machine_mode mode = GET_MODE (src);
27016   rtx x0 = gen_reg_rtx (mode);
27017   rtx y = gen_reg_rtx (mode);
27018   int passes = (TARGET_RECIP_PRECISION) ? 2 : 3;
27019   REAL_VALUE_TYPE dconst3_2;
27020   int i;
27021   rtx halfthree;
27022   enum insn_code code = optab_handler (smul_optab, mode);
27023   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
27024
27025   gcc_assert (code != CODE_FOR_nothing);
27026
27027   /* Load up the constant 1.5 either as a scalar, or as a vector.  */
27028   real_from_integer (&dconst3_2, VOIDmode, 3, 0, 0);
27029   SET_REAL_EXP (&dconst3_2, REAL_EXP (&dconst3_2) - 1);
27030
27031   halfthree = rs6000_load_constant_and_splat (mode, dconst3_2);
27032
27033   /* x0 = rsqrt estimate */
27034   emit_insn (gen_rtx_SET (VOIDmode, x0,
27035                           gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
27036                                           UNSPEC_RSQRT)));
27037
27038   /* y = 0.5 * src = 1.5 * src - src -> fewer constants */
27039   rs6000_emit_msub (y, src, halfthree, src);
27040
27041   for (i = 0; i < passes; i++)
27042     {
27043       rtx x1 = gen_reg_rtx (mode);
27044       rtx u = gen_reg_rtx (mode);
27045       rtx v = gen_reg_rtx (mode);
27046
27047       /* x1 = x0 * (1.5 - y * (x0 * x0)) */
27048       emit_insn (gen_mul (u, x0, x0));
27049       rs6000_emit_nmsub (v, y, u, halfthree);
27050       emit_insn (gen_mul (x1, x0, v));
27051       x0 = x1;
27052     }
27053
27054   emit_move_insn (dst, x0);
27055   return;
27056 }
27057
27058 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
27059    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
27060
27061 void
27062 rs6000_emit_popcount (rtx dst, rtx src)
27063 {
27064   enum machine_mode mode = GET_MODE (dst);
27065   rtx tmp1, tmp2;
27066
27067   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
27068   if (TARGET_POPCNTD)
27069     {
27070       if (mode == SImode)
27071         emit_insn (gen_popcntdsi2 (dst, src));
27072       else
27073         emit_insn (gen_popcntddi2 (dst, src));
27074       return;
27075     }
27076
27077   tmp1 = gen_reg_rtx (mode);
27078
27079   if (mode == SImode)
27080     {
27081       emit_insn (gen_popcntbsi2 (tmp1, src));
27082       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
27083                            NULL_RTX, 0);
27084       tmp2 = force_reg (SImode, tmp2);
27085       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
27086     }
27087   else
27088     {
27089       emit_insn (gen_popcntbdi2 (tmp1, src));
27090       tmp2 = expand_mult (DImode, tmp1,
27091                           GEN_INT ((HOST_WIDE_INT)
27092                                    0x01010101 << 32 | 0x01010101),
27093                           NULL_RTX, 0);
27094       tmp2 = force_reg (DImode, tmp2);
27095       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
27096     }
27097 }
27098
27099
27100 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
27101    target, and SRC is the argument operand.  */
27102
27103 void
27104 rs6000_emit_parity (rtx dst, rtx src)
27105 {
27106   enum machine_mode mode = GET_MODE (dst);
27107   rtx tmp;
27108
27109   tmp = gen_reg_rtx (mode);
27110
27111   /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can.  */
27112   if (TARGET_CMPB)
27113     {
27114       if (mode == SImode)
27115         {
27116           emit_insn (gen_popcntbsi2 (tmp, src));
27117           emit_insn (gen_paritysi2_cmpb (dst, tmp));
27118         }
27119       else
27120         {
27121           emit_insn (gen_popcntbdi2 (tmp, src));
27122           emit_insn (gen_paritydi2_cmpb (dst, tmp));
27123         }
27124       return;
27125     }
27126
27127   if (mode == SImode)
27128     {
27129       /* Is mult+shift >= shift+xor+shift+xor?  */
27130       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
27131         {
27132           rtx tmp1, tmp2, tmp3, tmp4;
27133
27134           tmp1 = gen_reg_rtx (SImode);
27135           emit_insn (gen_popcntbsi2 (tmp1, src));
27136
27137           tmp2 = gen_reg_rtx (SImode);
27138           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
27139           tmp3 = gen_reg_rtx (SImode);
27140           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
27141
27142           tmp4 = gen_reg_rtx (SImode);
27143           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
27144           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
27145         }
27146       else
27147         rs6000_emit_popcount (tmp, src);
27148       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
27149     }
27150   else
27151     {
27152       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
27153       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
27154         {
27155           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
27156
27157           tmp1 = gen_reg_rtx (DImode);
27158           emit_insn (gen_popcntbdi2 (tmp1, src));
27159
27160           tmp2 = gen_reg_rtx (DImode);
27161           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
27162           tmp3 = gen_reg_rtx (DImode);
27163           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
27164
27165           tmp4 = gen_reg_rtx (DImode);
27166           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
27167           tmp5 = gen_reg_rtx (DImode);
27168           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
27169
27170           tmp6 = gen_reg_rtx (DImode);
27171           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
27172           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
27173         }
27174       else
27175         rs6000_emit_popcount (tmp, src);
27176       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
27177     }
27178 }
27179
27180 /* Return an RTX representing where to find the function value of a
27181    function returning MODE.  */
27182 static rtx
27183 rs6000_complex_function_value (enum machine_mode mode)
27184 {
27185   unsigned int regno;
27186   rtx r1, r2;
27187   enum machine_mode inner = GET_MODE_INNER (mode);
27188   unsigned int inner_bytes = GET_MODE_SIZE (inner);
27189
27190   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
27191     regno = FP_ARG_RETURN;
27192   else
27193     {
27194       regno = GP_ARG_RETURN;
27195
27196       /* 32-bit is OK since it'll go in r3/r4.  */
27197       if (TARGET_32BIT && inner_bytes >= 4)
27198         return gen_rtx_REG (mode, regno);
27199     }
27200
27201   if (inner_bytes >= 8)
27202     return gen_rtx_REG (mode, regno);
27203
27204   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
27205                           const0_rtx);
27206   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
27207                           GEN_INT (inner_bytes));
27208   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
27209 }
27210
27211 /* Target hook for TARGET_FUNCTION_VALUE.
27212
27213    On the SPE, both FPs and vectors are returned in r3.
27214
27215    On RS/6000 an integer value is in r3 and a floating-point value is in
27216    fp1, unless -msoft-float.  */
27217
27218 rtx
27219 rs6000_function_value (const_tree valtype,
27220                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
27221                        bool outgoing ATTRIBUTE_UNUSED)
27222 {
27223   enum machine_mode mode;
27224   unsigned int regno;
27225
27226   /* Special handling for structs in darwin64.  */
27227   if (TARGET_MACHO 
27228       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
27229     {
27230       CUMULATIVE_ARGS valcum;
27231       rtx valret;
27232
27233       valcum.words = 0;
27234       valcum.fregno = FP_ARG_MIN_REG;
27235       valcum.vregno = ALTIVEC_ARG_MIN_REG;
27236       /* Do a trial code generation as if this were going to be passed as
27237          an argument; if any part goes in memory, we return NULL.  */
27238       valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true);
27239       if (valret)
27240         return valret;
27241       /* Otherwise fall through to standard ABI rules.  */
27242     }
27243
27244   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
27245     {
27246       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
27247       return gen_rtx_PARALLEL (DImode,
27248         gen_rtvec (2,
27249                    gen_rtx_EXPR_LIST (VOIDmode,
27250                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
27251                                       const0_rtx),
27252                    gen_rtx_EXPR_LIST (VOIDmode,
27253                                       gen_rtx_REG (SImode,
27254                                                    GP_ARG_RETURN + 1),
27255                                       GEN_INT (4))));
27256     }
27257   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
27258     {
27259       return gen_rtx_PARALLEL (DCmode,
27260         gen_rtvec (4,
27261                    gen_rtx_EXPR_LIST (VOIDmode,
27262                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
27263                                       const0_rtx),
27264                    gen_rtx_EXPR_LIST (VOIDmode,
27265                                       gen_rtx_REG (SImode,
27266                                                    GP_ARG_RETURN + 1),
27267                                       GEN_INT (4)),
27268                    gen_rtx_EXPR_LIST (VOIDmode,
27269                                       gen_rtx_REG (SImode,
27270                                                    GP_ARG_RETURN + 2),
27271                                       GEN_INT (8)),
27272                    gen_rtx_EXPR_LIST (VOIDmode,
27273                                       gen_rtx_REG (SImode,
27274                                                    GP_ARG_RETURN + 3),
27275                                       GEN_INT (12))));
27276     }
27277
27278   mode = TYPE_MODE (valtype);
27279   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
27280       || POINTER_TYPE_P (valtype))
27281     mode = TARGET_32BIT ? SImode : DImode;
27282
27283   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
27284     /* _Decimal128 must use an even/odd register pair.  */
27285     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
27286   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
27287            && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
27288     regno = FP_ARG_RETURN;
27289   else if (TREE_CODE (valtype) == COMPLEX_TYPE
27290            && targetm.calls.split_complex_arg)
27291     return rs6000_complex_function_value (mode);
27292   else if (TREE_CODE (valtype) == VECTOR_TYPE
27293            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
27294            && ALTIVEC_VECTOR_MODE (mode))
27295     regno = ALTIVEC_ARG_RETURN;
27296   else if (TREE_CODE (valtype) == VECTOR_TYPE
27297            && TARGET_VSX && TARGET_ALTIVEC_ABI
27298            && VSX_VECTOR_MODE (mode))
27299     regno = ALTIVEC_ARG_RETURN;
27300   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
27301            && (mode == DFmode || mode == DCmode
27302                || mode == TFmode || mode == TCmode))
27303     return spe_build_register_parallel (mode, GP_ARG_RETURN);
27304   else
27305     regno = GP_ARG_RETURN;
27306
27307   return gen_rtx_REG (mode, regno);
27308 }
27309
27310 /* Define how to find the value returned by a library function
27311    assuming the value has mode MODE.  */
27312 rtx
27313 rs6000_libcall_value (enum machine_mode mode)
27314 {
27315   unsigned int regno;
27316
27317   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
27318     {
27319       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
27320       return gen_rtx_PARALLEL (DImode,
27321         gen_rtvec (2,
27322                    gen_rtx_EXPR_LIST (VOIDmode,
27323                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
27324                                       const0_rtx),
27325                    gen_rtx_EXPR_LIST (VOIDmode,
27326                                       gen_rtx_REG (SImode,
27327                                                    GP_ARG_RETURN + 1),
27328                                       GEN_INT (4))));
27329     }
27330
27331   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
27332     /* _Decimal128 must use an even/odd register pair.  */
27333     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
27334   else if (SCALAR_FLOAT_MODE_P (mode)
27335            && TARGET_HARD_FLOAT && TARGET_FPRS
27336            && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
27337     regno = FP_ARG_RETURN;
27338   else if (ALTIVEC_VECTOR_MODE (mode)
27339            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
27340     regno = ALTIVEC_ARG_RETURN;
27341   else if (VSX_VECTOR_MODE (mode)
27342            && TARGET_VSX && TARGET_ALTIVEC_ABI)
27343     regno = ALTIVEC_ARG_RETURN;
27344   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
27345     return rs6000_complex_function_value (mode);
27346   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
27347            && (mode == DFmode || mode == DCmode
27348                || mode == TFmode || mode == TCmode))
27349     return spe_build_register_parallel (mode, GP_ARG_RETURN);
27350   else
27351     regno = GP_ARG_RETURN;
27352
27353   return gen_rtx_REG (mode, regno);
27354 }
27355
27356
27357 /* Given FROM and TO register numbers, say whether this elimination is allowed.
27358    Frame pointer elimination is automatically handled.
27359
27360    For the RS/6000, if frame pointer elimination is being done, we would like
27361    to convert ap into fp, not sp.
27362
27363    We need r30 if -mminimal-toc was specified, and there are constant pool
27364    references.  */
27365
27366 bool
27367 rs6000_can_eliminate (const int from, const int to)
27368 {
27369   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
27370           ? ! frame_pointer_needed
27371           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
27372             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0
27373             : true);
27374 }
27375
27376 /* Define the offset between two registers, FROM to be eliminated and its
27377    replacement TO, at the start of a routine.  */
27378 HOST_WIDE_INT
27379 rs6000_initial_elimination_offset (int from, int to)
27380 {
27381   rs6000_stack_t *info = rs6000_stack_info ();
27382   HOST_WIDE_INT offset;
27383
27384   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
27385     offset = info->push_p ? 0 : -info->total_size;
27386   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
27387     {
27388       offset = info->push_p ? 0 : -info->total_size;
27389       if (FRAME_GROWS_DOWNWARD)
27390         offset += info->fixed_size + info->vars_size + info->parm_size;
27391     }
27392   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
27393     offset = FRAME_GROWS_DOWNWARD
27394              ? info->fixed_size + info->vars_size + info->parm_size
27395              : 0;
27396   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
27397     offset = info->total_size;
27398   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
27399     offset = info->push_p ? info->total_size : 0;
27400   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
27401     offset = 0;
27402   else
27403     gcc_unreachable ();
27404
27405   return offset;
27406 }
27407
27408 static rtx
27409 rs6000_dwarf_register_span (rtx reg)
27410 {
27411   rtx parts[8];
27412   int i, words;
27413   unsigned regno = REGNO (reg);
27414   enum machine_mode mode = GET_MODE (reg);
27415
27416   if (TARGET_SPE
27417       && regno < 32
27418       && (SPE_VECTOR_MODE (GET_MODE (reg))
27419           || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
27420               && mode != SFmode && mode != SDmode && mode != SCmode)))
27421     ;
27422   else
27423     return NULL_RTX;
27424
27425   regno = REGNO (reg);
27426
27427   /* The duality of the SPE register size wreaks all kinds of havoc.
27428      This is a way of distinguishing r0 in 32-bits from r0 in
27429      64-bits.  */
27430   words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
27431   gcc_assert (words <= 4);
27432   for (i = 0; i < words; i++, regno++)
27433     {
27434       if (BYTES_BIG_ENDIAN)
27435         {
27436           parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
27437           parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
27438         }
27439       else
27440         {
27441           parts[2 * i] = gen_rtx_REG (SImode, regno);
27442           parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
27443         }
27444     }
27445
27446   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
27447 }
27448
27449 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
27450
27451 static void
27452 rs6000_init_dwarf_reg_sizes_extra (tree address)
27453 {
27454   if (TARGET_SPE)
27455     {
27456       int i;
27457       enum machine_mode mode = TYPE_MODE (char_type_node);
27458       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
27459       rtx mem = gen_rtx_MEM (BLKmode, addr);
27460       rtx value = gen_int_mode (4, mode);
27461
27462       for (i = 1201; i < 1232; i++)
27463         {
27464           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
27465           HOST_WIDE_INT offset
27466             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
27467
27468           emit_move_insn (adjust_address (mem, mode, offset), value);
27469         }
27470     }
27471 }
27472
27473 /* Map internal gcc register numbers to DWARF2 register numbers.  */
27474
27475 unsigned int
27476 rs6000_dbx_register_number (unsigned int regno)
27477 {
27478   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
27479     return regno;
27480   if (regno == MQ_REGNO)
27481     return 100;
27482   if (regno == LR_REGNO)
27483     return 108;
27484   if (regno == CTR_REGNO)
27485     return 109;
27486   if (CR_REGNO_P (regno))
27487     return regno - CR0_REGNO + 86;
27488   if (regno == CA_REGNO)
27489     return 101;  /* XER */
27490   if (ALTIVEC_REGNO_P (regno))
27491     return regno - FIRST_ALTIVEC_REGNO + 1124;
27492   if (regno == VRSAVE_REGNO)
27493     return 356;
27494   if (regno == VSCR_REGNO)
27495     return 67;
27496   if (regno == SPE_ACC_REGNO)
27497     return 99;
27498   if (regno == SPEFSCR_REGNO)
27499     return 612;
27500   /* SPE high reg number.  We get these values of regno from
27501      rs6000_dwarf_register_span.  */
27502   gcc_assert (regno >= 1200 && regno < 1232);
27503   return regno;
27504 }
27505
27506 /* target hook eh_return_filter_mode */
27507 static enum machine_mode
27508 rs6000_eh_return_filter_mode (void)
27509 {
27510   return TARGET_32BIT ? SImode : word_mode;
27511 }
27512
27513 /* Target hook for scalar_mode_supported_p.  */
27514 static bool
27515 rs6000_scalar_mode_supported_p (enum machine_mode mode)
27516 {
27517   if (DECIMAL_FLOAT_MODE_P (mode))
27518     return default_decimal_float_supported_p ();
27519   else
27520     return default_scalar_mode_supported_p (mode);
27521 }
27522
27523 /* Target hook for vector_mode_supported_p.  */
27524 static bool
27525 rs6000_vector_mode_supported_p (enum machine_mode mode)
27526 {
27527
27528   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
27529     return true;
27530
27531   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
27532     return true;
27533
27534   else if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
27535     return true;
27536
27537   else
27538     return false;
27539 }
27540
27541 /* Target hook for invalid_arg_for_unprototyped_fn. */
27542 static const char *
27543 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
27544 {
27545   return (!rs6000_darwin64_abi
27546           && typelist == 0
27547           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
27548           && (funcdecl == NULL_TREE
27549               || (TREE_CODE (funcdecl) == FUNCTION_DECL
27550                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
27551           ? N_("AltiVec argument passed to unprototyped function")
27552           : NULL;
27553 }
27554
27555 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
27556    setup by using __stack_chk_fail_local hidden function instead of
27557    calling __stack_chk_fail directly.  Otherwise it is better to call
27558    __stack_chk_fail directly.  */
27559
27560 static tree
27561 rs6000_stack_protect_fail (void)
27562 {
27563   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
27564          ? default_hidden_stack_protect_fail ()
27565          : default_external_stack_protect_fail ();
27566 }
27567
27568 void
27569 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
27570                            int num_operands ATTRIBUTE_UNUSED)
27571 {
27572   if (rs6000_warn_cell_microcode)
27573     {
27574       const char *temp;
27575       int insn_code_number = recog_memoized (insn);
27576       location_t location = locator_location (INSN_LOCATOR (insn));
27577
27578       /* Punt on insns we cannot recognize.  */
27579       if (insn_code_number < 0)
27580         return;
27581
27582       temp = get_insn_template (insn_code_number, insn);
27583
27584       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
27585         warning_at (location, OPT_mwarn_cell_microcode,
27586                     "emitting microcode insn %s\t[%s] #%d",
27587                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn)); 
27588       else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
27589         warning_at (location, OPT_mwarn_cell_microcode,
27590                     "emitting conditional microcode insn %s\t[%s] #%d",
27591                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
27592     }
27593 }
27594
27595 \f
27596 /* Mask options that we want to support inside of attribute((target)) and
27597    #pragma GCC target operations.  Note, we do not include things like
27598    64/32-bit, endianess, hard/soft floating point, etc. that would have
27599    different calling sequences.  */
27600
27601 struct rs6000_opt_mask {
27602   const char *name;             /* option name */
27603   int mask;                     /* mask to set */
27604   bool invert;                  /* invert sense of mask */
27605   bool valid_target;            /* option is a target option */
27606 };
27607
27608 static struct rs6000_opt_mask const rs6000_opt_masks[] =
27609 {
27610   { "altivec",          MASK_ALTIVEC,           false, true  },
27611   { "cmpb",             MASK_CMPB,              false, true  },
27612   { "dlmzb",            MASK_DLMZB,             false, true  },
27613   { "fprnd",            MASK_FPRND,             false, true  },
27614   { "hard-dfp",         MASK_DFP,               false, true  },
27615   { "isel",             MASK_ISEL,              false, true  },
27616   { "mfcrf",            MASK_MFCRF,             false, true  },
27617   { "mfpgpr",           MASK_MFPGPR,            false, true  },
27618   { "mulhw",            MASK_MULHW,             false, true  },
27619   { "multiple",         MASK_MULTIPLE,          false, true  },
27620   { "update",           MASK_NO_UPDATE,         true , true  },
27621   { "popcntb",          MASK_POPCNTB,           false, true  },
27622   { "popcntd",          MASK_POPCNTD,           false, true  },
27623   { "powerpc-gfxopt",   MASK_PPC_GFXOPT,        false, true  },
27624   { "powerpc-gpopt",    MASK_PPC_GPOPT,         false, true  },
27625   { "recip-precision",  MASK_RECIP_PRECISION,   false, true  },
27626   { "string",           MASK_STRING,            false, true  },
27627   { "vsx",              MASK_VSX,               false, true  },
27628 #ifdef MASK_64BIT
27629 #if TARGET_AIX_OS
27630   { "aix64",            MASK_64BIT,             false, false },
27631   { "aix32",            MASK_64BIT,             true,  false },
27632 #else
27633   { "64",               MASK_64BIT,             false, false },
27634   { "32",               MASK_64BIT,             true,  false },
27635 #endif
27636 #endif
27637 #ifdef MASK_EABI
27638   { "eabi",             MASK_EABI,              false, false },
27639 #endif
27640 #ifdef MASK_LITTLE_ENDIAN
27641   { "little",           MASK_LITTLE_ENDIAN,     false, false },
27642   { "big",              MASK_LITTLE_ENDIAN,     true,  false },
27643 #endif
27644 #ifdef MASK_RELOCATABLE
27645   { "relocatable",      MASK_RELOCATABLE,       false, false },
27646 #endif
27647 #ifdef MASK_STRICT_ALIGN
27648   { "strict-align",     MASK_STRICT_ALIGN,      false, false },
27649 #endif
27650   { "power",            MASK_POWER,             false, false },
27651   { "power2",           MASK_POWER2,            false, false },
27652   { "powerpc",          MASK_POWERPC,           false, false },
27653   { "soft-float",       MASK_SOFT_FLOAT,        false, false },
27654   { "string",           MASK_STRING,            false, false },
27655 };
27656
27657 /* Option variables that we want to support inside attribute((target)) and
27658    #pragma GCC target operations.  */
27659
27660 struct rs6000_opt_var {
27661   const char *name;             /* option name */
27662   size_t global_offset;         /* offset of the option in global_options.  */
27663   size_t target_offset;         /* offset of the option in target optiosn.  */
27664 };
27665
27666 static struct rs6000_opt_var const rs6000_opt_vars[] =
27667 {
27668   { "friz",
27669     offsetof (struct gcc_options, x_TARGET_FRIZ),
27670     offsetof (struct cl_target_option, x_TARGET_FRIZ), },
27671   { "avoid-indexed-addresses",
27672     offsetof (struct gcc_options, x_TARGET_AVOID_XFORM),
27673     offsetof (struct cl_target_option, x_TARGET_AVOID_XFORM) },
27674   { "paired",
27675     offsetof (struct gcc_options, x_rs6000_paired_float),
27676     offsetof (struct cl_target_option, x_rs6000_paired_float), },
27677   { "longcall",
27678     offsetof (struct gcc_options, x_rs6000_default_long_calls),
27679     offsetof (struct cl_target_option, x_rs6000_default_long_calls), },
27680 };
27681
27682 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
27683    parsing.  Return true if there were no errors.  */
27684
27685 static bool
27686 rs6000_inner_target_options (tree args, bool attr_p)
27687 {
27688   bool ret = true;
27689
27690   if (args == NULL_TREE)
27691     ;
27692
27693   else if (TREE_CODE (args) == STRING_CST)
27694     {
27695       char *p = ASTRDUP (TREE_STRING_POINTER (args));
27696       char *q;
27697
27698       while ((q = strtok (p, ",")) != NULL)
27699         {
27700           bool error_p = false;
27701           bool not_valid_p = false;
27702           const char *cpu_opt = NULL;
27703
27704           p = NULL;
27705           if (strncmp (q, "cpu=", 4) == 0)
27706             {
27707               int cpu_index = rs6000_cpu_name_lookup (q+4);
27708               if (cpu_index >= 0)
27709                 rs6000_cpu_index = cpu_index;
27710               else
27711                 {
27712                   error_p = true;
27713                   cpu_opt = q+4;
27714                 }
27715             }
27716           else if (strncmp (q, "tune=", 5) == 0)
27717             {
27718               int tune_index = rs6000_cpu_name_lookup (q+5);
27719               if (tune_index >= 0)
27720                 rs6000_tune_index = tune_index;
27721               else
27722                 {
27723                   error_p = true;
27724                   cpu_opt = q+5;
27725                 }
27726             }
27727           else
27728             {
27729               size_t i;
27730               bool invert = false;
27731               char *r = q;
27732
27733               error_p = true;
27734               if (strncmp (r, "no-", 3) == 0)
27735                 {
27736                   invert = true;
27737                   r += 3;
27738                 }
27739
27740               for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
27741                 if (strcmp (r, rs6000_opt_masks[i].name) == 0)
27742                   {
27743                     int mask = rs6000_opt_masks[i].mask;
27744
27745                     if (!rs6000_opt_masks[i].valid_target)
27746                       not_valid_p = true;
27747                     else
27748                       {
27749                         error_p = false;
27750                         target_flags_explicit |= mask;
27751
27752                         if (rs6000_opt_masks[i].invert)
27753                           invert = !invert;
27754
27755                         if (invert)
27756                           target_flags &= ~mask;
27757                         else
27758                           target_flags |= mask;
27759                       }
27760                     break;
27761                   }
27762
27763               if (error_p && !not_valid_p)
27764                 {
27765                   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
27766                     if (strcmp (r, rs6000_opt_vars[i].name) == 0)
27767                       {
27768                         size_t j = rs6000_opt_vars[i].global_offset;
27769                         ((int *) &global_options)[j] = !invert;
27770                         error_p = false;
27771                         break;
27772                       }
27773                 }
27774             }
27775
27776           if (error_p)
27777             {
27778               const char *eprefix, *esuffix;
27779
27780               ret = false;
27781               if (attr_p)
27782                 {
27783                   eprefix = "__attribute__((__target__(";
27784                   esuffix = ")))";
27785                 }
27786               else
27787                 {
27788                   eprefix = "#pragma GCC target ";
27789                   esuffix = "";
27790                 }
27791
27792               if (cpu_opt)
27793                 error ("invalid cpu \"%s\" for %s\"%s\"%s", cpu_opt, eprefix,
27794                        q, esuffix);
27795               else if (not_valid_p)
27796                 error ("%s\"%s\"%s is not allowed", eprefix, q, esuffix);
27797               else
27798                 error ("%s\"%s\"%s is invalid", eprefix, q, esuffix);
27799             }
27800         }
27801     }
27802
27803   else if (TREE_CODE (args) == TREE_LIST)
27804     {
27805       do
27806         {
27807           tree value = TREE_VALUE (args);
27808           if (value)
27809             {
27810               bool ret2 = rs6000_inner_target_options (value, attr_p);
27811               if (!ret2)
27812                 ret = false;
27813             }
27814           args = TREE_CHAIN (args);
27815         }
27816       while (args != NULL_TREE);
27817     }
27818
27819   else
27820     gcc_unreachable ();
27821
27822   return ret;
27823 }
27824
27825 /* Print out the target options as a list for -mdebug=target.  */
27826
27827 static void
27828 rs6000_debug_target_options (tree args, const char *prefix)
27829 {
27830   if (args == NULL_TREE)
27831     fprintf (stderr, "%s<NULL>", prefix);
27832
27833   else if (TREE_CODE (args) == STRING_CST)
27834     {
27835       char *p = ASTRDUP (TREE_STRING_POINTER (args));
27836       char *q;
27837
27838       while ((q = strtok (p, ",")) != NULL)
27839         {
27840           p = NULL;
27841           fprintf (stderr, "%s\"%s\"", prefix, q);
27842           prefix = ", ";
27843         }
27844     }
27845
27846   else if (TREE_CODE (args) == TREE_LIST)
27847     {
27848       do
27849         {
27850           tree value = TREE_VALUE (args);
27851           if (value)
27852             {
27853               rs6000_debug_target_options (value, prefix);
27854               prefix = ", ";
27855             }
27856           args = TREE_CHAIN (args);
27857         }
27858       while (args != NULL_TREE);
27859     }
27860
27861   else
27862     gcc_unreachable ();
27863
27864   return;
27865 }
27866
27867 \f
27868 /* Hook to validate attribute((target("..."))).  */
27869
27870 static bool
27871 rs6000_valid_attribute_p (tree fndecl,
27872                           tree ARG_UNUSED (name),
27873                           tree args,
27874                           int flags)
27875 {
27876   struct cl_target_option cur_target;
27877   bool ret;
27878   tree old_optimize = build_optimization_node ();
27879   tree new_target, new_optimize;
27880   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27881
27882   gcc_assert ((fndecl != NULL_TREE) && (args != NULL_TREE));
27883
27884   if (TARGET_DEBUG_TARGET)
27885     {
27886       tree tname = DECL_NAME (fndecl);
27887       fprintf (stderr, "\n==================== rs6000_valid_attribute_p:\n");
27888       if (tname)
27889         fprintf (stderr, "function: %.*s\n",
27890                  (int) IDENTIFIER_LENGTH (tname),
27891                  IDENTIFIER_POINTER (tname));
27892       else
27893         fprintf (stderr, "function: unknown\n");
27894   
27895       fprintf (stderr, "args:");
27896       rs6000_debug_target_options (args, " ");
27897       fprintf (stderr, "\n");
27898
27899       if (flags)
27900         fprintf (stderr, "flags: 0x%x\n", flags);
27901
27902       fprintf (stderr, "--------------------\n");
27903     }
27904
27905   old_optimize = build_optimization_node ();
27906   func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27907
27908   /* If the function changed the optimization levels as well as setting target
27909      options, start with the optimizations specified.  */
27910   if (func_optimize && func_optimize != old_optimize)
27911     cl_optimization_restore (&global_options,
27912                              TREE_OPTIMIZATION (func_optimize));
27913
27914   /* The target attributes may also change some optimization flags, so update
27915      the optimization options if necessary.  */
27916   cl_target_option_save (&cur_target, &global_options);
27917   rs6000_cpu_index = rs6000_tune_index = -1;
27918   ret = rs6000_inner_target_options (args, true);
27919
27920   /* Set up any additional state.  */
27921   if (ret)
27922     {
27923       ret = rs6000_option_override_internal (false);
27924       new_target = build_target_option_node ();
27925     }
27926   else
27927     new_target = NULL;
27928
27929   new_optimize = build_optimization_node ();
27930
27931   if (!new_target)
27932     ret = false;
27933
27934   else if (fndecl)
27935     {
27936       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
27937
27938       if (old_optimize != new_optimize)
27939         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
27940     }
27941
27942   cl_target_option_restore (&global_options, &cur_target);
27943
27944   if (old_optimize != new_optimize)
27945     cl_optimization_restore (&global_options,
27946                              TREE_OPTIMIZATION (old_optimize));
27947
27948   return ret;
27949 }
27950
27951 \f
27952 /* Hook to validate the current #pragma GCC target and set the state, and
27953    update the macros based on what was changed.  If ARGS is NULL, then
27954    POP_TARGET is used to reset the options.  */
27955
27956 bool
27957 rs6000_pragma_target_parse (tree args, tree pop_target)
27958 {
27959   tree cur_tree;
27960   bool ret;
27961
27962   if (TARGET_DEBUG_TARGET)
27963     {
27964       fprintf (stderr, "\n==================== rs6000_pragma_target_parse\n");
27965       fprintf (stderr, "args:");
27966       rs6000_debug_target_options (args, " ");
27967       fprintf (stderr, "\n");
27968
27969       if (pop_target)
27970         {
27971           fprintf (stderr, "pop_target:\n");
27972           debug_tree (pop_target);
27973         }
27974       else
27975         fprintf (stderr, "pop_target: <NULL>\n");
27976
27977       fprintf (stderr, "--------------------\n");
27978     }
27979
27980   if (! args)
27981     {
27982       ret = true;
27983       cur_tree = ((pop_target)
27984                   ? pop_target
27985                   : target_option_default_node);
27986       cl_target_option_restore (&global_options,
27987                                 TREE_TARGET_OPTION (cur_tree));
27988     }
27989   else
27990     {
27991       rs6000_cpu_index = rs6000_tune_index = -1;
27992       ret = rs6000_inner_target_options (args, false);
27993       cur_tree = build_target_option_node ();
27994
27995       if (!cur_tree)
27996         ret = false;
27997     }
27998
27999   if (cur_tree)
28000     target_option_current_node = cur_tree;
28001
28002   return ret;
28003 }
28004
28005 \f
28006 /* Remember the last target of rs6000_set_current_function.  */
28007 static GTY(()) tree rs6000_previous_fndecl;
28008
28009 /* Establish appropriate back-end context for processing the function
28010    FNDECL.  The argument might be NULL to indicate processing at top
28011    level, outside of any function scope.  */
28012 static void
28013 rs6000_set_current_function (tree fndecl)
28014 {
28015   tree old_tree = (rs6000_previous_fndecl
28016                    ? DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl)
28017                    : NULL_TREE);
28018
28019   tree new_tree = (fndecl
28020                    ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
28021                    : NULL_TREE);
28022
28023   if (TARGET_DEBUG_TARGET)
28024     {
28025       bool print_final = false;
28026       fprintf (stderr, "\n==================== rs6000_set_current_function");
28027
28028       if (fndecl)
28029         fprintf (stderr, ", fndecl %s (%p)",
28030                  (DECL_NAME (fndecl)
28031                   ? IDENTIFIER_POINTER (DECL_NAME (fndecl))
28032                   : "<unknown>"), (void *)fndecl);
28033
28034       if (rs6000_previous_fndecl)
28035         fprintf (stderr, ", prev_fndecl (%p)", (void *)rs6000_previous_fndecl);
28036
28037       fprintf (stderr, "\n");
28038       if (new_tree)
28039         {
28040           fprintf (stderr, "\nnew fndecl target specific options:\n");
28041           debug_tree (new_tree);
28042           print_final = true;
28043         }
28044
28045       if (old_tree)
28046         {
28047           fprintf (stderr, "\nold fndecl target specific options:\n");
28048           debug_tree (old_tree);
28049           print_final = true;
28050         }
28051
28052       if (print_final)
28053         fprintf (stderr, "--------------------\n");
28054     }
28055
28056   /* Only change the context if the function changes.  This hook is called
28057      several times in the course of compiling a function, and we don't want to
28058      slow things down too much or call target_reinit when it isn't safe.  */
28059   if (fndecl && fndecl != rs6000_previous_fndecl)
28060     {
28061       rs6000_previous_fndecl = fndecl;
28062       if (old_tree == new_tree)
28063         ;
28064
28065       else if (new_tree)
28066         {
28067           cl_target_option_restore (&global_options,
28068                                     TREE_TARGET_OPTION (new_tree));
28069           target_reinit ();
28070         }
28071
28072       else if (old_tree)
28073         {
28074           struct cl_target_option *def
28075             = TREE_TARGET_OPTION (target_option_current_node);
28076
28077           cl_target_option_restore (&global_options, def);
28078           target_reinit ();
28079         }
28080     }
28081 }
28082
28083 \f
28084 /* Save the current options */
28085
28086 static void
28087 rs6000_function_specific_save (struct cl_target_option *ptr)
28088 {
28089   ptr->rs6000_target_flags_explicit = target_flags_explicit;
28090 }
28091
28092 /* Restore the current options */
28093
28094 static void
28095 rs6000_function_specific_restore (struct cl_target_option *ptr)
28096 {
28097   target_flags_explicit = ptr->rs6000_target_flags_explicit;
28098   (void) rs6000_option_override_internal (false);
28099 }
28100
28101 /* Print the current options */
28102
28103 static void
28104 rs6000_function_specific_print (FILE *file, int indent,
28105                                 struct cl_target_option *ptr)
28106 {
28107   size_t i;
28108   int flags = ptr->x_target_flags;
28109
28110   /* Print the various mask options.  */
28111   for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
28112     if ((flags & rs6000_opt_masks[i].mask) != 0)
28113       {
28114         flags &= ~ rs6000_opt_masks[i].mask;
28115         fprintf (file, "%*s-m%s%s\n", indent, "",
28116                  rs6000_opt_masks[i].invert ? "no-" : "",
28117                  rs6000_opt_masks[i].name);
28118       }
28119
28120   /* Print the various options that are variables.  */
28121   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
28122     {
28123       size_t j = rs6000_opt_vars[i].target_offset;
28124       if (((signed char *) ptr)[j])
28125         fprintf (file, "%*s-m%s\n", indent, "",
28126                  rs6000_opt_vars[i].name);
28127     }
28128 }
28129
28130 \f
28131 /* Hook to determine if one function can safely inline another.  */
28132
28133 static bool
28134 rs6000_can_inline_p (tree caller, tree callee)
28135 {
28136   bool ret = false;
28137   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
28138   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
28139
28140   /* If callee has no option attributes, then it is ok to inline.  */
28141   if (!callee_tree)
28142     ret = true;
28143
28144   /* If caller has no option attributes, but callee does then it is not ok to
28145      inline.  */
28146   else if (!caller_tree)
28147     ret = false;
28148
28149   else
28150     {
28151       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
28152       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
28153
28154       /* Callee's options should a subset of the caller's, i.e. a vsx function
28155          can inline an altivec function but a non-vsx function can't inline a
28156          vsx function.  */
28157       if ((caller_opts->x_target_flags & callee_opts->x_target_flags)
28158           == callee_opts->x_target_flags)
28159         ret = true;
28160     }
28161
28162   if (TARGET_DEBUG_TARGET)
28163     fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
28164              (DECL_NAME (caller)
28165               ? IDENTIFIER_POINTER (DECL_NAME (caller))
28166               : "<unknown>"),
28167              (DECL_NAME (callee)
28168               ? IDENTIFIER_POINTER (DECL_NAME (callee))
28169               : "<unknown>"),
28170              (ret ? "can" : "cannot"));
28171
28172   return ret;
28173 }
28174 \f
28175 /* Allocate a stack temp and fixup the address so it meets the particular
28176    memory requirements (either offetable or REG+REG addressing).  */
28177
28178 rtx
28179 rs6000_allocate_stack_temp (enum machine_mode mode,
28180                             bool offsettable_p,
28181                             bool reg_reg_p)
28182 {
28183   rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
28184   rtx addr = XEXP (stack, 0);
28185   int strict_p = (reload_in_progress || reload_completed);
28186
28187   if (!legitimate_indirect_address_p (addr, strict_p))
28188     {
28189       if (offsettable_p
28190           && !rs6000_legitimate_offset_address_p (mode, addr, strict_p))
28191         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
28192
28193       else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
28194         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
28195     }
28196
28197   return stack;
28198 }
28199
28200 /* Given a memory reference, if it is not a reg or reg+reg addressing, convert
28201    to such a form to deal with memory reference instructions like STFIWX that
28202    only take reg+reg addressing.  */
28203
28204 rtx
28205 rs6000_address_for_fpconvert (rtx x)
28206 {
28207   int strict_p = (reload_in_progress || reload_completed);
28208   rtx addr;
28209
28210   gcc_assert (MEM_P (x));
28211   addr = XEXP (x, 0);
28212   if (! legitimate_indirect_address_p (addr, strict_p)
28213       && ! legitimate_indexed_address_p (addr, strict_p))
28214     {
28215       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
28216         {
28217           rtx reg = XEXP (addr, 0);
28218           HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (x));
28219           rtx size_rtx = GEN_INT ((GET_CODE (addr) == PRE_DEC) ? -size : size);
28220           gcc_assert (REG_P (reg));
28221           emit_insn (gen_add3_insn (reg, reg, size_rtx));
28222           addr = reg;
28223         }
28224       else if (GET_CODE (addr) == PRE_MODIFY)
28225         {
28226           rtx reg = XEXP (addr, 0);
28227           rtx expr = XEXP (addr, 1);
28228           gcc_assert (REG_P (reg));
28229           gcc_assert (GET_CODE (expr) == PLUS);
28230           emit_insn (gen_add3_insn (reg, XEXP (expr, 0), XEXP (expr, 1)));
28231           addr = reg;
28232         }
28233
28234       x = replace_equiv_address (x, copy_addr_to_reg (addr));
28235     }
28236
28237   return x;
28238 }
28239
28240 /* Given a memory reference, if it is not in the form for altivec memory
28241    reference instructions (i.e. reg or reg+reg addressing with AND of -16),
28242    convert to the altivec format.  */
28243
28244 rtx
28245 rs6000_address_for_altivec (rtx x)
28246 {
28247   gcc_assert (MEM_P (x));
28248   if (!altivec_indexed_or_indirect_operand (x, GET_MODE (x)))
28249     {
28250       rtx addr = XEXP (x, 0);
28251       int strict_p = (reload_in_progress || reload_completed);
28252
28253       if (!legitimate_indexed_address_p (addr, strict_p)
28254           && !legitimate_indirect_address_p (addr, strict_p))
28255         addr = copy_to_mode_reg (Pmode, addr);
28256
28257       addr = gen_rtx_AND (Pmode, addr, GEN_INT (-16));
28258       x = change_address (x, GET_MODE (x), addr);
28259     }
28260
28261   return x;
28262 }
28263
28264
28265 #include "gt-rs6000.h"