OSDN Git Service

part 3 of darwin64 PPC ABI changes
[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
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 "sched-int.h"
55 #include "gimple.h"
56 #include "tree-flow.h"
57 #include "intl.h"
58 #include "params.h"
59 #include "tm-constrs.h"
60 #if TARGET_XCOFF
61 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
62 #endif
63 #if TARGET_MACHO
64 #include "gstab.h"  /* for N_SLINE */
65 #endif
66
67 #ifndef TARGET_NO_PROTOTYPE
68 #define TARGET_NO_PROTOTYPE 0
69 #endif
70
71 #define min(A,B)        ((A) < (B) ? (A) : (B))
72 #define max(A,B)        ((A) > (B) ? (A) : (B))
73
74 /* Structure used to define the rs6000 stack */
75 typedef struct rs6000_stack {
76   int first_gp_reg_save;        /* first callee saved GP register used */
77   int first_fp_reg_save;        /* first callee saved FP register used */
78   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
79   int lr_save_p;                /* true if the link reg needs to be saved */
80   int cr_save_p;                /* true if the CR reg needs to be saved */
81   unsigned int vrsave_mask;     /* mask of vec registers to save */
82   int push_p;                   /* true if we need to allocate stack space */
83   int calls_p;                  /* true if the function makes any calls */
84   int world_save_p;             /* true if we're saving *everything*:
85                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
86   enum rs6000_abi abi;          /* which ABI to use */
87   int gp_save_offset;           /* offset to save GP regs from initial SP */
88   int fp_save_offset;           /* offset to save FP regs from initial SP */
89   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
90   int lr_save_offset;           /* offset to save LR from initial SP */
91   int cr_save_offset;           /* offset to save CR from initial SP */
92   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
93   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
94   int varargs_save_offset;      /* offset to save the varargs registers */
95   int ehrd_offset;              /* offset to EH return data */
96   int reg_size;                 /* register size (4 or 8) */
97   HOST_WIDE_INT vars_size;      /* variable save area size */
98   int parm_size;                /* outgoing parameter size */
99   int save_size;                /* save area size */
100   int fixed_size;               /* fixed size of stack frame */
101   int gp_size;                  /* size of saved GP registers */
102   int fp_size;                  /* size of saved FP registers */
103   int altivec_size;             /* size of saved AltiVec registers */
104   int cr_size;                  /* size to hold CR if not in save_size */
105   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
106   int altivec_padding_size;     /* size of altivec alignment padding if
107                                    not in save_size */
108   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
109   int spe_padding_size;
110   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
111   int spe_64bit_regs_used;
112 } rs6000_stack_t;
113
114 /* A C structure for machine-specific, per-function data.
115    This is added to the cfun structure.  */
116 typedef struct GTY(()) machine_function
117 {
118   /* Some local-dynamic symbol.  */
119   const char *some_ld_name;
120   /* Whether the instruction chain has been scanned already.  */
121   int insn_chain_scanned_p;
122   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
123   int ra_needs_full_frame;
124   /* Flags if __builtin_return_address (0) was used.  */
125   int ra_need_lr;
126   /* Cache lr_save_p after expansion of builtin_eh_return.  */
127   int lr_save_state;
128   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
129      varargs save area.  */
130   HOST_WIDE_INT varargs_save_offset;
131   /* Temporary stack slot to use for SDmode copies.  This slot is
132      64-bits wide and is allocated early enough so that the offset
133      does not overflow the 16-bit load/store offset field.  */
134   rtx sdmode_stack_slot;
135 } machine_function;
136
137 /* Target cpu type */
138
139 enum processor_type rs6000_cpu;
140 struct rs6000_cpu_select rs6000_select[3] =
141 {
142   /* switch             name,                   tune    arch */
143   { (const char *)0,    "--with-cpu=",          1,      1 },
144   { (const char *)0,    "-mcpu=",               1,      1 },
145   { (const char *)0,    "-mtune=",              1,      0 },
146 };
147
148 /* Always emit branch hint bits.  */
149 static GTY(()) bool rs6000_always_hint;
150
151 /* Schedule instructions for group formation.  */
152 static GTY(()) bool rs6000_sched_groups;
153
154 /* Align branch targets.  */
155 static GTY(()) bool rs6000_align_branch_targets;
156
157 /* Support for -msched-costly-dep option.  */
158 const char *rs6000_sched_costly_dep_str;
159 enum rs6000_dependence_cost rs6000_sched_costly_dep;
160
161 /* Support for -minsert-sched-nops option.  */
162 const char *rs6000_sched_insert_nops_str;
163 enum rs6000_nop_insertion rs6000_sched_insert_nops;
164
165 /* Support targetm.vectorize.builtin_mask_for_load.  */
166 static GTY(()) tree altivec_builtin_mask_for_load;
167
168 /* Size of long double.  */
169 int rs6000_long_double_type_size;
170
171 /* IEEE quad extended precision long double. */
172 int rs6000_ieeequad;
173
174 /* Nonzero to use AltiVec ABI.  */
175 int rs6000_altivec_abi;
176
177 /* Nonzero if we want SPE SIMD instructions.  */
178 int rs6000_spe;
179
180 /* Nonzero if we want SPE ABI extensions.  */
181 int rs6000_spe_abi;
182
183 /* Nonzero if floating point operations are done in the GPRs.  */
184 int rs6000_float_gprs = 0;
185
186 /* Nonzero if we want Darwin's struct-by-value-in-regs ABI.  */
187 int rs6000_darwin64_abi;
188
189 /* Set to nonzero once AIX common-mode calls have been defined.  */
190 static GTY(()) int common_mode_defined;
191
192 /* Label number of label created for -mrelocatable, to call to so we can
193    get the address of the GOT section */
194 int rs6000_pic_labelno;
195
196 #ifdef USING_ELFOS_H
197 /* Which abi to adhere to */
198 const char *rs6000_abi_name;
199
200 /* Semantics of the small data area */
201 enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
202
203 /* Which small data model to use */
204 const char *rs6000_sdata_name = (char *)0;
205
206 /* Counter for labels which are to be placed in .fixup.  */
207 int fixuplabelno = 0;
208 #endif
209
210 /* Bit size of immediate TLS offsets and string from which it is decoded.  */
211 int rs6000_tls_size = 32;
212 const char *rs6000_tls_size_string;
213
214 /* ABI enumeration available for subtarget to use.  */
215 enum rs6000_abi rs6000_current_abi;
216
217 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
218 int dot_symbols;
219
220 /* Debug flags */
221 const char *rs6000_debug_name;
222 int rs6000_debug_stack;         /* debug stack applications */
223 int rs6000_debug_arg;           /* debug argument handling */
224 int rs6000_debug_reg;           /* debug register classes */
225 int rs6000_debug_addr;          /* debug memory addressing */
226 int rs6000_debug_cost;          /* debug rtx_costs */
227
228 /* Specify the machine mode that pointers have.  After generation of rtl, the
229    compiler makes no further distinction between pointers and any other objects
230    of this machine mode.  The type is unsigned since not all things that
231    include rs6000.h also include machmode.h.  */
232 unsigned rs6000_pmode;
233
234 /* Width in bits of a pointer.  */
235 unsigned rs6000_pointer_size;
236
237
238 /* Value is TRUE if register/mode pair is acceptable.  */
239 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
240
241 /* Maximum number of registers needed for a given register class and mode.  */
242 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
243
244 /* How many registers are needed for a given register and mode.  */
245 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
246
247 /* Map register number to register class.  */
248 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
249
250 /* Reload functions based on the type and the vector unit.  */
251 static enum insn_code rs6000_vector_reload[NUM_MACHINE_MODES][2];
252
253 /* Built in types.  */
254 tree rs6000_builtin_types[RS6000_BTI_MAX];
255 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
256
257 const char *rs6000_traceback_name;
258 static enum {
259   traceback_default = 0,
260   traceback_none,
261   traceback_part,
262   traceback_full
263 } rs6000_traceback;
264
265 /* Flag to say the TOC is initialized */
266 int toc_initialized;
267 char toc_label_name[10];
268
269 /* Cached value of rs6000_variable_issue. This is cached in
270    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
271 static short cached_can_issue_more;
272
273 static GTY(()) section *read_only_data_section;
274 static GTY(()) section *private_data_section;
275 static GTY(()) section *read_only_private_data_section;
276 static GTY(()) section *sdata2_section;
277 static GTY(()) section *toc_section;
278
279 /* Control alignment for fields within structures.  */
280 /* String from -malign-XXXXX.  */
281 int rs6000_alignment_flags;
282
283 /* Code model for 64-bit linux.  */
284 enum rs6000_cmodel cmodel;
285
286 /* True for any options that were explicitly set.  */
287 static struct {
288   bool aix_struct_ret;          /* True if -maix-struct-ret was used.  */
289   bool alignment;               /* True if -malign- was used.  */
290   bool spe_abi;                 /* True if -mabi=spe/no-spe was used.  */
291   bool altivec_abi;             /* True if -mabi=altivec/no-altivec used.  */
292   bool spe;                     /* True if -mspe= was used.  */
293   bool float_gprs;              /* True if -mfloat-gprs= was used.  */
294   bool long_double;             /* True if -mlong-double- was used.  */
295   bool ieee;                    /* True if -mabi=ieee/ibmlongdouble used.  */
296   bool vrsave;                  /* True if -mvrsave was used.  */
297   bool cmodel;                  /* True if -mcmodel was used.  */
298 } rs6000_explicit_options;
299
300 struct builtin_description
301 {
302   /* mask is not const because we're going to alter it below.  This
303      nonsense will go away when we rewrite the -march infrastructure
304      to give us more target flag bits.  */
305   unsigned int mask;
306   const enum insn_code icode;
307   const char *const name;
308   const enum rs6000_builtins code;
309 };
310
311 /* Describe the vector unit used for modes.  */
312 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
313 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
314
315 /* Register classes for various constraints that are based on the target
316    switches.  */
317 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
318
319 /* Describe the alignment of a vector.  */
320 int rs6000_vector_align[NUM_MACHINE_MODES];
321
322 /* Map selected modes to types for builtins.  */
323 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
324
325 /* What modes to automatically generate reciprocal divide estimate (fre) and
326    reciprocal sqrt (frsqrte) for.  */
327 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
328
329 /* Masks to determine which reciprocal esitmate instructions to generate
330    automatically.  */
331 enum rs6000_recip_mask {
332   RECIP_SF_DIV          = 0x001,        /* Use divide estimate */
333   RECIP_DF_DIV          = 0x002,
334   RECIP_V4SF_DIV        = 0x004,
335   RECIP_V2DF_DIV        = 0x008,
336
337   RECIP_SF_RSQRT        = 0x010,        /* Use reciprocal sqrt estimate.  */
338   RECIP_DF_RSQRT        = 0x020,
339   RECIP_V4SF_RSQRT      = 0x040,
340   RECIP_V2DF_RSQRT      = 0x080,
341
342   /* Various combination of flags for -mrecip=xxx.  */
343   RECIP_NONE            = 0,
344   RECIP_ALL             = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
345                            | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
346                            | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
347
348   RECIP_HIGH_PRECISION  = RECIP_ALL,
349
350   /* On low precision machines like the power5, don't enable double precision
351      reciprocal square root estimate, since it isn't accurate enough.  */
352   RECIP_LOW_PRECISION   = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
353 };
354
355 static unsigned int rs6000_recip_control;
356 static const char *rs6000_recip_name;
357
358 /* -mrecip options.  */
359 static struct
360 {
361   const char *string;           /* option name */
362   unsigned int mask;            /* mask bits to set */
363 } recip_options[] = {
364   { "all",       RECIP_ALL },
365   { "none",      RECIP_NONE },
366   { "div",       (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
367                   | RECIP_V2DF_DIV) },
368   { "divf",      (RECIP_SF_DIV | RECIP_V4SF_DIV) },
369   { "divd",      (RECIP_DF_DIV | RECIP_V2DF_DIV) },
370   { "rsqrt",     (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
371                   | RECIP_V2DF_RSQRT) },
372   { "rsqrtf",    (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
373   { "rsqrtd",    (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
374 };
375
376 /* 2 argument gen function typedef.  */
377 typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
378
379 \f
380 /* Target cpu costs.  */
381
382 struct processor_costs {
383   const int mulsi;        /* cost of SImode multiplication.  */
384   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
385   const int mulsi_const9; /* cost of SImode mult by short constant.  */
386   const int muldi;        /* cost of DImode multiplication.  */
387   const int divsi;        /* cost of SImode division.  */
388   const int divdi;        /* cost of DImode division.  */
389   const int fp;           /* cost of simple SFmode and DFmode insns.  */
390   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
391   const int sdiv;         /* cost of SFmode division (fdivs).  */
392   const int ddiv;         /* cost of DFmode division (fdiv).  */
393   const int cache_line_size;    /* cache line size in bytes. */
394   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
395   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
396   const int simultaneous_prefetches; /* number of parallel prefetch
397                                         operations.  */
398 };
399
400 const struct processor_costs *rs6000_cost;
401
402 /* Processor costs (relative to an add) */
403
404 /* Instruction size costs on 32bit processors.  */
405 static const
406 struct processor_costs size32_cost = {
407   COSTS_N_INSNS (1),    /* mulsi */
408   COSTS_N_INSNS (1),    /* mulsi_const */
409   COSTS_N_INSNS (1),    /* mulsi_const9 */
410   COSTS_N_INSNS (1),    /* muldi */
411   COSTS_N_INSNS (1),    /* divsi */
412   COSTS_N_INSNS (1),    /* divdi */
413   COSTS_N_INSNS (1),    /* fp */
414   COSTS_N_INSNS (1),    /* dmul */
415   COSTS_N_INSNS (1),    /* sdiv */
416   COSTS_N_INSNS (1),    /* ddiv */
417   32,
418   0,
419   0,
420   0,
421 };
422
423 /* Instruction size costs on 64bit processors.  */
424 static const
425 struct processor_costs size64_cost = {
426   COSTS_N_INSNS (1),    /* mulsi */
427   COSTS_N_INSNS (1),    /* mulsi_const */
428   COSTS_N_INSNS (1),    /* mulsi_const9 */
429   COSTS_N_INSNS (1),    /* muldi */
430   COSTS_N_INSNS (1),    /* divsi */
431   COSTS_N_INSNS (1),    /* divdi */
432   COSTS_N_INSNS (1),    /* fp */
433   COSTS_N_INSNS (1),    /* dmul */
434   COSTS_N_INSNS (1),    /* sdiv */
435   COSTS_N_INSNS (1),    /* ddiv */
436   128,
437   0,
438   0,
439   0,
440 };
441
442 /* Instruction costs on RIOS1 processors.  */
443 static const
444 struct processor_costs rios1_cost = {
445   COSTS_N_INSNS (5),    /* mulsi */
446   COSTS_N_INSNS (4),    /* mulsi_const */
447   COSTS_N_INSNS (3),    /* mulsi_const9 */
448   COSTS_N_INSNS (5),    /* muldi */
449   COSTS_N_INSNS (19),   /* divsi */
450   COSTS_N_INSNS (19),   /* divdi */
451   COSTS_N_INSNS (2),    /* fp */
452   COSTS_N_INSNS (2),    /* dmul */
453   COSTS_N_INSNS (19),   /* sdiv */
454   COSTS_N_INSNS (19),   /* ddiv */
455   128,                  /* cache line size */
456   64,                   /* l1 cache */
457   512,                  /* l2 cache */
458   0,                    /* streams */
459 };
460
461 /* Instruction costs on RIOS2 processors.  */
462 static const
463 struct processor_costs rios2_cost = {
464   COSTS_N_INSNS (2),    /* mulsi */
465   COSTS_N_INSNS (2),    /* mulsi_const */
466   COSTS_N_INSNS (2),    /* mulsi_const9 */
467   COSTS_N_INSNS (2),    /* muldi */
468   COSTS_N_INSNS (13),   /* divsi */
469   COSTS_N_INSNS (13),   /* divdi */
470   COSTS_N_INSNS (2),    /* fp */
471   COSTS_N_INSNS (2),    /* dmul */
472   COSTS_N_INSNS (17),   /* sdiv */
473   COSTS_N_INSNS (17),   /* ddiv */
474   256,                  /* cache line size */
475   256,                  /* l1 cache */
476   1024,                 /* l2 cache */
477   0,                    /* streams */
478 };
479
480 /* Instruction costs on RS64A processors.  */
481 static const
482 struct processor_costs rs64a_cost = {
483   COSTS_N_INSNS (20),   /* mulsi */
484   COSTS_N_INSNS (12),   /* mulsi_const */
485   COSTS_N_INSNS (8),    /* mulsi_const9 */
486   COSTS_N_INSNS (34),   /* muldi */
487   COSTS_N_INSNS (65),   /* divsi */
488   COSTS_N_INSNS (67),   /* divdi */
489   COSTS_N_INSNS (4),    /* fp */
490   COSTS_N_INSNS (4),    /* dmul */
491   COSTS_N_INSNS (31),   /* sdiv */
492   COSTS_N_INSNS (31),   /* ddiv */
493   128,                  /* cache line size */
494   128,                  /* l1 cache */
495   2048,                 /* l2 cache */
496   1,                    /* streams */
497 };
498
499 /* Instruction costs on MPCCORE processors.  */
500 static const
501 struct processor_costs mpccore_cost = {
502   COSTS_N_INSNS (2),    /* mulsi */
503   COSTS_N_INSNS (2),    /* mulsi_const */
504   COSTS_N_INSNS (2),    /* mulsi_const9 */
505   COSTS_N_INSNS (2),    /* muldi */
506   COSTS_N_INSNS (6),    /* divsi */
507   COSTS_N_INSNS (6),    /* divdi */
508   COSTS_N_INSNS (4),    /* fp */
509   COSTS_N_INSNS (5),    /* dmul */
510   COSTS_N_INSNS (10),   /* sdiv */
511   COSTS_N_INSNS (17),   /* ddiv */
512   32,                   /* cache line size */
513   4,                    /* l1 cache */
514   16,                   /* l2 cache */
515   1,                    /* streams */
516 };
517
518 /* Instruction costs on PPC403 processors.  */
519 static const
520 struct processor_costs ppc403_cost = {
521   COSTS_N_INSNS (4),    /* mulsi */
522   COSTS_N_INSNS (4),    /* mulsi_const */
523   COSTS_N_INSNS (4),    /* mulsi_const9 */
524   COSTS_N_INSNS (4),    /* muldi */
525   COSTS_N_INSNS (33),   /* divsi */
526   COSTS_N_INSNS (33),   /* divdi */
527   COSTS_N_INSNS (11),   /* fp */
528   COSTS_N_INSNS (11),   /* dmul */
529   COSTS_N_INSNS (11),   /* sdiv */
530   COSTS_N_INSNS (11),   /* ddiv */
531   32,                   /* cache line size */
532   4,                    /* l1 cache */
533   16,                   /* l2 cache */
534   1,                    /* streams */
535 };
536
537 /* Instruction costs on PPC405 processors.  */
538 static const
539 struct processor_costs ppc405_cost = {
540   COSTS_N_INSNS (5),    /* mulsi */
541   COSTS_N_INSNS (4),    /* mulsi_const */
542   COSTS_N_INSNS (3),    /* mulsi_const9 */
543   COSTS_N_INSNS (5),    /* muldi */
544   COSTS_N_INSNS (35),   /* divsi */
545   COSTS_N_INSNS (35),   /* divdi */
546   COSTS_N_INSNS (11),   /* fp */
547   COSTS_N_INSNS (11),   /* dmul */
548   COSTS_N_INSNS (11),   /* sdiv */
549   COSTS_N_INSNS (11),   /* ddiv */
550   32,                   /* cache line size */
551   16,                   /* l1 cache */
552   128,                  /* l2 cache */
553   1,                    /* streams */
554 };
555
556 /* Instruction costs on PPC440 processors.  */
557 static const
558 struct processor_costs ppc440_cost = {
559   COSTS_N_INSNS (3),    /* mulsi */
560   COSTS_N_INSNS (2),    /* mulsi_const */
561   COSTS_N_INSNS (2),    /* mulsi_const9 */
562   COSTS_N_INSNS (3),    /* muldi */
563   COSTS_N_INSNS (34),   /* divsi */
564   COSTS_N_INSNS (34),   /* divdi */
565   COSTS_N_INSNS (5),    /* fp */
566   COSTS_N_INSNS (5),    /* dmul */
567   COSTS_N_INSNS (19),   /* sdiv */
568   COSTS_N_INSNS (33),   /* ddiv */
569   32,                   /* cache line size */
570   32,                   /* l1 cache */
571   256,                  /* l2 cache */
572   1,                    /* streams */
573 };
574
575 /* Instruction costs on PPC476 processors.  */
576 static const
577 struct processor_costs ppc476_cost = {
578   COSTS_N_INSNS (4),    /* mulsi */
579   COSTS_N_INSNS (4),    /* mulsi_const */
580   COSTS_N_INSNS (4),    /* mulsi_const9 */
581   COSTS_N_INSNS (4),    /* muldi */
582   COSTS_N_INSNS (11),   /* divsi */
583   COSTS_N_INSNS (11),   /* divdi */
584   COSTS_N_INSNS (6),    /* fp */
585   COSTS_N_INSNS (6),    /* dmul */
586   COSTS_N_INSNS (19),   /* sdiv */
587   COSTS_N_INSNS (33),   /* ddiv */
588   32,                   /* l1 cache line size */
589   32,                   /* l1 cache */
590   512,                  /* l2 cache */
591   1,                    /* streams */
592 };
593
594 /* Instruction costs on PPC601 processors.  */
595 static const
596 struct processor_costs ppc601_cost = {
597   COSTS_N_INSNS (5),    /* mulsi */
598   COSTS_N_INSNS (5),    /* mulsi_const */
599   COSTS_N_INSNS (5),    /* mulsi_const9 */
600   COSTS_N_INSNS (5),    /* muldi */
601   COSTS_N_INSNS (36),   /* divsi */
602   COSTS_N_INSNS (36),   /* divdi */
603   COSTS_N_INSNS (4),    /* fp */
604   COSTS_N_INSNS (5),    /* dmul */
605   COSTS_N_INSNS (17),   /* sdiv */
606   COSTS_N_INSNS (31),   /* ddiv */
607   32,                   /* cache line size */
608   32,                   /* l1 cache */
609   256,                  /* l2 cache */
610   1,                    /* streams */
611 };
612
613 /* Instruction costs on PPC603 processors.  */
614 static const
615 struct processor_costs ppc603_cost = {
616   COSTS_N_INSNS (5),    /* mulsi */
617   COSTS_N_INSNS (3),    /* mulsi_const */
618   COSTS_N_INSNS (2),    /* mulsi_const9 */
619   COSTS_N_INSNS (5),    /* muldi */
620   COSTS_N_INSNS (37),   /* divsi */
621   COSTS_N_INSNS (37),   /* divdi */
622   COSTS_N_INSNS (3),    /* fp */
623   COSTS_N_INSNS (4),    /* dmul */
624   COSTS_N_INSNS (18),   /* sdiv */
625   COSTS_N_INSNS (33),   /* ddiv */
626   32,                   /* cache line size */
627   8,                    /* l1 cache */
628   64,                   /* l2 cache */
629   1,                    /* streams */
630 };
631
632 /* Instruction costs on PPC604 processors.  */
633 static const
634 struct processor_costs ppc604_cost = {
635   COSTS_N_INSNS (4),    /* mulsi */
636   COSTS_N_INSNS (4),    /* mulsi_const */
637   COSTS_N_INSNS (4),    /* mulsi_const9 */
638   COSTS_N_INSNS (4),    /* muldi */
639   COSTS_N_INSNS (20),   /* divsi */
640   COSTS_N_INSNS (20),   /* divdi */
641   COSTS_N_INSNS (3),    /* fp */
642   COSTS_N_INSNS (3),    /* dmul */
643   COSTS_N_INSNS (18),   /* sdiv */
644   COSTS_N_INSNS (32),   /* ddiv */
645   32,                   /* cache line size */
646   16,                   /* l1 cache */
647   512,                  /* l2 cache */
648   1,                    /* streams */
649 };
650
651 /* Instruction costs on PPC604e processors.  */
652 static const
653 struct processor_costs ppc604e_cost = {
654   COSTS_N_INSNS (2),    /* mulsi */
655   COSTS_N_INSNS (2),    /* mulsi_const */
656   COSTS_N_INSNS (2),    /* mulsi_const9 */
657   COSTS_N_INSNS (2),    /* muldi */
658   COSTS_N_INSNS (20),   /* divsi */
659   COSTS_N_INSNS (20),   /* divdi */
660   COSTS_N_INSNS (3),    /* fp */
661   COSTS_N_INSNS (3),    /* dmul */
662   COSTS_N_INSNS (18),   /* sdiv */
663   COSTS_N_INSNS (32),   /* ddiv */
664   32,                   /* cache line size */
665   32,                   /* l1 cache */
666   1024,                 /* l2 cache */
667   1,                    /* streams */
668 };
669
670 /* Instruction costs on PPC620 processors.  */
671 static const
672 struct processor_costs ppc620_cost = {
673   COSTS_N_INSNS (5),    /* mulsi */
674   COSTS_N_INSNS (4),    /* mulsi_const */
675   COSTS_N_INSNS (3),    /* mulsi_const9 */
676   COSTS_N_INSNS (7),    /* muldi */
677   COSTS_N_INSNS (21),   /* divsi */
678   COSTS_N_INSNS (37),   /* divdi */
679   COSTS_N_INSNS (3),    /* fp */
680   COSTS_N_INSNS (3),    /* dmul */
681   COSTS_N_INSNS (18),   /* sdiv */
682   COSTS_N_INSNS (32),   /* ddiv */
683   128,                  /* cache line size */
684   32,                   /* l1 cache */
685   1024,                 /* l2 cache */
686   1,                    /* streams */
687 };
688
689 /* Instruction costs on PPC630 processors.  */
690 static const
691 struct processor_costs ppc630_cost = {
692   COSTS_N_INSNS (5),    /* mulsi */
693   COSTS_N_INSNS (4),    /* mulsi_const */
694   COSTS_N_INSNS (3),    /* mulsi_const9 */
695   COSTS_N_INSNS (7),    /* muldi */
696   COSTS_N_INSNS (21),   /* divsi */
697   COSTS_N_INSNS (37),   /* divdi */
698   COSTS_N_INSNS (3),    /* fp */
699   COSTS_N_INSNS (3),    /* dmul */
700   COSTS_N_INSNS (17),   /* sdiv */
701   COSTS_N_INSNS (21),   /* ddiv */
702   128,                  /* cache line size */
703   64,                   /* l1 cache */
704   1024,                 /* l2 cache */
705   1,                    /* streams */
706 };
707
708 /* Instruction costs on Cell processor.  */
709 /* COSTS_N_INSNS (1) ~ one add.  */
710 static const
711 struct processor_costs ppccell_cost = {
712   COSTS_N_INSNS (9/2)+2,    /* mulsi */
713   COSTS_N_INSNS (6/2),    /* mulsi_const */
714   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
715   COSTS_N_INSNS (15/2)+2,   /* muldi */
716   COSTS_N_INSNS (38/2),   /* divsi */
717   COSTS_N_INSNS (70/2),   /* divdi */
718   COSTS_N_INSNS (10/2),   /* fp */
719   COSTS_N_INSNS (10/2),   /* dmul */
720   COSTS_N_INSNS (74/2),   /* sdiv */
721   COSTS_N_INSNS (74/2),   /* ddiv */
722   128,                  /* cache line size */
723   32,                   /* l1 cache */
724   512,                  /* l2 cache */
725   6,                    /* streams */
726 };
727
728 /* Instruction costs on PPC750 and PPC7400 processors.  */
729 static const
730 struct processor_costs ppc750_cost = {
731   COSTS_N_INSNS (5),    /* mulsi */
732   COSTS_N_INSNS (3),    /* mulsi_const */
733   COSTS_N_INSNS (2),    /* mulsi_const9 */
734   COSTS_N_INSNS (5),    /* muldi */
735   COSTS_N_INSNS (17),   /* divsi */
736   COSTS_N_INSNS (17),   /* divdi */
737   COSTS_N_INSNS (3),    /* fp */
738   COSTS_N_INSNS (3),    /* dmul */
739   COSTS_N_INSNS (17),   /* sdiv */
740   COSTS_N_INSNS (31),   /* ddiv */
741   32,                   /* cache line size */
742   32,                   /* l1 cache */
743   512,                  /* l2 cache */
744   1,                    /* streams */
745 };
746
747 /* Instruction costs on PPC7450 processors.  */
748 static const
749 struct processor_costs ppc7450_cost = {
750   COSTS_N_INSNS (4),    /* mulsi */
751   COSTS_N_INSNS (3),    /* mulsi_const */
752   COSTS_N_INSNS (3),    /* mulsi_const9 */
753   COSTS_N_INSNS (4),    /* muldi */
754   COSTS_N_INSNS (23),   /* divsi */
755   COSTS_N_INSNS (23),   /* divdi */
756   COSTS_N_INSNS (5),    /* fp */
757   COSTS_N_INSNS (5),    /* dmul */
758   COSTS_N_INSNS (21),   /* sdiv */
759   COSTS_N_INSNS (35),   /* ddiv */
760   32,                   /* cache line size */
761   32,                   /* l1 cache */
762   1024,                 /* l2 cache */
763   1,                    /* streams */
764 };
765
766 /* Instruction costs on PPC8540 processors.  */
767 static const
768 struct processor_costs ppc8540_cost = {
769   COSTS_N_INSNS (4),    /* mulsi */
770   COSTS_N_INSNS (4),    /* mulsi_const */
771   COSTS_N_INSNS (4),    /* mulsi_const9 */
772   COSTS_N_INSNS (4),    /* muldi */
773   COSTS_N_INSNS (19),   /* divsi */
774   COSTS_N_INSNS (19),   /* divdi */
775   COSTS_N_INSNS (4),    /* fp */
776   COSTS_N_INSNS (4),    /* dmul */
777   COSTS_N_INSNS (29),   /* sdiv */
778   COSTS_N_INSNS (29),   /* ddiv */
779   32,                   /* cache line size */
780   32,                   /* l1 cache */
781   256,                  /* l2 cache */
782   1,                    /* prefetch streams /*/
783 };
784
785 /* Instruction costs on E300C2 and E300C3 cores.  */
786 static const
787 struct processor_costs ppce300c2c3_cost = {
788   COSTS_N_INSNS (4),    /* mulsi */
789   COSTS_N_INSNS (4),    /* mulsi_const */
790   COSTS_N_INSNS (4),    /* mulsi_const9 */
791   COSTS_N_INSNS (4),    /* muldi */
792   COSTS_N_INSNS (19),   /* divsi */
793   COSTS_N_INSNS (19),   /* divdi */
794   COSTS_N_INSNS (3),    /* fp */
795   COSTS_N_INSNS (4),    /* dmul */
796   COSTS_N_INSNS (18),   /* sdiv */
797   COSTS_N_INSNS (33),   /* ddiv */
798   32,
799   16,                   /* l1 cache */
800   16,                   /* l2 cache */
801   1,                    /* prefetch streams /*/
802 };
803
804 /* Instruction costs on PPCE500MC processors.  */
805 static const
806 struct processor_costs ppce500mc_cost = {
807   COSTS_N_INSNS (4),    /* mulsi */
808   COSTS_N_INSNS (4),    /* mulsi_const */
809   COSTS_N_INSNS (4),    /* mulsi_const9 */
810   COSTS_N_INSNS (4),    /* muldi */
811   COSTS_N_INSNS (14),   /* divsi */
812   COSTS_N_INSNS (14),   /* divdi */
813   COSTS_N_INSNS (8),    /* fp */
814   COSTS_N_INSNS (10),   /* dmul */
815   COSTS_N_INSNS (36),   /* sdiv */
816   COSTS_N_INSNS (66),   /* ddiv */
817   64,                   /* cache line size */
818   32,                   /* l1 cache */
819   128,                  /* l2 cache */
820   1,                    /* prefetch streams /*/
821 };
822
823 /* Instruction costs on PPCE500MC64 processors.  */
824 static const
825 struct processor_costs ppce500mc64_cost = {
826   COSTS_N_INSNS (4),    /* mulsi */
827   COSTS_N_INSNS (4),    /* mulsi_const */
828   COSTS_N_INSNS (4),    /* mulsi_const9 */
829   COSTS_N_INSNS (4),    /* muldi */
830   COSTS_N_INSNS (14),   /* divsi */
831   COSTS_N_INSNS (14),   /* divdi */
832   COSTS_N_INSNS (4),    /* fp */
833   COSTS_N_INSNS (10),   /* dmul */
834   COSTS_N_INSNS (36),   /* sdiv */
835   COSTS_N_INSNS (66),   /* ddiv */
836   64,                   /* cache line size */
837   32,                   /* l1 cache */
838   128,                  /* l2 cache */
839   1,                    /* prefetch streams /*/
840 };
841
842 /* Instruction costs on AppliedMicro Titan processors.  */
843 static const
844 struct processor_costs titan_cost = {
845   COSTS_N_INSNS (5),    /* mulsi */
846   COSTS_N_INSNS (5),    /* mulsi_const */
847   COSTS_N_INSNS (5),    /* mulsi_const9 */
848   COSTS_N_INSNS (5),    /* muldi */
849   COSTS_N_INSNS (18),   /* divsi */
850   COSTS_N_INSNS (18),   /* divdi */
851   COSTS_N_INSNS (10),   /* fp */
852   COSTS_N_INSNS (10),   /* dmul */
853   COSTS_N_INSNS (46),   /* sdiv */
854   COSTS_N_INSNS (72),   /* ddiv */
855   32,                   /* cache line size */
856   32,                   /* l1 cache */
857   512,                  /* l2 cache */
858   1,                    /* prefetch streams /*/
859 };
860
861 /* Instruction costs on POWER4 and POWER5 processors.  */
862 static const
863 struct processor_costs power4_cost = {
864   COSTS_N_INSNS (3),    /* mulsi */
865   COSTS_N_INSNS (2),    /* mulsi_const */
866   COSTS_N_INSNS (2),    /* mulsi_const9 */
867   COSTS_N_INSNS (4),    /* muldi */
868   COSTS_N_INSNS (18),   /* divsi */
869   COSTS_N_INSNS (34),   /* divdi */
870   COSTS_N_INSNS (3),    /* fp */
871   COSTS_N_INSNS (3),    /* dmul */
872   COSTS_N_INSNS (17),   /* sdiv */
873   COSTS_N_INSNS (17),   /* ddiv */
874   128,                  /* cache line size */
875   32,                   /* l1 cache */
876   1024,                 /* l2 cache */
877   8,                    /* prefetch streams /*/
878 };
879
880 /* Instruction costs on POWER6 processors.  */
881 static const
882 struct processor_costs power6_cost = {
883   COSTS_N_INSNS (8),    /* mulsi */
884   COSTS_N_INSNS (8),    /* mulsi_const */
885   COSTS_N_INSNS (8),    /* mulsi_const9 */
886   COSTS_N_INSNS (8),    /* muldi */
887   COSTS_N_INSNS (22),   /* divsi */
888   COSTS_N_INSNS (28),   /* divdi */
889   COSTS_N_INSNS (3),    /* fp */
890   COSTS_N_INSNS (3),    /* dmul */
891   COSTS_N_INSNS (13),   /* sdiv */
892   COSTS_N_INSNS (16),   /* ddiv */
893   128,                  /* cache line size */
894   64,                   /* l1 cache */
895   2048,                 /* l2 cache */
896   16,                   /* prefetch streams */
897 };
898
899 /* Instruction costs on POWER7 processors.  */
900 static const
901 struct processor_costs power7_cost = {
902   COSTS_N_INSNS (2),    /* mulsi */
903   COSTS_N_INSNS (2),    /* mulsi_const */
904   COSTS_N_INSNS (2),    /* mulsi_const9 */
905   COSTS_N_INSNS (2),    /* muldi */
906   COSTS_N_INSNS (18),   /* divsi */
907   COSTS_N_INSNS (34),   /* divdi */
908   COSTS_N_INSNS (3),    /* fp */
909   COSTS_N_INSNS (3),    /* dmul */
910   COSTS_N_INSNS (13),   /* sdiv */
911   COSTS_N_INSNS (16),   /* ddiv */
912   128,                  /* cache line size */
913   32,                   /* l1 cache */
914   256,                  /* l2 cache */
915   12,                   /* prefetch streams */
916 };
917
918 /* Instruction costs on POWER A2 processors.  */
919 static const
920 struct processor_costs ppca2_cost = {
921   COSTS_N_INSNS (16),    /* mulsi */
922   COSTS_N_INSNS (16),    /* mulsi_const */
923   COSTS_N_INSNS (16),    /* mulsi_const9 */
924   COSTS_N_INSNS (16),   /* muldi */
925   COSTS_N_INSNS (22),   /* divsi */
926   COSTS_N_INSNS (28),   /* divdi */
927   COSTS_N_INSNS (3),    /* fp */
928   COSTS_N_INSNS (3),    /* dmul */
929   COSTS_N_INSNS (59),   /* sdiv */
930   COSTS_N_INSNS (72),   /* ddiv */
931   64,
932   16,                   /* l1 cache */
933   2048,                 /* l2 cache */
934   16,                   /* prefetch streams */
935 };
936
937 \f
938 /* Table that classifies rs6000 builtin functions (pure, const, etc.).  */
939 #undef RS6000_BUILTIN
940 #undef RS6000_BUILTIN_EQUATE
941 #define RS6000_BUILTIN(NAME, TYPE) TYPE,
942 #define RS6000_BUILTIN_EQUATE(NAME, VALUE)
943
944 static const enum rs6000_btc builtin_classify[(int)RS6000_BUILTIN_COUNT] =
945 {
946 #include "rs6000-builtin.def"
947 };
948
949 #undef RS6000_BUILTIN
950 #undef RS6000_BUILTIN_EQUATE
951
952 \f
953 static bool rs6000_function_ok_for_sibcall (tree, tree);
954 static const char *rs6000_invalid_within_doloop (const_rtx);
955 static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
956 static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
957 static rtx rs6000_generate_compare (rtx, enum machine_mode);
958 static void rs6000_emit_stack_tie (void);
959 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
960 static bool spe_func_has_64bit_regs_p (void);
961 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
962                              int, HOST_WIDE_INT);
963 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
964 static unsigned rs6000_hash_constant (rtx);
965 static unsigned toc_hash_function (const void *);
966 static int toc_hash_eq (const void *, const void *);
967 static bool reg_offset_addressing_ok_p (enum machine_mode);
968 static bool virtual_stack_registers_memory_p (rtx);
969 static bool constant_pool_expr_p (rtx);
970 static bool legitimate_small_data_p (enum machine_mode, rtx);
971 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
972 static struct machine_function * rs6000_init_machine_status (void);
973 static bool rs6000_assemble_integer (rtx, unsigned int, int);
974 static bool no_global_regs_above (int, bool);
975 #ifdef HAVE_GAS_HIDDEN
976 static void rs6000_assemble_visibility (tree, int);
977 #endif
978 static int rs6000_ra_ever_killed (void);
979 static bool rs6000_attribute_takes_identifier_p (const_tree);
980 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
981 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
982 static bool rs6000_ms_bitfield_layout_p (const_tree);
983 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
984 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
985 static const char *rs6000_mangle_type (const_tree);
986 static void rs6000_set_default_type_attributes (tree);
987 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
988 static rtx rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
989 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
990                                    enum machine_mode, bool, bool, bool);
991 static bool rs6000_reg_live_or_pic_offset_p (int);
992 static tree rs6000_builtin_vectorized_function (tree, tree, tree);
993 static int rs6000_savres_strategy (rs6000_stack_t *, bool, int, int);
994 static void rs6000_restore_saved_cr (rtx, int);
995 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
996 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
997 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
998                                     tree);
999 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
1000 static bool rs6000_return_in_memory (const_tree, const_tree);
1001 static rtx rs6000_function_value (const_tree, const_tree, bool);
1002 static void rs6000_file_start (void);
1003 #if TARGET_ELF
1004 static int rs6000_elf_reloc_rw_mask (void);
1005 static void rs6000_elf_asm_out_constructor (rtx, int);
1006 static void rs6000_elf_asm_out_destructor (rtx, int);
1007 static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
1008 static void rs6000_elf_asm_init_sections (void);
1009 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
1010                                                unsigned HOST_WIDE_INT);
1011 static void rs6000_elf_encode_section_info (tree, rtx, int)
1012      ATTRIBUTE_UNUSED;
1013 #endif
1014 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
1015 static void rs6000_alloc_sdmode_stack_slot (void);
1016 static void rs6000_instantiate_decls (void);
1017 #if TARGET_XCOFF
1018 static void rs6000_xcoff_asm_output_anchor (rtx);
1019 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
1020 static void rs6000_xcoff_asm_init_sections (void);
1021 static int rs6000_xcoff_reloc_rw_mask (void);
1022 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
1023 static section *rs6000_xcoff_select_section (tree, int,
1024                                              unsigned HOST_WIDE_INT);
1025 static void rs6000_xcoff_unique_section (tree, int);
1026 static section *rs6000_xcoff_select_rtx_section
1027   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
1028 static const char * rs6000_xcoff_strip_name_encoding (const char *);
1029 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
1030 static void rs6000_xcoff_file_start (void);
1031 static void rs6000_xcoff_file_end (void);
1032 #endif
1033 static int rs6000_variable_issue (FILE *, int, rtx, int);
1034 static int rs6000_register_move_cost (enum machine_mode,
1035                                       reg_class_t, reg_class_t);
1036 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
1037 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
1038 static bool rs6000_debug_rtx_costs (rtx, int, int, int *, bool);
1039 static int rs6000_debug_address_cost (rtx, bool);
1040 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
1041 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
1042 static void rs6000_sched_init (FILE *, int, int);
1043 static bool is_microcoded_insn (rtx);
1044 static bool is_nonpipeline_insn (rtx);
1045 static bool is_cracked_insn (rtx);
1046 static bool is_branch_slot_insn (rtx);
1047 static bool is_load_insn (rtx);
1048 static rtx get_store_dest (rtx pat);
1049 static bool is_store_insn (rtx);
1050 static bool set_to_load_agen (rtx,rtx);
1051 static bool adjacent_mem_locations (rtx,rtx);
1052 static int rs6000_adjust_priority (rtx, int);
1053 static int rs6000_issue_rate (void);
1054 static bool rs6000_is_costly_dependence (dep_t, int, int);
1055 static rtx get_next_active_insn (rtx, rtx);
1056 static bool insn_terminates_group_p (rtx , enum group_termination);
1057 static bool insn_must_be_first_in_group (rtx);
1058 static bool insn_must_be_last_in_group (rtx);
1059 static bool is_costly_group (rtx *, rtx);
1060 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
1061 static int redefine_groups (FILE *, int, rtx, rtx);
1062 static int pad_groups (FILE *, int, rtx, rtx);
1063 static void rs6000_sched_finish (FILE *, int);
1064 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
1065 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
1066 static int rs6000_use_sched_lookahead (void);
1067 static int rs6000_use_sched_lookahead_guard (rtx);
1068 static void * rs6000_alloc_sched_context (void);
1069 static void rs6000_init_sched_context (void *, bool);
1070 static void rs6000_set_sched_context (void *);
1071 static void rs6000_free_sched_context (void *);
1072 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
1073 static tree rs6000_builtin_mask_for_load (void);
1074 static tree rs6000_builtin_mul_widen_even (tree);
1075 static tree rs6000_builtin_mul_widen_odd (tree);
1076 static tree rs6000_builtin_conversion (unsigned int, tree, tree);
1077 static tree rs6000_builtin_vec_perm (tree, tree *);
1078 static bool rs6000_builtin_support_vector_misalignment (enum
1079                                                         machine_mode,
1080                                                         const_tree,
1081                                                         int, bool);
1082 static int rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt,
1083                                               tree, int);
1084
1085 static void def_builtin (int, const char *, tree, int);
1086 static bool rs6000_vector_alignment_reachable (const_tree, bool);
1087 static void rs6000_init_builtins (void);
1088 static tree rs6000_builtin_decl (unsigned, bool);
1089
1090 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
1091 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
1092 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
1093 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1094 static void altivec_init_builtins (void);
1095 static unsigned builtin_hash_function (const void *);
1096 static int builtin_hash_eq (const void *, const void *);
1097 static tree builtin_function_type (enum machine_mode, enum machine_mode,
1098                                    enum machine_mode, enum machine_mode,
1099                                    enum rs6000_builtins, const char *name);
1100 static void rs6000_common_init_builtins (void);
1101 static void rs6000_init_libfuncs (void);
1102
1103 static void paired_init_builtins (void);
1104 static rtx paired_expand_builtin (tree, rtx, bool *);
1105 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
1106 static rtx paired_expand_stv_builtin (enum insn_code, tree);
1107 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
1108
1109 static void enable_mask_for_builtins (struct builtin_description *, int,
1110                                       enum rs6000_builtins,
1111                                       enum rs6000_builtins);
1112 static void spe_init_builtins (void);
1113 static rtx spe_expand_builtin (tree, rtx, bool *);
1114 static rtx spe_expand_stv_builtin (enum insn_code, tree);
1115 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
1116 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
1117 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
1118 static rs6000_stack_t *rs6000_stack_info (void);
1119 static void debug_stack_info (rs6000_stack_t *);
1120
1121 static rtx altivec_expand_builtin (tree, rtx, bool *);
1122 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
1123 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
1124 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
1125 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
1126 static rtx altivec_expand_predicate_builtin (enum insn_code, tree, rtx);
1127 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
1128 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
1129 static rtx altivec_expand_vec_set_builtin (tree);
1130 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
1131 static int get_element_number (tree, tree);
1132 static bool rs6000_handle_option (size_t, const char *, int);
1133 static void rs6000_parse_tls_size_option (void);
1134 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
1135 static int first_altivec_reg_to_save (void);
1136 static unsigned int compute_vrsave_mask (void);
1137 static void compute_save_world_info (rs6000_stack_t *info_ptr);
1138 static void is_altivec_return_reg (rtx, void *);
1139 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
1140 int easy_vector_constant (rtx, enum machine_mode);
1141 static rtx rs6000_dwarf_register_span (rtx);
1142 static void rs6000_init_dwarf_reg_sizes_extra (tree);
1143 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
1144 static rtx rs6000_debug_legitimize_address (rtx, rtx, enum machine_mode);
1145 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1146 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
1147 static rtx rs6000_delegitimize_address (rtx);
1148 static rtx rs6000_tls_get_addr (void);
1149 static rtx rs6000_got_sym (void);
1150 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
1151 static const char *rs6000_get_some_local_dynamic_name (void);
1152 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
1153 static rtx rs6000_complex_function_value (enum machine_mode);
1154 static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
1155                                     enum machine_mode, tree);
1156 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
1157                                                       HOST_WIDE_INT, int);
1158 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
1159                                                         tree, HOST_WIDE_INT);
1160 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
1161                                               HOST_WIDE_INT,
1162                                               rtx[], int *);
1163 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
1164                                                 const_tree, HOST_WIDE_INT,
1165                                                 rtx[], int *);
1166 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, int, bool);
1167 static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
1168 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
1169 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
1170                                     enum machine_mode, tree,
1171                                     int *, int);
1172 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
1173                                       const_tree, bool);
1174 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
1175                                      tree, bool);
1176 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
1177 #if TARGET_MACHO
1178 static void macho_branch_islands (void);
1179 static int no_previous_def (tree function_name);
1180 static tree get_prev_label (tree function_name);
1181 static void rs6000_darwin_file_start (void);
1182 #endif
1183
1184 static tree rs6000_build_builtin_va_list (void);
1185 static void rs6000_va_start (tree, rtx);
1186 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
1187 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
1188 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
1189 static bool rs6000_vector_mode_supported_p (enum machine_mode);
1190 static rtx rs6000_emit_vector_compare_inner (enum rtx_code, rtx, rtx);
1191 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
1192                                        enum machine_mode);
1193 static tree rs6000_stack_protect_fail (void);
1194
1195 static rtx rs6000_legitimize_reload_address (rtx, enum machine_mode, int, int,
1196                                              int, int *);
1197
1198 static rtx rs6000_debug_legitimize_reload_address (rtx, enum machine_mode, int,
1199                                                    int, int, int *);
1200
1201 rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode, int, int,
1202                                              int, int *)
1203   = rs6000_legitimize_reload_address;
1204
1205 static bool rs6000_mode_dependent_address_p (const_rtx);
1206 static bool rs6000_mode_dependent_address (const_rtx);
1207 static bool rs6000_debug_mode_dependent_address (const_rtx);
1208 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1209   = rs6000_mode_dependent_address;
1210
1211 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1212                                                      enum machine_mode, rtx);
1213 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1214                                                            enum machine_mode,
1215                                                            rtx);
1216 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1217                                                      enum machine_mode, rtx)
1218   = rs6000_secondary_reload_class;
1219
1220 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1221 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1222                                                            enum reg_class);
1223 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1224   = rs6000_preferred_reload_class;
1225
1226 static bool rs6000_secondary_memory_needed (enum reg_class, enum reg_class,
1227                                             enum machine_mode);
1228
1229 static bool rs6000_debug_secondary_memory_needed (enum reg_class,
1230                                                   enum reg_class,
1231                                                   enum machine_mode);
1232
1233 bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class, enum reg_class,
1234                                             enum machine_mode)
1235   = rs6000_secondary_memory_needed;
1236
1237 static bool rs6000_cannot_change_mode_class (enum machine_mode,
1238                                              enum machine_mode,
1239                                              enum reg_class);
1240 static bool rs6000_debug_cannot_change_mode_class (enum machine_mode,
1241                                                    enum machine_mode,
1242                                                    enum reg_class);
1243
1244 bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
1245                                              enum machine_mode,
1246                                              enum reg_class)
1247   = rs6000_cannot_change_mode_class;
1248
1249 static reg_class_t rs6000_secondary_reload (bool, rtx, reg_class_t,
1250                                             enum machine_mode,
1251                                             struct secondary_reload_info *);
1252
1253 static const reg_class_t *rs6000_ira_cover_classes (void);
1254
1255 const int INSN_NOT_AVAILABLE = -1;
1256 static enum machine_mode rs6000_eh_return_filter_mode (void);
1257 static bool rs6000_can_eliminate (const int, const int);
1258 static void rs6000_trampoline_init (rtx, tree, rtx);
1259
1260 /* Hash table stuff for keeping track of TOC entries.  */
1261
1262 struct GTY(()) toc_hash_struct
1263 {
1264   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1265      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
1266   rtx key;
1267   enum machine_mode key_mode;
1268   int labelno;
1269 };
1270
1271 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
1272
1273 /* Hash table to keep track of the argument types for builtin functions.  */
1274
1275 struct GTY(()) builtin_hash_struct
1276 {
1277   tree type;
1278   enum machine_mode mode[4];    /* return value + 3 arguments.  */
1279   unsigned char uns_p[4];       /* and whether the types are unsigned.  */
1280 };
1281
1282 static GTY ((param_is (struct builtin_hash_struct))) htab_t builtin_hash_table;
1283 \f
1284 /* Default register names.  */
1285 char rs6000_reg_names[][8] =
1286 {
1287       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1288       "8",  "9", "10", "11", "12", "13", "14", "15",
1289      "16", "17", "18", "19", "20", "21", "22", "23",
1290      "24", "25", "26", "27", "28", "29", "30", "31",
1291       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1292       "8",  "9", "10", "11", "12", "13", "14", "15",
1293      "16", "17", "18", "19", "20", "21", "22", "23",
1294      "24", "25", "26", "27", "28", "29", "30", "31",
1295      "mq", "lr", "ctr","ap",
1296       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1297       "ca",
1298       /* AltiVec registers.  */
1299       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
1300       "8",  "9",  "10", "11", "12", "13", "14", "15",
1301       "16", "17", "18", "19", "20", "21", "22", "23",
1302       "24", "25", "26", "27", "28", "29", "30", "31",
1303       "vrsave", "vscr",
1304       /* SPE registers.  */
1305       "spe_acc", "spefscr",
1306       /* Soft frame pointer.  */
1307       "sfp"
1308 };
1309
1310 #ifdef TARGET_REGNAMES
1311 static const char alt_reg_names[][8] =
1312 {
1313    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1314    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1315   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1316   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1317    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1318    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1319   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1320   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1321     "mq",    "lr",  "ctr",   "ap",
1322   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1323    "ca",
1324   /* AltiVec registers.  */
1325    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1326    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1327   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1328   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1329   "vrsave", "vscr",
1330   /* SPE registers.  */
1331   "spe_acc", "spefscr",
1332   /* Soft frame pointer.  */
1333   "sfp"
1334 };
1335 #endif
1336
1337 /* Table of valid machine attributes.  */
1338
1339 static const struct attribute_spec rs6000_attribute_table[] =
1340 {
1341   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
1342   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute },
1343   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
1344   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
1345   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
1346   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
1347 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1348   SUBTARGET_ATTRIBUTE_TABLE,
1349 #endif
1350   { NULL,        0, 0, false, false, false, NULL }
1351 };
1352 \f
1353 #ifndef MASK_STRICT_ALIGN
1354 #define MASK_STRICT_ALIGN 0
1355 #endif
1356 #ifndef TARGET_PROFILE_KERNEL
1357 #define TARGET_PROFILE_KERNEL 0
1358 #endif
1359
1360 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1361 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1362 \f
1363 /* Initialize the GCC target structure.  */
1364 #undef TARGET_ATTRIBUTE_TABLE
1365 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1366 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1367 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1368 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1369 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1370
1371 #undef TARGET_ASM_ALIGNED_DI_OP
1372 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1373
1374 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1375    for non-ELF systems.  */
1376 #ifndef OBJECT_FORMAT_ELF
1377 #if TARGET_XCOFF
1378 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1379    64-bit targets.  */
1380 #undef TARGET_ASM_UNALIGNED_HI_OP
1381 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1382 #undef TARGET_ASM_UNALIGNED_SI_OP
1383 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1384 #undef TARGET_ASM_UNALIGNED_DI_OP
1385 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1386 #else
1387 /* For Darwin.  */
1388 #undef TARGET_ASM_UNALIGNED_HI_OP
1389 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1390 #undef TARGET_ASM_UNALIGNED_SI_OP
1391 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1392 #undef TARGET_ASM_UNALIGNED_DI_OP
1393 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1394 #undef TARGET_ASM_ALIGNED_DI_OP
1395 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1396 #endif
1397 #endif
1398
1399 /* This hook deals with fixups for relocatable code and DI-mode objects
1400    in 64-bit code.  */
1401 #undef TARGET_ASM_INTEGER
1402 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1403
1404 #ifdef HAVE_GAS_HIDDEN
1405 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1406 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1407 #endif
1408
1409 #undef TARGET_HAVE_TLS
1410 #define TARGET_HAVE_TLS HAVE_AS_TLS
1411
1412 #undef TARGET_CANNOT_FORCE_CONST_MEM
1413 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
1414
1415 #undef TARGET_DELEGITIMIZE_ADDRESS
1416 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1417
1418 #undef TARGET_ASM_FUNCTION_PROLOGUE
1419 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1420 #undef TARGET_ASM_FUNCTION_EPILOGUE
1421 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1422
1423 #undef TARGET_LEGITIMIZE_ADDRESS
1424 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1425
1426 #undef  TARGET_SCHED_VARIABLE_ISSUE
1427 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1428
1429 #undef TARGET_SCHED_ISSUE_RATE
1430 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1431 #undef TARGET_SCHED_ADJUST_COST
1432 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1433 #undef TARGET_SCHED_ADJUST_PRIORITY
1434 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1435 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1436 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1437 #undef TARGET_SCHED_INIT
1438 #define TARGET_SCHED_INIT rs6000_sched_init
1439 #undef TARGET_SCHED_FINISH
1440 #define TARGET_SCHED_FINISH rs6000_sched_finish
1441 #undef TARGET_SCHED_REORDER
1442 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1443 #undef TARGET_SCHED_REORDER2
1444 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1445
1446 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1447 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1448
1449 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1450 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1451
1452 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1453 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1454 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1455 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1456 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1457 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1458 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1459 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1460
1461 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1462 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1463 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1464 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1465 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1466 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1467 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1468 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1469 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1470 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1471 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1472 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT            \
1473   rs6000_builtin_support_vector_misalignment
1474 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1475 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1476 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1477 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1478   rs6000_builtin_vectorization_cost
1479
1480 #undef TARGET_INIT_BUILTINS
1481 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1482 #undef TARGET_BUILTIN_DECL
1483 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1484
1485 #undef TARGET_EXPAND_BUILTIN
1486 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1487
1488 #undef TARGET_MANGLE_TYPE
1489 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1490
1491 #undef TARGET_INIT_LIBFUNCS
1492 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1493
1494 #if TARGET_MACHO
1495 #undef TARGET_BINDS_LOCAL_P
1496 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1497 #endif
1498
1499 #undef TARGET_MS_BITFIELD_LAYOUT_P
1500 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1501
1502 #undef TARGET_ASM_OUTPUT_MI_THUNK
1503 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1504
1505 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1506 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1507
1508 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1509 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1510
1511 #undef TARGET_INVALID_WITHIN_DOLOOP
1512 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1513
1514 #undef TARGET_REGISTER_MOVE_COST
1515 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1516 #undef TARGET_MEMORY_MOVE_COST
1517 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1518 #undef TARGET_RTX_COSTS
1519 #define TARGET_RTX_COSTS rs6000_rtx_costs
1520 #undef TARGET_ADDRESS_COST
1521 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1522
1523 #undef TARGET_DWARF_REGISTER_SPAN
1524 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1525
1526 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1527 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1528
1529 /* On rs6000, function arguments are promoted, as are function return
1530    values.  */
1531 #undef TARGET_PROMOTE_FUNCTION_MODE
1532 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
1533
1534 #undef TARGET_RETURN_IN_MEMORY
1535 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1536
1537 #undef TARGET_SETUP_INCOMING_VARARGS
1538 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1539
1540 /* Always strict argument naming on rs6000.  */
1541 #undef TARGET_STRICT_ARGUMENT_NAMING
1542 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1543 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1544 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1545 #undef TARGET_SPLIT_COMPLEX_ARG
1546 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1547 #undef TARGET_MUST_PASS_IN_STACK
1548 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1549 #undef TARGET_PASS_BY_REFERENCE
1550 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1551 #undef TARGET_ARG_PARTIAL_BYTES
1552 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1553
1554 #undef TARGET_BUILD_BUILTIN_VA_LIST
1555 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1556
1557 #undef TARGET_EXPAND_BUILTIN_VA_START
1558 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1559
1560 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1561 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1562
1563 #undef TARGET_EH_RETURN_FILTER_MODE
1564 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1565
1566 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1567 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1568
1569 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1570 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1571
1572 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1573 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1574
1575 #undef TARGET_HANDLE_OPTION
1576 #define TARGET_HANDLE_OPTION rs6000_handle_option
1577
1578 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1579 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1580   rs6000_builtin_vectorized_function
1581
1582 #undef TARGET_DEFAULT_TARGET_FLAGS
1583 #define TARGET_DEFAULT_TARGET_FLAGS \
1584   (TARGET_DEFAULT)
1585
1586 #undef TARGET_STACK_PROTECT_FAIL
1587 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1588
1589 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1590    The PowerPC architecture requires only weak consistency among
1591    processors--that is, memory accesses between processors need not be
1592    sequentially consistent and memory accesses among processors can occur
1593    in any order. The ability to order memory accesses weakly provides
1594    opportunities for more efficient use of the system bus. Unless a
1595    dependency exists, the 604e allows read operations to precede store
1596    operations.  */
1597 #undef TARGET_RELAXED_ORDERING
1598 #define TARGET_RELAXED_ORDERING true
1599
1600 #ifdef HAVE_AS_TLS
1601 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1602 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1603 #endif
1604
1605 /* Use a 32-bit anchor range.  This leads to sequences like:
1606
1607         addis   tmp,anchor,high
1608         add     dest,tmp,low
1609
1610    where tmp itself acts as an anchor, and can be shared between
1611    accesses to the same 64k page.  */
1612 #undef TARGET_MIN_ANCHOR_OFFSET
1613 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1614 #undef TARGET_MAX_ANCHOR_OFFSET
1615 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1616 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1617 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1618
1619 #undef TARGET_BUILTIN_RECIPROCAL
1620 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1621
1622 #undef TARGET_EXPAND_TO_RTL_HOOK
1623 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1624
1625 #undef TARGET_INSTANTIATE_DECLS
1626 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1627
1628 #undef TARGET_SECONDARY_RELOAD
1629 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1630
1631 #undef TARGET_IRA_COVER_CLASSES
1632 #define TARGET_IRA_COVER_CLASSES rs6000_ira_cover_classes
1633
1634 #undef TARGET_LEGITIMATE_ADDRESS_P
1635 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1636
1637 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1638 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1639
1640 #undef TARGET_CAN_ELIMINATE
1641 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1642
1643 #undef TARGET_TRAMPOLINE_INIT
1644 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1645
1646 #undef TARGET_FUNCTION_VALUE
1647 #define TARGET_FUNCTION_VALUE rs6000_function_value
1648
1649 struct gcc_target targetm = TARGET_INITIALIZER;
1650 \f
1651 /* Return number of consecutive hard regs needed starting at reg REGNO
1652    to hold something of mode MODE.
1653    This is ordinarily the length in words of a value of mode MODE
1654    but can be less for certain modes in special long registers.
1655
1656    For the SPE, GPRs are 64 bits but only 32 bits are visible in
1657    scalar instructions.  The upper 32 bits are only available to the
1658    SIMD instructions.
1659
1660    POWER and PowerPC GPRs hold 32 bits worth;
1661    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
1662
1663 static int
1664 rs6000_hard_regno_nregs_internal (int regno, enum machine_mode mode)
1665 {
1666   unsigned HOST_WIDE_INT reg_size;
1667
1668   if (FP_REGNO_P (regno))
1669     reg_size = (VECTOR_MEM_VSX_P (mode)
1670                 ? UNITS_PER_VSX_WORD
1671                 : UNITS_PER_FP_WORD);
1672
1673   else if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1674     reg_size = UNITS_PER_SPE_WORD;
1675
1676   else if (ALTIVEC_REGNO_P (regno))
1677     reg_size = UNITS_PER_ALTIVEC_WORD;
1678
1679   /* The value returned for SCmode in the E500 double case is 2 for
1680      ABI compatibility; storing an SCmode value in a single register
1681      would require function_arg and rs6000_spe_function_arg to handle
1682      SCmode so as to pass the value correctly in a pair of
1683      registers.  */
1684   else if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
1685            && !DECIMAL_FLOAT_MODE_P (mode))
1686     reg_size = UNITS_PER_FP_WORD;
1687
1688   else
1689     reg_size = UNITS_PER_WORD;
1690
1691   return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
1692 }
1693
1694 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1695    MODE.  */
1696 static int
1697 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1698 {
1699   int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
1700
1701   /* VSX registers that overlap the FPR registers are larger than for non-VSX
1702      implementations.  Don't allow an item to be split between a FP register
1703      and an Altivec register.  */
1704   if (VECTOR_MEM_VSX_P (mode))
1705     {
1706       if (FP_REGNO_P (regno))
1707         return FP_REGNO_P (last_regno);
1708
1709       if (ALTIVEC_REGNO_P (regno))
1710         return ALTIVEC_REGNO_P (last_regno);
1711     }
1712
1713   /* The GPRs can hold any mode, but values bigger than one register
1714      cannot go past R31.  */
1715   if (INT_REGNO_P (regno))
1716     return INT_REGNO_P (last_regno);
1717
1718   /* The float registers (except for VSX vector modes) can only hold floating
1719      modes and DImode.  This excludes the 32-bit decimal float mode for
1720      now.  */
1721   if (FP_REGNO_P (regno))
1722     {
1723       if (SCALAR_FLOAT_MODE_P (mode)
1724           && (mode != TDmode || (regno % 2) == 0)
1725           && FP_REGNO_P (last_regno))
1726         return 1;
1727
1728       if (GET_MODE_CLASS (mode) == MODE_INT
1729           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1730         return 1;
1731
1732       if (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1733           && PAIRED_VECTOR_MODE (mode))
1734         return 1;
1735
1736       return 0;
1737     }
1738
1739   /* The CR register can only hold CC modes.  */
1740   if (CR_REGNO_P (regno))
1741     return GET_MODE_CLASS (mode) == MODE_CC;
1742
1743   if (CA_REGNO_P (regno))
1744     return mode == BImode;
1745
1746   /* AltiVec only in AldyVec registers.  */
1747   if (ALTIVEC_REGNO_P (regno))
1748     return VECTOR_MEM_ALTIVEC_OR_VSX_P (mode);
1749
1750   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1751   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1752     return 1;
1753
1754   /* We cannot put TImode anywhere except general register and it must be able
1755      to fit within the register set.  In the future, allow TImode in the
1756      Altivec or VSX registers.  */
1757
1758   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1759 }
1760
1761 /* Print interesting facts about registers.  */
1762 static void
1763 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
1764 {
1765   int r, m;
1766
1767   for (r = first_regno; r <= last_regno; ++r)
1768     {
1769       const char *comma = "";
1770       int len;
1771
1772       if (first_regno == last_regno)
1773         fprintf (stderr, "%s:\t", reg_name);
1774       else
1775         fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
1776
1777       len = 8;
1778       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1779         if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
1780           {
1781             if (len > 70)
1782               {
1783                 fprintf (stderr, ",\n\t");
1784                 len = 8;
1785                 comma = "";
1786               }
1787
1788             if (rs6000_hard_regno_nregs[m][r] > 1)
1789               len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
1790                              rs6000_hard_regno_nregs[m][r]);
1791             else
1792               len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
1793
1794             comma = ", ";
1795           }
1796
1797       if (call_used_regs[r])
1798         {
1799           if (len > 70)
1800             {
1801               fprintf (stderr, ",\n\t");
1802               len = 8;
1803               comma = "";
1804             }
1805
1806           len += fprintf (stderr, "%s%s", comma, "call-used");
1807           comma = ", ";
1808         }
1809
1810       if (fixed_regs[r])
1811         {
1812           if (len > 70)
1813             {
1814               fprintf (stderr, ",\n\t");
1815               len = 8;
1816               comma = "";
1817             }
1818
1819           len += fprintf (stderr, "%s%s", comma, "fixed");
1820           comma = ", ";
1821         }
1822
1823       if (len > 70)
1824         {
1825           fprintf (stderr, ",\n\t");
1826           comma = "";
1827         }
1828
1829       fprintf (stderr, "%sregno = %d\n", comma, r);
1830     }
1831 }
1832
1833 /* Print various interesting information with -mdebug=reg.  */
1834 static void
1835 rs6000_debug_reg_global (void)
1836 {
1837   const char *nl = (const char *)0;
1838   int m;
1839   char costly_num[20];
1840   char nop_num[20];
1841   const char *costly_str;
1842   const char *nop_str;
1843
1844   /* Map enum rs6000_vector to string.  */
1845   static const char *rs6000_debug_vector_unit[] = {
1846     "none",
1847     "altivec",
1848     "vsx",
1849     "paired",
1850     "spe",
1851     "other"
1852   };
1853
1854   fprintf (stderr, "Register information: (last virtual reg = %d)\n",
1855            LAST_VIRTUAL_REGISTER);
1856   rs6000_debug_reg_print (0, 31, "gr");
1857   rs6000_debug_reg_print (32, 63, "fp");
1858   rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
1859                           LAST_ALTIVEC_REGNO,
1860                           "vs");
1861   rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
1862   rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
1863   rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
1864   rs6000_debug_reg_print (MQ_REGNO, MQ_REGNO, "mq");
1865   rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
1866   rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
1867   rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
1868   rs6000_debug_reg_print (SPE_ACC_REGNO, SPE_ACC_REGNO, "spe_a");
1869   rs6000_debug_reg_print (SPEFSCR_REGNO, SPEFSCR_REGNO, "spe_f");
1870
1871   fprintf (stderr,
1872            "\n"
1873            "d  reg_class = %s\n"
1874            "f  reg_class = %s\n"
1875            "v  reg_class = %s\n"
1876            "wa reg_class = %s\n"
1877            "wd reg_class = %s\n"
1878            "wf reg_class = %s\n"
1879            "ws reg_class = %s\n\n",
1880            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
1881            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
1882            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
1883            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
1884            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
1885            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
1886            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]]);
1887
1888   for (m = 0; m < NUM_MACHINE_MODES; ++m)
1889     if (rs6000_vector_unit[m] || rs6000_vector_mem[m])
1890       {
1891         nl = "\n";
1892         fprintf (stderr, "Vector mode: %-5s arithmetic: %-8s move: %-8s\n",
1893                  GET_MODE_NAME (m),
1894                  rs6000_debug_vector_unit[ rs6000_vector_unit[m] ],
1895                  rs6000_debug_vector_unit[ rs6000_vector_mem[m] ]);
1896       }
1897
1898   if (nl)
1899     fputs (nl, stderr);
1900
1901   if (rs6000_recip_control)
1902     {
1903       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
1904
1905       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1906         if (rs6000_recip_bits[m])
1907           {
1908             fprintf (stderr,
1909                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
1910                      GET_MODE_NAME (m),
1911                      (RS6000_RECIP_AUTO_RE_P (m)
1912                       ? "auto"
1913                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
1914                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
1915                       ? "auto"
1916                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
1917           }
1918
1919       fputs ("\n", stderr);
1920     }
1921
1922   switch (rs6000_sched_costly_dep)
1923     {
1924     case max_dep_latency:
1925       costly_str = "max_dep_latency";
1926       break;
1927
1928     case no_dep_costly:
1929       costly_str = "no_dep_costly";
1930       break;
1931
1932     case all_deps_costly:
1933       costly_str = "all_deps_costly";
1934       break;
1935
1936     case true_store_to_load_dep_costly:
1937       costly_str = "true_store_to_load_dep_costly";
1938       break;
1939
1940     case store_to_load_dep_costly:
1941       costly_str = "store_to_load_dep_costly";
1942       break;
1943
1944     default:
1945       costly_str = costly_num;
1946       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
1947       break;
1948     }
1949
1950   switch (rs6000_sched_insert_nops)
1951     {
1952     case sched_finish_regroup_exact:
1953       nop_str = "sched_finish_regroup_exact";
1954       break;
1955
1956     case sched_finish_pad_groups:
1957       nop_str = "sched_finish_pad_groups";
1958       break;
1959
1960     case sched_finish_none:
1961       nop_str = "sched_finish_none";
1962       break;
1963
1964     default:
1965       nop_str = nop_num;
1966       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
1967       break;
1968     }
1969
1970   fprintf (stderr,
1971            "always_hint                     = %s\n"
1972            "align_branch_targets            = %s\n"
1973            "sched_restricted_insns_priority = %d\n"
1974            "sched_costly_dep                = %s\n"
1975            "sched_insert_nops               = %s\n\n",
1976            rs6000_always_hint ? "true" : "false",
1977            rs6000_align_branch_targets ? "true" : "false",
1978            (int)rs6000_sched_restricted_insns_priority,
1979            costly_str, nop_str);
1980 }
1981
1982 /* Initialize the various global tables that are based on register size.  */
1983 static void
1984 rs6000_init_hard_regno_mode_ok (void)
1985 {
1986   int r, m, c;
1987   int align64;
1988   int align32;
1989
1990   /* Precalculate REGNO_REG_CLASS.  */
1991   rs6000_regno_regclass[0] = GENERAL_REGS;
1992   for (r = 1; r < 32; ++r)
1993     rs6000_regno_regclass[r] = BASE_REGS;
1994
1995   for (r = 32; r < 64; ++r)
1996     rs6000_regno_regclass[r] = FLOAT_REGS;
1997
1998   for (r = 64; r < FIRST_PSEUDO_REGISTER; ++r)
1999     rs6000_regno_regclass[r] = NO_REGS;
2000
2001   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2002     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2003
2004   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2005   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2006     rs6000_regno_regclass[r] = CR_REGS;
2007
2008   rs6000_regno_regclass[MQ_REGNO] = MQ_REGS;
2009   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2010   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2011   rs6000_regno_regclass[CA_REGNO] = CA_REGS;
2012   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2013   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2014   rs6000_regno_regclass[SPE_ACC_REGNO] = SPE_ACC_REGS;
2015   rs6000_regno_regclass[SPEFSCR_REGNO] = SPEFSCR_REGS;
2016   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2017   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2018
2019   /* Precalculate vector information, this must be set up before the
2020      rs6000_hard_regno_nregs_internal below.  */
2021   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2022     {
2023       rs6000_vector_unit[m] = rs6000_vector_mem[m] = VECTOR_NONE;
2024       rs6000_vector_reload[m][0] = CODE_FOR_nothing;
2025       rs6000_vector_reload[m][1] = CODE_FOR_nothing;
2026     }
2027
2028   for (c = 0; c < (int)(int)RS6000_CONSTRAINT_MAX; c++)
2029     rs6000_constraints[c] = NO_REGS;
2030
2031   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
2032      believes it can use native alignment or still uses 128-bit alignment.  */
2033   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
2034     {
2035       align64 = 64;
2036       align32 = 32;
2037     }
2038   else
2039     {
2040       align64 = 128;
2041       align32 = 128;
2042     }
2043
2044   /* V2DF mode, VSX only.  */
2045   if (TARGET_VSX)
2046     {
2047       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
2048       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
2049       rs6000_vector_align[V2DFmode] = align64;
2050     }
2051
2052   /* V4SF mode, either VSX or Altivec.  */
2053   if (TARGET_VSX)
2054     {
2055       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
2056       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
2057       rs6000_vector_align[V4SFmode] = align32;
2058     }
2059   else if (TARGET_ALTIVEC)
2060     {
2061       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
2062       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
2063       rs6000_vector_align[V4SFmode] = align32;
2064     }
2065
2066   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
2067      and stores. */
2068   if (TARGET_ALTIVEC)
2069     {
2070       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
2071       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
2072       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
2073       rs6000_vector_align[V4SImode] = align32;
2074       rs6000_vector_align[V8HImode] = align32;
2075       rs6000_vector_align[V16QImode] = align32;
2076
2077       if (TARGET_VSX)
2078         {
2079           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
2080           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
2081           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
2082         }
2083       else
2084         {
2085           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
2086           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
2087           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
2088         }
2089     }
2090
2091   /* V2DImode, only allow under VSX, which can do V2DI insert/splat/extract.
2092      Altivec doesn't have 64-bit support.  */
2093   if (TARGET_VSX)
2094     {
2095       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
2096       rs6000_vector_unit[V2DImode] = VECTOR_NONE;
2097       rs6000_vector_align[V2DImode] = align64;
2098     }
2099
2100   /* DFmode, see if we want to use the VSX unit.  */
2101   if (TARGET_VSX && TARGET_VSX_SCALAR_DOUBLE)
2102     {
2103       rs6000_vector_unit[DFmode] = VECTOR_VSX;
2104       rs6000_vector_mem[DFmode]
2105         = (TARGET_VSX_SCALAR_MEMORY ? VECTOR_VSX : VECTOR_NONE);
2106       rs6000_vector_align[DFmode] = align64;
2107     }
2108
2109   /* TODO add SPE and paired floating point vector support.  */
2110
2111   /* Register class constaints for the constraints that depend on compile
2112      switches.  */
2113   if (TARGET_HARD_FLOAT && TARGET_FPRS)
2114     rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
2115
2116   if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
2117     rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
2118
2119   if (TARGET_VSX)
2120     {
2121       /* At present, we just use VSX_REGS, but we have different constraints
2122          based on the use, in case we want to fine tune the default register
2123          class used.  wa = any VSX register, wf = register class to use for
2124          V4SF, wd = register class to use for V2DF, and ws = register classs to
2125          use for DF scalars.  */
2126       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
2127       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
2128       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
2129       rs6000_constraints[RS6000_CONSTRAINT_ws] = (TARGET_VSX_SCALAR_MEMORY
2130                                                   ? VSX_REGS
2131                                                   : FLOAT_REGS);
2132     }
2133
2134   if (TARGET_ALTIVEC)
2135     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
2136
2137   /* Set up the reload helper functions.  */
2138   if (TARGET_VSX || TARGET_ALTIVEC)
2139     {
2140       if (TARGET_64BIT)
2141         {
2142           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_di_store;
2143           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_di_load;
2144           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_di_store;
2145           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_di_load;
2146           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_di_store;
2147           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_di_load;
2148           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_di_store;
2149           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_di_load;
2150           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_di_store;
2151           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_di_load;
2152           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_di_store;
2153           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_di_load;
2154         }
2155       else
2156         {
2157           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_si_store;
2158           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_si_load;
2159           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_si_store;
2160           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_si_load;
2161           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_si_store;
2162           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_si_load;
2163           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_si_store;
2164           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_si_load;
2165           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_si_store;
2166           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_si_load;
2167           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_si_store;
2168           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_si_load;
2169         }
2170     }
2171
2172   /* Precalculate HARD_REGNO_NREGS.  */
2173   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2174     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2175       rs6000_hard_regno_nregs[m][r]
2176         = rs6000_hard_regno_nregs_internal (r, (enum machine_mode)m);
2177
2178   /* Precalculate HARD_REGNO_MODE_OK.  */
2179   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2180     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2181       if (rs6000_hard_regno_mode_ok (r, (enum machine_mode)m))
2182         rs6000_hard_regno_mode_ok_p[m][r] = true;
2183
2184   /* Precalculate CLASS_MAX_NREGS sizes.  */
2185   for (c = 0; c < LIM_REG_CLASSES; ++c)
2186     {
2187       int reg_size;
2188
2189       if (TARGET_VSX && VSX_REG_CLASS_P (c))
2190         reg_size = UNITS_PER_VSX_WORD;
2191
2192       else if (c == ALTIVEC_REGS)
2193         reg_size = UNITS_PER_ALTIVEC_WORD;
2194
2195       else if (c == FLOAT_REGS)
2196         reg_size = UNITS_PER_FP_WORD;
2197
2198       else
2199         reg_size = UNITS_PER_WORD;
2200
2201       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2202         rs6000_class_max_nregs[m][c]
2203           = (GET_MODE_SIZE (m) + reg_size - 1) / reg_size;
2204     }
2205
2206   if (TARGET_E500_DOUBLE)
2207     rs6000_class_max_nregs[DFmode][GENERAL_REGS] = 1;
2208
2209   /* Calculate which modes to automatically generate code to use a the
2210      reciprocal divide and square root instructions.  In the future, possibly
2211      automatically generate the instructions even if the user did not specify
2212      -mrecip.  The older machines double precision reciprocal sqrt estimate is
2213      not accurate enough.  */
2214   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
2215   if (TARGET_FRES)
2216     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2217   if (TARGET_FRE)
2218     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2219   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2220     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2221   if (VECTOR_UNIT_VSX_P (V2DFmode))
2222     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2223
2224   if (TARGET_FRSQRTES)
2225     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2226   if (TARGET_FRSQRTE)
2227     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2228   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2229     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2230   if (VECTOR_UNIT_VSX_P (V2DFmode))
2231     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2232
2233   if (rs6000_recip_control)
2234     {
2235       if (!TARGET_FUSED_MADD)
2236         warning (0, "-mrecip requires -mfused-madd");
2237       if (!flag_finite_math_only)
2238         warning (0, "-mrecip requires -ffinite-math or -ffast-math");
2239       if (flag_trapping_math)
2240         warning (0, "-mrecip requires -fno-trapping-math or -ffast-math");
2241       if (!flag_reciprocal_math)
2242         warning (0, "-mrecip requires -freciprocal-math or -ffast-math");
2243       if (TARGET_FUSED_MADD && flag_finite_math_only && !flag_trapping_math
2244           && flag_reciprocal_math)
2245         {
2246           if (RS6000_RECIP_HAVE_RE_P (SFmode)
2247               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
2248             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2249
2250           if (RS6000_RECIP_HAVE_RE_P (DFmode)
2251               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
2252             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2253
2254           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
2255               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
2256             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2257
2258           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
2259               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
2260             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2261
2262           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
2263               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
2264             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2265
2266           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
2267               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
2268             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2269
2270           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
2271               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
2272             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2273
2274           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
2275               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
2276             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2277         }
2278     }
2279
2280   if (TARGET_DEBUG_REG)
2281     rs6000_debug_reg_global ();
2282
2283   if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
2284     fprintf (stderr,
2285              "SImode variable mult cost       = %d\n"
2286              "SImode constant mult cost       = %d\n"
2287              "SImode short constant mult cost = %d\n"
2288              "DImode multipliciation cost     = %d\n"
2289              "SImode division cost            = %d\n"
2290              "DImode division cost            = %d\n"
2291              "Simple fp operation cost        = %d\n"
2292              "DFmode multiplication cost      = %d\n"
2293              "SFmode division cost            = %d\n"
2294              "DFmode division cost            = %d\n"
2295              "cache line size                 = %d\n"
2296              "l1 cache size                   = %d\n"
2297              "l2 cache size                   = %d\n"
2298              "simultaneous prefetches         = %d\n"
2299              "\n",
2300              rs6000_cost->mulsi,
2301              rs6000_cost->mulsi_const,
2302              rs6000_cost->mulsi_const9,
2303              rs6000_cost->muldi,
2304              rs6000_cost->divsi,
2305              rs6000_cost->divdi,
2306              rs6000_cost->fp,
2307              rs6000_cost->dmul,
2308              rs6000_cost->sdiv,
2309              rs6000_cost->ddiv,
2310              rs6000_cost->cache_line_size,
2311              rs6000_cost->l1_cache_size,
2312              rs6000_cost->l2_cache_size,
2313              rs6000_cost->simultaneous_prefetches);
2314 }
2315
2316 #if TARGET_MACHO
2317 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
2318
2319 static void
2320 darwin_rs6000_override_options (void)
2321 {
2322   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
2323      off.  */
2324   rs6000_altivec_abi = 1;
2325   TARGET_ALTIVEC_VRSAVE = 1;
2326   if (DEFAULT_ABI == ABI_DARWIN)
2327   {
2328     if (MACHO_DYNAMIC_NO_PIC_P)
2329       {
2330         if (flag_pic)
2331             warning (0, "-mdynamic-no-pic overrides -fpic or -fPIC");
2332         flag_pic = 0;
2333       }
2334     else if (flag_pic == 1)
2335       {
2336         flag_pic = 2;
2337       }
2338     if (TARGET_64BIT)
2339       darwin_one_byte_bool = 1;
2340   }
2341   if (TARGET_64BIT && ! TARGET_POWERPC64)
2342     {
2343       target_flags |= MASK_POWERPC64;
2344       warning (0, "-m64 requires PowerPC64 architecture, enabling");
2345     }
2346   if (flag_mkernel)
2347     {
2348       rs6000_default_long_calls = 1;
2349       target_flags |= MASK_SOFT_FLOAT;
2350     }
2351
2352   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
2353      Altivec.  */
2354   if (!flag_mkernel && !flag_apple_kext
2355       && TARGET_64BIT
2356       && ! (target_flags_explicit & MASK_ALTIVEC))
2357     target_flags |= MASK_ALTIVEC;
2358
2359   /* Unless the user (not the configurer) has explicitly overridden
2360      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
2361      G4 unless targetting the kernel.  */
2362   if (!flag_mkernel
2363       && !flag_apple_kext
2364       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
2365       && ! (target_flags_explicit & MASK_ALTIVEC)
2366       && ! rs6000_select[1].string)
2367     {
2368       target_flags |= MASK_ALTIVEC;
2369     }
2370 }
2371 #endif
2372
2373 /* If not otherwise specified by a target, make 'long double' equivalent to
2374    'double'.  */
2375
2376 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
2377 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
2378 #endif
2379
2380 /* Override command line options.  Mostly we process the processor
2381    type and sometimes adjust other TARGET_ options.  */
2382
2383 void
2384 rs6000_override_options (const char *default_cpu)
2385 {
2386   size_t i, j;
2387   struct rs6000_cpu_select *ptr;
2388   int set_masks;
2389
2390   /* Simplifications for entries below.  */
2391
2392   enum {
2393     POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
2394     POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
2395   };
2396
2397   /* This table occasionally claims that a processor does not support
2398      a particular feature even though it does, but the feature is slower
2399      than the alternative.  Thus, it shouldn't be relied on as a
2400      complete description of the processor's support.
2401
2402      Please keep this list in order, and don't forget to update the
2403      documentation in invoke.texi when adding a new processor or
2404      flag.  */
2405   static struct ptt
2406     {
2407       const char *const name;           /* Canonical processor name.  */
2408       const enum processor_type processor; /* Processor type enum value.  */
2409       const int target_enable;  /* Target flags to enable.  */
2410     } const processor_target_table[]
2411       = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2412          {"403", PROCESSOR_PPC403,
2413           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
2414          {"405", PROCESSOR_PPC405,
2415           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
2416          {"405fp", PROCESSOR_PPC405,
2417           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2418          {"440", PROCESSOR_PPC440,
2419           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
2420          {"440fp", PROCESSOR_PPC440,
2421           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2422          {"464", PROCESSOR_PPC440,
2423           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
2424          {"464fp", PROCESSOR_PPC440,
2425           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2426          {"476", PROCESSOR_PPC476,
2427           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_PPC_GFXOPT | MASK_MFCRF
2428           | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
2429          {"476fp", PROCESSOR_PPC476,
2430           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB
2431           | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
2432          {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
2433          {"601", PROCESSOR_PPC601,
2434           MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
2435          {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2436          {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2437          {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2438          {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2439          {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2440          {"620", PROCESSOR_PPC620,
2441           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2442          {"630", PROCESSOR_PPC630,
2443           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2444          {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2445          {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
2446          {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
2447          {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2448          {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2449          {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2450          {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2451          {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
2452           | MASK_ISEL},
2453          /* 8548 has a dummy entry for now.  */
2454          {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
2455           | MASK_ISEL},
2456          {"a2", PROCESSOR_PPCA2,
2457           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_POPCNTB
2458           | MASK_CMPB | MASK_NO_UPDATE },
2459          {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2460          {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK},
2461          {"e500mc", PROCESSOR_PPCE500MC, POWERPC_BASE_MASK | MASK_PPC_GFXOPT
2462           | MASK_ISEL},
2463          {"e500mc64", PROCESSOR_PPCE500MC64, POWERPC_BASE_MASK | MASK_POWERPC64
2464           | MASK_PPC_GFXOPT | MASK_ISEL},
2465          {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2466          {"970", PROCESSOR_POWER4,
2467           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
2468          {"cell", PROCESSOR_CELL,
2469           POWERPC_7400_MASK  | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
2470          {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
2471          {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2472          {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2473          {"G4",  PROCESSOR_PPC7450, POWERPC_7400_MASK},
2474          {"G5", PROCESSOR_POWER4,
2475           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
2476          {"titan", PROCESSOR_TITAN,
2477           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2478          {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2479          {"power2", PROCESSOR_POWER,
2480           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
2481          {"power3", PROCESSOR_PPC630,
2482           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2483          {"power4", PROCESSOR_POWER4,
2484           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2485           | MASK_MFCRF},
2486          {"power5", PROCESSOR_POWER5,
2487           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2488           | MASK_MFCRF | MASK_POPCNTB},
2489          {"power5+", PROCESSOR_POWER5,
2490           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2491           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
2492          {"power6", PROCESSOR_POWER6,
2493           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2494           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
2495           | MASK_RECIP_PRECISION},
2496          {"power6x", PROCESSOR_POWER6,
2497           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2498           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
2499           | MASK_MFPGPR | MASK_RECIP_PRECISION},
2500          {"power7", PROCESSOR_POWER7,
2501           POWERPC_7400_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_MFCRF
2502           | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP | MASK_POPCNTD
2503           | MASK_VSX| MASK_RECIP_PRECISION},    /* Don't add MASK_ISEL by default */
2504          {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
2505          {"powerpc64", PROCESSOR_POWERPC64,
2506           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2507          {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2508          {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2509          {"rios2", PROCESSOR_RIOS2,
2510           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
2511          {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2512          {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2513          {"rs64", PROCESSOR_RS64A,
2514           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
2515       };
2516
2517   const size_t ptt_size = ARRAY_SIZE (processor_target_table);
2518
2519   /* Some OSs don't support saving the high part of 64-bit registers on
2520      context switch.  Other OSs don't support saving Altivec registers.
2521      On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
2522      settings; if the user wants either, the user must explicitly specify
2523      them and we won't interfere with the user's specification.  */
2524
2525   enum {
2526     POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
2527     POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
2528                      | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
2529                      | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
2530                      | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP
2531                      | MASK_POPCNTD | MASK_VSX | MASK_ISEL | MASK_NO_UPDATE
2532                      | MASK_RECIP_PRECISION)
2533   };
2534
2535   /* Masks for instructions set at various powerpc ISAs.  */
2536   enum {
2537     ISA_2_1_MASKS = MASK_MFCRF,
2538     ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB | MASK_FPRND),
2539
2540     /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and
2541        don't add ALTIVEC, since in general it isn't a win on power6.  */
2542     ISA_2_5_MASKS = (ISA_2_2_MASKS | MASK_CMPB | MASK_RECIP_PRECISION
2543                      | MASK_DFP),
2544
2545     /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but
2546        altivec is a win so enable it.  */
2547     ISA_2_6_MASKS = (ISA_2_5_MASKS | MASK_ALTIVEC | MASK_POPCNTD
2548                      | MASK_VSX | MASK_RECIP_PRECISION)
2549   };
2550
2551   /* Numerous experiment shows that IRA based loop pressure
2552      calculation works better for RTL loop invariant motion on targets
2553      with enough (>= 32) registers.  It is an expensive optimization.
2554      So it is on only for peak performance.  */
2555   if (optimize >= 3)
2556     flag_ira_loop_pressure = 1;
2557
2558   /* Set the pointer size.  */
2559   if (TARGET_64BIT)
2560     {
2561       rs6000_pmode = (int)DImode;
2562       rs6000_pointer_size = 64;
2563     }
2564   else
2565     {
2566       rs6000_pmode = (int)SImode;
2567       rs6000_pointer_size = 32;
2568     }
2569
2570   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
2571 #ifdef OS_MISSING_POWERPC64
2572   if (OS_MISSING_POWERPC64)
2573     set_masks &= ~MASK_POWERPC64;
2574 #endif
2575 #ifdef OS_MISSING_ALTIVEC
2576   if (OS_MISSING_ALTIVEC)
2577     set_masks &= ~MASK_ALTIVEC;
2578 #endif
2579
2580   /* Don't override by the processor default if given explicitly.  */
2581   set_masks &= ~target_flags_explicit;
2582
2583   /* Identify the processor type.  */
2584   rs6000_select[0].string = default_cpu;
2585   rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
2586
2587   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
2588     {
2589       ptr = &rs6000_select[i];
2590       if (ptr->string != (char *)0 && ptr->string[0] != '\0')
2591         {
2592           for (j = 0; j < ptt_size; j++)
2593             if (! strcmp (ptr->string, processor_target_table[j].name))
2594               {
2595                 if (ptr->set_tune_p)
2596                   rs6000_cpu = processor_target_table[j].processor;
2597
2598                 if (ptr->set_arch_p)
2599                   {
2600                     target_flags &= ~set_masks;
2601                     target_flags |= (processor_target_table[j].target_enable
2602                                      & set_masks);
2603                   }
2604                 break;
2605               }
2606
2607           if (j == ptt_size)
2608             error ("bad value (%s) for %s switch", ptr->string, ptr->name);
2609         }
2610     }
2611
2612   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
2613       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64)
2614     {
2615       if (TARGET_ALTIVEC)
2616         error ("AltiVec not supported in this target");
2617       if (TARGET_SPE)
2618         error ("Spe not supported in this target");
2619     }
2620
2621   /* Disable Cell microcode if we are optimizing for the Cell
2622      and not optimizing for size.  */
2623   if (rs6000_gen_cell_microcode == -1)
2624     rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
2625                                   && !optimize_size);
2626
2627   /* If we are optimizing big endian systems for space and it's OK to
2628      use instructions that would be microcoded on the Cell, use the
2629      load/store multiple and string instructions.  */
2630   if (BYTES_BIG_ENDIAN && optimize_size && rs6000_gen_cell_microcode)
2631     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
2632
2633   /* Don't allow -mmultiple or -mstring on little endian systems
2634      unless the cpu is a 750, because the hardware doesn't support the
2635      instructions used in little endian mode, and causes an alignment
2636      trap.  The 750 does not cause an alignment trap (except when the
2637      target is unaligned).  */
2638
2639   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
2640     {
2641       if (TARGET_MULTIPLE)
2642         {
2643           target_flags &= ~MASK_MULTIPLE;
2644           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
2645             warning (0, "-mmultiple is not supported on little endian systems");
2646         }
2647
2648       if (TARGET_STRING)
2649         {
2650           target_flags &= ~MASK_STRING;
2651           if ((target_flags_explicit & MASK_STRING) != 0)
2652             warning (0, "-mstring is not supported on little endian systems");
2653         }
2654     }
2655
2656   /* Add some warnings for VSX.  */
2657   if (TARGET_VSX)
2658     {
2659       const char *msg = NULL;
2660       if (!TARGET_HARD_FLOAT || !TARGET_FPRS
2661           || !TARGET_SINGLE_FLOAT || !TARGET_DOUBLE_FLOAT)
2662         {
2663           if (target_flags_explicit & MASK_VSX)
2664             msg = N_("-mvsx requires hardware floating point");
2665           else
2666             target_flags &= ~ MASK_VSX;
2667         }
2668       else if (TARGET_PAIRED_FLOAT)
2669         msg = N_("-mvsx and -mpaired are incompatible");
2670       /* The hardware will allow VSX and little endian, but until we make sure
2671          things like vector select, etc. work don't allow VSX on little endian
2672          systems at this point.  */
2673       else if (!BYTES_BIG_ENDIAN)
2674         msg = N_("-mvsx used with little endian code");
2675       else if (TARGET_AVOID_XFORM > 0)
2676         msg = N_("-mvsx needs indexed addressing");
2677       else if (!TARGET_ALTIVEC && (target_flags_explicit & MASK_ALTIVEC))
2678         {
2679           if (target_flags_explicit & MASK_VSX)
2680             msg = N_("-mvsx and -mno-altivec are incompatible");
2681           else
2682             msg = N_("-mno-altivec disables vsx");
2683         }
2684
2685       if (msg)
2686         {
2687           warning (0, msg);
2688           target_flags &= ~ MASK_VSX;
2689         }
2690     }
2691
2692   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
2693      unless the user explicitly used the -mno-<option> to disable the code.  */
2694   if (TARGET_VSX)
2695     target_flags |= (ISA_2_6_MASKS & ~target_flags_explicit);
2696   else if (TARGET_DFP)
2697     target_flags |= (ISA_2_5_MASKS & ~target_flags_explicit);
2698   else if (TARGET_ALTIVEC)
2699     target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
2700
2701   /* E500mc does "better" if we inline more aggressively.  Respect the
2702      user's opinion, though.  */
2703   if (rs6000_block_move_inline_limit == 0
2704       && (rs6000_cpu == PROCESSOR_PPCE500MC
2705           || rs6000_cpu == PROCESSOR_PPCE500MC64))
2706     rs6000_block_move_inline_limit = 128;
2707
2708   /* store_one_arg depends on expand_block_move to handle at least the
2709      size of reg_parm_stack_space.  */
2710   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
2711     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
2712
2713   /* Set debug flags */
2714   if (rs6000_debug_name)
2715     {
2716       if (! strcmp (rs6000_debug_name, "all"))
2717         rs6000_debug_stack = rs6000_debug_arg = rs6000_debug_reg
2718           = rs6000_debug_addr = rs6000_debug_cost = 1;
2719       else if (! strcmp (rs6000_debug_name, "stack"))
2720         rs6000_debug_stack = 1;
2721       else if (! strcmp (rs6000_debug_name, "arg"))
2722         rs6000_debug_arg = 1;
2723       else if (! strcmp (rs6000_debug_name, "reg"))
2724         rs6000_debug_reg = 1;
2725       else if (! strcmp (rs6000_debug_name, "addr"))
2726         rs6000_debug_addr = 1;
2727       else if (! strcmp (rs6000_debug_name, "cost"))
2728         rs6000_debug_cost = 1;
2729       else
2730         error ("unknown -mdebug-%s switch", rs6000_debug_name);
2731
2732       /* If the appropriate debug option is enabled, replace the target hooks
2733          with debug versions that call the real version and then prints
2734          debugging information.  */
2735       if (TARGET_DEBUG_COST)
2736         {
2737           targetm.rtx_costs = rs6000_debug_rtx_costs;
2738           targetm.address_cost = rs6000_debug_address_cost;
2739           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
2740         }
2741
2742       if (TARGET_DEBUG_ADDR)
2743         {
2744           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
2745           targetm.legitimize_address = rs6000_debug_legitimize_address;
2746           rs6000_secondary_reload_class_ptr
2747             = rs6000_debug_secondary_reload_class;
2748           rs6000_secondary_memory_needed_ptr
2749             = rs6000_debug_secondary_memory_needed;
2750           rs6000_cannot_change_mode_class_ptr
2751             = rs6000_debug_cannot_change_mode_class;
2752           rs6000_preferred_reload_class_ptr
2753             = rs6000_debug_preferred_reload_class;
2754           rs6000_legitimize_reload_address_ptr
2755             = rs6000_debug_legitimize_reload_address;
2756           rs6000_mode_dependent_address_ptr
2757             = rs6000_debug_mode_dependent_address;
2758         }
2759     }
2760
2761   if (rs6000_traceback_name)
2762     {
2763       if (! strncmp (rs6000_traceback_name, "full", 4))
2764         rs6000_traceback = traceback_full;
2765       else if (! strncmp (rs6000_traceback_name, "part", 4))
2766         rs6000_traceback = traceback_part;
2767       else if (! strncmp (rs6000_traceback_name, "no", 2))
2768         rs6000_traceback = traceback_none;
2769       else
2770         error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
2771                rs6000_traceback_name);
2772     }
2773
2774   if (!rs6000_explicit_options.long_double)
2775     rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2776
2777 #ifndef POWERPC_LINUX
2778   if (!rs6000_explicit_options.ieee)
2779     rs6000_ieeequad = 1;
2780 #endif
2781
2782   /* Enable Altivec ABI for AIX -maltivec.  */
2783   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
2784     rs6000_altivec_abi = 1;
2785
2786   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
2787      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
2788      be explicitly overridden in either case.  */
2789   if (TARGET_ELF)
2790     {
2791       if (!rs6000_explicit_options.altivec_abi
2792           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
2793         rs6000_altivec_abi = 1;
2794
2795       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
2796       if (!rs6000_explicit_options.vrsave)
2797         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
2798     }
2799
2800   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
2801      So far, the only darwin64 targets are also MACH-O.  */
2802   if (TARGET_MACHO
2803       && DEFAULT_ABI == ABI_DARWIN 
2804       && TARGET_64BIT)
2805     {
2806       rs6000_darwin64_abi = 1;
2807       /* Default to natural alignment, for better performance.  */
2808       rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2809     }
2810
2811   /* Place FP constants in the constant pool instead of TOC
2812      if section anchors enabled.  */
2813   if (flag_section_anchors)
2814     TARGET_NO_FP_IN_TOC = 1;
2815
2816   /* Handle -mtls-size option.  */
2817   rs6000_parse_tls_size_option ();
2818
2819 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2820   SUBTARGET_OVERRIDE_OPTIONS;
2821 #endif
2822 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2823   SUBSUBTARGET_OVERRIDE_OPTIONS;
2824 #endif
2825 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
2826   SUB3TARGET_OVERRIDE_OPTIONS;
2827 #endif
2828
2829   if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC
2830       || rs6000_cpu == PROCESSOR_PPCE500MC64)
2831     {
2832       /* The e500 and e500mc do not have string instructions, and we set
2833          MASK_STRING above when optimizing for size.  */
2834       if ((target_flags & MASK_STRING) != 0)
2835         target_flags = target_flags & ~MASK_STRING;
2836     }
2837   else if (rs6000_select[1].string != NULL)
2838     {
2839       /* For the powerpc-eabispe configuration, we set all these by
2840          default, so let's unset them if we manually set another
2841          CPU that is not the E500.  */
2842       if (!rs6000_explicit_options.spe_abi)
2843         rs6000_spe_abi = 0;
2844       if (!rs6000_explicit_options.spe)
2845         rs6000_spe = 0;
2846       if (!rs6000_explicit_options.float_gprs)
2847         rs6000_float_gprs = 0;
2848       if (!(target_flags_explicit & MASK_ISEL))
2849         target_flags &= ~MASK_ISEL;
2850     }
2851
2852   /* Detect invalid option combinations with E500.  */
2853   CHECK_E500_OPTIONS;
2854
2855   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
2856                         && rs6000_cpu != PROCESSOR_POWER5
2857                         && rs6000_cpu != PROCESSOR_POWER6
2858                         && rs6000_cpu != PROCESSOR_POWER7
2859                         && rs6000_cpu != PROCESSOR_PPCA2
2860                         && rs6000_cpu != PROCESSOR_CELL);
2861   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
2862                          || rs6000_cpu == PROCESSOR_POWER5
2863                          || rs6000_cpu == PROCESSOR_POWER7);
2864   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
2865                                  || rs6000_cpu == PROCESSOR_POWER5
2866                                  || rs6000_cpu == PROCESSOR_POWER6
2867                                  || rs6000_cpu == PROCESSOR_POWER7
2868                                  || rs6000_cpu == PROCESSOR_PPCE500MC
2869                                  || rs6000_cpu == PROCESSOR_PPCE500MC64);
2870
2871   /* Allow debug switches to override the above settings.  */
2872   if (TARGET_ALWAYS_HINT > 0)
2873     rs6000_always_hint = TARGET_ALWAYS_HINT;
2874
2875   if (TARGET_SCHED_GROUPS > 0)
2876     rs6000_sched_groups = TARGET_SCHED_GROUPS;
2877
2878   if (TARGET_ALIGN_BRANCH_TARGETS > 0)
2879     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
2880
2881   rs6000_sched_restricted_insns_priority
2882     = (rs6000_sched_groups ? 1 : 0);
2883
2884   /* Handle -msched-costly-dep option.  */
2885   rs6000_sched_costly_dep
2886     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
2887
2888   if (rs6000_sched_costly_dep_str)
2889     {
2890       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
2891         rs6000_sched_costly_dep = no_dep_costly;
2892       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
2893         rs6000_sched_costly_dep = all_deps_costly;
2894       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
2895         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
2896       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
2897         rs6000_sched_costly_dep = store_to_load_dep_costly;
2898       else
2899         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
2900                                    atoi (rs6000_sched_costly_dep_str));
2901     }
2902
2903   /* Handle -minsert-sched-nops option.  */
2904   rs6000_sched_insert_nops
2905     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
2906
2907   if (rs6000_sched_insert_nops_str)
2908     {
2909       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
2910         rs6000_sched_insert_nops = sched_finish_none;
2911       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
2912         rs6000_sched_insert_nops = sched_finish_pad_groups;
2913       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
2914         rs6000_sched_insert_nops = sched_finish_regroup_exact;
2915       else
2916         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
2917                                     atoi (rs6000_sched_insert_nops_str));
2918     }
2919
2920 #ifdef TARGET_REGNAMES
2921   /* If the user desires alternate register names, copy in the
2922      alternate names now.  */
2923   if (TARGET_REGNAMES)
2924     memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
2925 #endif
2926
2927   /* Set aix_struct_return last, after the ABI is determined.
2928      If -maix-struct-return or -msvr4-struct-return was explicitly
2929      used, don't override with the ABI default.  */
2930   if (!rs6000_explicit_options.aix_struct_ret)
2931     aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
2932
2933 #if 0
2934   /* IBM XL compiler defaults to unsigned bitfields.  */
2935   if (TARGET_XL_COMPAT)
2936     flag_signed_bitfields = 0;
2937 #endif
2938
2939   if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
2940     REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
2941
2942   if (TARGET_TOC)
2943     ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
2944
2945   /* We can only guarantee the availability of DI pseudo-ops when
2946      assembling for 64-bit targets.  */
2947   if (!TARGET_64BIT)
2948     {
2949       targetm.asm_out.aligned_op.di = NULL;
2950       targetm.asm_out.unaligned_op.di = NULL;
2951     }
2952
2953   /* Set branch target alignment, if not optimizing for size.  */
2954   if (!optimize_size)
2955     {
2956       /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
2957          aligned 8byte to avoid misprediction by the branch predictor.  */
2958       if (rs6000_cpu == PROCESSOR_TITAN
2959           || rs6000_cpu == PROCESSOR_CELL)
2960         {
2961           if (align_functions <= 0)
2962             align_functions = 8;
2963           if (align_jumps <= 0)
2964             align_jumps = 8;
2965           if (align_loops <= 0)
2966             align_loops = 8;
2967         }
2968       if (rs6000_align_branch_targets)
2969         {
2970           if (align_functions <= 0)
2971             align_functions = 16;
2972           if (align_jumps <= 0)
2973             align_jumps = 16;
2974           if (align_loops <= 0)
2975             align_loops = 16;
2976         }
2977       if (align_jumps_max_skip <= 0)
2978         align_jumps_max_skip = 15;
2979       if (align_loops_max_skip <= 0)
2980         align_loops_max_skip = 15;
2981     }
2982
2983   /* Arrange to save and restore machine status around nested functions.  */
2984   init_machine_status = rs6000_init_machine_status;
2985
2986   /* We should always be splitting complex arguments, but we can't break
2987      Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
2988   if (DEFAULT_ABI != ABI_AIX)
2989     targetm.calls.split_complex_arg = NULL;
2990
2991   /* Initialize rs6000_cost with the appropriate target costs.  */
2992   if (optimize_size)
2993     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
2994   else
2995     switch (rs6000_cpu)
2996       {
2997       case PROCESSOR_RIOS1:
2998         rs6000_cost = &rios1_cost;
2999         break;
3000
3001       case PROCESSOR_RIOS2:
3002         rs6000_cost = &rios2_cost;
3003         break;
3004
3005       case PROCESSOR_RS64A:
3006         rs6000_cost = &rs64a_cost;
3007         break;
3008
3009       case PROCESSOR_MPCCORE:
3010         rs6000_cost = &mpccore_cost;
3011         break;
3012
3013       case PROCESSOR_PPC403:
3014         rs6000_cost = &ppc403_cost;
3015         break;
3016
3017       case PROCESSOR_PPC405:
3018         rs6000_cost = &ppc405_cost;
3019         break;
3020
3021       case PROCESSOR_PPC440:
3022         rs6000_cost = &ppc440_cost;
3023         break;
3024
3025       case PROCESSOR_PPC476:
3026         rs6000_cost = &ppc476_cost;
3027         break;
3028
3029       case PROCESSOR_PPC601:
3030         rs6000_cost = &ppc601_cost;
3031         break;
3032
3033       case PROCESSOR_PPC603:
3034         rs6000_cost = &ppc603_cost;
3035         break;
3036
3037       case PROCESSOR_PPC604:
3038         rs6000_cost = &ppc604_cost;
3039         break;
3040
3041       case PROCESSOR_PPC604e:
3042         rs6000_cost = &ppc604e_cost;
3043         break;
3044
3045       case PROCESSOR_PPC620:
3046         rs6000_cost = &ppc620_cost;
3047         break;
3048
3049       case PROCESSOR_PPC630:
3050         rs6000_cost = &ppc630_cost;
3051         break;
3052
3053       case PROCESSOR_CELL:
3054         rs6000_cost = &ppccell_cost;
3055         break;
3056
3057       case PROCESSOR_PPC750:
3058       case PROCESSOR_PPC7400:
3059         rs6000_cost = &ppc750_cost;
3060         break;
3061
3062       case PROCESSOR_PPC7450:
3063         rs6000_cost = &ppc7450_cost;
3064         break;
3065
3066       case PROCESSOR_PPC8540:
3067         rs6000_cost = &ppc8540_cost;
3068         break;
3069
3070       case PROCESSOR_PPCE300C2:
3071       case PROCESSOR_PPCE300C3:
3072         rs6000_cost = &ppce300c2c3_cost;
3073         break;
3074
3075       case PROCESSOR_PPCE500MC:
3076         rs6000_cost = &ppce500mc_cost;
3077         break;
3078
3079       case PROCESSOR_PPCE500MC64:
3080         rs6000_cost = &ppce500mc64_cost;
3081         break;
3082
3083       case PROCESSOR_TITAN:
3084         rs6000_cost = &titan_cost;
3085         break;
3086
3087       case PROCESSOR_POWER4:
3088       case PROCESSOR_POWER5:
3089         rs6000_cost = &power4_cost;
3090         break;
3091
3092       case PROCESSOR_POWER6:
3093         rs6000_cost = &power6_cost;
3094         break;
3095
3096       case PROCESSOR_POWER7:
3097         rs6000_cost = &power7_cost;
3098         break;
3099
3100       case PROCESSOR_PPCA2:
3101         rs6000_cost = &ppca2_cost;
3102         break;
3103
3104       default:
3105         gcc_unreachable ();
3106       }
3107
3108   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3109     set_param_value ("simultaneous-prefetches",
3110                      rs6000_cost->simultaneous_prefetches);
3111   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3112     set_param_value ("l1-cache-size", rs6000_cost->l1_cache_size);
3113   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3114     set_param_value ("l1-cache-line-size", rs6000_cost->cache_line_size);
3115   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3116     set_param_value ("l2-cache-size", rs6000_cost->l2_cache_size);
3117
3118   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3119      can be optimized to ap = __builtin_next_arg (0).  */
3120   if (DEFAULT_ABI != ABI_V4)
3121     targetm.expand_builtin_va_start = NULL;
3122
3123   /* Set up single/double float flags.  
3124      If TARGET_HARD_FLOAT is set, but neither single or double is set, 
3125      then set both flags. */
3126   if (TARGET_HARD_FLOAT && TARGET_FPRS 
3127       && rs6000_single_float == 0 && rs6000_double_float == 0)
3128     rs6000_single_float = rs6000_double_float = 1;
3129
3130   /* Reset single and double FP flags if target is E500. */
3131   if (TARGET_E500) 
3132   {
3133     rs6000_single_float = rs6000_double_float = 0;
3134     if (TARGET_E500_SINGLE)
3135       rs6000_single_float = 1; 
3136     if (TARGET_E500_DOUBLE)
3137       rs6000_single_float = rs6000_double_float = 1;
3138   }
3139
3140   /* If not explicitly specified via option, decide whether to generate indexed
3141      load/store instructions.  */
3142   if (TARGET_AVOID_XFORM == -1)
3143     /* Avoid indexed addressing when targeting Power6 in order to avoid
3144      the DERAT mispredict penalty.  */
3145     TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB);
3146
3147   /* Set the -mrecip options.  */
3148   if (rs6000_recip_name)
3149     {
3150       char *p = ASTRDUP (rs6000_recip_name);
3151       char *q;
3152       unsigned int mask, i;
3153       bool invert;
3154
3155       while ((q = strtok (p, ",")) != NULL)
3156         {
3157           p = NULL;
3158           if (*q == '!')
3159             {
3160               invert = true;
3161               q++;
3162             }
3163           else
3164             invert = false;
3165
3166           if (!strcmp (q, "default"))
3167             mask = ((TARGET_RECIP_PRECISION)
3168                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
3169           else
3170             {
3171               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
3172                 if (!strcmp (q, recip_options[i].string))
3173                   {
3174                     mask = recip_options[i].mask;
3175                     break;
3176                   }
3177
3178               if (i == ARRAY_SIZE (recip_options))
3179                 {
3180                   error ("Unknown option for -mrecip=%s", q);
3181                   invert = false;
3182                   mask = 0;
3183                 }
3184             }
3185
3186           if (invert)
3187             rs6000_recip_control &= ~mask;
3188           else
3189             rs6000_recip_control |= mask;
3190         }
3191     }
3192
3193   rs6000_init_hard_regno_mode_ok ();
3194 }
3195
3196 /* Implement targetm.vectorize.builtin_mask_for_load.  */
3197 static tree
3198 rs6000_builtin_mask_for_load (void)
3199 {
3200   if (TARGET_ALTIVEC || TARGET_VSX)
3201     return altivec_builtin_mask_for_load;
3202   else
3203     return 0;
3204 }
3205
3206 /* Implement targetm.vectorize.builtin_conversion.
3207    Returns a decl of a function that implements conversion of an integer vector
3208    into a floating-point vector, or vice-versa.  DEST_TYPE is the
3209    destination type and SRC_TYPE the source type of the conversion.
3210    Return NULL_TREE if it is not available.  */
3211 static tree
3212 rs6000_builtin_conversion (unsigned int tcode, tree dest_type, tree src_type)
3213 {
3214   enum tree_code code = (enum tree_code) tcode;
3215
3216   switch (code)
3217     {
3218     case FIX_TRUNC_EXPR:
3219       switch (TYPE_MODE (dest_type))
3220         {
3221         case V2DImode:
3222           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3223             return NULL_TREE;
3224
3225           return TYPE_UNSIGNED (dest_type)
3226             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVDPUXDS_UNS]
3227             : rs6000_builtin_decls[VSX_BUILTIN_XVCVDPSXDS];
3228
3229         case V4SImode:
3230           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3231             return NULL_TREE;
3232
3233           return TYPE_UNSIGNED (dest_type)
3234             ? rs6000_builtin_decls[VECTOR_BUILTIN_FIXUNS_V4SF_V4SI]
3235             : rs6000_builtin_decls[VECTOR_BUILTIN_FIX_V4SF_V4SI];
3236
3237         default:
3238           return NULL_TREE;
3239         }
3240
3241     case FLOAT_EXPR:
3242       switch (TYPE_MODE (src_type))
3243         {
3244         case V2DImode:
3245           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3246             return NULL_TREE;
3247
3248           return TYPE_UNSIGNED (src_type)
3249             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVUXDDP]
3250             : rs6000_builtin_decls[VSX_BUILTIN_XVCVSXDDP];
3251
3252         case V4SImode:
3253           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3254             return NULL_TREE;
3255
3256           return TYPE_UNSIGNED (src_type)
3257             ? rs6000_builtin_decls[VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF]
3258             : rs6000_builtin_decls[VECTOR_BUILTIN_FLOAT_V4SI_V4SF];
3259
3260         default:
3261           return NULL_TREE;
3262         }
3263
3264     default:
3265       return NULL_TREE;
3266     }
3267 }
3268
3269 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
3270 static tree
3271 rs6000_builtin_mul_widen_even (tree type)
3272 {
3273   if (!TARGET_ALTIVEC)
3274     return NULL_TREE;
3275
3276   switch (TYPE_MODE (type))
3277     {
3278     case V8HImode:
3279       return TYPE_UNSIGNED (type)
3280             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH_UNS]
3281             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
3282
3283     case V16QImode:
3284       return TYPE_UNSIGNED (type)
3285             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB_UNS]
3286             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
3287     default:
3288       return NULL_TREE;
3289     }
3290 }
3291
3292 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
3293 static tree
3294 rs6000_builtin_mul_widen_odd (tree type)
3295 {
3296   if (!TARGET_ALTIVEC)
3297     return NULL_TREE;
3298
3299   switch (TYPE_MODE (type))
3300     {
3301     case V8HImode:
3302       return TYPE_UNSIGNED (type)
3303             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH_UNS]
3304             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
3305
3306     case V16QImode:
3307       return TYPE_UNSIGNED (type)
3308             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB_UNS]
3309             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
3310     default:
3311       return NULL_TREE;
3312     }
3313 }
3314
3315
3316 /* Return true iff, data reference of TYPE can reach vector alignment (16)
3317    after applying N number of iterations.  This routine does not determine
3318    how may iterations are required to reach desired alignment.  */
3319
3320 static bool
3321 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
3322 {
3323   if (is_packed)
3324     return false;
3325
3326   if (TARGET_32BIT)
3327     {
3328       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
3329         return true;
3330
3331       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
3332         return true;
3333
3334       return false;
3335     }
3336   else
3337     {
3338       if (TARGET_MACHO)
3339         return false;
3340
3341       /* Assuming that all other types are naturally aligned. CHECKME!  */
3342       return true;
3343     }
3344 }
3345
3346 /* Return true if the vector misalignment factor is supported by the
3347    target.  */ 
3348 bool
3349 rs6000_builtin_support_vector_misalignment (enum machine_mode mode,
3350                                             const_tree type,
3351                                             int misalignment,
3352                                             bool is_packed)
3353 {
3354   if (TARGET_VSX)
3355     {
3356       /* Return if movmisalign pattern is not supported for this mode.  */
3357       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
3358         return false;
3359
3360       if (misalignment == -1)
3361         {
3362           /* Misalignment factor is unknown at compile time but we know
3363              it's word aligned.  */
3364           if (rs6000_vector_alignment_reachable (type, is_packed))
3365             {
3366               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
3367
3368               if (element_size == 64 || element_size == 32)
3369                return true;
3370             }
3371
3372           return false;
3373         }
3374
3375       /* VSX supports word-aligned vector.  */
3376       if (misalignment % 4 == 0)
3377         return true;
3378     }
3379   return false;
3380 }
3381
3382 /* Implement targetm.vectorize.builtin_vec_perm.  */
3383 tree
3384 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
3385 {
3386   tree inner_type = TREE_TYPE (type);
3387   bool uns_p = TYPE_UNSIGNED (inner_type);
3388   tree d;
3389
3390   *mask_element_type = unsigned_char_type_node;
3391
3392   switch (TYPE_MODE (type))
3393     {
3394     case V16QImode:
3395       d = (uns_p
3396            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI_UNS]
3397            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI]);
3398       break;
3399
3400     case V8HImode:
3401       d = (uns_p
3402            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI_UNS]
3403            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI]);
3404       break;
3405
3406     case V4SImode:
3407       d = (uns_p
3408            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI_UNS]
3409            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI]);
3410       break;
3411
3412     case V4SFmode:
3413       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
3414       break;
3415
3416     case V2DFmode:
3417       if (!TARGET_ALLOW_DF_PERMUTE)
3418         return NULL_TREE;
3419
3420       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DF];
3421       break;
3422
3423     case V2DImode:
3424       if (!TARGET_ALLOW_DF_PERMUTE)
3425         return NULL_TREE;
3426
3427       d = (uns_p
3428            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI_UNS]
3429            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI]);
3430       break;
3431
3432     default:
3433       return NULL_TREE;
3434     }
3435
3436   gcc_assert (d);
3437   return d;
3438 }
3439
3440
3441 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
3442 static int
3443 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
3444                                    tree vectype, int misalign)
3445 {
3446   unsigned elements;
3447
3448   switch (type_of_cost)
3449     {
3450       case scalar_stmt:
3451       case scalar_load:
3452       case scalar_store:
3453       case vector_stmt:
3454       case vector_load:
3455       case vector_store:
3456       case vec_to_scalar:
3457       case scalar_to_vec:
3458       case cond_branch_not_taken:
3459       case vec_perm:
3460         return 1;
3461
3462       case cond_branch_taken:
3463         return 3;
3464
3465       case unaligned_load:
3466         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3467           {
3468             elements = TYPE_VECTOR_SUBPARTS (vectype);
3469             if (elements == 2)
3470               /* Double word aligned.  */
3471               return 2;
3472
3473             if (elements == 4)
3474               {
3475                 switch (misalign)
3476                   {
3477                     case 8:
3478                       /* Double word aligned.  */
3479                       return 2;
3480
3481                     case -1:
3482                       /* Unknown misalignment.  */
3483                     case 4:
3484                     case 12:
3485                       /* Word aligned.  */
3486                       return 22;
3487
3488                     default:
3489                       gcc_unreachable ();
3490                   }
3491               }
3492           }
3493
3494         if (TARGET_ALTIVEC)
3495           /* Misaligned loads are not supported.  */
3496           gcc_unreachable ();
3497
3498         return 2;
3499
3500       case unaligned_store:
3501         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3502           {
3503             elements = TYPE_VECTOR_SUBPARTS (vectype);
3504             if (elements == 2)
3505               /* Double word aligned.  */
3506               return 2;
3507
3508             if (elements == 4)
3509               {
3510                 switch (misalign)
3511                   {
3512                     case 8:
3513                       /* Double word aligned.  */
3514                       return 2;
3515
3516                     case -1:
3517                       /* Unknown misalignment.  */
3518                     case 4:
3519                     case 12:
3520                       /* Word aligned.  */
3521                       return 23;
3522
3523                     default:
3524                       gcc_unreachable ();
3525                   }
3526               }
3527           }
3528
3529         if (TARGET_ALTIVEC)
3530           /* Misaligned stores are not supported.  */
3531           gcc_unreachable ();
3532
3533         return 2;
3534
3535       default:
3536         gcc_unreachable ();
3537     }
3538 }
3539
3540 /* Handle generic options of the form -mfoo=yes/no.
3541    NAME is the option name.
3542    VALUE is the option value.
3543    FLAG is the pointer to the flag where to store a 1 or 0, depending on
3544    whether the option value is 'yes' or 'no' respectively.  */
3545 static void
3546 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
3547 {
3548   if (value == 0)
3549     return;
3550   else if (!strcmp (value, "yes"))
3551     *flag = 1;
3552   else if (!strcmp (value, "no"))
3553     *flag = 0;
3554   else
3555     error ("unknown -m%s= option specified: '%s'", name, value);
3556 }
3557
3558 /* Validate and record the size specified with the -mtls-size option.  */
3559
3560 static void
3561 rs6000_parse_tls_size_option (void)
3562 {
3563   if (rs6000_tls_size_string == 0)
3564     return;
3565   else if (strcmp (rs6000_tls_size_string, "16") == 0)
3566     rs6000_tls_size = 16;
3567   else if (strcmp (rs6000_tls_size_string, "32") == 0)
3568     rs6000_tls_size = 32;
3569   else if (strcmp (rs6000_tls_size_string, "64") == 0)
3570     rs6000_tls_size = 64;
3571   else
3572     error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
3573 }
3574
3575 void
3576 optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
3577 {
3578   if (DEFAULT_ABI == ABI_DARWIN)
3579     /* The Darwin libraries never set errno, so we might as well
3580        avoid calling them when that's the only reason we would.  */
3581     flag_errno_math = 0;
3582
3583   /* Double growth factor to counter reduced min jump length.  */
3584   set_param_value ("max-grow-copy-bb-insns", 16);
3585
3586   /* Enable section anchors by default.
3587      Skip section anchors for Objective C and Objective C++
3588      until front-ends fixed.  */
3589   if (!TARGET_MACHO && lang_hooks.name[4] != 'O')
3590     flag_section_anchors = 2;
3591 }
3592
3593 static enum fpu_type_t
3594 rs6000_parse_fpu_option (const char *option)
3595 {
3596   if (!strcmp("none", option)) return FPU_NONE;
3597   if (!strcmp("sp_lite", option)) return FPU_SF_LITE;
3598   if (!strcmp("dp_lite", option)) return FPU_DF_LITE;
3599   if (!strcmp("sp_full", option)) return FPU_SF_FULL;
3600   if (!strcmp("dp_full", option)) return FPU_DF_FULL;
3601   error("unknown value %s for -mfpu", option);
3602   return FPU_NONE;
3603 }
3604
3605 /* Returns a function decl for a vectorized version of the builtin function
3606    with builtin function code FN and the result vector type TYPE, or NULL_TREE
3607    if it is not available.  */
3608
3609 static tree
3610 rs6000_builtin_vectorized_function (tree fndecl, tree type_out,
3611                                     tree type_in)
3612 {
3613   enum machine_mode in_mode, out_mode;
3614   int in_n, out_n;
3615
3616   if (TREE_CODE (type_out) != VECTOR_TYPE
3617       || TREE_CODE (type_in) != VECTOR_TYPE
3618       || !TARGET_VECTORIZE_BUILTINS)
3619     return NULL_TREE;
3620
3621   out_mode = TYPE_MODE (TREE_TYPE (type_out));
3622   out_n = TYPE_VECTOR_SUBPARTS (type_out);
3623   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3624   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3625
3626   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3627     {
3628       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3629       switch (fn)
3630         {
3631         case BUILT_IN_COPYSIGN:
3632           if (VECTOR_UNIT_VSX_P (V2DFmode)
3633               && out_mode == DFmode && out_n == 2
3634               && in_mode == DFmode && in_n == 2)
3635             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
3636           break;
3637         case BUILT_IN_COPYSIGNF:
3638           if (out_mode != SFmode || out_n != 4
3639               || in_mode != SFmode || in_n != 4)
3640             break;
3641           if (VECTOR_UNIT_VSX_P (V4SFmode))
3642             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
3643           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3644             return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
3645           break;
3646         case BUILT_IN_SQRT:
3647           if (VECTOR_UNIT_VSX_P (V2DFmode)
3648               && out_mode == DFmode && out_n == 2
3649               && in_mode == DFmode && in_n == 2)
3650             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTDP];
3651           break;
3652         case BUILT_IN_SQRTF:
3653           if (VECTOR_UNIT_VSX_P (V4SFmode)
3654               && out_mode == SFmode && out_n == 4
3655               && in_mode == SFmode && in_n == 4)
3656             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTSP];
3657           break;
3658         case BUILT_IN_CEIL:
3659           if (VECTOR_UNIT_VSX_P (V2DFmode)
3660               && out_mode == DFmode && out_n == 2
3661               && in_mode == DFmode && in_n == 2)
3662             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
3663           break;
3664         case BUILT_IN_CEILF:
3665           if (out_mode != SFmode || out_n != 4
3666               || in_mode != SFmode || in_n != 4)
3667             break;
3668           if (VECTOR_UNIT_VSX_P (V4SFmode))
3669             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
3670           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3671             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
3672           break;
3673         case BUILT_IN_FLOOR:
3674           if (VECTOR_UNIT_VSX_P (V2DFmode)
3675               && out_mode == DFmode && out_n == 2
3676               && in_mode == DFmode && in_n == 2)
3677             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
3678           break;
3679         case BUILT_IN_FLOORF:
3680           if (out_mode != SFmode || out_n != 4
3681               || in_mode != SFmode || in_n != 4)
3682             break;
3683           if (VECTOR_UNIT_VSX_P (V4SFmode))
3684             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
3685           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3686             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
3687           break;
3688         case BUILT_IN_TRUNC:
3689           if (VECTOR_UNIT_VSX_P (V2DFmode)
3690               && out_mode == DFmode && out_n == 2
3691               && in_mode == DFmode && in_n == 2)
3692             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
3693           break;
3694         case BUILT_IN_TRUNCF:
3695           if (out_mode != SFmode || out_n != 4
3696               || in_mode != SFmode || in_n != 4)
3697             break;
3698           if (VECTOR_UNIT_VSX_P (V4SFmode))
3699             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
3700           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3701             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
3702           break;
3703         case BUILT_IN_NEARBYINT:
3704           if (VECTOR_UNIT_VSX_P (V2DFmode)
3705               && flag_unsafe_math_optimizations
3706               && out_mode == DFmode && out_n == 2
3707               && in_mode == DFmode && in_n == 2)
3708             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
3709           break;
3710         case BUILT_IN_NEARBYINTF:
3711           if (VECTOR_UNIT_VSX_P (V4SFmode)
3712               && flag_unsafe_math_optimizations
3713               && out_mode == SFmode && out_n == 4
3714               && in_mode == SFmode && in_n == 4)
3715             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
3716           break;
3717         case BUILT_IN_RINT:
3718           if (VECTOR_UNIT_VSX_P (V2DFmode)
3719               && !flag_trapping_math
3720               && out_mode == DFmode && out_n == 2
3721               && in_mode == DFmode && in_n == 2)
3722             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
3723           break;
3724         case BUILT_IN_RINTF:
3725           if (VECTOR_UNIT_VSX_P (V4SFmode)
3726               && !flag_trapping_math
3727               && out_mode == SFmode && out_n == 4
3728               && in_mode == SFmode && in_n == 4)
3729             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
3730           break;
3731         default:
3732           break;
3733         }
3734     }
3735
3736   else if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
3737     {
3738       enum rs6000_builtins fn
3739         = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
3740       switch (fn)
3741         {
3742         case RS6000_BUILTIN_RSQRTF:
3743           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
3744               && out_mode == SFmode && out_n == 4
3745               && in_mode == SFmode && in_n == 4)
3746             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
3747           break;
3748         case RS6000_BUILTIN_RSQRT:
3749           if (VECTOR_UNIT_VSX_P (V2DFmode)
3750               && out_mode == DFmode && out_n == 2
3751               && in_mode == DFmode && in_n == 2)
3752             return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
3753           break;
3754         case RS6000_BUILTIN_RECIPF:
3755           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
3756               && out_mode == SFmode && out_n == 4
3757               && in_mode == SFmode && in_n == 4)
3758             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
3759           break;
3760         case RS6000_BUILTIN_RECIP:
3761           if (VECTOR_UNIT_VSX_P (V2DFmode)
3762               && out_mode == DFmode && out_n == 2
3763               && in_mode == DFmode && in_n == 2)
3764             return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
3765           break;
3766         default:
3767           break;
3768         }
3769     }
3770
3771   return NULL_TREE;
3772 }
3773
3774
3775 /* Implement TARGET_HANDLE_OPTION.  */
3776
3777 static bool
3778 rs6000_handle_option (size_t code, const char *arg, int value)
3779 {
3780   enum fpu_type_t fpu_type = FPU_NONE;
3781   int isel;
3782
3783   switch (code)
3784     {
3785     case OPT_mno_power:
3786       target_flags &= ~(MASK_POWER | MASK_POWER2
3787                         | MASK_MULTIPLE | MASK_STRING);
3788       target_flags_explicit |= (MASK_POWER | MASK_POWER2
3789                                 | MASK_MULTIPLE | MASK_STRING);
3790       break;
3791     case OPT_mno_powerpc:
3792       target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
3793                         | MASK_PPC_GFXOPT | MASK_POWERPC64);
3794       target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
3795                                 | MASK_PPC_GFXOPT | MASK_POWERPC64);
3796       break;
3797     case OPT_mfull_toc:
3798       target_flags &= ~MASK_MINIMAL_TOC;
3799       TARGET_NO_FP_IN_TOC = 0;
3800       TARGET_NO_SUM_IN_TOC = 0;
3801       target_flags_explicit |= MASK_MINIMAL_TOC;
3802 #ifdef TARGET_USES_SYSV4_OPT
3803       /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
3804          just the same as -mminimal-toc.  */
3805       target_flags |= MASK_MINIMAL_TOC;
3806       target_flags_explicit |= MASK_MINIMAL_TOC;
3807 #endif
3808       break;
3809
3810 #ifdef TARGET_USES_SYSV4_OPT
3811     case OPT_mtoc:
3812       /* Make -mtoc behave like -mminimal-toc.  */
3813       target_flags |= MASK_MINIMAL_TOC;
3814       target_flags_explicit |= MASK_MINIMAL_TOC;
3815       break;
3816 #endif
3817
3818 #if defined (HAVE_LD_LARGE_TOC) && defined (TARGET_USES_LINUX64_OPT)
3819     case OPT_mcmodel_:
3820       if (strcmp (arg, "small") == 0)
3821         cmodel = CMODEL_SMALL;
3822       else if (strcmp (arg, "large") == 0)
3823         cmodel = CMODEL_LARGE;
3824       else
3825         {
3826           error ("invalid option for -mcmodel: '%s'", arg);
3827           return false;
3828         }
3829       rs6000_explicit_options.cmodel = true;
3830 #endif
3831
3832 #ifdef TARGET_USES_AIX64_OPT
3833     case OPT_maix64:
3834 #else
3835     case OPT_m64:
3836 #endif
3837       target_flags |= MASK_POWERPC64 | MASK_POWERPC;
3838       target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
3839       target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
3840       break;
3841
3842 #ifdef TARGET_USES_AIX64_OPT
3843     case OPT_maix32:
3844 #else
3845     case OPT_m32:
3846 #endif
3847       target_flags &= ~MASK_POWERPC64;
3848       target_flags_explicit |= MASK_POWERPC64;
3849       break;
3850
3851     case OPT_minsert_sched_nops_:
3852       rs6000_sched_insert_nops_str = arg;
3853       break;
3854
3855     case OPT_mminimal_toc:
3856       if (value == 1)
3857         {
3858           TARGET_NO_FP_IN_TOC = 0;
3859           TARGET_NO_SUM_IN_TOC = 0;
3860         }
3861       break;
3862
3863     case OPT_mpower:
3864       if (value == 1)
3865         {
3866           target_flags |= (MASK_MULTIPLE | MASK_STRING);
3867           target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
3868         }
3869       break;
3870
3871     case OPT_mpower2:
3872       if (value == 1)
3873         {
3874           target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
3875           target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
3876         }
3877       break;
3878
3879     case OPT_mpowerpc_gpopt:
3880     case OPT_mpowerpc_gfxopt:
3881       if (value == 1)
3882         {
3883           target_flags |= MASK_POWERPC;
3884           target_flags_explicit |= MASK_POWERPC;
3885         }
3886       break;
3887
3888     case OPT_maix_struct_return:
3889     case OPT_msvr4_struct_return:
3890       rs6000_explicit_options.aix_struct_ret = true;
3891       break;
3892
3893     case OPT_mvrsave:
3894       rs6000_explicit_options.vrsave = true;
3895       TARGET_ALTIVEC_VRSAVE = value;
3896       break;
3897
3898     case OPT_mvrsave_:
3899       rs6000_explicit_options.vrsave = true;
3900       rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
3901       break;
3902
3903     case OPT_misel_:
3904       target_flags_explicit |= MASK_ISEL;
3905       isel = 0;
3906       rs6000_parse_yes_no_option ("isel", arg, &isel);
3907       if (isel)
3908         target_flags |= MASK_ISEL;
3909       else
3910         target_flags &= ~MASK_ISEL;
3911       break;
3912
3913     case OPT_mspe:
3914       rs6000_explicit_options.spe = true;
3915       rs6000_spe = value;
3916       break;
3917
3918     case OPT_mspe_:
3919       rs6000_explicit_options.spe = true;
3920       rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
3921       break;
3922
3923     case OPT_mdebug_:
3924       rs6000_debug_name = arg;
3925       break;
3926
3927 #ifdef TARGET_USES_SYSV4_OPT
3928     case OPT_mcall_:
3929       rs6000_abi_name = arg;
3930       break;
3931
3932     case OPT_msdata_:
3933       rs6000_sdata_name = arg;
3934       break;
3935
3936     case OPT_mtls_size_:
3937       rs6000_tls_size_string = arg;
3938       break;
3939
3940     case OPT_mrelocatable:
3941       if (value == 1)
3942         {
3943           target_flags |= MASK_MINIMAL_TOC;
3944           target_flags_explicit |= MASK_MINIMAL_TOC;
3945           TARGET_NO_FP_IN_TOC = 1;
3946         }
3947       break;
3948
3949     case OPT_mrelocatable_lib:
3950       if (value == 1)
3951         {
3952           target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
3953           target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
3954           TARGET_NO_FP_IN_TOC = 1;
3955         }
3956       else
3957         {
3958           target_flags &= ~MASK_RELOCATABLE;
3959           target_flags_explicit |= MASK_RELOCATABLE;
3960         }
3961       break;
3962 #endif
3963
3964     case OPT_mabi_:
3965       if (!strcmp (arg, "altivec"))
3966         {
3967           rs6000_explicit_options.altivec_abi = true;
3968           rs6000_altivec_abi = 1;
3969
3970           /* Enabling the AltiVec ABI turns off the SPE ABI.  */
3971           rs6000_spe_abi = 0;
3972         }
3973       else if (! strcmp (arg, "no-altivec"))
3974         {
3975           rs6000_explicit_options.altivec_abi = true;
3976           rs6000_altivec_abi = 0;
3977         }
3978       else if (! strcmp (arg, "spe"))
3979         {
3980           rs6000_explicit_options.spe_abi = true;
3981           rs6000_spe_abi = 1;
3982           rs6000_altivec_abi = 0;
3983           if (!TARGET_SPE_ABI)
3984             error ("not configured for ABI: '%s'", arg);
3985         }
3986       else if (! strcmp (arg, "no-spe"))
3987         {
3988           rs6000_explicit_options.spe_abi = true;
3989           rs6000_spe_abi = 0;
3990         }
3991
3992       /* These are here for testing during development only, do not
3993          document in the manual please.  */
3994       else if (! strcmp (arg, "d64"))
3995         {
3996           rs6000_darwin64_abi = 1;
3997           warning (0, "Using darwin64 ABI");
3998         }
3999       else if (! strcmp (arg, "d32"))
4000         {
4001           rs6000_darwin64_abi = 0;
4002           warning (0, "Using old darwin ABI");
4003         }
4004
4005       else if (! strcmp (arg, "ibmlongdouble"))
4006         {
4007           rs6000_explicit_options.ieee = true;
4008           rs6000_ieeequad = 0;
4009           warning (0, "Using IBM extended precision long double");
4010         }
4011       else if (! strcmp (arg, "ieeelongdouble"))
4012         {
4013           rs6000_explicit_options.ieee = true;
4014           rs6000_ieeequad = 1;
4015           warning (0, "Using IEEE extended precision long double");
4016         }
4017
4018       else
4019         {
4020           error ("unknown ABI specified: '%s'", arg);
4021           return false;
4022         }
4023       break;
4024
4025     case OPT_mcpu_:
4026       rs6000_select[1].string = arg;
4027       break;
4028
4029     case OPT_mtune_:
4030       rs6000_select[2].string = arg;
4031       break;
4032
4033     case OPT_mtraceback_:
4034       rs6000_traceback_name = arg;
4035       break;
4036
4037     case OPT_mfloat_gprs_:
4038       rs6000_explicit_options.float_gprs = true;
4039       if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
4040         rs6000_float_gprs = 1;
4041       else if (! strcmp (arg, "double"))
4042         rs6000_float_gprs = 2;
4043       else if (! strcmp (arg, "no"))
4044         rs6000_float_gprs = 0;
4045       else
4046         {
4047           error ("invalid option for -mfloat-gprs: '%s'", arg);
4048           return false;
4049         }
4050       break;
4051
4052     case OPT_mlong_double_:
4053       rs6000_explicit_options.long_double = true;
4054       rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4055       if (value != 64 && value != 128)
4056         {
4057           error ("Unknown switch -mlong-double-%s", arg);
4058           rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4059           return false;
4060         }
4061       else
4062         rs6000_long_double_type_size = value;
4063       break;
4064
4065     case OPT_msched_costly_dep_:
4066       rs6000_sched_costly_dep_str = arg;
4067       break;
4068
4069     case OPT_malign_:
4070       rs6000_explicit_options.alignment = true;
4071       if (! strcmp (arg, "power"))
4072         {
4073           /* On 64-bit Darwin, power alignment is ABI-incompatible with
4074              some C library functions, so warn about it. The flag may be
4075              useful for performance studies from time to time though, so
4076              don't disable it entirely.  */
4077           if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
4078             warning (0, "-malign-power is not supported for 64-bit Darwin;"
4079                      " it is incompatible with the installed C and C++ libraries");
4080           rs6000_alignment_flags = MASK_ALIGN_POWER;
4081         }
4082       else if (! strcmp (arg, "natural"))
4083         rs6000_alignment_flags = MASK_ALIGN_NATURAL;
4084       else
4085         {
4086           error ("unknown -malign-XXXXX option specified: '%s'", arg);
4087           return false;
4088         }
4089       break;
4090
4091     case OPT_msingle_float:
4092       if (!TARGET_SINGLE_FPU) 
4093         warning (0, "-msingle-float option equivalent to -mhard-float");
4094       /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
4095       rs6000_double_float = 0;
4096       target_flags &= ~MASK_SOFT_FLOAT;
4097       target_flags_explicit |= MASK_SOFT_FLOAT;
4098       break;
4099
4100     case OPT_mdouble_float:
4101       /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
4102       rs6000_single_float = 1;
4103       target_flags &= ~MASK_SOFT_FLOAT;
4104       target_flags_explicit |= MASK_SOFT_FLOAT;
4105       break;
4106
4107     case OPT_msimple_fpu:
4108       if (!TARGET_SINGLE_FPU) 
4109         warning (0, "-msimple-fpu option ignored");
4110       break;
4111
4112     case OPT_mhard_float:
4113       /* -mhard_float implies -msingle-float and -mdouble-float. */
4114       rs6000_single_float = rs6000_double_float = 1;
4115       break;
4116
4117     case OPT_msoft_float:
4118       /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
4119       rs6000_single_float = rs6000_double_float = 0;
4120       break;
4121
4122     case OPT_mfpu_:
4123       fpu_type = rs6000_parse_fpu_option(arg);
4124       if (fpu_type != FPU_NONE) 
4125       /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on HARD_FLOAT. */
4126       {
4127         target_flags &= ~MASK_SOFT_FLOAT;
4128         target_flags_explicit |= MASK_SOFT_FLOAT;
4129         rs6000_xilinx_fpu = 1;
4130         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_SF_FULL) 
4131         rs6000_single_float = 1;
4132         if (fpu_type == FPU_DF_LITE || fpu_type == FPU_DF_FULL) 
4133           rs6000_single_float = rs6000_double_float = 1;
4134         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_DF_LITE) 
4135           rs6000_simple_fpu = 1;
4136       }
4137       else
4138       {
4139         /* -mfpu=none is equivalent to -msoft-float */
4140         target_flags |= MASK_SOFT_FLOAT;
4141         target_flags_explicit |= MASK_SOFT_FLOAT;
4142         rs6000_single_float = rs6000_double_float = 0;
4143       }
4144
4145     case OPT_mrecip:
4146       rs6000_recip_name = (value) ? "default" : "none";
4147       break;
4148
4149     case OPT_mrecip_:
4150       rs6000_recip_name = arg;
4151       break;
4152     }
4153   return true;
4154 }
4155 \f
4156 /* Do anything needed at the start of the asm file.  */
4157
4158 static void
4159 rs6000_file_start (void)
4160 {
4161   size_t i;
4162   char buffer[80];
4163   const char *start = buffer;
4164   struct rs6000_cpu_select *ptr;
4165   const char *default_cpu = TARGET_CPU_DEFAULT;
4166   FILE *file = asm_out_file;
4167
4168   default_file_start ();
4169
4170 #ifdef TARGET_BI_ARCH
4171   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
4172     default_cpu = 0;
4173 #endif
4174
4175   if (flag_verbose_asm)
4176     {
4177       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
4178       rs6000_select[0].string = default_cpu;
4179
4180       for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
4181         {
4182           ptr = &rs6000_select[i];
4183           if (ptr->string != (char *)0 && ptr->string[0] != '\0')
4184             {
4185               fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
4186               start = "";
4187             }
4188         }
4189
4190       if (PPC405_ERRATUM77)
4191         {
4192           fprintf (file, "%s PPC405CR_ERRATUM77", start);
4193           start = "";
4194         }
4195
4196 #ifdef USING_ELFOS_H
4197       switch (rs6000_sdata)
4198         {
4199         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
4200         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
4201         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
4202         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
4203         }
4204
4205       if (rs6000_sdata && g_switch_value)
4206         {
4207           fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
4208                    g_switch_value);
4209           start = "";
4210         }
4211 #endif
4212
4213       if (*start == '\0')
4214         putc ('\n', file);
4215     }
4216
4217 #ifdef HAVE_AS_GNU_ATTRIBUTE
4218   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
4219     {
4220       fprintf (file, "\t.gnu_attribute 4, %d\n",
4221                ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1 
4222                 : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3 
4223                 : 2));
4224       fprintf (file, "\t.gnu_attribute 8, %d\n",
4225                (TARGET_ALTIVEC_ABI ? 2
4226                 : TARGET_SPE_ABI ? 3
4227                 : 1));
4228       fprintf (file, "\t.gnu_attribute 12, %d\n",
4229                aix_struct_return ? 2 : 1);
4230
4231     }
4232 #endif
4233
4234   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
4235     {
4236       switch_to_section (toc_section);
4237       switch_to_section (text_section);
4238     }
4239 }
4240
4241 \f
4242 /* Return nonzero if this function is known to have a null epilogue.  */
4243
4244 int
4245 direct_return (void)
4246 {
4247   if (reload_completed)
4248     {
4249       rs6000_stack_t *info = rs6000_stack_info ();
4250
4251       if (info->first_gp_reg_save == 32
4252           && info->first_fp_reg_save == 64
4253           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
4254           && ! info->lr_save_p
4255           && ! info->cr_save_p
4256           && info->vrsave_mask == 0
4257           && ! info->push_p)
4258         return 1;
4259     }
4260
4261   return 0;
4262 }
4263
4264 /* Return the number of instructions it takes to form a constant in an
4265    integer register.  */
4266
4267 int
4268 num_insns_constant_wide (HOST_WIDE_INT value)
4269 {
4270   /* signed constant loadable with {cal|addi} */
4271   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
4272     return 1;
4273
4274   /* constant loadable with {cau|addis} */
4275   else if ((value & 0xffff) == 0
4276            && (value >> 31 == -1 || value >> 31 == 0))
4277     return 1;
4278
4279 #if HOST_BITS_PER_WIDE_INT == 64
4280   else if (TARGET_POWERPC64)
4281     {
4282       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
4283       HOST_WIDE_INT high = value >> 31;
4284
4285       if (high == 0 || high == -1)
4286         return 2;
4287
4288       high >>= 1;
4289
4290       if (low == 0)
4291         return num_insns_constant_wide (high) + 1;
4292       else if (high == 0)
4293         return num_insns_constant_wide (low) + 1;
4294       else
4295         return (num_insns_constant_wide (high)
4296                 + num_insns_constant_wide (low) + 1);
4297     }
4298 #endif
4299
4300   else
4301     return 2;
4302 }
4303
4304 int
4305 num_insns_constant (rtx op, enum machine_mode mode)
4306 {
4307   HOST_WIDE_INT low, high;
4308
4309   switch (GET_CODE (op))
4310     {
4311     case CONST_INT:
4312 #if HOST_BITS_PER_WIDE_INT == 64
4313       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4314           && mask64_operand (op, mode))
4315         return 2;
4316       else
4317 #endif
4318         return num_insns_constant_wide (INTVAL (op));
4319
4320       case CONST_DOUBLE:
4321         if (mode == SFmode || mode == SDmode)
4322           {
4323             long l;
4324             REAL_VALUE_TYPE rv;
4325
4326             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4327             if (DECIMAL_FLOAT_MODE_P (mode))
4328               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
4329             else
4330               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4331             return num_insns_constant_wide ((HOST_WIDE_INT) l);
4332           }
4333
4334         if (mode == VOIDmode || mode == DImode)
4335           {
4336             high = CONST_DOUBLE_HIGH (op);
4337             low  = CONST_DOUBLE_LOW (op);
4338           }
4339         else
4340           {
4341             long l[2];
4342             REAL_VALUE_TYPE rv;
4343
4344             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4345             if (DECIMAL_FLOAT_MODE_P (mode))
4346               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
4347             else
4348               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
4349             high = l[WORDS_BIG_ENDIAN == 0];
4350             low  = l[WORDS_BIG_ENDIAN != 0];
4351           }
4352
4353         if (TARGET_32BIT)
4354           return (num_insns_constant_wide (low)
4355                   + num_insns_constant_wide (high));
4356         else
4357           {
4358             if ((high == 0 && low >= 0)
4359                 || (high == -1 && low < 0))
4360               return num_insns_constant_wide (low);
4361
4362             else if (mask64_operand (op, mode))
4363               return 2;
4364
4365             else if (low == 0)
4366               return num_insns_constant_wide (high) + 1;
4367
4368             else
4369               return (num_insns_constant_wide (high)
4370                       + num_insns_constant_wide (low) + 1);
4371           }
4372
4373     default:
4374       gcc_unreachable ();
4375     }
4376 }
4377
4378 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
4379    If the mode of OP is MODE_VECTOR_INT, this simply returns the
4380    corresponding element of the vector, but for V4SFmode and V2SFmode,
4381    the corresponding "float" is interpreted as an SImode integer.  */
4382
4383 HOST_WIDE_INT
4384 const_vector_elt_as_int (rtx op, unsigned int elt)
4385 {
4386   rtx tmp = CONST_VECTOR_ELT (op, elt);
4387   if (GET_MODE (op) == V4SFmode
4388       || GET_MODE (op) == V2SFmode)
4389     tmp = gen_lowpart (SImode, tmp);
4390   return INTVAL (tmp);
4391 }
4392
4393 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
4394    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
4395    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
4396    all items are set to the same value and contain COPIES replicas of the
4397    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
4398    operand and the others are set to the value of the operand's msb.  */
4399
4400 static bool
4401 vspltis_constant (rtx op, unsigned step, unsigned copies)
4402 {
4403   enum machine_mode mode = GET_MODE (op);
4404   enum machine_mode inner = GET_MODE_INNER (mode);
4405
4406   unsigned i;
4407   unsigned nunits = GET_MODE_NUNITS (mode);
4408   unsigned bitsize = GET_MODE_BITSIZE (inner);
4409   unsigned mask = GET_MODE_MASK (inner);
4410
4411   HOST_WIDE_INT val = const_vector_elt_as_int (op, nunits - 1);
4412   HOST_WIDE_INT splat_val = val;
4413   HOST_WIDE_INT msb_val = val > 0 ? 0 : -1;
4414
4415   /* Construct the value to be splatted, if possible.  If not, return 0.  */
4416   for (i = 2; i <= copies; i *= 2)
4417     {
4418       HOST_WIDE_INT small_val;
4419       bitsize /= 2;
4420       small_val = splat_val >> bitsize;
4421       mask >>= bitsize;
4422       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
4423         return false;
4424       splat_val = small_val;
4425     }
4426
4427   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
4428   if (EASY_VECTOR_15 (splat_val))
4429     ;
4430
4431   /* Also check if we can splat, and then add the result to itself.  Do so if
4432      the value is positive, of if the splat instruction is using OP's mode;
4433      for splat_val < 0, the splat and the add should use the same mode.  */
4434   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
4435            && (splat_val >= 0 || (step == 1 && copies == 1)))
4436     ;
4437
4438   /* Also check if are loading up the most significant bit which can be done by
4439      loading up -1 and shifting the value left by -1.  */
4440   else if (EASY_VECTOR_MSB (splat_val, inner))
4441     ;
4442
4443   else
4444     return false;
4445
4446   /* Check if VAL is present in every STEP-th element, and the
4447      other elements are filled with its most significant bit.  */
4448   for (i = 0; i < nunits - 1; ++i)
4449     {
4450       HOST_WIDE_INT desired_val;
4451       if (((i + 1) & (step - 1)) == 0)
4452         desired_val = val;
4453       else
4454         desired_val = msb_val;
4455
4456       if (desired_val != const_vector_elt_as_int (op, i))
4457         return false;
4458     }
4459
4460   return true;
4461 }
4462
4463
4464 /* Return true if OP is of the given MODE and can be synthesized
4465    with a vspltisb, vspltish or vspltisw.  */
4466
4467 bool
4468 easy_altivec_constant (rtx op, enum machine_mode mode)
4469 {
4470   unsigned step, copies;
4471
4472   if (mode == VOIDmode)
4473     mode = GET_MODE (op);
4474   else if (mode != GET_MODE (op))
4475     return false;
4476
4477   /* Start with a vspltisw.  */
4478   step = GET_MODE_NUNITS (mode) / 4;
4479   copies = 1;
4480
4481   if (vspltis_constant (op, step, copies))
4482     return true;
4483
4484   /* Then try with a vspltish.  */
4485   if (step == 1)
4486     copies <<= 1;
4487   else
4488     step >>= 1;
4489
4490   if (vspltis_constant (op, step, copies))
4491     return true;
4492
4493   /* And finally a vspltisb.  */
4494   if (step == 1)
4495     copies <<= 1;
4496   else
4497     step >>= 1;
4498
4499   if (vspltis_constant (op, step, copies))
4500     return true;
4501
4502   return false;
4503 }
4504
4505 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
4506    result is OP.  Abort if it is not possible.  */
4507
4508 rtx
4509 gen_easy_altivec_constant (rtx op)
4510 {
4511   enum machine_mode mode = GET_MODE (op);
4512   int nunits = GET_MODE_NUNITS (mode);
4513   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
4514   unsigned step = nunits / 4;
4515   unsigned copies = 1;
4516
4517   /* Start with a vspltisw.  */
4518   if (vspltis_constant (op, step, copies))
4519     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
4520
4521   /* Then try with a vspltish.  */
4522   if (step == 1)
4523     copies <<= 1;
4524   else
4525     step >>= 1;
4526
4527   if (vspltis_constant (op, step, copies))
4528     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
4529
4530   /* And finally a vspltisb.  */
4531   if (step == 1)
4532     copies <<= 1;
4533   else
4534     step >>= 1;
4535
4536   if (vspltis_constant (op, step, copies))
4537     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
4538
4539   gcc_unreachable ();
4540 }
4541
4542 const char *
4543 output_vec_const_move (rtx *operands)
4544 {
4545   int cst, cst2;
4546   enum machine_mode mode;
4547   rtx dest, vec;
4548
4549   dest = operands[0];
4550   vec = operands[1];
4551   mode = GET_MODE (dest);
4552
4553   if (TARGET_VSX && zero_constant (vec, mode))
4554     return "xxlxor %x0,%x0,%x0";
4555
4556   if (TARGET_ALTIVEC)
4557     {
4558       rtx splat_vec;
4559       if (zero_constant (vec, mode))
4560         return "vxor %0,%0,%0";
4561
4562       splat_vec = gen_easy_altivec_constant (vec);
4563       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
4564       operands[1] = XEXP (splat_vec, 0);
4565       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
4566         return "#";
4567
4568       switch (GET_MODE (splat_vec))
4569         {
4570         case V4SImode:
4571           return "vspltisw %0,%1";
4572
4573         case V8HImode:
4574           return "vspltish %0,%1";
4575
4576         case V16QImode:
4577           return "vspltisb %0,%1";
4578
4579         default:
4580           gcc_unreachable ();
4581         }
4582     }
4583
4584   gcc_assert (TARGET_SPE);
4585
4586   /* Vector constant 0 is handled as a splitter of V2SI, and in the
4587      pattern of V1DI, V4HI, and V2SF.
4588
4589      FIXME: We should probably return # and add post reload
4590      splitters for these, but this way is so easy ;-).  */
4591   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
4592   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
4593   operands[1] = CONST_VECTOR_ELT (vec, 0);
4594   operands[2] = CONST_VECTOR_ELT (vec, 1);
4595   if (cst == cst2)
4596     return "li %0,%1\n\tevmergelo %0,%0,%0";
4597   else
4598     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
4599 }
4600
4601 /* Initialize TARGET of vector PAIRED to VALS.  */
4602
4603 void
4604 paired_expand_vector_init (rtx target, rtx vals)
4605 {
4606   enum machine_mode mode = GET_MODE (target);
4607   int n_elts = GET_MODE_NUNITS (mode);
4608   int n_var = 0;
4609   rtx x, new_rtx, tmp, constant_op, op1, op2;
4610   int i;
4611
4612   for (i = 0; i < n_elts; ++i)
4613     {
4614       x = XVECEXP (vals, 0, i);
4615       if (!CONSTANT_P (x))
4616         ++n_var;
4617     }
4618   if (n_var == 0)
4619     {
4620       /* Load from constant pool.  */
4621       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
4622       return;
4623     }
4624
4625   if (n_var == 2)
4626     {
4627       /* The vector is initialized only with non-constants.  */
4628       new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
4629                                 XVECEXP (vals, 0, 1));
4630
4631       emit_move_insn (target, new_rtx);
4632       return;
4633     }
4634   
4635   /* One field is non-constant and the other one is a constant.  Load the
4636      constant from the constant pool and use ps_merge instruction to
4637      construct the whole vector.  */
4638   op1 = XVECEXP (vals, 0, 0);
4639   op2 = XVECEXP (vals, 0, 1);
4640
4641   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
4642
4643   tmp = gen_reg_rtx (GET_MODE (constant_op));
4644   emit_move_insn (tmp, constant_op);
4645
4646   if (CONSTANT_P (op1))
4647     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
4648   else
4649     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
4650
4651   emit_move_insn (target, new_rtx);
4652 }
4653
4654 void
4655 paired_expand_vector_move (rtx operands[])
4656 {
4657   rtx op0 = operands[0], op1 = operands[1];
4658
4659   emit_move_insn (op0, op1);
4660 }
4661
4662 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
4663    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
4664    operands for the relation operation COND.  This is a recursive
4665    function.  */
4666
4667 static void
4668 paired_emit_vector_compare (enum rtx_code rcode,
4669                             rtx dest, rtx op0, rtx op1,
4670                             rtx cc_op0, rtx cc_op1)
4671 {
4672   rtx tmp = gen_reg_rtx (V2SFmode);
4673   rtx tmp1, max, min;
4674
4675   gcc_assert (TARGET_PAIRED_FLOAT);
4676   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
4677
4678   switch (rcode)
4679     {
4680     case LT:
4681     case LTU:
4682       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4683       return;
4684     case GE:
4685     case GEU:
4686       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4687       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
4688       return;
4689     case LE:
4690     case LEU:
4691       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
4692       return;
4693     case GT:
4694       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4695       return;
4696     case EQ:
4697       tmp1 = gen_reg_rtx (V2SFmode);
4698       max = gen_reg_rtx (V2SFmode);
4699       min = gen_reg_rtx (V2SFmode);
4700       gen_reg_rtx (V2SFmode);
4701       
4702       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4703       emit_insn (gen_selv2sf4
4704                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4705       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
4706       emit_insn (gen_selv2sf4
4707                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4708       emit_insn (gen_subv2sf3 (tmp1, min, max));
4709       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
4710       return;
4711     case NE:
4712       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
4713       return;
4714     case UNLE:
4715       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4716       return;
4717     case UNLT:
4718       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
4719       return;
4720     case UNGE:
4721       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4722       return;
4723     case UNGT:
4724       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
4725       return;
4726     default:
4727       gcc_unreachable ();
4728     }
4729
4730   return;
4731 }
4732
4733 /* Emit vector conditional expression.
4734    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
4735    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
4736
4737 int
4738 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
4739                               rtx cond, rtx cc_op0, rtx cc_op1)
4740 {
4741   enum rtx_code rcode = GET_CODE (cond);
4742
4743   if (!TARGET_PAIRED_FLOAT)
4744     return 0;
4745
4746   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
4747
4748   return 1;
4749 }
4750
4751 /* Initialize vector TARGET to VALS.  */
4752
4753 void
4754 rs6000_expand_vector_init (rtx target, rtx vals)
4755 {
4756   enum machine_mode mode = GET_MODE (target);
4757   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4758   int n_elts = GET_MODE_NUNITS (mode);
4759   int n_var = 0, one_var = -1;
4760   bool all_same = true, all_const_zero = true;
4761   rtx x, mem;
4762   int i;
4763
4764   for (i = 0; i < n_elts; ++i)
4765     {
4766       x = XVECEXP (vals, 0, i);
4767       if (!CONSTANT_P (x))
4768         ++n_var, one_var = i;
4769       else if (x != CONST0_RTX (inner_mode))
4770         all_const_zero = false;
4771
4772       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
4773         all_same = false;
4774     }
4775
4776   if (n_var == 0)
4777     {
4778       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
4779       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
4780       if ((int_vector_p || TARGET_VSX) && all_const_zero)
4781         {
4782           /* Zero register.  */
4783           emit_insn (gen_rtx_SET (VOIDmode, target,
4784                                   gen_rtx_XOR (mode, target, target)));
4785           return;
4786         }
4787       else if (int_vector_p && easy_vector_constant (const_vec, mode))
4788         {
4789           /* Splat immediate.  */
4790           emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
4791           return;
4792         }
4793       else
4794         {
4795           /* Load from constant pool.  */
4796           emit_move_insn (target, const_vec);
4797           return;
4798         }
4799     }
4800
4801   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
4802   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4803     {
4804       if (all_same)
4805         {
4806           rtx element = XVECEXP (vals, 0, 0);
4807           if (mode == V2DFmode)
4808             emit_insn (gen_vsx_splat_v2df (target, element));
4809           else
4810             emit_insn (gen_vsx_splat_v2di (target, element));
4811         }
4812       else
4813         {
4814           rtx op0 = copy_to_reg (XVECEXP (vals, 0, 0));
4815           rtx op1 = copy_to_reg (XVECEXP (vals, 0, 1));
4816           if (mode == V2DFmode)
4817             emit_insn (gen_vsx_concat_v2df (target, op0, op1));
4818           else
4819             emit_insn (gen_vsx_concat_v2di (target, op0, op1));
4820         }
4821       return;
4822     }
4823
4824   /* With single precision floating point on VSX, know that internally single
4825      precision is actually represented as a double, and either make 2 V2DF
4826      vectors, and convert these vectors to single precision, or do one
4827      conversion, and splat the result to the other elements.  */
4828   if (mode == V4SFmode && VECTOR_MEM_VSX_P (mode))
4829     {
4830       if (all_same)
4831         {
4832           rtx freg = gen_reg_rtx (V4SFmode);
4833           rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
4834
4835           emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
4836           emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
4837         }
4838       else
4839         {
4840           rtx dbl_even = gen_reg_rtx (V2DFmode);
4841           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
4842           rtx flt_even = gen_reg_rtx (V4SFmode);
4843           rtx flt_odd  = gen_reg_rtx (V4SFmode);
4844
4845           emit_insn (gen_vsx_concat_v2sf (dbl_even,
4846                                           copy_to_reg (XVECEXP (vals, 0, 0)),
4847                                           copy_to_reg (XVECEXP (vals, 0, 1))));
4848           emit_insn (gen_vsx_concat_v2sf (dbl_odd,
4849                                           copy_to_reg (XVECEXP (vals, 0, 2)),
4850                                           copy_to_reg (XVECEXP (vals, 0, 3))));
4851           emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
4852           emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
4853           emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
4854         }
4855       return;
4856     }
4857
4858   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
4859      of 64-bit items is not supported on Altivec.  */
4860   if (all_same && GET_MODE_SIZE (mode) <= 4)
4861     {
4862       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
4863       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
4864                       XVECEXP (vals, 0, 0));
4865       x = gen_rtx_UNSPEC (VOIDmode,
4866                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
4867       emit_insn (gen_rtx_PARALLEL (VOIDmode,
4868                                    gen_rtvec (2,
4869                                               gen_rtx_SET (VOIDmode,
4870                                                            target, mem),
4871                                               x)));
4872       x = gen_rtx_VEC_SELECT (inner_mode, target,
4873                               gen_rtx_PARALLEL (VOIDmode,
4874                                                 gen_rtvec (1, const0_rtx)));
4875       emit_insn (gen_rtx_SET (VOIDmode, target,
4876                               gen_rtx_VEC_DUPLICATE (mode, x)));
4877       return;
4878     }
4879
4880   /* One field is non-constant.  Load constant then overwrite
4881      varying field.  */
4882   if (n_var == 1)
4883     {
4884       rtx copy = copy_rtx (vals);
4885
4886       /* Load constant part of vector, substitute neighboring value for
4887          varying element.  */
4888       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
4889       rs6000_expand_vector_init (target, copy);
4890
4891       /* Insert variable.  */
4892       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
4893       return;
4894     }
4895
4896   /* Construct the vector in memory one field at a time
4897      and load the whole vector.  */
4898   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
4899   for (i = 0; i < n_elts; i++)
4900     emit_move_insn (adjust_address_nv (mem, inner_mode,
4901                                     i * GET_MODE_SIZE (inner_mode)),
4902                     XVECEXP (vals, 0, i));
4903   emit_move_insn (target, mem);
4904 }
4905
4906 /* Set field ELT of TARGET to VAL.  */
4907
4908 void
4909 rs6000_expand_vector_set (rtx target, rtx val, int elt)
4910 {
4911   enum machine_mode mode = GET_MODE (target);
4912   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4913   rtx reg = gen_reg_rtx (mode);
4914   rtx mask, mem, x;
4915   int width = GET_MODE_SIZE (inner_mode);
4916   int i;
4917
4918   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4919     {
4920       rtx (*set_func) (rtx, rtx, rtx, rtx)
4921         = ((mode == V2DFmode) ? gen_vsx_set_v2df : gen_vsx_set_v2di);
4922       emit_insn (set_func (target, target, val, GEN_INT (elt)));
4923       return;
4924     }
4925
4926   /* Load single variable value.  */
4927   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
4928   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
4929   x = gen_rtx_UNSPEC (VOIDmode,
4930                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
4931   emit_insn (gen_rtx_PARALLEL (VOIDmode,
4932                                gen_rtvec (2,
4933                                           gen_rtx_SET (VOIDmode,
4934                                                        reg, mem),
4935                                           x)));
4936
4937   /* Linear sequence.  */
4938   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
4939   for (i = 0; i < 16; ++i)
4940     XVECEXP (mask, 0, i) = GEN_INT (i);
4941
4942   /* Set permute mask to insert element into target.  */
4943   for (i = 0; i < width; ++i)
4944     XVECEXP (mask, 0, elt*width + i)
4945       = GEN_INT (i + 0x10);
4946   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
4947   x = gen_rtx_UNSPEC (mode,
4948                       gen_rtvec (3, target, reg,
4949                                  force_reg (V16QImode, x)),
4950                       UNSPEC_VPERM);
4951   emit_insn (gen_rtx_SET (VOIDmode, target, x));
4952 }
4953
4954 /* Extract field ELT from VEC into TARGET.  */
4955
4956 void
4957 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
4958 {
4959   enum machine_mode mode = GET_MODE (vec);
4960   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4961   rtx mem, x;
4962
4963   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4964     {
4965       rtx (*extract_func) (rtx, rtx, rtx)
4966         = ((mode == V2DFmode) ? gen_vsx_extract_v2df : gen_vsx_extract_v2di);
4967       emit_insn (extract_func (target, vec, GEN_INT (elt)));
4968       return;
4969     }
4970
4971   /* Allocate mode-sized buffer.  */
4972   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
4973
4974   /* Add offset to field within buffer matching vector element.  */
4975   mem = adjust_address_nv (mem, mode, elt * GET_MODE_SIZE (inner_mode));
4976
4977   /* Store single field into mode-sized buffer.  */
4978   x = gen_rtx_UNSPEC (VOIDmode,
4979                       gen_rtvec (1, const0_rtx), UNSPEC_STVE);
4980   emit_insn (gen_rtx_PARALLEL (VOIDmode,
4981                                gen_rtvec (2,
4982                                           gen_rtx_SET (VOIDmode,
4983                                                        mem, vec),
4984                                           x)));
4985   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
4986 }
4987
4988 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
4989    implement ANDing by the mask IN.  */
4990 void
4991 build_mask64_2_operands (rtx in, rtx *out)
4992 {
4993 #if HOST_BITS_PER_WIDE_INT >= 64
4994   unsigned HOST_WIDE_INT c, lsb, m1, m2;
4995   int shift;
4996
4997   gcc_assert (GET_CODE (in) == CONST_INT);
4998
4999   c = INTVAL (in);
5000   if (c & 1)
5001     {
5002       /* Assume c initially something like 0x00fff000000fffff.  The idea
5003          is to rotate the word so that the middle ^^^^^^ group of zeros
5004          is at the MS end and can be cleared with an rldicl mask.  We then
5005          rotate back and clear off the MS    ^^ group of zeros with a
5006          second rldicl.  */
5007       c = ~c;                   /*   c == 0xff000ffffff00000 */
5008       lsb = c & -c;             /* lsb == 0x0000000000100000 */
5009       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
5010       c = ~c;                   /*   c == 0x00fff000000fffff */
5011       c &= -lsb;                /*   c == 0x00fff00000000000 */
5012       lsb = c & -c;             /* lsb == 0x0000100000000000 */
5013       c = ~c;                   /*   c == 0xff000fffffffffff */
5014       c &= -lsb;                /*   c == 0xff00000000000000 */
5015       shift = 0;
5016       while ((lsb >>= 1) != 0)
5017         shift++;                /* shift == 44 on exit from loop */
5018       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
5019       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
5020       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
5021     }
5022   else
5023     {
5024       /* Assume c initially something like 0xff000f0000000000.  The idea
5025          is to rotate the word so that the     ^^^  middle group of zeros
5026          is at the LS end and can be cleared with an rldicr mask.  We then
5027          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
5028          a second rldicr.  */
5029       lsb = c & -c;             /* lsb == 0x0000010000000000 */
5030       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
5031       c = ~c;                   /*   c == 0x00fff0ffffffffff */
5032       c &= -lsb;                /*   c == 0x00fff00000000000 */
5033       lsb = c & -c;             /* lsb == 0x0000100000000000 */
5034       c = ~c;                   /*   c == 0xff000fffffffffff */
5035       c &= -lsb;                /*   c == 0xff00000000000000 */
5036       shift = 0;
5037       while ((lsb >>= 1) != 0)
5038         shift++;                /* shift == 44 on exit from loop */
5039       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
5040       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
5041       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
5042     }
5043
5044   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
5045      masks will be all 1's.  We are guaranteed more than one transition.  */
5046   out[0] = GEN_INT (64 - shift);
5047   out[1] = GEN_INT (m1);
5048   out[2] = GEN_INT (shift);
5049   out[3] = GEN_INT (m2);
5050 #else
5051   (void)in;
5052   (void)out;
5053   gcc_unreachable ();
5054 #endif
5055 }
5056
5057 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
5058
5059 bool
5060 invalid_e500_subreg (rtx op, enum machine_mode mode)
5061 {
5062   if (TARGET_E500_DOUBLE)
5063     {
5064       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
5065          subreg:TI and reg:TF.  Decimal float modes are like integer
5066          modes (only low part of each register used) for this
5067          purpose.  */
5068       if (GET_CODE (op) == SUBREG
5069           && (mode == SImode || mode == DImode || mode == TImode
5070               || mode == DDmode || mode == TDmode)
5071           && REG_P (SUBREG_REG (op))
5072           && (GET_MODE (SUBREG_REG (op)) == DFmode
5073               || GET_MODE (SUBREG_REG (op)) == TFmode))
5074         return true;
5075
5076       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
5077          reg:TI.  */
5078       if (GET_CODE (op) == SUBREG
5079           && (mode == DFmode || mode == TFmode)
5080           && REG_P (SUBREG_REG (op))
5081           && (GET_MODE (SUBREG_REG (op)) == DImode
5082               || GET_MODE (SUBREG_REG (op)) == TImode
5083               || GET_MODE (SUBREG_REG (op)) == DDmode
5084               || GET_MODE (SUBREG_REG (op)) == TDmode))
5085         return true;
5086     }
5087
5088   if (TARGET_SPE
5089       && GET_CODE (op) == SUBREG
5090       && mode == SImode
5091       && REG_P (SUBREG_REG (op))
5092       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
5093     return true;
5094
5095   return false;
5096 }
5097
5098 /* AIX increases natural record alignment to doubleword if the first
5099    field is an FP double while the FP fields remain word aligned.  */
5100
5101 unsigned int
5102 rs6000_special_round_type_align (tree type, unsigned int computed,
5103                                  unsigned int specified)
5104 {
5105   unsigned int align = MAX (computed, specified);
5106   tree field = TYPE_FIELDS (type);
5107
5108   /* Skip all non field decls */
5109   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5110     field = DECL_CHAIN (field);
5111
5112   if (field != NULL && field != type)
5113     {
5114       type = TREE_TYPE (field);
5115       while (TREE_CODE (type) == ARRAY_TYPE)
5116         type = TREE_TYPE (type);
5117
5118       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
5119         align = MAX (align, 64);
5120     }
5121
5122   return align;
5123 }
5124
5125 /* Darwin increases record alignment to the natural alignment of
5126    the first field.  */
5127
5128 unsigned int
5129 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
5130                                         unsigned int specified)
5131 {
5132   unsigned int align = MAX (computed, specified);
5133
5134   if (TYPE_PACKED (type))
5135     return align;
5136
5137   /* Find the first field, looking down into aggregates.  */
5138   do {
5139     tree field = TYPE_FIELDS (type);
5140     /* Skip all non field decls */
5141     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5142       field = DECL_CHAIN (field);
5143     if (! field)
5144       break;
5145     /* A packed field does not contribute any extra alignment.  */
5146     if (DECL_PACKED (field))
5147       return align;
5148     type = TREE_TYPE (field);
5149     while (TREE_CODE (type) == ARRAY_TYPE)
5150       type = TREE_TYPE (type);
5151   } while (AGGREGATE_TYPE_P (type));
5152
5153   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
5154     align = MAX (align, TYPE_ALIGN (type));
5155
5156   return align;
5157 }
5158
5159 /* Return 1 for an operand in small memory on V.4/eabi.  */
5160
5161 int
5162 small_data_operand (rtx op ATTRIBUTE_UNUSED,
5163                     enum machine_mode mode ATTRIBUTE_UNUSED)
5164 {
5165 #if TARGET_ELF
5166   rtx sym_ref;
5167
5168   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
5169     return 0;
5170
5171   if (DEFAULT_ABI != ABI_V4)
5172     return 0;
5173
5174   /* Vector and float memory instructions have a limited offset on the
5175      SPE, so using a vector or float variable directly as an operand is
5176      not useful.  */
5177   if (TARGET_SPE
5178       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
5179     return 0;
5180
5181   if (GET_CODE (op) == SYMBOL_REF)
5182     sym_ref = op;
5183
5184   else if (GET_CODE (op) != CONST
5185            || GET_CODE (XEXP (op, 0)) != PLUS
5186            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
5187            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
5188     return 0;
5189
5190   else
5191     {
5192       rtx sum = XEXP (op, 0);
5193       HOST_WIDE_INT summand;
5194
5195       /* We have to be careful here, because it is the referenced address
5196          that must be 32k from _SDA_BASE_, not just the symbol.  */
5197       summand = INTVAL (XEXP (sum, 1));
5198       if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
5199         return 0;
5200
5201       sym_ref = XEXP (sum, 0);
5202     }
5203
5204   return SYMBOL_REF_SMALL_P (sym_ref);
5205 #else
5206   return 0;
5207 #endif
5208 }
5209
5210 /* Return true if either operand is a general purpose register.  */
5211
5212 bool
5213 gpr_or_gpr_p (rtx op0, rtx op1)
5214 {
5215   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
5216           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
5217 }
5218
5219 \f
5220 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
5221
5222 static bool
5223 reg_offset_addressing_ok_p (enum machine_mode mode)
5224 {
5225   switch (mode)
5226     {
5227     case V16QImode:
5228     case V8HImode:
5229     case V4SFmode:
5230     case V4SImode:
5231     case V2DFmode:
5232     case V2DImode:
5233       /* AltiVec/VSX vector modes.  Only reg+reg addressing is valid.  */
5234       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
5235         return false;
5236       break;
5237
5238     case V4HImode:
5239     case V2SImode:
5240     case V1DImode:
5241     case V2SFmode:
5242        /* Paired vector modes.  Only reg+reg addressing is valid.  */
5243       if (TARGET_PAIRED_FLOAT)
5244         return false;
5245       break;
5246
5247     default:
5248       break;
5249     }
5250
5251   return true;
5252 }
5253
5254 static bool
5255 virtual_stack_registers_memory_p (rtx op)
5256 {
5257   int regnum;
5258
5259   if (GET_CODE (op) == REG)
5260     regnum = REGNO (op);
5261
5262   else if (GET_CODE (op) == PLUS
5263            && GET_CODE (XEXP (op, 0)) == REG
5264            && GET_CODE (XEXP (op, 1)) == CONST_INT)
5265     regnum = REGNO (XEXP (op, 0));
5266
5267   else
5268     return false;
5269
5270   return (regnum >= FIRST_VIRTUAL_REGISTER
5271           && regnum <= LAST_VIRTUAL_REGISTER);
5272 }
5273
5274 static bool
5275 constant_pool_expr_p (rtx op)
5276 {
5277   rtx base, offset;
5278
5279   split_const (op, &base, &offset);
5280   return (GET_CODE (base) == SYMBOL_REF
5281           && CONSTANT_POOL_ADDRESS_P (base)
5282           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
5283 }
5284
5285 static rtx tocrel_base, tocrel_offset;
5286
5287 bool
5288 toc_relative_expr_p (rtx op)
5289 {
5290   if (GET_CODE (op) != CONST)
5291     return false;
5292
5293   split_const (op, &tocrel_base, &tocrel_offset);
5294   return (GET_CODE (tocrel_base) == UNSPEC
5295           && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
5296 }
5297
5298 bool
5299 legitimate_constant_pool_address_p (const_rtx x, bool strict)
5300 {
5301   return (TARGET_TOC
5302           && (GET_CODE (x) == PLUS || GET_CODE (x) == LO_SUM)
5303           && GET_CODE (XEXP (x, 0)) == REG
5304           && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5305               || ((TARGET_MINIMAL_TOC
5306                    || TARGET_CMODEL != CMODEL_SMALL)
5307                   && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict)))
5308           && toc_relative_expr_p (XEXP (x, 1)));
5309 }
5310
5311 static bool
5312 legitimate_small_data_p (enum machine_mode mode, rtx x)
5313 {
5314   return (DEFAULT_ABI == ABI_V4
5315           && !flag_pic && !TARGET_TOC
5316           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
5317           && small_data_operand (x, mode));
5318 }
5319
5320 /* SPE offset addressing is limited to 5-bits worth of double words.  */
5321 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
5322
5323 bool
5324 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
5325 {
5326   unsigned HOST_WIDE_INT offset, extra;
5327
5328   if (GET_CODE (x) != PLUS)
5329     return false;
5330   if (GET_CODE (XEXP (x, 0)) != REG)
5331     return false;
5332   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5333     return false;
5334   if (!reg_offset_addressing_ok_p (mode))
5335     return virtual_stack_registers_memory_p (x);
5336   if (legitimate_constant_pool_address_p (x, strict))
5337     return true;
5338   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5339     return false;
5340
5341   offset = INTVAL (XEXP (x, 1));
5342   extra = 0;
5343   switch (mode)
5344     {
5345     case V4HImode:
5346     case V2SImode:
5347     case V1DImode:
5348     case V2SFmode:
5349       /* SPE vector modes.  */
5350       return SPE_CONST_OFFSET_OK (offset);
5351
5352     case DFmode:
5353       if (TARGET_E500_DOUBLE)
5354         return SPE_CONST_OFFSET_OK (offset);
5355
5356       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
5357          addressing.  */
5358       if (VECTOR_MEM_VSX_P (DFmode))
5359         return false;
5360
5361     case DDmode:
5362     case DImode:
5363       /* On e500v2, we may have:
5364
5365            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
5366
5367          Which gets addressed with evldd instructions.  */
5368       if (TARGET_E500_DOUBLE)
5369         return SPE_CONST_OFFSET_OK (offset);
5370
5371       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
5372         extra = 4;
5373       else if (offset & 3)
5374         return false;
5375       break;
5376
5377     case TFmode:
5378       if (TARGET_E500_DOUBLE)
5379         return (SPE_CONST_OFFSET_OK (offset)
5380                 && SPE_CONST_OFFSET_OK (offset + 8));
5381
5382     case TDmode:
5383     case TImode:
5384       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
5385         extra = 12;
5386       else if (offset & 3)
5387         return false;
5388       else
5389         extra = 8;
5390       break;
5391
5392     default:
5393       break;
5394     }
5395
5396   offset += 0x8000;
5397   return (offset < 0x10000) && (offset + extra < 0x10000);
5398 }
5399
5400 bool
5401 legitimate_indexed_address_p (rtx x, int strict)
5402 {
5403   rtx op0, op1;
5404
5405   if (GET_CODE (x) != PLUS)
5406     return false;
5407
5408   op0 = XEXP (x, 0);
5409   op1 = XEXP (x, 1);
5410
5411   /* Recognize the rtl generated by reload which we know will later be
5412      replaced with proper base and index regs.  */
5413   if (!strict
5414       && reload_in_progress
5415       && (REG_P (op0) || GET_CODE (op0) == PLUS)
5416       && REG_P (op1))
5417     return true;
5418
5419   return (REG_P (op0) && REG_P (op1)
5420           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
5421                && INT_REG_OK_FOR_INDEX_P (op1, strict))
5422               || (INT_REG_OK_FOR_BASE_P (op1, strict)
5423                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
5424 }
5425
5426 bool
5427 avoiding_indexed_address_p (enum machine_mode mode)
5428 {
5429   /* Avoid indexed addressing for modes that have non-indexed
5430      load/store instruction forms.  */
5431   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
5432 }
5433
5434 inline bool
5435 legitimate_indirect_address_p (rtx x, int strict)
5436 {
5437   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
5438 }
5439
5440 bool
5441 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
5442 {
5443   if (!TARGET_MACHO || !flag_pic
5444       || mode != SImode || GET_CODE (x) != MEM)
5445     return false;
5446   x = XEXP (x, 0);
5447
5448   if (GET_CODE (x) != LO_SUM)
5449     return false;
5450   if (GET_CODE (XEXP (x, 0)) != REG)
5451     return false;
5452   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
5453     return false;
5454   x = XEXP (x, 1);
5455
5456   return CONSTANT_P (x);
5457 }
5458
5459 static bool
5460 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
5461 {
5462   if (GET_CODE (x) != LO_SUM)
5463     return false;
5464   if (GET_CODE (XEXP (x, 0)) != REG)
5465     return false;
5466   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5467     return false;
5468   /* Restrict addressing for DI because of our SUBREG hackery.  */
5469   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5470                              || mode == DDmode || mode == TDmode
5471                              || mode == DImode))
5472     return false;
5473   x = XEXP (x, 1);
5474
5475   if (TARGET_ELF || TARGET_MACHO)
5476     {
5477       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
5478         return false;
5479       if (TARGET_TOC)
5480         return false;
5481       if (GET_MODE_NUNITS (mode) != 1)
5482         return false;
5483       if (GET_MODE_BITSIZE (mode) > 64
5484           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
5485               && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
5486                    && (mode == DFmode || mode == DDmode))))
5487         return false;
5488
5489       return CONSTANT_P (x);
5490     }
5491
5492   return false;
5493 }
5494
5495
5496 /* Try machine-dependent ways of modifying an illegitimate address
5497    to be legitimate.  If we find one, return the new, valid address.
5498    This is used from only one place: `memory_address' in explow.c.
5499
5500    OLDX is the address as it was before break_out_memory_refs was
5501    called.  In some cases it is useful to look at this to decide what
5502    needs to be done.
5503
5504    It is always safe for this function to do nothing.  It exists to
5505    recognize opportunities to optimize the output.
5506
5507    On RS/6000, first check for the sum of a register with a constant
5508    integer that is out of range.  If so, generate code to add the
5509    constant with the low-order 16 bits masked to the register and force
5510    this result into another register (this can be done with `cau').
5511    Then generate an address of REG+(CONST&0xffff), allowing for the
5512    possibility of bit 16 being a one.
5513
5514    Then check for the sum of a register and something not constant, try to
5515    load the other things into a register and return the sum.  */
5516
5517 static rtx
5518 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
5519                            enum machine_mode mode)
5520 {
5521   unsigned int extra = 0;
5522
5523   if (!reg_offset_addressing_ok_p (mode))
5524     {
5525       if (virtual_stack_registers_memory_p (x))
5526         return x;
5527
5528       /* In theory we should not be seeing addresses of the form reg+0,
5529          but just in case it is generated, optimize it away.  */
5530       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
5531         return force_reg (Pmode, XEXP (x, 0));
5532
5533       /* Make sure both operands are registers.  */
5534       else if (GET_CODE (x) == PLUS)
5535         return gen_rtx_PLUS (Pmode,
5536                              force_reg (Pmode, XEXP (x, 0)),
5537                              force_reg (Pmode, XEXP (x, 1)));
5538       else
5539         return force_reg (Pmode, x);
5540     }
5541   if (GET_CODE (x) == SYMBOL_REF)
5542     {
5543       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
5544       if (model != 0)
5545         return rs6000_legitimize_tls_address (x, model);
5546     }
5547
5548   switch (mode)
5549     {
5550     case DFmode:
5551     case DDmode:
5552       extra = 4;
5553       break;
5554     case DImode:
5555       if (!TARGET_POWERPC64)
5556         extra = 4;
5557       break;
5558     case TFmode:
5559     case TDmode:
5560       extra = 12;
5561       break;
5562     case TImode:
5563       extra = TARGET_POWERPC64 ? 8 : 12;
5564       break;
5565     default:
5566       break;
5567     }
5568
5569   if (GET_CODE (x) == PLUS
5570       && GET_CODE (XEXP (x, 0)) == REG
5571       && GET_CODE (XEXP (x, 1)) == CONST_INT
5572       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
5573           >= 0x10000 - extra)
5574       && !((TARGET_POWERPC64
5575             && (mode == DImode || mode == TImode)
5576             && (INTVAL (XEXP (x, 1)) & 3) != 0)
5577            || SPE_VECTOR_MODE (mode)
5578            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5579                                       || mode == DImode || mode == DDmode
5580                                       || mode == TDmode))))
5581     {
5582       HOST_WIDE_INT high_int, low_int;
5583       rtx sum;
5584       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
5585       if (low_int >= 0x8000 - extra)
5586         low_int = 0;
5587       high_int = INTVAL (XEXP (x, 1)) - low_int;
5588       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
5589                                          GEN_INT (high_int)), 0);
5590       return plus_constant (sum, low_int);
5591     }
5592   else if (GET_CODE (x) == PLUS
5593            && GET_CODE (XEXP (x, 0)) == REG
5594            && GET_CODE (XEXP (x, 1)) != CONST_INT
5595            && GET_MODE_NUNITS (mode) == 1
5596            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5597                || TARGET_POWERPC64
5598                || ((mode != DImode && mode != DFmode && mode != DDmode)
5599                    || (TARGET_E500_DOUBLE && mode != DDmode)))
5600            && (TARGET_POWERPC64 || mode != DImode)
5601            && !avoiding_indexed_address_p (mode)
5602            && mode != TImode
5603            && mode != TFmode
5604            && mode != TDmode)
5605     {
5606       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
5607                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
5608     }
5609   else if (SPE_VECTOR_MODE (mode)
5610            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5611                                       || mode == DDmode || mode == TDmode
5612                                       || mode == DImode)))
5613     {
5614       if (mode == DImode)
5615         return x;
5616       /* We accept [reg + reg] and [reg + OFFSET].  */
5617
5618       if (GET_CODE (x) == PLUS)
5619        {
5620          rtx op1 = XEXP (x, 0);
5621          rtx op2 = XEXP (x, 1);
5622          rtx y;
5623
5624          op1 = force_reg (Pmode, op1);
5625
5626          if (GET_CODE (op2) != REG
5627              && (GET_CODE (op2) != CONST_INT
5628                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
5629                  || (GET_MODE_SIZE (mode) > 8
5630                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
5631            op2 = force_reg (Pmode, op2);
5632
5633          /* We can't always do [reg + reg] for these, because [reg +
5634             reg + offset] is not a legitimate addressing mode.  */
5635          y = gen_rtx_PLUS (Pmode, op1, op2);
5636
5637          if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
5638            return force_reg (Pmode, y);
5639          else
5640            return y;
5641        }
5642
5643       return force_reg (Pmode, x);
5644     }
5645   else if (TARGET_ELF
5646            && TARGET_32BIT
5647            && TARGET_NO_TOC
5648            && ! flag_pic
5649            && GET_CODE (x) != CONST_INT
5650            && GET_CODE (x) != CONST_DOUBLE
5651            && CONSTANT_P (x)
5652            && GET_MODE_NUNITS (mode) == 1
5653            && (GET_MODE_BITSIZE (mode) <= 32
5654                || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5655                    && (mode == DFmode || mode == DDmode))))
5656     {
5657       rtx reg = gen_reg_rtx (Pmode);
5658       emit_insn (gen_elf_high (reg, x));
5659       return gen_rtx_LO_SUM (Pmode, reg, x);
5660     }
5661   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
5662            && ! flag_pic
5663 #if TARGET_MACHO
5664            && ! MACHO_DYNAMIC_NO_PIC_P
5665 #endif
5666            && GET_CODE (x) != CONST_INT
5667            && GET_CODE (x) != CONST_DOUBLE
5668            && CONSTANT_P (x)
5669            && GET_MODE_NUNITS (mode) == 1
5670            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5671                || (mode != DFmode && mode != DDmode))
5672            && mode != DImode
5673            && mode != TImode)
5674     {
5675       rtx reg = gen_reg_rtx (Pmode);
5676       emit_insn (gen_macho_high (reg, x));
5677       return gen_rtx_LO_SUM (Pmode, reg, x);
5678     }
5679   else if (TARGET_TOC
5680            && GET_CODE (x) == SYMBOL_REF
5681            && constant_pool_expr_p (x)
5682            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
5683     {
5684       rtx reg = TARGET_CMODEL != CMODEL_SMALL ? gen_reg_rtx (Pmode) : NULL_RTX;
5685       return create_TOC_reference (x, reg);
5686     }
5687   else
5688     return x;
5689 }
5690
5691 /* Debug version of rs6000_legitimize_address.  */
5692 static rtx
5693 rs6000_debug_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
5694 {
5695   rtx ret;
5696   rtx insns;
5697
5698   start_sequence ();
5699   ret = rs6000_legitimize_address (x, oldx, mode);
5700   insns = get_insns ();
5701   end_sequence ();
5702
5703   if (ret != x)
5704     {
5705       fprintf (stderr,
5706                "\nrs6000_legitimize_address: mode %s, old code %s, "
5707                "new code %s, modified\n",
5708                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
5709                GET_RTX_NAME (GET_CODE (ret)));
5710
5711       fprintf (stderr, "Original address:\n");
5712       debug_rtx (x);
5713
5714       fprintf (stderr, "oldx:\n");
5715       debug_rtx (oldx);
5716
5717       fprintf (stderr, "New address:\n");
5718       debug_rtx (ret);
5719
5720       if (insns)
5721         {
5722           fprintf (stderr, "Insns added:\n");
5723           debug_rtx_list (insns, 20);
5724         }
5725     }
5726   else
5727     {
5728       fprintf (stderr,
5729                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
5730                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
5731
5732       debug_rtx (x);
5733     }
5734
5735   if (insns)
5736     emit_insn (insns);
5737
5738   return ret;
5739 }
5740
5741 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
5742    We need to emit DTP-relative relocations.  */
5743
5744 static void
5745 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
5746 {
5747   switch (size)
5748     {
5749     case 4:
5750       fputs ("\t.long\t", file);
5751       break;
5752     case 8:
5753       fputs (DOUBLE_INT_ASM_OP, file);
5754       break;
5755     default:
5756       gcc_unreachable ();
5757     }
5758   output_addr_const (file, x);
5759   fputs ("@dtprel+0x8000", file);
5760 }
5761
5762 /* In the name of slightly smaller debug output, and to cater to
5763    general assembler lossage, recognize various UNSPEC sequences
5764    and turn them back into a direct symbol reference.  */
5765
5766 static rtx
5767 rs6000_delegitimize_address (rtx orig_x)
5768 {
5769   rtx x, y;
5770
5771   orig_x = delegitimize_mem_from_attrs (orig_x);
5772   x = orig_x;
5773   if (MEM_P (x))
5774     x = XEXP (x, 0);
5775
5776   if ((GET_CODE (x) == PLUS
5777        || GET_CODE (x) == LO_SUM)
5778       && GET_CODE (XEXP (x, 0)) == REG
5779       && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5780           || TARGET_MINIMAL_TOC
5781           || TARGET_CMODEL != CMODEL_SMALL)
5782       && GET_CODE (XEXP (x, 1)) == CONST)
5783     {
5784       y = XEXP (XEXP (x, 1), 0);
5785       if (GET_CODE (y) == UNSPEC
5786           && XINT (y, 1) == UNSPEC_TOCREL)
5787         {
5788           y = XVECEXP (y, 0, 0);
5789           if (!MEM_P (orig_x))
5790             return y;
5791           else
5792             return replace_equiv_address_nv (orig_x, y);
5793         }
5794     }
5795
5796   if (TARGET_MACHO
5797       && GET_CODE (orig_x) == LO_SUM
5798       && GET_CODE (XEXP (x, 1)) == CONST)
5799     {
5800       y = XEXP (XEXP (x, 1), 0);
5801       if (GET_CODE (y) == UNSPEC
5802           && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
5803         return XVECEXP (y, 0, 0);
5804     }
5805
5806   return orig_x;
5807 }
5808
5809 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
5810
5811 static GTY(()) rtx rs6000_tls_symbol;
5812 static rtx
5813 rs6000_tls_get_addr (void)
5814 {
5815   if (!rs6000_tls_symbol)
5816     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
5817
5818   return rs6000_tls_symbol;
5819 }
5820
5821 /* Construct the SYMBOL_REF for TLS GOT references.  */
5822
5823 static GTY(()) rtx rs6000_got_symbol;
5824 static rtx
5825 rs6000_got_sym (void)
5826 {
5827   if (!rs6000_got_symbol)
5828     {
5829       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
5830       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
5831       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
5832     }
5833
5834   return rs6000_got_symbol;
5835 }
5836
5837 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
5838    this (thread-local) address.  */
5839
5840 static rtx
5841 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
5842 {
5843   rtx dest, insn;
5844
5845   dest = gen_reg_rtx (Pmode);
5846   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
5847     {
5848       rtx tlsreg;
5849
5850       if (TARGET_64BIT)
5851         {
5852           tlsreg = gen_rtx_REG (Pmode, 13);
5853           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
5854         }
5855       else
5856         {
5857           tlsreg = gen_rtx_REG (Pmode, 2);
5858           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
5859         }
5860       emit_insn (insn);
5861     }
5862   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
5863     {
5864       rtx tlsreg, tmp;
5865
5866       tmp = gen_reg_rtx (Pmode);
5867       if (TARGET_64BIT)
5868         {
5869           tlsreg = gen_rtx_REG (Pmode, 13);
5870           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
5871         }
5872       else
5873         {
5874           tlsreg = gen_rtx_REG (Pmode, 2);
5875           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
5876         }
5877       emit_insn (insn);
5878       if (TARGET_64BIT)
5879         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
5880       else
5881         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
5882       emit_insn (insn);
5883     }
5884   else
5885     {
5886       rtx r3, got, tga, tmp1, tmp2, call_insn;
5887
5888       /* We currently use relocations like @got@tlsgd for tls, which
5889          means the linker will handle allocation of tls entries, placing
5890          them in the .got section.  So use a pointer to the .got section,
5891          not one to secondary TOC sections used by 64-bit -mminimal-toc,
5892          or to secondary GOT sections used by 32-bit -fPIC.  */
5893       if (TARGET_64BIT)
5894         got = gen_rtx_REG (Pmode, 2);
5895       else
5896         {
5897           if (flag_pic == 1)
5898             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
5899           else
5900             {
5901               rtx gsym = rs6000_got_sym ();
5902               got = gen_reg_rtx (Pmode);
5903               if (flag_pic == 0)
5904                 rs6000_emit_move (got, gsym, Pmode);
5905               else
5906                 {
5907                   rtx mem, lab, last;
5908
5909                   tmp1 = gen_reg_rtx (Pmode);
5910                   tmp2 = gen_reg_rtx (Pmode);
5911                   mem = gen_const_mem (Pmode, tmp1);
5912                   lab = gen_label_rtx ();
5913                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
5914                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
5915                   emit_move_insn (tmp2, mem);
5916                   last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
5917                   set_unique_reg_note (last, REG_EQUAL, gsym);
5918                 }
5919             }
5920         }
5921
5922       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
5923         {
5924           r3 = gen_rtx_REG (Pmode, 3);
5925           tga = rs6000_tls_get_addr ();
5926           emit_library_call_value (tga, dest, LCT_CONST, Pmode, 1, r3, Pmode);
5927
5928           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5929             insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
5930           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
5931             insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
5932           else if (DEFAULT_ABI == ABI_V4)
5933             insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
5934           else
5935             gcc_unreachable ();
5936           call_insn = last_call_insn ();
5937           PATTERN (call_insn) = insn;
5938           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
5939             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
5940                      pic_offset_table_rtx);
5941         }
5942       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
5943         {
5944           r3 = gen_rtx_REG (Pmode, 3);
5945           tga = rs6000_tls_get_addr ();
5946           tmp1 = gen_reg_rtx (Pmode);
5947           emit_library_call_value (tga, tmp1, LCT_CONST, Pmode, 1, r3, Pmode);
5948
5949           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5950             insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
5951           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
5952             insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
5953           else if (DEFAULT_ABI == ABI_V4)
5954             insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
5955           else
5956             gcc_unreachable ();
5957           call_insn = last_call_insn ();
5958           PATTERN (call_insn) = insn;
5959           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
5960             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
5961                      pic_offset_table_rtx);
5962
5963           if (rs6000_tls_size == 16)
5964             {
5965               if (TARGET_64BIT)
5966                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
5967               else
5968                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
5969             }
5970           else if (rs6000_tls_size == 32)
5971             {
5972               tmp2 = gen_reg_rtx (Pmode);
5973               if (TARGET_64BIT)
5974                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
5975               else
5976                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
5977               emit_insn (insn);
5978               if (TARGET_64BIT)
5979                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
5980               else
5981                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
5982             }
5983           else
5984             {
5985               tmp2 = gen_reg_rtx (Pmode);
5986               if (TARGET_64BIT)
5987                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
5988               else
5989                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
5990               emit_insn (insn);
5991               insn = gen_rtx_SET (Pmode, dest,
5992                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
5993             }
5994           emit_insn (insn);
5995         }
5996       else
5997         {
5998           /* IE, or 64-bit offset LE.  */
5999           tmp2 = gen_reg_rtx (Pmode);
6000           if (TARGET_64BIT)
6001             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
6002           else
6003             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
6004           emit_insn (insn);
6005           if (TARGET_64BIT)
6006             insn = gen_tls_tls_64 (dest, tmp2, addr);
6007           else
6008             insn = gen_tls_tls_32 (dest, tmp2, addr);
6009           emit_insn (insn);
6010         }
6011     }
6012
6013   return dest;
6014 }
6015
6016 /* Return 1 if X contains a thread-local symbol.  */
6017
6018 bool
6019 rs6000_tls_referenced_p (rtx x)
6020 {
6021   if (! TARGET_HAVE_TLS)
6022     return false;
6023
6024   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
6025 }
6026
6027 /* Return 1 if *X is a thread-local symbol.  This is the same as
6028    rs6000_tls_symbol_ref except for the type of the unused argument.  */
6029
6030 static int
6031 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
6032 {
6033   return RS6000_SYMBOL_REF_TLS_P (*x);
6034 }
6035
6036 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
6037    replace the input X, or the original X if no replacement is called for.
6038    The output parameter *WIN is 1 if the calling macro should goto WIN,
6039    0 if it should not.
6040
6041    For RS/6000, we wish to handle large displacements off a base
6042    register by splitting the addend across an addiu/addis and the mem insn.
6043    This cuts number of extra insns needed from 3 to 1.
6044
6045    On Darwin, we use this to generate code for floating point constants.
6046    A movsf_low is generated so we wind up with 2 instructions rather than 3.
6047    The Darwin code is inside #if TARGET_MACHO because only then are the
6048    machopic_* functions defined.  */
6049 static rtx
6050 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
6051                                   int opnum, int type,
6052                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
6053 {
6054   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6055
6056   /* We must recognize output that we have already generated ourselves.  */
6057   if (GET_CODE (x) == PLUS
6058       && GET_CODE (XEXP (x, 0)) == PLUS
6059       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6060       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6061       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6062     {
6063       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6064                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6065                    opnum, (enum reload_type)type);
6066       *win = 1;
6067       return x;
6068     }
6069
6070   /* Likewise for (lo_sum (high ...) ...) output we have generated.  */
6071   if (GET_CODE (x) == LO_SUM
6072       && GET_CODE (XEXP (x, 0)) == HIGH)
6073     {
6074       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6075                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6076                    opnum, (enum reload_type)type);
6077       *win = 1;
6078       return x;
6079     }
6080
6081 #if TARGET_MACHO
6082   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
6083       && GET_CODE (x) == LO_SUM
6084       && GET_CODE (XEXP (x, 0)) == PLUS
6085       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
6086       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6087       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
6088       && machopic_operand_p (XEXP (x, 1)))
6089     {
6090       /* Result of previous invocation of this function on Darwin
6091          floating point constant.  */
6092       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6093                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6094                    opnum, (enum reload_type)type);
6095       *win = 1;
6096       return x;
6097     }
6098 #endif
6099
6100   if (TARGET_CMODEL != CMODEL_SMALL
6101       && GET_CODE (x) == LO_SUM
6102       && GET_CODE (XEXP (x, 0)) == PLUS
6103       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6104       && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6105       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6106       && GET_CODE (XEXP (x, 1)) == CONST
6107       && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
6108       && XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_TOCREL
6109       && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 1), 0), XEXP (x, 1)))
6110     {
6111       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6112                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6113                    opnum, (enum reload_type) type);
6114       *win = 1;
6115       return x;
6116     }
6117
6118   /* Force ld/std non-word aligned offset into base register by wrapping
6119      in offset 0.  */
6120   if (GET_CODE (x) == PLUS
6121       && GET_CODE (XEXP (x, 0)) == REG
6122       && REGNO (XEXP (x, 0)) < 32
6123       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6124       && GET_CODE (XEXP (x, 1)) == CONST_INT
6125       && reg_offset_p
6126       && (INTVAL (XEXP (x, 1)) & 3) != 0
6127       && VECTOR_MEM_NONE_P (mode)
6128       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
6129       && TARGET_POWERPC64)
6130     {
6131       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
6132       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6133                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6134                    opnum, (enum reload_type) type);
6135       *win = 1;
6136       return x;
6137     }
6138
6139   if (GET_CODE (x) == PLUS
6140       && GET_CODE (XEXP (x, 0)) == REG
6141       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
6142       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6143       && GET_CODE (XEXP (x, 1)) == CONST_INT
6144       && reg_offset_p
6145       && !SPE_VECTOR_MODE (mode)
6146       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6147                                   || mode == DDmode || mode == TDmode
6148                                   || mode == DImode))
6149       && VECTOR_MEM_NONE_P (mode))
6150     {
6151       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
6152       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
6153       HOST_WIDE_INT high
6154         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
6155
6156       /* Check for 32-bit overflow.  */
6157       if (high + low != val)
6158         {
6159           *win = 0;
6160           return x;
6161         }
6162
6163       /* Reload the high part into a base reg; leave the low part
6164          in the mem directly.  */
6165
6166       x = gen_rtx_PLUS (GET_MODE (x),
6167                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6168                                       GEN_INT (high)),
6169                         GEN_INT (low));
6170
6171       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6172                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6173                    opnum, (enum reload_type)type);
6174       *win = 1;
6175       return x;
6176     }
6177
6178   if (GET_CODE (x) == SYMBOL_REF
6179       && reg_offset_p
6180       && VECTOR_MEM_NONE_P (mode)
6181       && !SPE_VECTOR_MODE (mode)
6182 #if TARGET_MACHO
6183       && DEFAULT_ABI == ABI_DARWIN
6184       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
6185 #else
6186       && DEFAULT_ABI == ABI_V4
6187       && !flag_pic
6188 #endif
6189       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
6190          The same goes for DImode without 64-bit gprs and DFmode and DDmode
6191          without fprs.  */
6192       && mode != TFmode
6193       && mode != TDmode
6194       && (mode != DImode || TARGET_POWERPC64)
6195       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
6196           || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
6197     {
6198 #if TARGET_MACHO
6199       if (flag_pic)
6200         {
6201           rtx offset = machopic_gen_offset (x);
6202           x = gen_rtx_LO_SUM (GET_MODE (x),
6203                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
6204                   gen_rtx_HIGH (Pmode, offset)), offset);
6205         }
6206       else
6207 #endif
6208         x = gen_rtx_LO_SUM (GET_MODE (x),
6209               gen_rtx_HIGH (Pmode, x), x);
6210
6211       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6212                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6213                    opnum, (enum reload_type)type);
6214       *win = 1;
6215       return x;
6216     }
6217
6218   /* Reload an offset address wrapped by an AND that represents the
6219      masking of the lower bits.  Strip the outer AND and let reload
6220      convert the offset address into an indirect address.  For VSX,
6221      force reload to create the address with an AND in a separate
6222      register, because we can't guarantee an altivec register will
6223      be used.  */
6224   if (VECTOR_MEM_ALTIVEC_P (mode)
6225       && GET_CODE (x) == AND
6226       && GET_CODE (XEXP (x, 0)) == PLUS
6227       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6228       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6229       && GET_CODE (XEXP (x, 1)) == CONST_INT
6230       && INTVAL (XEXP (x, 1)) == -16)
6231     {
6232       x = XEXP (x, 0);
6233       *win = 1;
6234       return x;
6235     }
6236
6237   if (TARGET_TOC
6238       && reg_offset_p
6239       && GET_CODE (x) == SYMBOL_REF
6240       && constant_pool_expr_p (x)
6241       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
6242     {
6243       x = create_TOC_reference (x, NULL_RTX);
6244       if (TARGET_CMODEL != CMODEL_SMALL)
6245         push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6246                      BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6247                      opnum, (enum reload_type) type);
6248       *win = 1;
6249       return x;
6250     }
6251   *win = 0;
6252   return x;
6253 }
6254
6255 /* Debug version of rs6000_legitimize_reload_address.  */
6256 static rtx
6257 rs6000_debug_legitimize_reload_address (rtx x, enum machine_mode mode,
6258                                         int opnum, int type,
6259                                         int ind_levels, int *win)
6260 {
6261   rtx ret = rs6000_legitimize_reload_address (x, mode, opnum, type,
6262                                               ind_levels, win);
6263   fprintf (stderr,
6264            "\nrs6000_legitimize_reload_address: mode = %s, opnum = %d, "
6265            "type = %d, ind_levels = %d, win = %d, original addr:\n",
6266            GET_MODE_NAME (mode), opnum, type, ind_levels, *win);
6267   debug_rtx (x);
6268
6269   if (x == ret)
6270     fprintf (stderr, "Same address returned\n");
6271   else if (!ret)
6272     fprintf (stderr, "NULL returned\n");
6273   else
6274     {
6275       fprintf (stderr, "New address:\n");
6276       debug_rtx (ret);
6277     }
6278
6279   return ret;
6280 }
6281
6282 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
6283    that is a valid memory address for an instruction.
6284    The MODE argument is the machine mode for the MEM expression
6285    that wants to use this address.
6286
6287    On the RS/6000, there are four valid address: a SYMBOL_REF that
6288    refers to a constant pool entry of an address (or the sum of it
6289    plus a constant), a short (16-bit signed) constant plus a register,
6290    the sum of two registers, or a register indirect, possibly with an
6291    auto-increment.  For DFmode, DDmode and DImode with a constant plus
6292    register, we must ensure that both words are addressable or PowerPC64
6293    with offset word aligned.
6294
6295    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
6296    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
6297    because adjacent memory cells are accessed by adding word-sized offsets
6298    during assembly output.  */
6299 bool
6300 rs6000_legitimate_address_p (enum machine_mode mode, rtx x, bool reg_ok_strict)
6301 {
6302   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6303
6304   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
6305   if (VECTOR_MEM_ALTIVEC_P (mode)
6306       && GET_CODE (x) == AND
6307       && GET_CODE (XEXP (x, 1)) == CONST_INT
6308       && INTVAL (XEXP (x, 1)) == -16)
6309     x = XEXP (x, 0);
6310
6311   if (RS6000_SYMBOL_REF_TLS_P (x))
6312     return 0;
6313   if (legitimate_indirect_address_p (x, reg_ok_strict))
6314     return 1;
6315   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
6316       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6317       && !SPE_VECTOR_MODE (mode)
6318       && mode != TFmode
6319       && mode != TDmode
6320       /* Restrict addressing for DI because of our SUBREG hackery.  */
6321       && !(TARGET_E500_DOUBLE
6322            && (mode == DFmode || mode == DDmode || mode == DImode))
6323       && TARGET_UPDATE
6324       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
6325     return 1;
6326   if (virtual_stack_registers_memory_p (x))
6327     return 1;
6328   if (reg_offset_p && legitimate_small_data_p (mode, x))
6329     return 1;
6330   if (reg_offset_p && legitimate_constant_pool_address_p (x, reg_ok_strict))
6331     return 1;
6332   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
6333   if (! reg_ok_strict
6334       && reg_offset_p
6335       && GET_CODE (x) == PLUS
6336       && GET_CODE (XEXP (x, 0)) == REG
6337       && (XEXP (x, 0) == virtual_stack_vars_rtx
6338           || XEXP (x, 0) == arg_pointer_rtx)
6339       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6340     return 1;
6341   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
6342     return 1;
6343   if (mode != TImode
6344       && mode != TFmode
6345       && mode != TDmode
6346       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6347           || TARGET_POWERPC64
6348           || (mode != DFmode && mode != DDmode)
6349           || (TARGET_E500_DOUBLE && mode != DDmode))
6350       && (TARGET_POWERPC64 || mode != DImode)
6351       && !avoiding_indexed_address_p (mode)
6352       && legitimate_indexed_address_p (x, reg_ok_strict))
6353     return 1;
6354   if (GET_CODE (x) == PRE_MODIFY
6355       && mode != TImode
6356       && mode != TFmode
6357       && mode != TDmode
6358       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6359           || TARGET_POWERPC64
6360           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
6361       && (TARGET_POWERPC64 || mode != DImode)
6362       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6363       && !SPE_VECTOR_MODE (mode)
6364       /* Restrict addressing for DI because of our SUBREG hackery.  */
6365       && !(TARGET_E500_DOUBLE
6366            && (mode == DFmode || mode == DDmode || mode == DImode))
6367       && TARGET_UPDATE
6368       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
6369       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
6370           || (!avoiding_indexed_address_p (mode)
6371               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
6372       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6373     return 1;
6374   if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
6375     return 1;
6376   return 0;
6377 }
6378
6379 /* Debug version of rs6000_legitimate_address_p.  */
6380 static bool
6381 rs6000_debug_legitimate_address_p (enum machine_mode mode, rtx x,
6382                                    bool reg_ok_strict)
6383 {
6384   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
6385   fprintf (stderr,
6386            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
6387            "strict = %d, code = %s\n",
6388            ret ? "true" : "false",
6389            GET_MODE_NAME (mode),
6390            reg_ok_strict,
6391            GET_RTX_NAME (GET_CODE (x)));
6392   debug_rtx (x);
6393
6394   return ret;
6395 }
6396
6397 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
6398
6399 static bool
6400 rs6000_mode_dependent_address_p (const_rtx addr)
6401 {
6402   return rs6000_mode_dependent_address_ptr (addr);
6403 }
6404
6405 /* Go to LABEL if ADDR (a legitimate address expression)
6406    has an effect that depends on the machine mode it is used for.
6407
6408    On the RS/6000 this is true of all integral offsets (since AltiVec
6409    and VSX modes don't allow them) or is a pre-increment or decrement.
6410
6411    ??? Except that due to conceptual problems in offsettable_address_p
6412    we can't really report the problems of integral offsets.  So leave
6413    this assuming that the adjustable offset must be valid for the
6414    sub-words of a TFmode operand, which is what we had before.  */
6415
6416 static bool
6417 rs6000_mode_dependent_address (const_rtx addr)
6418 {
6419   switch (GET_CODE (addr))
6420     {
6421     case PLUS:
6422       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
6423          is considered a legitimate address before reload, so there
6424          are no offset restrictions in that case.  Note that this
6425          condition is safe in strict mode because any address involving
6426          virtual_stack_vars_rtx or arg_pointer_rtx would already have
6427          been rejected as illegitimate.  */
6428       if (XEXP (addr, 0) != virtual_stack_vars_rtx
6429           && XEXP (addr, 0) != arg_pointer_rtx
6430           && GET_CODE (XEXP (addr, 1)) == CONST_INT)
6431         {
6432           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
6433           return val + 12 + 0x8000 >= 0x10000;
6434         }
6435       break;
6436
6437     case LO_SUM:
6438       /* Anything in the constant pool is sufficiently aligned that
6439          all bytes have the same high part address.  */
6440       return !legitimate_constant_pool_address_p (addr, false);
6441
6442     /* Auto-increment cases are now treated generically in recog.c.  */
6443     case PRE_MODIFY:
6444       return TARGET_UPDATE;
6445
6446     /* AND is only allowed in Altivec loads.  */
6447     case AND:
6448       return true;
6449
6450     default:
6451       break;
6452     }
6453
6454   return false;
6455 }
6456
6457 /* Debug version of rs6000_mode_dependent_address.  */
6458 static bool
6459 rs6000_debug_mode_dependent_address (const_rtx addr)
6460 {
6461   bool ret = rs6000_mode_dependent_address (addr);
6462
6463   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
6464            ret ? "true" : "false");
6465   debug_rtx (addr);
6466
6467   return ret;
6468 }
6469
6470 /* Implement FIND_BASE_TERM.  */
6471
6472 rtx
6473 rs6000_find_base_term (rtx op)
6474 {
6475   rtx base, offset;
6476
6477   split_const (op, &base, &offset);
6478   if (GET_CODE (base) == UNSPEC)
6479     switch (XINT (base, 1))
6480       {
6481       case UNSPEC_TOCREL:
6482       case UNSPEC_MACHOPIC_OFFSET:
6483         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
6484            for aliasing purposes.  */
6485         return XVECEXP (base, 0, 0);
6486       }
6487
6488   return op;
6489 }
6490
6491 /* More elaborate version of recog's offsettable_memref_p predicate
6492    that works around the ??? note of rs6000_mode_dependent_address.
6493    In particular it accepts
6494
6495      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
6496
6497    in 32-bit mode, that the recog predicate rejects.  */
6498
6499 bool
6500 rs6000_offsettable_memref_p (rtx op)
6501 {
6502   if (!MEM_P (op))
6503     return false;
6504
6505   /* First mimic offsettable_memref_p.  */
6506   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
6507     return true;
6508
6509   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
6510      the latter predicate knows nothing about the mode of the memory
6511      reference and, therefore, assumes that it is the largest supported
6512      mode (TFmode).  As a consequence, legitimate offsettable memory
6513      references are rejected.  rs6000_legitimate_offset_address_p contains
6514      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
6515   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
6516 }
6517
6518 /* Change register usage conditional on target flags.  */
6519 void
6520 rs6000_conditional_register_usage (void)
6521 {
6522   int i;
6523
6524   /* Set MQ register fixed (already call_used) if not POWER
6525      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
6526      be allocated.  */
6527   if (! TARGET_POWER)
6528     fixed_regs[64] = 1;
6529
6530   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
6531   if (TARGET_64BIT)
6532     fixed_regs[13] = call_used_regs[13]
6533       = call_really_used_regs[13] = 1;
6534
6535   /* Conditionally disable FPRs.  */
6536   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
6537     for (i = 32; i < 64; i++)
6538       fixed_regs[i] = call_used_regs[i]
6539         = call_really_used_regs[i] = 1;
6540
6541   /* The TOC register is not killed across calls in a way that is
6542      visible to the compiler.  */
6543   if (DEFAULT_ABI == ABI_AIX)
6544     call_really_used_regs[2] = 0;
6545
6546   if (DEFAULT_ABI == ABI_V4
6547       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6548       && flag_pic == 2)
6549     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6550
6551   if (DEFAULT_ABI == ABI_V4
6552       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6553       && flag_pic == 1)
6554     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6555       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6556       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6557
6558   if (DEFAULT_ABI == ABI_DARWIN
6559       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
6560       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6561       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6562       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6563
6564   if (TARGET_TOC && TARGET_MINIMAL_TOC)
6565     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6566       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6567
6568   if (TARGET_SPE)
6569     {
6570       global_regs[SPEFSCR_REGNO] = 1;
6571       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
6572          registers in prologues and epilogues.  We no longer use r14
6573          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
6574          pool for link-compatibility with older versions of GCC.  Once
6575          "old" code has died out, we can return r14 to the allocation
6576          pool.  */
6577       fixed_regs[14]
6578         = call_used_regs[14]
6579         = call_really_used_regs[14] = 1;
6580     }
6581
6582   if (!TARGET_ALTIVEC && !TARGET_VSX)
6583     {
6584       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
6585         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6586       call_really_used_regs[VRSAVE_REGNO] = 1;
6587     }
6588
6589   if (TARGET_ALTIVEC || TARGET_VSX)
6590     global_regs[VSCR_REGNO] = 1;
6591
6592   if (TARGET_ALTIVEC_ABI)
6593     {
6594       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
6595         call_used_regs[i] = call_really_used_regs[i] = 1;
6596
6597       /* AIX reserves VR20:31 in non-extended ABI mode.  */
6598       if (TARGET_XCOFF)
6599         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
6600           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6601     }
6602 }
6603 \f
6604 /* Try to output insns to set TARGET equal to the constant C if it can
6605    be done in less than N insns.  Do all computations in MODE.
6606    Returns the place where the output has been placed if it can be
6607    done and the insns have been emitted.  If it would take more than N
6608    insns, zero is returned and no insns and emitted.  */
6609
6610 rtx
6611 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
6612                        rtx source, int n ATTRIBUTE_UNUSED)
6613 {
6614   rtx result, insn, set;
6615   HOST_WIDE_INT c0, c1;
6616
6617   switch (mode)
6618     {
6619       case  QImode:
6620     case HImode:
6621       if (dest == NULL)
6622         dest = gen_reg_rtx (mode);
6623       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
6624       return dest;
6625
6626     case SImode:
6627       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
6628
6629       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
6630                               GEN_INT (INTVAL (source)
6631                                        & (~ (HOST_WIDE_INT) 0xffff))));
6632       emit_insn (gen_rtx_SET (VOIDmode, dest,
6633                               gen_rtx_IOR (SImode, copy_rtx (result),
6634                                            GEN_INT (INTVAL (source) & 0xffff))));
6635       result = dest;
6636       break;
6637
6638     case DImode:
6639       switch (GET_CODE (source))
6640         {
6641         case CONST_INT:
6642           c0 = INTVAL (source);
6643           c1 = -(c0 < 0);
6644           break;
6645
6646         case CONST_DOUBLE:
6647 #if HOST_BITS_PER_WIDE_INT >= 64
6648           c0 = CONST_DOUBLE_LOW (source);
6649           c1 = -(c0 < 0);
6650 #else
6651           c0 = CONST_DOUBLE_LOW (source);
6652           c1 = CONST_DOUBLE_HIGH (source);
6653 #endif
6654           break;
6655
6656         default:
6657           gcc_unreachable ();
6658         }
6659
6660       result = rs6000_emit_set_long_const (dest, c0, c1);
6661       break;
6662
6663     default:
6664       gcc_unreachable ();
6665     }
6666
6667   insn = get_last_insn ();
6668   set = single_set (insn);
6669   if (! CONSTANT_P (SET_SRC (set)))
6670     set_unique_reg_note (insn, REG_EQUAL, source);
6671
6672   return result;
6673 }
6674
6675 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
6676    fall back to a straight forward decomposition.  We do this to avoid
6677    exponential run times encountered when looking for longer sequences
6678    with rs6000_emit_set_const.  */
6679 static rtx
6680 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
6681 {
6682   if (!TARGET_POWERPC64)
6683     {
6684       rtx operand1, operand2;
6685
6686       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
6687                                         DImode);
6688       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
6689                                         DImode);
6690       emit_move_insn (operand1, GEN_INT (c1));
6691       emit_move_insn (operand2, GEN_INT (c2));
6692     }
6693   else
6694     {
6695       HOST_WIDE_INT ud1, ud2, ud3, ud4;
6696
6697       ud1 = c1 & 0xffff;
6698       ud2 = (c1 & 0xffff0000) >> 16;
6699 #if HOST_BITS_PER_WIDE_INT >= 64
6700       c2 = c1 >> 32;
6701 #endif
6702       ud3 = c2 & 0xffff;
6703       ud4 = (c2 & 0xffff0000) >> 16;
6704
6705       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
6706           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
6707         {
6708           if (ud1 & 0x8000)
6709             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
6710           else
6711             emit_move_insn (dest, GEN_INT (ud1));
6712         }
6713
6714       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
6715                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
6716         {
6717           if (ud2 & 0x8000)
6718             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6719                                            - 0x80000000));
6720           else
6721             emit_move_insn (dest, GEN_INT (ud2 << 16));
6722           if (ud1 != 0)
6723             emit_move_insn (copy_rtx (dest),
6724                             gen_rtx_IOR (DImode, copy_rtx (dest),
6725                                          GEN_INT (ud1)));
6726         }
6727       else if (ud3 == 0 && ud4 == 0)
6728         {
6729           gcc_assert (ud2 & 0x8000);
6730           emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6731                                          - 0x80000000));
6732           if (ud1 != 0)
6733             emit_move_insn (copy_rtx (dest),
6734                             gen_rtx_IOR (DImode, copy_rtx (dest),
6735                                          GEN_INT (ud1)));
6736           emit_move_insn (copy_rtx (dest),
6737                           gen_rtx_ZERO_EXTEND (DImode,
6738                                                gen_lowpart (SImode,
6739                                                             copy_rtx (dest))));
6740         }
6741       else if ((ud4 == 0xffff && (ud3 & 0x8000))
6742                || (ud4 == 0 && ! (ud3 & 0x8000)))
6743         {
6744           if (ud3 & 0x8000)
6745             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
6746                                            - 0x80000000));
6747           else
6748             emit_move_insn (dest, GEN_INT (ud3 << 16));
6749
6750           if (ud2 != 0)
6751             emit_move_insn (copy_rtx (dest),
6752                             gen_rtx_IOR (DImode, copy_rtx (dest),
6753                                          GEN_INT (ud2)));
6754           emit_move_insn (copy_rtx (dest),
6755                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
6756                                           GEN_INT (16)));
6757           if (ud1 != 0)
6758             emit_move_insn (copy_rtx (dest),
6759                             gen_rtx_IOR (DImode, copy_rtx (dest),
6760                                          GEN_INT (ud1)));
6761         }
6762       else
6763         {
6764           if (ud4 & 0x8000)
6765             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
6766                                            - 0x80000000));
6767           else
6768             emit_move_insn (dest, GEN_INT (ud4 << 16));
6769
6770           if (ud3 != 0)
6771             emit_move_insn (copy_rtx (dest),
6772                             gen_rtx_IOR (DImode, copy_rtx (dest),
6773                                          GEN_INT (ud3)));
6774
6775           emit_move_insn (copy_rtx (dest),
6776                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
6777                                           GEN_INT (32)));
6778           if (ud2 != 0)
6779             emit_move_insn (copy_rtx (dest),
6780                             gen_rtx_IOR (DImode, copy_rtx (dest),
6781                                          GEN_INT (ud2 << 16)));
6782           if (ud1 != 0)
6783             emit_move_insn (copy_rtx (dest),
6784                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
6785         }
6786     }
6787   return dest;
6788 }
6789
6790 /* Helper for the following.  Get rid of [r+r] memory refs
6791    in cases where it won't work (TImode, TFmode, TDmode).  */
6792
6793 static void
6794 rs6000_eliminate_indexed_memrefs (rtx operands[2])
6795 {
6796   if (reload_in_progress)
6797     return;
6798
6799   if (GET_CODE (operands[0]) == MEM
6800       && GET_CODE (XEXP (operands[0], 0)) != REG
6801       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0), false))
6802     operands[0]
6803       = replace_equiv_address (operands[0],
6804                                copy_addr_to_reg (XEXP (operands[0], 0)));
6805
6806   if (GET_CODE (operands[1]) == MEM
6807       && GET_CODE (XEXP (operands[1], 0)) != REG
6808       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0), false))
6809     operands[1]
6810       = replace_equiv_address (operands[1],
6811                                copy_addr_to_reg (XEXP (operands[1], 0)));
6812 }
6813
6814 /* Emit a move from SOURCE to DEST in mode MODE.  */
6815 void
6816 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
6817 {
6818   rtx operands[2];
6819   operands[0] = dest;
6820   operands[1] = source;
6821
6822   if (TARGET_DEBUG_ADDR)
6823     {
6824       fprintf (stderr,
6825                "\nrs6000_emit_move: mode = %s, reload_in_progress = %d, "
6826                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
6827                GET_MODE_NAME (mode),
6828                reload_in_progress,
6829                reload_completed,
6830                can_create_pseudo_p ());
6831       debug_rtx (dest);
6832       fprintf (stderr, "source:\n");
6833       debug_rtx (source);
6834     }
6835
6836   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
6837   if (GET_CODE (operands[1]) == CONST_DOUBLE
6838       && ! FLOAT_MODE_P (mode)
6839       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
6840     {
6841       /* FIXME.  This should never happen.  */
6842       /* Since it seems that it does, do the safe thing and convert
6843          to a CONST_INT.  */
6844       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
6845     }
6846   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
6847               || FLOAT_MODE_P (mode)
6848               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
6849                    || CONST_DOUBLE_LOW (operands[1]) < 0)
6850                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
6851                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
6852
6853   /* Check if GCC is setting up a block move that will end up using FP
6854      registers as temporaries.  We must make sure this is acceptable.  */
6855   if (GET_CODE (operands[0]) == MEM
6856       && GET_CODE (operands[1]) == MEM
6857       && mode == DImode
6858       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
6859           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
6860       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
6861                                             ? 32 : MEM_ALIGN (operands[0])))
6862             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
6863                                                ? 32
6864                                                : MEM_ALIGN (operands[1]))))
6865       && ! MEM_VOLATILE_P (operands [0])
6866       && ! MEM_VOLATILE_P (operands [1]))
6867     {
6868       emit_move_insn (adjust_address (operands[0], SImode, 0),
6869                       adjust_address (operands[1], SImode, 0));
6870       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
6871                       adjust_address (copy_rtx (operands[1]), SImode, 4));
6872       return;
6873     }
6874
6875   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
6876       && !gpc_reg_operand (operands[1], mode))
6877     operands[1] = force_reg (mode, operands[1]);
6878
6879   if (mode == SFmode && ! TARGET_POWERPC
6880       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
6881       && GET_CODE (operands[0]) == MEM)
6882     {
6883       int regnum;
6884
6885       if (reload_in_progress || reload_completed)
6886         regnum = true_regnum (operands[1]);
6887       else if (GET_CODE (operands[1]) == REG)
6888         regnum = REGNO (operands[1]);
6889       else
6890         regnum = -1;
6891
6892       /* If operands[1] is a register, on POWER it may have
6893          double-precision data in it, so truncate it to single
6894          precision.  */
6895       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
6896         {
6897           rtx newreg;
6898           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
6899                     : gen_reg_rtx (mode));
6900           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
6901           operands[1] = newreg;
6902         }
6903     }
6904
6905   /* Recognize the case where operand[1] is a reference to thread-local
6906      data and load its address to a register.  */
6907   if (rs6000_tls_referenced_p (operands[1]))
6908     {
6909       enum tls_model model;
6910       rtx tmp = operands[1];
6911       rtx addend = NULL;
6912
6913       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
6914         {
6915           addend = XEXP (XEXP (tmp, 0), 1);
6916           tmp = XEXP (XEXP (tmp, 0), 0);
6917         }
6918
6919       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
6920       model = SYMBOL_REF_TLS_MODEL (tmp);
6921       gcc_assert (model != 0);
6922
6923       tmp = rs6000_legitimize_tls_address (tmp, model);
6924       if (addend)
6925         {
6926           tmp = gen_rtx_PLUS (mode, tmp, addend);
6927           tmp = force_operand (tmp, operands[0]);
6928         }
6929       operands[1] = tmp;
6930     }
6931
6932   /* Handle the case where reload calls us with an invalid address.  */
6933   if (reload_in_progress && mode == Pmode
6934       && (! general_operand (operands[1], mode)
6935           || ! nonimmediate_operand (operands[0], mode)))
6936     goto emit_set;
6937
6938   /* 128-bit constant floating-point values on Darwin should really be
6939      loaded as two parts.  */
6940   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
6941       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
6942     {
6943       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
6944          know how to get a DFmode SUBREG of a TFmode.  */
6945       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
6946       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
6947                         simplify_gen_subreg (imode, operands[1], mode, 0),
6948                         imode);
6949       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
6950                                              GET_MODE_SIZE (imode)),
6951                         simplify_gen_subreg (imode, operands[1], mode,
6952                                              GET_MODE_SIZE (imode)),
6953                         imode);
6954       return;
6955     }
6956
6957   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
6958     cfun->machine->sdmode_stack_slot =
6959       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
6960
6961   if (reload_in_progress
6962       && mode == SDmode
6963       && MEM_P (operands[0])
6964       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
6965       && REG_P (operands[1]))
6966     {
6967       if (FP_REGNO_P (REGNO (operands[1])))
6968         {
6969           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
6970           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
6971           emit_insn (gen_movsd_store (mem, operands[1]));
6972         }
6973       else if (INT_REGNO_P (REGNO (operands[1])))
6974         {
6975           rtx mem = adjust_address_nv (operands[0], mode, 4);
6976           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
6977           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
6978         }
6979       else
6980         gcc_unreachable();
6981       return;
6982     }
6983   if (reload_in_progress
6984       && mode == SDmode
6985       && REG_P (operands[0])
6986       && MEM_P (operands[1])
6987       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
6988     {
6989       if (FP_REGNO_P (REGNO (operands[0])))
6990         {
6991           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
6992           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
6993           emit_insn (gen_movsd_load (operands[0], mem));
6994         }
6995       else if (INT_REGNO_P (REGNO (operands[0])))
6996         {
6997           rtx mem = adjust_address_nv (operands[1], mode, 4);
6998           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
6999           emit_insn (gen_movsd_hardfloat (operands[0], mem));
7000         }
7001       else
7002         gcc_unreachable();
7003       return;
7004     }
7005
7006   /* FIXME:  In the long term, this switch statement should go away
7007      and be replaced by a sequence of tests based on things like
7008      mode == Pmode.  */
7009   switch (mode)
7010     {
7011     case HImode:
7012     case QImode:
7013       if (CONSTANT_P (operands[1])
7014           && GET_CODE (operands[1]) != CONST_INT)
7015         operands[1] = force_const_mem (mode, operands[1]);
7016       break;
7017
7018     case TFmode:
7019     case TDmode:
7020       rs6000_eliminate_indexed_memrefs (operands);
7021       /* fall through */
7022
7023     case DFmode:
7024     case DDmode:
7025     case SFmode:
7026     case SDmode:
7027       if (CONSTANT_P (operands[1])
7028           && ! easy_fp_constant (operands[1], mode))
7029         operands[1] = force_const_mem (mode, operands[1]);
7030       break;
7031
7032     case V16QImode:
7033     case V8HImode:
7034     case V4SFmode:
7035     case V4SImode:
7036     case V4HImode:
7037     case V2SFmode:
7038     case V2SImode:
7039     case V1DImode:
7040     case V2DFmode:
7041     case V2DImode:
7042       if (CONSTANT_P (operands[1])
7043           && !easy_vector_constant (operands[1], mode))
7044         operands[1] = force_const_mem (mode, operands[1]);
7045       break;
7046
7047     case SImode:
7048     case DImode:
7049       /* Use default pattern for address of ELF small data */
7050       if (TARGET_ELF
7051           && mode == Pmode
7052           && DEFAULT_ABI == ABI_V4
7053           && (GET_CODE (operands[1]) == SYMBOL_REF
7054               || GET_CODE (operands[1]) == CONST)
7055           && small_data_operand (operands[1], mode))
7056         {
7057           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7058           return;
7059         }
7060
7061       if (DEFAULT_ABI == ABI_V4
7062           && mode == Pmode && mode == SImode
7063           && flag_pic == 1 && got_operand (operands[1], mode))
7064         {
7065           emit_insn (gen_movsi_got (operands[0], operands[1]));
7066           return;
7067         }
7068
7069       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
7070           && TARGET_NO_TOC
7071           && ! flag_pic
7072           && mode == Pmode
7073           && CONSTANT_P (operands[1])
7074           && GET_CODE (operands[1]) != HIGH
7075           && GET_CODE (operands[1]) != CONST_INT)
7076         {
7077           rtx target = (!can_create_pseudo_p ()
7078                         ? operands[0]
7079                         : gen_reg_rtx (mode));
7080
7081           /* If this is a function address on -mcall-aixdesc,
7082              convert it to the address of the descriptor.  */
7083           if (DEFAULT_ABI == ABI_AIX
7084               && GET_CODE (operands[1]) == SYMBOL_REF
7085               && XSTR (operands[1], 0)[0] == '.')
7086             {
7087               const char *name = XSTR (operands[1], 0);
7088               rtx new_ref;
7089               while (*name == '.')
7090                 name++;
7091               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
7092               CONSTANT_POOL_ADDRESS_P (new_ref)
7093                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
7094               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
7095               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
7096               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
7097               operands[1] = new_ref;
7098             }
7099
7100           if (DEFAULT_ABI == ABI_DARWIN)
7101             {
7102 #if TARGET_MACHO
7103               if (MACHO_DYNAMIC_NO_PIC_P)
7104                 {
7105                   /* Take care of any required data indirection.  */
7106                   operands[1] = rs6000_machopic_legitimize_pic_address (
7107                                   operands[1], mode, operands[0]);
7108                   if (operands[0] != operands[1])
7109                     emit_insn (gen_rtx_SET (VOIDmode,
7110                                             operands[0], operands[1]));
7111                   return;
7112                 }
7113 #endif
7114               emit_insn (gen_macho_high (target, operands[1]));
7115               emit_insn (gen_macho_low (operands[0], target, operands[1]));
7116               return;
7117             }
7118
7119           emit_insn (gen_elf_high (target, operands[1]));
7120           emit_insn (gen_elf_low (operands[0], target, operands[1]));
7121           return;
7122         }
7123
7124       /* If this is a SYMBOL_REF that refers to a constant pool entry,
7125          and we have put it in the TOC, we just need to make a TOC-relative
7126          reference to it.  */
7127       if (TARGET_TOC
7128           && GET_CODE (operands[1]) == SYMBOL_REF
7129           && constant_pool_expr_p (operands[1])
7130           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
7131                                               get_pool_mode (operands[1])))
7132         {
7133           rtx reg = NULL_RTX;
7134           if (TARGET_CMODEL != CMODEL_SMALL)
7135             {
7136               if (can_create_pseudo_p ())
7137                 reg = gen_reg_rtx (Pmode);
7138               else
7139                 reg = operands[0];
7140             }
7141           operands[1] = create_TOC_reference (operands[1], reg);
7142         }
7143       else if (mode == Pmode
7144                && CONSTANT_P (operands[1])
7145                && ((GET_CODE (operands[1]) != CONST_INT
7146                     && ! easy_fp_constant (operands[1], mode))
7147                    || (GET_CODE (operands[1]) == CONST_INT
7148                        && (num_insns_constant (operands[1], mode)
7149                            > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
7150                    || (GET_CODE (operands[0]) == REG
7151                        && FP_REGNO_P (REGNO (operands[0]))))
7152                && GET_CODE (operands[1]) != HIGH
7153                && ! legitimate_constant_pool_address_p (operands[1], false)
7154                && ! toc_relative_expr_p (operands[1])
7155                && (TARGET_CMODEL == CMODEL_SMALL
7156                    || can_create_pseudo_p ()
7157                    || (REG_P (operands[0])
7158                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
7159         {
7160
7161 #if TARGET_MACHO
7162           /* Darwin uses a special PIC legitimizer.  */
7163           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
7164             {
7165               operands[1] =
7166                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
7167                                                         operands[0]);
7168               if (operands[0] != operands[1])
7169                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7170               return;
7171             }
7172 #endif
7173
7174           /* If we are to limit the number of things we put in the TOC and
7175              this is a symbol plus a constant we can add in one insn,
7176              just put the symbol in the TOC and add the constant.  Don't do
7177              this if reload is in progress.  */
7178           if (GET_CODE (operands[1]) == CONST
7179               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
7180               && GET_CODE (XEXP (operands[1], 0)) == PLUS
7181               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
7182               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
7183                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
7184               && ! side_effects_p (operands[0]))
7185             {
7186               rtx sym =
7187                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
7188               rtx other = XEXP (XEXP (operands[1], 0), 1);
7189
7190               sym = force_reg (mode, sym);
7191               emit_insn (gen_add3_insn (operands[0], sym, other));
7192               return;
7193             }
7194
7195           operands[1] = force_const_mem (mode, operands[1]);
7196
7197           if (TARGET_TOC
7198               && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
7199               && constant_pool_expr_p (XEXP (operands[1], 0))
7200               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
7201                         get_pool_constant (XEXP (operands[1], 0)),
7202                         get_pool_mode (XEXP (operands[1], 0))))
7203             {
7204               rtx tocref;
7205               rtx reg = NULL_RTX;
7206               if (TARGET_CMODEL != CMODEL_SMALL)
7207                 {
7208                   if (can_create_pseudo_p ())
7209                     reg = gen_reg_rtx (Pmode);
7210                   else
7211                     reg = operands[0];
7212                 }
7213               tocref = create_TOC_reference (XEXP (operands[1], 0), reg);
7214               operands[1] = gen_const_mem (mode, tocref);
7215               set_mem_alias_set (operands[1], get_TOC_alias_set ());
7216             }
7217         }
7218       break;
7219
7220     case TImode:
7221       rs6000_eliminate_indexed_memrefs (operands);
7222
7223       if (TARGET_POWER)
7224         {
7225           emit_insn (gen_rtx_PARALLEL (VOIDmode,
7226                        gen_rtvec (2,
7227                                   gen_rtx_SET (VOIDmode,
7228                                                operands[0], operands[1]),
7229                                   gen_rtx_CLOBBER (VOIDmode,
7230                                                    gen_rtx_SCRATCH (SImode)))));
7231           return;
7232         }
7233       break;
7234
7235     default:
7236       fatal_insn ("bad move", gen_rtx_SET (VOIDmode, dest, source));
7237     }
7238
7239   /* Above, we may have called force_const_mem which may have returned
7240      an invalid address.  If we can, fix this up; otherwise, reload will
7241      have to deal with it.  */
7242   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
7243     operands[1] = validize_mem (operands[1]);
7244
7245  emit_set:
7246   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7247 }
7248 \f
7249 /* Nonzero if we can use a floating-point register to pass this arg.  */
7250 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
7251   (SCALAR_FLOAT_MODE_P (MODE)                   \
7252    && (CUM)->fregno <= FP_ARG_MAX_REG           \
7253    && TARGET_HARD_FLOAT && TARGET_FPRS)
7254
7255 /* Nonzero if we can use an AltiVec register to pass this arg.  */
7256 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)              \
7257   ((ALTIVEC_VECTOR_MODE (MODE) || VSX_VECTOR_MODE (MODE))       \
7258    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
7259    && TARGET_ALTIVEC_ABI                                        \
7260    && (NAMED))
7261
7262 /* Return a nonzero value to say to return the function value in
7263    memory, just as large structures are always returned.  TYPE will be
7264    the data type of the value, and FNTYPE will be the type of the
7265    function doing the returning, or @code{NULL} for libcalls.
7266
7267    The AIX ABI for the RS/6000 specifies that all structures are
7268    returned in memory.  The Darwin ABI does the same.
7269    
7270    For the Darwin 64 Bit ABI, a function result can be returned in
7271    registers or in memory, depending on the size of the return data
7272    type.  If it is returned in registers, the value occupies the same
7273    registers as it would if it were the first and only function
7274    argument.  Otherwise, the function places its result in memory at
7275    the location pointed to by GPR3.
7276    
7277    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
7278    but a draft put them in memory, and GCC used to implement the draft
7279    instead of the final standard.  Therefore, aix_struct_return
7280    controls this instead of DEFAULT_ABI; V.4 targets needing backward
7281    compatibility can change DRAFT_V4_STRUCT_RET to override the
7282    default, and -m switches get the final word.  See
7283    rs6000_override_options for more details.
7284
7285    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
7286    long double support is enabled.  These values are returned in memory.
7287
7288    int_size_in_bytes returns -1 for variable size objects, which go in
7289    memory always.  The cast to unsigned makes -1 > 8.  */
7290
7291 static bool
7292 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7293 {
7294   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
7295   if (TARGET_MACHO
7296       && rs6000_darwin64_abi
7297       && TREE_CODE (type) == RECORD_TYPE
7298       && int_size_in_bytes (type) > 0)
7299     {
7300       CUMULATIVE_ARGS valcum;
7301       rtx valret;
7302
7303       valcum.words = 0;
7304       valcum.fregno = FP_ARG_MIN_REG;
7305       valcum.vregno = ALTIVEC_ARG_MIN_REG;
7306       /* Do a trial code generation as if this were going to be passed
7307          as an argument; if any part goes in memory, we return NULL.  */
7308       valret = rs6000_darwin64_record_arg (&valcum, type, 1, true);
7309       if (valret)
7310         return false;
7311       /* Otherwise fall through to more conventional ABI rules.  */
7312     }
7313
7314   if (AGGREGATE_TYPE_P (type)
7315       && (aix_struct_return
7316           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
7317     return true;
7318
7319   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
7320      modes only exist for GCC vector types if -maltivec.  */
7321   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
7322       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7323     return false;
7324
7325   /* Return synthetic vectors in memory.  */
7326   if (TREE_CODE (type) == VECTOR_TYPE
7327       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
7328     {
7329       static bool warned_for_return_big_vectors = false;
7330       if (!warned_for_return_big_vectors)
7331         {
7332           warning (0, "GCC vector returned by reference: "
7333                    "non-standard ABI extension with no compatibility guarantee");
7334           warned_for_return_big_vectors = true;
7335         }
7336       return true;
7337     }
7338
7339   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
7340     return true;
7341
7342   return false;
7343 }
7344
7345 /* Initialize a variable CUM of type CUMULATIVE_ARGS
7346    for a call to a function whose data type is FNTYPE.
7347    For a library call, FNTYPE is 0.
7348
7349    For incoming args we set the number of arguments in the prototype large
7350    so we never return a PARALLEL.  */
7351
7352 void
7353 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
7354                       rtx libname ATTRIBUTE_UNUSED, int incoming,
7355                       int libcall, int n_named_args)
7356 {
7357   static CUMULATIVE_ARGS zero_cumulative;
7358
7359   *cum = zero_cumulative;
7360   cum->words = 0;
7361   cum->fregno = FP_ARG_MIN_REG;
7362   cum->vregno = ALTIVEC_ARG_MIN_REG;
7363   cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
7364   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
7365                       ? CALL_LIBCALL : CALL_NORMAL);
7366   cum->sysv_gregno = GP_ARG_MIN_REG;
7367   cum->stdarg = fntype
7368     && (TYPE_ARG_TYPES (fntype) != 0
7369         && (TREE_VALUE (tree_last  (TYPE_ARG_TYPES (fntype)))
7370             != void_type_node));
7371
7372   cum->nargs_prototype = 0;
7373   if (incoming || cum->prototype)
7374     cum->nargs_prototype = n_named_args;
7375
7376   /* Check for a longcall attribute.  */
7377   if ((!fntype && rs6000_default_long_calls)
7378       || (fntype
7379           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
7380           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
7381     cum->call_cookie |= CALL_LONG;
7382
7383   if (TARGET_DEBUG_ARG)
7384     {
7385       fprintf (stderr, "\ninit_cumulative_args:");
7386       if (fntype)
7387         {
7388           tree ret_type = TREE_TYPE (fntype);
7389           fprintf (stderr, " ret code = %s,",
7390                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
7391         }
7392
7393       if (cum->call_cookie & CALL_LONG)
7394         fprintf (stderr, " longcall,");
7395
7396       fprintf (stderr, " proto = %d, nargs = %d\n",
7397                cum->prototype, cum->nargs_prototype);
7398     }
7399
7400   if (fntype
7401       && !TARGET_ALTIVEC
7402       && TARGET_ALTIVEC_ABI
7403       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
7404     {
7405       error ("cannot return value in vector register because"
7406              " altivec instructions are disabled, use -maltivec"
7407              " to enable them");
7408     }
7409 }
7410 \f
7411 /* Return true if TYPE must be passed on the stack and not in registers.  */
7412
7413 static bool
7414 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
7415 {
7416   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
7417     return must_pass_in_stack_var_size (mode, type);
7418   else
7419     return must_pass_in_stack_var_size_or_pad (mode, type);
7420 }
7421
7422 /* If defined, a C expression which determines whether, and in which
7423    direction, to pad out an argument with extra space.  The value
7424    should be of type `enum direction': either `upward' to pad above
7425    the argument, `downward' to pad below, or `none' to inhibit
7426    padding.
7427
7428    For the AIX ABI structs are always stored left shifted in their
7429    argument slot.  */
7430
7431 enum direction
7432 function_arg_padding (enum machine_mode mode, const_tree type)
7433 {
7434 #ifndef AGGREGATE_PADDING_FIXED
7435 #define AGGREGATE_PADDING_FIXED 0
7436 #endif
7437 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
7438 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
7439 #endif
7440
7441   if (!AGGREGATE_PADDING_FIXED)
7442     {
7443       /* GCC used to pass structures of the same size as integer types as
7444          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
7445          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
7446          passed padded downward, except that -mstrict-align further
7447          muddied the water in that multi-component structures of 2 and 4
7448          bytes in size were passed padded upward.
7449
7450          The following arranges for best compatibility with previous
7451          versions of gcc, but removes the -mstrict-align dependency.  */
7452       if (BYTES_BIG_ENDIAN)
7453         {
7454           HOST_WIDE_INT size = 0;
7455
7456           if (mode == BLKmode)
7457             {
7458               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
7459                 size = int_size_in_bytes (type);
7460             }
7461           else
7462             size = GET_MODE_SIZE (mode);
7463
7464           if (size == 1 || size == 2 || size == 4)
7465             return downward;
7466         }
7467       return upward;
7468     }
7469
7470   if (AGGREGATES_PAD_UPWARD_ALWAYS)
7471     {
7472       if (type != 0 && AGGREGATE_TYPE_P (type))
7473         return upward;
7474     }
7475
7476   /* Fall back to the default.  */
7477   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7478 }
7479
7480 /* If defined, a C expression that gives the alignment boundary, in bits,
7481    of an argument with the specified mode and type.  If it is not defined,
7482    PARM_BOUNDARY is used for all arguments.
7483
7484    V.4 wants long longs and doubles to be double word aligned.  Just
7485    testing the mode size is a boneheaded way to do this as it means
7486    that other types such as complex int are also double word aligned.
7487    However, we're stuck with this because changing the ABI might break
7488    existing library interfaces.
7489
7490    Doubleword align SPE vectors.
7491    Quadword align Altivec vectors.
7492    Quadword align large synthetic vector types.   */
7493
7494 int
7495 function_arg_boundary (enum machine_mode mode, tree type)
7496 {
7497   if (DEFAULT_ABI == ABI_V4
7498       && (GET_MODE_SIZE (mode) == 8
7499           || (TARGET_HARD_FLOAT
7500               && TARGET_FPRS
7501               && (mode == TFmode || mode == TDmode))))
7502     return 64;
7503   else if (SPE_VECTOR_MODE (mode)
7504            || (type && TREE_CODE (type) == VECTOR_TYPE
7505                && int_size_in_bytes (type) >= 8
7506                && int_size_in_bytes (type) < 16))
7507     return 64;
7508   else if ((ALTIVEC_VECTOR_MODE (mode) || VSX_VECTOR_MODE (mode))
7509            || (type && TREE_CODE (type) == VECTOR_TYPE
7510                && int_size_in_bytes (type) >= 16))
7511     return 128;
7512   else if (TARGET_MACHO
7513            && rs6000_darwin64_abi
7514            && mode == BLKmode
7515            && type && TYPE_ALIGN (type) > 64)
7516     return 128;
7517   else
7518     return PARM_BOUNDARY;
7519 }
7520
7521 /* For a function parm of MODE and TYPE, return the starting word in
7522    the parameter area.  NWORDS of the parameter area are already used.  */
7523
7524 static unsigned int
7525 rs6000_parm_start (enum machine_mode mode, tree type, unsigned int nwords)
7526 {
7527   unsigned int align;
7528   unsigned int parm_offset;
7529
7530   align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
7531   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
7532   return nwords + (-(parm_offset + nwords) & align);
7533 }
7534
7535 /* Compute the size (in words) of a function argument.  */
7536
7537 static unsigned long
7538 rs6000_arg_size (enum machine_mode mode, tree type)
7539 {
7540   unsigned long size;
7541
7542   if (mode != BLKmode)
7543     size = GET_MODE_SIZE (mode);
7544   else
7545     size = int_size_in_bytes (type);
7546
7547   if (TARGET_32BIT)
7548     return (size + 3) >> 2;
7549   else
7550     return (size + 7) >> 3;
7551 }
7552 \f
7553 /* Use this to flush pending int fields.  */
7554
7555 static void
7556 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
7557                                           HOST_WIDE_INT bitpos, int final)
7558 {
7559   unsigned int startbit, endbit;
7560   int intregs, intoffset;
7561   enum machine_mode mode;
7562
7563   /* Handle the situations where a float is taking up the first half
7564      of the GPR, and the other half is empty (typically due to
7565      alignment restrictions). We can detect this by a 8-byte-aligned
7566      int field, or by seeing that this is the final flush for this
7567      argument. Count the word and continue on.  */
7568   if (cum->floats_in_gpr == 1
7569       && (cum->intoffset % 64 == 0
7570           || (cum->intoffset == -1 && final)))
7571     {
7572       cum->words++;
7573       cum->floats_in_gpr = 0;
7574     }
7575
7576   if (cum->intoffset == -1)
7577     return;
7578
7579   intoffset = cum->intoffset;
7580   cum->intoffset = -1;
7581   cum->floats_in_gpr = 0;
7582
7583   if (intoffset % BITS_PER_WORD != 0)
7584     {
7585       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
7586                             MODE_INT, 0);
7587       if (mode == BLKmode)
7588         {
7589           /* We couldn't find an appropriate mode, which happens,
7590              e.g., in packed structs when there are 3 bytes to load.
7591              Back intoffset back to the beginning of the word in this
7592              case.  */
7593           intoffset = intoffset & -BITS_PER_WORD;
7594         }
7595     }
7596
7597   startbit = intoffset & -BITS_PER_WORD;
7598   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
7599   intregs = (endbit - startbit) / BITS_PER_WORD;
7600   cum->words += intregs;
7601   /* words should be unsigned. */
7602   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
7603     {
7604       int pad = (endbit/BITS_PER_WORD) - cum->words;
7605       cum->words += pad;
7606     }
7607 }
7608
7609 /* The darwin64 ABI calls for us to recurse down through structs,
7610    looking for elements passed in registers.  Unfortunately, we have
7611    to track int register count here also because of misalignments
7612    in powerpc alignment mode.  */
7613
7614 static void
7615 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
7616                                             tree type,
7617                                             HOST_WIDE_INT startbitpos)
7618 {
7619   tree f;
7620
7621   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
7622     if (TREE_CODE (f) == FIELD_DECL)
7623       {
7624         HOST_WIDE_INT bitpos = startbitpos;
7625         tree ftype = TREE_TYPE (f);
7626         enum machine_mode mode;
7627         if (ftype == error_mark_node)
7628           continue;
7629         mode = TYPE_MODE (ftype);
7630
7631         if (DECL_SIZE (f) != 0
7632             && host_integerp (bit_position (f), 1))
7633           bitpos += int_bit_position (f);
7634
7635         /* ??? FIXME: else assume zero offset.  */
7636
7637         if (TREE_CODE (ftype) == RECORD_TYPE)
7638           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
7639         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
7640           {
7641             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7642             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
7643             /* Single-precision floats present a special problem for
7644                us, because they are smaller than an 8-byte GPR, and so
7645                the structure-packing rules combined with the standard
7646                varargs behavior mean that we want to pack float/float
7647                and float/int combinations into a single register's
7648                space. This is complicated by the arg advance flushing,
7649                which works on arbitrarily large groups of int-type
7650                fields.  */
7651             if (mode == SFmode)
7652               {
7653                 if (cum->floats_in_gpr == 1)
7654                   {
7655                     /* Two floats in a word; count the word and reset
7656                        the float count.  */
7657                     cum->words++;
7658                     cum->floats_in_gpr = 0;
7659                   }
7660                 else if (bitpos % 64 == 0)
7661                   {
7662                     /* A float at the beginning of an 8-byte word;
7663                        count it and put off adjusting cum->words until
7664                        we see if a arg advance flush is going to do it
7665                        for us.  */
7666                     cum->floats_in_gpr++;
7667                   }
7668                 else
7669                   {
7670                     /* The float is at the end of a word, preceded
7671                        by integer fields, so the arg advance flush
7672                        just above has already set cum->words and
7673                        everything is taken care of.  */
7674                   }
7675               }
7676             else
7677               cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
7678           }
7679         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
7680           {
7681             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7682             cum->vregno++;
7683             cum->words += 2;
7684           }
7685         else if (cum->intoffset == -1)
7686           cum->intoffset = bitpos;
7687       }
7688 }
7689
7690 /* Check for an item that needs to be considered specially under the darwin 64
7691    bit ABI.  These are record types where the mode is BLK or the structure is
7692    8 bytes in size.  */
7693 static int
7694 rs6000_darwin64_struct_check_p (enum machine_mode mode, const_tree type)
7695 {
7696   return rs6000_darwin64_abi
7697          && ((mode == BLKmode 
7698               && TREE_CODE (type) == RECORD_TYPE 
7699               && int_size_in_bytes (type) > 0)
7700           || (type && TREE_CODE (type) == RECORD_TYPE 
7701               && int_size_in_bytes (type) == 8)) ? 1 : 0;
7702 }
7703
7704 /* Update the data in CUM to advance over an argument
7705    of mode MODE and data type TYPE.
7706    (TYPE is null for libcalls where that information may not be available.)
7707
7708    Note that for args passed by reference, function_arg will be called
7709    with MODE and TYPE set to that of the pointer to the arg, not the arg
7710    itself.  */
7711
7712 void
7713 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
7714                       tree type, int named, int depth)
7715 {
7716
7717   /* Only tick off an argument if we're not recursing.  */
7718   if (depth == 0)
7719     cum->nargs_prototype--;
7720
7721   if (TARGET_ALTIVEC_ABI
7722       && (ALTIVEC_VECTOR_MODE (mode)
7723           || VSX_VECTOR_MODE (mode)
7724           || (type && TREE_CODE (type) == VECTOR_TYPE
7725               && int_size_in_bytes (type) == 16)))
7726     {
7727       bool stack = false;
7728
7729       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
7730         {
7731           cum->vregno++;
7732           if (!TARGET_ALTIVEC)
7733             error ("cannot pass argument in vector register because"
7734                    " altivec instructions are disabled, use -maltivec"
7735                    " to enable them");
7736
7737           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
7738              even if it is going to be passed in a vector register.
7739              Darwin does the same for variable-argument functions.  */
7740           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
7741               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
7742             stack = true;
7743         }
7744       else
7745         stack = true;
7746
7747       if (stack)
7748         {
7749           int align;
7750
7751           /* Vector parameters must be 16-byte aligned.  This places
7752              them at 2 mod 4 in terms of words in 32-bit mode, since
7753              the parameter save area starts at offset 24 from the
7754              stack.  In 64-bit mode, they just have to start on an
7755              even word, since the parameter save area is 16-byte
7756              aligned.  Space for GPRs is reserved even if the argument
7757              will be passed in memory.  */
7758           if (TARGET_32BIT)
7759             align = (2 - cum->words) & 3;
7760           else
7761             align = cum->words & 1;
7762           cum->words += align + rs6000_arg_size (mode, type);
7763
7764           if (TARGET_DEBUG_ARG)
7765             {
7766               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
7767                        cum->words, align);
7768               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
7769                        cum->nargs_prototype, cum->prototype,
7770                        GET_MODE_NAME (mode));
7771             }
7772         }
7773     }
7774   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
7775            && !cum->stdarg
7776            && cum->sysv_gregno <= GP_ARG_MAX_REG)
7777     cum->sysv_gregno++;
7778
7779   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
7780     {
7781       int size = int_size_in_bytes (type);
7782       /* Variable sized types have size == -1 and are
7783          treated as if consisting entirely of ints.
7784          Pad to 16 byte boundary if needed.  */
7785       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
7786           && (cum->words % 2) != 0)
7787         cum->words++;
7788       /* For varargs, we can just go up by the size of the struct. */
7789       if (!named)
7790         cum->words += (size + 7) / 8;
7791       else
7792         {
7793           /* It is tempting to say int register count just goes up by
7794              sizeof(type)/8, but this is wrong in a case such as
7795              { int; double; int; } [powerpc alignment].  We have to
7796              grovel through the fields for these too.  */
7797           cum->intoffset = 0;
7798           cum->floats_in_gpr = 0;
7799           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
7800           rs6000_darwin64_record_arg_advance_flush (cum,
7801                                                     size * BITS_PER_UNIT, 1);
7802         }
7803           if (TARGET_DEBUG_ARG)
7804             {
7805               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
7806                        cum->words, TYPE_ALIGN (type), size);
7807               fprintf (stderr, 
7808                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
7809                        cum->nargs_prototype, cum->prototype,
7810                        GET_MODE_NAME (mode));
7811             }
7812     }
7813   else if (DEFAULT_ABI == ABI_V4)
7814     {
7815       if (TARGET_HARD_FLOAT && TARGET_FPRS
7816           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
7817               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
7818               || (mode == TFmode && !TARGET_IEEEQUAD)
7819               || mode == SDmode || mode == DDmode || mode == TDmode))
7820         {
7821           /* _Decimal128 must use an even/odd register pair.  This assumes
7822              that the register number is odd when fregno is odd.  */
7823           if (mode == TDmode && (cum->fregno % 2) == 1)
7824             cum->fregno++;
7825
7826           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
7827               <= FP_ARG_V4_MAX_REG)
7828             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
7829           else
7830             {
7831               cum->fregno = FP_ARG_V4_MAX_REG + 1;
7832               if (mode == DFmode || mode == TFmode
7833                   || mode == DDmode || mode == TDmode)
7834                 cum->words += cum->words & 1;
7835               cum->words += rs6000_arg_size (mode, type);
7836             }
7837         }
7838       else
7839         {
7840           int n_words = rs6000_arg_size (mode, type);
7841           int gregno = cum->sysv_gregno;
7842
7843           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
7844              (r7,r8) or (r9,r10).  As does any other 2 word item such
7845              as complex int due to a historical mistake.  */
7846           if (n_words == 2)
7847             gregno += (1 - gregno) & 1;
7848
7849           /* Multi-reg args are not split between registers and stack.  */
7850           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
7851             {
7852               /* Long long and SPE vectors are aligned on the stack.
7853                  So are other 2 word items such as complex int due to
7854                  a historical mistake.  */
7855               if (n_words == 2)
7856                 cum->words += cum->words & 1;
7857               cum->words += n_words;
7858             }
7859
7860           /* Note: continuing to accumulate gregno past when we've started
7861              spilling to the stack indicates the fact that we've started
7862              spilling to the stack to expand_builtin_saveregs.  */
7863           cum->sysv_gregno = gregno + n_words;
7864         }
7865
7866       if (TARGET_DEBUG_ARG)
7867         {
7868           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
7869                    cum->words, cum->fregno);
7870           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
7871                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
7872           fprintf (stderr, "mode = %4s, named = %d\n",
7873                    GET_MODE_NAME (mode), named);
7874         }
7875     }
7876   else
7877     {
7878       int n_words = rs6000_arg_size (mode, type);
7879       int start_words = cum->words;
7880       int align_words = rs6000_parm_start (mode, type, start_words);
7881
7882       cum->words = align_words + n_words;
7883
7884       if (SCALAR_FLOAT_MODE_P (mode)
7885           && TARGET_HARD_FLOAT && TARGET_FPRS)
7886         {
7887           /* _Decimal128 must be passed in an even/odd float register pair.
7888              This assumes that the register number is odd when fregno is
7889              odd.  */
7890           if (mode == TDmode && (cum->fregno % 2) == 1)
7891             cum->fregno++;
7892           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
7893         }
7894
7895       if (TARGET_DEBUG_ARG)
7896         {
7897           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
7898                    cum->words, cum->fregno);
7899           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
7900                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
7901           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
7902                    named, align_words - start_words, depth);
7903         }
7904     }
7905 }
7906
7907 static rtx
7908 spe_build_register_parallel (enum machine_mode mode, int gregno)
7909 {
7910   rtx r1, r3, r5, r7;
7911
7912   switch (mode)
7913     {
7914     case DFmode:
7915       r1 = gen_rtx_REG (DImode, gregno);
7916       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
7917       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
7918
7919     case DCmode:
7920     case TFmode:
7921       r1 = gen_rtx_REG (DImode, gregno);
7922       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
7923       r3 = gen_rtx_REG (DImode, gregno + 2);
7924       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
7925       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
7926
7927     case TCmode:
7928       r1 = gen_rtx_REG (DImode, gregno);
7929       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
7930       r3 = gen_rtx_REG (DImode, gregno + 2);
7931       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
7932       r5 = gen_rtx_REG (DImode, gregno + 4);
7933       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
7934       r7 = gen_rtx_REG (DImode, gregno + 6);
7935       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
7936       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
7937
7938     default:
7939       gcc_unreachable ();
7940     }
7941 }
7942
7943 /* Determine where to put a SIMD argument on the SPE.  */
7944 static rtx
7945 rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
7946                          tree type)
7947 {
7948   int gregno = cum->sysv_gregno;
7949
7950   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
7951      are passed and returned in a pair of GPRs for ABI compatibility.  */
7952   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
7953                              || mode == DCmode || mode == TCmode))
7954     {
7955       int n_words = rs6000_arg_size (mode, type);
7956
7957       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
7958       if (mode == DFmode)
7959         gregno += (1 - gregno) & 1;
7960
7961       /* Multi-reg args are not split between registers and stack.  */
7962       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
7963         return NULL_RTX;
7964
7965       return spe_build_register_parallel (mode, gregno);
7966     }
7967   if (cum->stdarg)
7968     {
7969       int n_words = rs6000_arg_size (mode, type);
7970
7971       /* SPE vectors are put in odd registers.  */
7972       if (n_words == 2 && (gregno & 1) == 0)
7973         gregno += 1;
7974
7975       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
7976         {
7977           rtx r1, r2;
7978           enum machine_mode m = SImode;
7979
7980           r1 = gen_rtx_REG (m, gregno);
7981           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
7982           r2 = gen_rtx_REG (m, gregno + 1);
7983           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
7984           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
7985         }
7986       else
7987         return NULL_RTX;
7988     }
7989   else
7990     {
7991       if (gregno <= GP_ARG_MAX_REG)
7992         return gen_rtx_REG (mode, gregno);
7993       else
7994         return NULL_RTX;
7995     }
7996 }
7997
7998 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
7999    structure between cum->intoffset and bitpos to integer registers.  */
8000
8001 static void
8002 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
8003                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
8004 {
8005   enum machine_mode mode;
8006   unsigned int regno;
8007   unsigned int startbit, endbit;
8008   int this_regno, intregs, intoffset;
8009   rtx reg;
8010
8011   if (cum->intoffset == -1)
8012     return;
8013
8014   intoffset = cum->intoffset;
8015   cum->intoffset = -1;
8016
8017   /* If this is the trailing part of a word, try to only load that
8018      much into the register.  Otherwise load the whole register.  Note
8019      that in the latter case we may pick up unwanted bits.  It's not a
8020      problem at the moment but may wish to revisit.  */
8021
8022   if (intoffset % BITS_PER_WORD != 0)
8023     {
8024       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8025                           MODE_INT, 0);
8026       if (mode == BLKmode)
8027         {
8028           /* We couldn't find an appropriate mode, which happens,
8029              e.g., in packed structs when there are 3 bytes to load.
8030              Back intoffset back to the beginning of the word in this
8031              case.  */
8032          intoffset = intoffset & -BITS_PER_WORD;
8033          mode = word_mode;
8034         }
8035     }
8036   else
8037     mode = word_mode;
8038
8039   startbit = intoffset & -BITS_PER_WORD;
8040   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8041   intregs = (endbit - startbit) / BITS_PER_WORD;
8042   this_regno = cum->words + intoffset / BITS_PER_WORD;
8043
8044   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
8045     cum->use_stack = 1;
8046
8047   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
8048   if (intregs <= 0)
8049     return;
8050
8051   intoffset /= BITS_PER_UNIT;
8052   do
8053     {
8054       regno = GP_ARG_MIN_REG + this_regno;
8055       reg = gen_rtx_REG (mode, regno);
8056       rvec[(*k)++] =
8057         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
8058
8059       this_regno += 1;
8060       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
8061       mode = word_mode;
8062       intregs -= 1;
8063     }
8064   while (intregs > 0);
8065 }
8066
8067 /* Recursive workhorse for the following.  */
8068
8069 static void
8070 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
8071                                     HOST_WIDE_INT startbitpos, rtx rvec[],
8072                                     int *k)
8073 {
8074   tree f;
8075
8076   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8077     if (TREE_CODE (f) == FIELD_DECL)
8078       {
8079         HOST_WIDE_INT bitpos = startbitpos;
8080         tree ftype = TREE_TYPE (f);
8081         enum machine_mode mode;
8082         if (ftype == error_mark_node)
8083           continue;
8084         mode = TYPE_MODE (ftype);
8085
8086         if (DECL_SIZE (f) != 0
8087             && host_integerp (bit_position (f), 1))
8088           bitpos += int_bit_position (f);
8089
8090         /* ??? FIXME: else assume zero offset.  */
8091
8092         if (TREE_CODE (ftype) == RECORD_TYPE)
8093           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
8094         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
8095           {
8096 #if 0
8097             switch (mode)
8098               {
8099               case SCmode: mode = SFmode; break;
8100               case DCmode: mode = DFmode; break;
8101               case TCmode: mode = TFmode; break;
8102               default: break;
8103               }
8104 #endif
8105             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8106             rvec[(*k)++]
8107               = gen_rtx_EXPR_LIST (VOIDmode,
8108                                    gen_rtx_REG (mode, cum->fregno++),
8109                                    GEN_INT (bitpos / BITS_PER_UNIT));
8110             if (mode == TFmode || mode == TDmode)
8111               cum->fregno++;
8112           }
8113         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
8114           {
8115             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8116             rvec[(*k)++]
8117               = gen_rtx_EXPR_LIST (VOIDmode,
8118                                    gen_rtx_REG (mode, cum->vregno++),
8119                                    GEN_INT (bitpos / BITS_PER_UNIT));
8120           }
8121         else if (cum->intoffset == -1)
8122           cum->intoffset = bitpos;
8123       }
8124 }
8125
8126 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
8127    the register(s) to be used for each field and subfield of a struct
8128    being passed by value, along with the offset of where the
8129    register's value may be found in the block.  FP fields go in FP
8130    register, vector fields go in vector registers, and everything
8131    else goes in int registers, packed as in memory.
8132
8133    This code is also used for function return values.  RETVAL indicates
8134    whether this is the case.
8135
8136    Much of this is taken from the SPARC V9 port, which has a similar
8137    calling convention.  */
8138
8139 static rtx
8140 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
8141                             int named, bool retval)
8142 {
8143   rtx rvec[FIRST_PSEUDO_REGISTER];
8144   int k = 1, kbase = 1;
8145   HOST_WIDE_INT typesize = int_size_in_bytes (type);
8146   /* This is a copy; modifications are not visible to our caller.  */
8147   CUMULATIVE_ARGS copy_cum = *orig_cum;
8148   CUMULATIVE_ARGS *cum = &copy_cum;
8149
8150   /* Pad to 16 byte boundary if needed.  */
8151   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8152       && (cum->words % 2) != 0)
8153     cum->words++;
8154
8155   cum->intoffset = 0;
8156   cum->use_stack = 0;
8157   cum->named = named;
8158
8159   /* Put entries into rvec[] for individual FP and vector fields, and
8160      for the chunks of memory that go in int regs.  Note we start at
8161      element 1; 0 is reserved for an indication of using memory, and
8162      may or may not be filled in below. */
8163   rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
8164   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
8165
8166   /* If any part of the struct went on the stack put all of it there.
8167      This hack is because the generic code for
8168      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
8169      parts of the struct are not at the beginning.  */
8170   if (cum->use_stack)
8171     {
8172       if (retval)
8173         return NULL_RTX;    /* doesn't go in registers at all */
8174       kbase = 0;
8175       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8176     }
8177   if (k > 1 || cum->use_stack)
8178     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
8179   else
8180     return NULL_RTX;
8181 }
8182
8183 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
8184
8185 static rtx
8186 rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
8187 {
8188   int n_units;
8189   int i, k;
8190   rtx rvec[GP_ARG_NUM_REG + 1];
8191
8192   if (align_words >= GP_ARG_NUM_REG)
8193     return NULL_RTX;
8194
8195   n_units = rs6000_arg_size (mode, type);
8196
8197   /* Optimize the simple case where the arg fits in one gpr, except in
8198      the case of BLKmode due to assign_parms assuming that registers are
8199      BITS_PER_WORD wide.  */
8200   if (n_units == 0
8201       || (n_units == 1 && mode != BLKmode))
8202     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8203
8204   k = 0;
8205   if (align_words + n_units > GP_ARG_NUM_REG)
8206     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
8207        using a magic NULL_RTX component.
8208        This is not strictly correct.  Only some of the arg belongs in
8209        memory, not all of it.  However, the normal scheme using
8210        function_arg_partial_nregs can result in unusual subregs, eg.
8211        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
8212        store the whole arg to memory is often more efficient than code
8213        to store pieces, and we know that space is available in the right
8214        place for the whole arg.  */
8215     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8216
8217   i = 0;
8218   do
8219     {
8220       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
8221       rtx off = GEN_INT (i++ * 4);
8222       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8223     }
8224   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
8225
8226   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8227 }
8228
8229 /* Determine where to put an argument to a function.
8230    Value is zero to push the argument on the stack,
8231    or a hard register in which to store the argument.
8232
8233    MODE is the argument's machine mode.
8234    TYPE is the data type of the argument (as a tree).
8235     This is null for libcalls where that information may
8236     not be available.
8237    CUM is a variable of type CUMULATIVE_ARGS which gives info about
8238     the preceding args and about the function being called.  It is
8239     not modified in this routine.
8240    NAMED is nonzero if this argument is a named parameter
8241     (otherwise it is an extra parameter matching an ellipsis).
8242
8243    On RS/6000 the first eight words of non-FP are normally in registers
8244    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
8245    Under V.4, the first 8 FP args are in registers.
8246
8247    If this is floating-point and no prototype is specified, we use
8248    both an FP and integer register (or possibly FP reg and stack).  Library
8249    functions (when CALL_LIBCALL is set) always have the proper types for args,
8250    so we can pass the FP value just in one register.  emit_library_function
8251    doesn't support PARALLEL anyway.
8252
8253    Note that for args passed by reference, function_arg will be called
8254    with MODE and TYPE set to that of the pointer to the arg, not the arg
8255    itself.  */
8256
8257 rtx
8258 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8259               tree type, int named)
8260 {
8261   enum rs6000_abi abi = DEFAULT_ABI;
8262
8263   /* Return a marker to indicate whether CR1 needs to set or clear the
8264      bit that V.4 uses to say fp args were passed in registers.
8265      Assume that we don't need the marker for software floating point,
8266      or compiler generated library calls.  */
8267   if (mode == VOIDmode)
8268     {
8269       if (abi == ABI_V4
8270           && (cum->call_cookie & CALL_LIBCALL) == 0
8271           && (cum->stdarg
8272               || (cum->nargs_prototype < 0
8273                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
8274         {
8275           /* For the SPE, we need to crxor CR6 always.  */
8276           if (TARGET_SPE_ABI)
8277             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
8278           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
8279             return GEN_INT (cum->call_cookie
8280                             | ((cum->fregno == FP_ARG_MIN_REG)
8281                                ? CALL_V4_SET_FP_ARGS
8282                                : CALL_V4_CLEAR_FP_ARGS));
8283         }
8284
8285       return GEN_INT (cum->call_cookie);
8286     }
8287
8288   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8289     {
8290       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
8291       if (rslt != NULL_RTX)
8292         return rslt;
8293       /* Else fall through to usual handling.  */
8294     }
8295
8296   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8297     if (TARGET_64BIT && ! cum->prototype)
8298       {
8299         /* Vector parameters get passed in vector register
8300            and also in GPRs or memory, in absence of prototype.  */
8301         int align_words;
8302         rtx slot;
8303         align_words = (cum->words + 1) & ~1;
8304
8305         if (align_words >= GP_ARG_NUM_REG)
8306           {
8307             slot = NULL_RTX;
8308           }
8309         else
8310           {
8311             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8312           }
8313         return gen_rtx_PARALLEL (mode,
8314                  gen_rtvec (2,
8315                             gen_rtx_EXPR_LIST (VOIDmode,
8316                                                slot, const0_rtx),
8317                             gen_rtx_EXPR_LIST (VOIDmode,
8318                                                gen_rtx_REG (mode, cum->vregno),
8319                                                const0_rtx)));
8320       }
8321     else
8322       return gen_rtx_REG (mode, cum->vregno);
8323   else if (TARGET_ALTIVEC_ABI
8324            && (ALTIVEC_VECTOR_MODE (mode)
8325                || VSX_VECTOR_MODE (mode)
8326                || (type && TREE_CODE (type) == VECTOR_TYPE
8327                    && int_size_in_bytes (type) == 16)))
8328     {
8329       if (named || abi == ABI_V4)
8330         return NULL_RTX;
8331       else
8332         {
8333           /* Vector parameters to varargs functions under AIX or Darwin
8334              get passed in memory and possibly also in GPRs.  */
8335           int align, align_words, n_words;
8336           enum machine_mode part_mode;
8337
8338           /* Vector parameters must be 16-byte aligned.  This places them at
8339              2 mod 4 in terms of words in 32-bit mode, since the parameter
8340              save area starts at offset 24 from the stack.  In 64-bit mode,
8341              they just have to start on an even word, since the parameter
8342              save area is 16-byte aligned.  */
8343           if (TARGET_32BIT)
8344             align = (2 - cum->words) & 3;
8345           else
8346             align = cum->words & 1;
8347           align_words = cum->words + align;
8348
8349           /* Out of registers?  Memory, then.  */
8350           if (align_words >= GP_ARG_NUM_REG)
8351             return NULL_RTX;
8352
8353           if (TARGET_32BIT && TARGET_POWERPC64)
8354             return rs6000_mixed_function_arg (mode, type, align_words);
8355
8356           /* The vector value goes in GPRs.  Only the part of the
8357              value in GPRs is reported here.  */
8358           part_mode = mode;
8359           n_words = rs6000_arg_size (mode, type);
8360           if (align_words + n_words > GP_ARG_NUM_REG)
8361             /* Fortunately, there are only two possibilities, the value
8362                is either wholly in GPRs or half in GPRs and half not.  */
8363             part_mode = DImode;
8364
8365           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
8366         }
8367     }
8368   else if (TARGET_SPE_ABI && TARGET_SPE
8369            && (SPE_VECTOR_MODE (mode)
8370                || (TARGET_E500_DOUBLE && (mode == DFmode
8371                                           || mode == DCmode
8372                                           || mode == TFmode
8373                                           || mode == TCmode))))
8374     return rs6000_spe_function_arg (cum, mode, type);
8375
8376   else if (abi == ABI_V4)
8377     {
8378       if (TARGET_HARD_FLOAT && TARGET_FPRS
8379           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8380               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8381               || (mode == TFmode && !TARGET_IEEEQUAD)
8382               || mode == SDmode || mode == DDmode || mode == TDmode))
8383         {
8384           /* _Decimal128 must use an even/odd register pair.  This assumes
8385              that the register number is odd when fregno is odd.  */
8386           if (mode == TDmode && (cum->fregno % 2) == 1)
8387             cum->fregno++;
8388
8389           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8390               <= FP_ARG_V4_MAX_REG)
8391             return gen_rtx_REG (mode, cum->fregno);
8392           else
8393             return NULL_RTX;
8394         }
8395       else
8396         {
8397           int n_words = rs6000_arg_size (mode, type);
8398           int gregno = cum->sysv_gregno;
8399
8400           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8401              (r7,r8) or (r9,r10).  As does any other 2 word item such
8402              as complex int due to a historical mistake.  */
8403           if (n_words == 2)
8404             gregno += (1 - gregno) & 1;
8405
8406           /* Multi-reg args are not split between registers and stack.  */
8407           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8408             return NULL_RTX;
8409
8410           if (TARGET_32BIT && TARGET_POWERPC64)
8411             return rs6000_mixed_function_arg (mode, type,
8412                                               gregno - GP_ARG_MIN_REG);
8413           return gen_rtx_REG (mode, gregno);
8414         }
8415     }
8416   else
8417     {
8418       int align_words = rs6000_parm_start (mode, type, cum->words);
8419
8420       /* _Decimal128 must be passed in an even/odd float register pair.
8421          This assumes that the register number is odd when fregno is odd.  */
8422       if (mode == TDmode && (cum->fregno % 2) == 1)
8423         cum->fregno++;
8424
8425       if (USE_FP_FOR_ARG_P (cum, mode, type))
8426         {
8427           rtx rvec[GP_ARG_NUM_REG + 1];
8428           rtx r;
8429           int k;
8430           bool needs_psave;
8431           enum machine_mode fmode = mode;
8432           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8433
8434           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8435             {
8436               /* Currently, we only ever need one reg here because complex
8437                  doubles are split.  */
8438               gcc_assert (cum->fregno == FP_ARG_MAX_REG
8439                           && (fmode == TFmode || fmode == TDmode));
8440
8441               /* Long double or _Decimal128 split over regs and memory.  */
8442               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
8443             }
8444
8445           /* Do we also need to pass this arg in the parameter save
8446              area?  */
8447           needs_psave = (type
8448                          && (cum->nargs_prototype <= 0
8449                              || (DEFAULT_ABI == ABI_AIX
8450                                  && TARGET_XL_COMPAT
8451                                  && align_words >= GP_ARG_NUM_REG)));
8452
8453           if (!needs_psave && mode == fmode)
8454             return gen_rtx_REG (fmode, cum->fregno);
8455
8456           k = 0;
8457           if (needs_psave)
8458             {
8459               /* Describe the part that goes in gprs or the stack.
8460                  This piece must come first, before the fprs.  */
8461               if (align_words < GP_ARG_NUM_REG)
8462                 {
8463                   unsigned long n_words = rs6000_arg_size (mode, type);
8464
8465                   if (align_words + n_words > GP_ARG_NUM_REG
8466                       || (TARGET_32BIT && TARGET_POWERPC64))
8467                     {
8468                       /* If this is partially on the stack, then we only
8469                          include the portion actually in registers here.  */
8470                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
8471                       rtx off;
8472                       int i = 0;
8473                       if (align_words + n_words > GP_ARG_NUM_REG)
8474                         /* Not all of the arg fits in gprs.  Say that it
8475                            goes in memory too, using a magic NULL_RTX
8476                            component.  Also see comment in
8477                            rs6000_mixed_function_arg for why the normal
8478                            function_arg_partial_nregs scheme doesn't work
8479                            in this case. */
8480                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
8481                                                        const0_rtx);
8482                       do
8483                         {
8484                           r = gen_rtx_REG (rmode,
8485                                            GP_ARG_MIN_REG + align_words);
8486                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
8487                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8488                         }
8489                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
8490                     }
8491                   else
8492                     {
8493                       /* The whole arg fits in gprs.  */
8494                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8495                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8496                     }
8497                 }
8498               else
8499                 /* It's entirely in memory.  */
8500                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8501             }
8502
8503           /* Describe where this piece goes in the fprs.  */
8504           r = gen_rtx_REG (fmode, cum->fregno);
8505           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8506
8507           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8508         }
8509       else if (align_words < GP_ARG_NUM_REG)
8510         {
8511           if (TARGET_32BIT && TARGET_POWERPC64)
8512             return rs6000_mixed_function_arg (mode, type, align_words);
8513
8514           if (mode == BLKmode)
8515             mode = Pmode;
8516
8517           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8518         }
8519       else
8520         return NULL_RTX;
8521     }
8522 }
8523 \f
8524 /* For an arg passed partly in registers and partly in memory, this is
8525    the number of bytes passed in registers.  For args passed entirely in
8526    registers or entirely in memory, zero.  When an arg is described by a
8527    PARALLEL, perhaps using more than one register type, this function
8528    returns the number of bytes used by the first element of the PARALLEL.  */
8529
8530 static int
8531 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8532                           tree type, bool named)
8533 {
8534   int ret = 0;
8535   int align_words;
8536
8537   if (DEFAULT_ABI == ABI_V4)
8538     return 0;
8539
8540   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
8541       && cum->nargs_prototype >= 0)
8542     return 0;
8543
8544   /* In this complicated case we just disable the partial_nregs code.  */
8545   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8546     return 0;
8547
8548   align_words = rs6000_parm_start (mode, type, cum->words);
8549
8550   if (USE_FP_FOR_ARG_P (cum, mode, type))
8551     {
8552       /* If we are passing this arg in the fixed parameter save area
8553          (gprs or memory) as well as fprs, then this function should
8554          return the number of partial bytes passed in the parameter
8555          save area rather than partial bytes passed in fprs.  */
8556       if (type
8557           && (cum->nargs_prototype <= 0
8558               || (DEFAULT_ABI == ABI_AIX
8559                   && TARGET_XL_COMPAT
8560                   && align_words >= GP_ARG_NUM_REG)))
8561         return 0;
8562       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
8563                > FP_ARG_MAX_REG + 1)
8564         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
8565       else if (cum->nargs_prototype >= 0)
8566         return 0;
8567     }
8568
8569   if (align_words < GP_ARG_NUM_REG
8570       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
8571     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
8572
8573   if (ret != 0 && TARGET_DEBUG_ARG)
8574     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
8575
8576   return ret;
8577 }
8578 \f
8579 /* A C expression that indicates when an argument must be passed by
8580    reference.  If nonzero for an argument, a copy of that argument is
8581    made in memory and a pointer to the argument is passed instead of
8582    the argument itself.  The pointer is passed in whatever way is
8583    appropriate for passing a pointer to that type.
8584
8585    Under V.4, aggregates and long double are passed by reference.
8586
8587    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
8588    reference unless the AltiVec vector extension ABI is in force.
8589
8590    As an extension to all ABIs, variable sized types are passed by
8591    reference.  */
8592
8593 static bool
8594 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
8595                           enum machine_mode mode, const_tree type,
8596                           bool named ATTRIBUTE_UNUSED)
8597 {
8598   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
8599     {
8600       if (TARGET_DEBUG_ARG)
8601         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
8602       return 1;
8603     }
8604
8605   if (!type)
8606     return 0;
8607
8608   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
8609     {
8610       if (TARGET_DEBUG_ARG)
8611         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
8612       return 1;
8613     }
8614
8615   if (int_size_in_bytes (type) < 0)
8616     {
8617       if (TARGET_DEBUG_ARG)
8618         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
8619       return 1;
8620     }
8621
8622   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
8623      modes only exist for GCC vector types if -maltivec.  */
8624   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
8625     {
8626       if (TARGET_DEBUG_ARG)
8627         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
8628       return 1;
8629     }
8630
8631   /* Pass synthetic vectors in memory.  */
8632   if (TREE_CODE (type) == VECTOR_TYPE
8633       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
8634     {
8635       static bool warned_for_pass_big_vectors = false;
8636       if (TARGET_DEBUG_ARG)
8637         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
8638       if (!warned_for_pass_big_vectors)
8639         {
8640           warning (0, "GCC vector passed by reference: "
8641                    "non-standard ABI extension with no compatibility guarantee");
8642           warned_for_pass_big_vectors = true;
8643         }
8644       return 1;
8645     }
8646
8647   return 0;
8648 }
8649
8650 static void
8651 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
8652 {
8653   int i;
8654   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
8655
8656   if (nregs == 0)
8657     return;
8658
8659   for (i = 0; i < nregs; i++)
8660     {
8661       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
8662       if (reload_completed)
8663         {
8664           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
8665             tem = NULL_RTX;
8666           else
8667             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
8668                                        i * GET_MODE_SIZE (reg_mode));
8669         }
8670       else
8671         tem = replace_equiv_address (tem, XEXP (tem, 0));
8672
8673       gcc_assert (tem);
8674
8675       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
8676     }
8677 }
8678 \f
8679 /* Perform any needed actions needed for a function that is receiving a
8680    variable number of arguments.
8681
8682    CUM is as above.
8683
8684    MODE and TYPE are the mode and type of the current parameter.
8685
8686    PRETEND_SIZE is a variable that should be set to the amount of stack
8687    that must be pushed by the prolog to pretend that our caller pushed
8688    it.
8689
8690    Normally, this macro will push all remaining incoming registers on the
8691    stack and set PRETEND_SIZE to the length of the registers pushed.  */
8692
8693 static void
8694 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8695                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
8696                         int no_rtl)
8697 {
8698   CUMULATIVE_ARGS next_cum;
8699   int reg_size = TARGET_32BIT ? 4 : 8;
8700   rtx save_area = NULL_RTX, mem;
8701   int first_reg_offset;
8702   alias_set_type set;
8703
8704   /* Skip the last named argument.  */
8705   next_cum = *cum;
8706   function_arg_advance (&next_cum, mode, type, 1, 0);
8707
8708   if (DEFAULT_ABI == ABI_V4)
8709     {
8710       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
8711
8712       if (! no_rtl)
8713         {
8714           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
8715           HOST_WIDE_INT offset = 0;
8716
8717           /* Try to optimize the size of the varargs save area.
8718              The ABI requires that ap.reg_save_area is doubleword
8719              aligned, but we don't need to allocate space for all
8720              the bytes, only those to which we actually will save
8721              anything.  */
8722           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
8723             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
8724           if (TARGET_HARD_FLOAT && TARGET_FPRS
8725               && next_cum.fregno <= FP_ARG_V4_MAX_REG
8726               && cfun->va_list_fpr_size)
8727             {
8728               if (gpr_reg_num)
8729                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
8730                            * UNITS_PER_FP_WORD;
8731               if (cfun->va_list_fpr_size
8732                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
8733                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
8734               else
8735                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
8736                             * UNITS_PER_FP_WORD;
8737             }
8738           if (gpr_reg_num)
8739             {
8740               offset = -((first_reg_offset * reg_size) & ~7);
8741               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
8742                 {
8743                   gpr_reg_num = cfun->va_list_gpr_size;
8744                   if (reg_size == 4 && (first_reg_offset & 1))
8745                     gpr_reg_num++;
8746                 }
8747               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
8748             }
8749           else if (fpr_size)
8750             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
8751                        * UNITS_PER_FP_WORD
8752                      - (int) (GP_ARG_NUM_REG * reg_size);
8753
8754           if (gpr_size + fpr_size)
8755             {
8756               rtx reg_save_area
8757                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
8758               gcc_assert (GET_CODE (reg_save_area) == MEM);
8759               reg_save_area = XEXP (reg_save_area, 0);
8760               if (GET_CODE (reg_save_area) == PLUS)
8761                 {
8762                   gcc_assert (XEXP (reg_save_area, 0)
8763                               == virtual_stack_vars_rtx);
8764                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
8765                   offset += INTVAL (XEXP (reg_save_area, 1));
8766                 }
8767               else
8768                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
8769             }
8770
8771           cfun->machine->varargs_save_offset = offset;
8772           save_area = plus_constant (virtual_stack_vars_rtx, offset);
8773         }
8774     }
8775   else
8776     {
8777       first_reg_offset = next_cum.words;
8778       save_area = virtual_incoming_args_rtx;
8779
8780       if (targetm.calls.must_pass_in_stack (mode, type))
8781         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
8782     }
8783
8784   set = get_varargs_alias_set ();
8785   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
8786       && cfun->va_list_gpr_size)
8787     {
8788       int nregs = GP_ARG_NUM_REG - first_reg_offset;
8789
8790       if (va_list_gpr_counter_field)
8791         {
8792           /* V4 va_list_gpr_size counts number of registers needed.  */
8793           if (nregs > cfun->va_list_gpr_size)
8794             nregs = cfun->va_list_gpr_size;
8795         }
8796       else
8797         {
8798           /* char * va_list instead counts number of bytes needed.  */
8799           if (nregs > cfun->va_list_gpr_size / reg_size)
8800             nregs = cfun->va_list_gpr_size / reg_size;
8801         }
8802
8803       mem = gen_rtx_MEM (BLKmode,
8804                          plus_constant (save_area,
8805                                         first_reg_offset * reg_size));
8806       MEM_NOTRAP_P (mem) = 1;
8807       set_mem_alias_set (mem, set);
8808       set_mem_align (mem, BITS_PER_WORD);
8809
8810       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
8811                                   nregs);
8812     }
8813
8814   /* Save FP registers if needed.  */
8815   if (DEFAULT_ABI == ABI_V4
8816       && TARGET_HARD_FLOAT && TARGET_FPRS
8817       && ! no_rtl
8818       && next_cum.fregno <= FP_ARG_V4_MAX_REG
8819       && cfun->va_list_fpr_size)
8820     {
8821       int fregno = next_cum.fregno, nregs;
8822       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
8823       rtx lab = gen_label_rtx ();
8824       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
8825                                                * UNITS_PER_FP_WORD);
8826
8827       emit_jump_insn
8828         (gen_rtx_SET (VOIDmode,
8829                       pc_rtx,
8830                       gen_rtx_IF_THEN_ELSE (VOIDmode,
8831                                             gen_rtx_NE (VOIDmode, cr1,
8832                                                         const0_rtx),
8833                                             gen_rtx_LABEL_REF (VOIDmode, lab),
8834                                             pc_rtx)));
8835
8836       for (nregs = 0;
8837            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
8838            fregno++, off += UNITS_PER_FP_WORD, nregs++)
8839         {
8840           mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
8841                               ? DFmode : SFmode, 
8842                              plus_constant (save_area, off));
8843           MEM_NOTRAP_P (mem) = 1;
8844           set_mem_alias_set (mem, set);
8845           set_mem_align (mem, GET_MODE_ALIGNMENT (
8846                          (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
8847                           ? DFmode : SFmode));
8848           emit_move_insn (mem, gen_rtx_REG (
8849                           (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
8850                            ? DFmode : SFmode, fregno));
8851         }
8852
8853       emit_label (lab);
8854     }
8855 }
8856
8857 /* Create the va_list data type.  */
8858
8859 static tree
8860 rs6000_build_builtin_va_list (void)
8861 {
8862   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
8863
8864   /* For AIX, prefer 'char *' because that's what the system
8865      header files like.  */
8866   if (DEFAULT_ABI != ABI_V4)
8867     return build_pointer_type (char_type_node);
8868
8869   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
8870   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
8871                           get_identifier ("__va_list_tag"), record);
8872
8873   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
8874                       unsigned_char_type_node);
8875   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
8876                       unsigned_char_type_node);
8877   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
8878      every user file.  */
8879   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
8880                       get_identifier ("reserved"), short_unsigned_type_node);
8881   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
8882                       get_identifier ("overflow_arg_area"),
8883                       ptr_type_node);
8884   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
8885                       get_identifier ("reg_save_area"),
8886                       ptr_type_node);
8887
8888   va_list_gpr_counter_field = f_gpr;
8889   va_list_fpr_counter_field = f_fpr;
8890
8891   DECL_FIELD_CONTEXT (f_gpr) = record;
8892   DECL_FIELD_CONTEXT (f_fpr) = record;
8893   DECL_FIELD_CONTEXT (f_res) = record;
8894   DECL_FIELD_CONTEXT (f_ovf) = record;
8895   DECL_FIELD_CONTEXT (f_sav) = record;
8896
8897   TREE_CHAIN (record) = type_decl;
8898   TYPE_NAME (record) = type_decl;
8899   TYPE_FIELDS (record) = f_gpr;
8900   DECL_CHAIN (f_gpr) = f_fpr;
8901   DECL_CHAIN (f_fpr) = f_res;
8902   DECL_CHAIN (f_res) = f_ovf;
8903   DECL_CHAIN (f_ovf) = f_sav;
8904
8905   layout_type (record);
8906
8907   /* The correct type is an array type of one element.  */
8908   return build_array_type (record, build_index_type (size_zero_node));
8909 }
8910
8911 /* Implement va_start.  */
8912
8913 static void
8914 rs6000_va_start (tree valist, rtx nextarg)
8915 {
8916   HOST_WIDE_INT words, n_gpr, n_fpr;
8917   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
8918   tree gpr, fpr, ovf, sav, t;
8919
8920   /* Only SVR4 needs something special.  */
8921   if (DEFAULT_ABI != ABI_V4)
8922     {
8923       std_expand_builtin_va_start (valist, nextarg);
8924       return;
8925     }
8926
8927   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
8928   f_fpr = DECL_CHAIN (f_gpr);
8929   f_res = DECL_CHAIN (f_fpr);
8930   f_ovf = DECL_CHAIN (f_res);
8931   f_sav = DECL_CHAIN (f_ovf);
8932
8933   valist = build_va_arg_indirect_ref (valist);
8934   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
8935   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
8936                 f_fpr, NULL_TREE);
8937   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
8938                 f_ovf, NULL_TREE);
8939   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
8940                 f_sav, NULL_TREE);
8941
8942   /* Count number of gp and fp argument registers used.  */
8943   words = crtl->args.info.words;
8944   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
8945                GP_ARG_NUM_REG);
8946   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
8947                FP_ARG_NUM_REG);
8948
8949   if (TARGET_DEBUG_ARG)
8950     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
8951              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
8952              words, n_gpr, n_fpr);
8953
8954   if (cfun->va_list_gpr_size)
8955     {
8956       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
8957                   build_int_cst (NULL_TREE, n_gpr));
8958       TREE_SIDE_EFFECTS (t) = 1;
8959       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8960     }
8961
8962   if (cfun->va_list_fpr_size)
8963     {
8964       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
8965                   build_int_cst (NULL_TREE, n_fpr));
8966       TREE_SIDE_EFFECTS (t) = 1;
8967       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8968     }
8969
8970   /* Find the overflow area.  */
8971   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
8972   if (words != 0)
8973     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
8974                 size_int (words * UNITS_PER_WORD));
8975   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
8976   TREE_SIDE_EFFECTS (t) = 1;
8977   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8978
8979   /* If there were no va_arg invocations, don't set up the register
8980      save area.  */
8981   if (!cfun->va_list_gpr_size
8982       && !cfun->va_list_fpr_size
8983       && n_gpr < GP_ARG_NUM_REG
8984       && n_fpr < FP_ARG_V4_MAX_REG)
8985     return;
8986
8987   /* Find the register save area.  */
8988   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
8989   if (cfun->machine->varargs_save_offset)
8990     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
8991                 size_int (cfun->machine->varargs_save_offset));
8992   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
8993   TREE_SIDE_EFFECTS (t) = 1;
8994   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8995 }
8996
8997 /* Implement va_arg.  */
8998
8999 tree
9000 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
9001                         gimple_seq *post_p)
9002 {
9003   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9004   tree gpr, fpr, ovf, sav, reg, t, u;
9005   int size, rsize, n_reg, sav_ofs, sav_scale;
9006   tree lab_false, lab_over, addr;
9007   int align;
9008   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
9009   int regalign = 0;
9010   gimple stmt;
9011
9012   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
9013     {
9014       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
9015       return build_va_arg_indirect_ref (t);
9016     }
9017
9018   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
9019      earlier version of gcc, with the property that it always applied alignment
9020      adjustments to the va-args (even for zero-sized types).  The cheapest way
9021      to deal with this is to replicate the effect of the part of 
9022      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
9023      of relevance.  
9024      We don't need to check for pass-by-reference because of the test above.
9025      We can return a simplifed answer, since we know there's no offset to add.  */
9026
9027   if (TARGET_MACHO
9028       && rs6000_darwin64_abi 
9029       && integer_zerop (TYPE_SIZE (type)))
9030     {
9031       unsigned HOST_WIDE_INT align, boundary;
9032       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
9033       align = PARM_BOUNDARY / BITS_PER_UNIT;
9034       boundary = FUNCTION_ARG_BOUNDARY (TYPE_MODE (type), type);
9035       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
9036         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
9037       boundary /= BITS_PER_UNIT;
9038       if (boundary > align)
9039         {
9040           tree t ;
9041           /* This updates arg ptr by the amount that would be necessary
9042              to align the zero-sized (but not zero-alignment) item.  */
9043           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9044                   fold_build2 (POINTER_PLUS_EXPR,
9045                                TREE_TYPE (valist),
9046                                valist_tmp, size_int (boundary - 1)));
9047           gimplify_and_add (t, pre_p);
9048
9049           t = fold_convert (sizetype, valist_tmp);
9050           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9051                   fold_convert (TREE_TYPE (valist),
9052                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
9053                                              size_int (-boundary))));
9054           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
9055           gimplify_and_add (t, pre_p);
9056         }
9057       /* Since it is zero-sized there's no increment for the item itself. */
9058       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
9059       return build_va_arg_indirect_ref (valist_tmp);
9060     }
9061
9062   if (DEFAULT_ABI != ABI_V4)
9063     {
9064       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
9065         {
9066           tree elem_type = TREE_TYPE (type);
9067           enum machine_mode elem_mode = TYPE_MODE (elem_type);
9068           int elem_size = GET_MODE_SIZE (elem_mode);
9069
9070           if (elem_size < UNITS_PER_WORD)
9071             {
9072               tree real_part, imag_part;
9073               gimple_seq post = NULL;
9074
9075               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9076                                                   &post);
9077               /* Copy the value into a temporary, lest the formal temporary
9078                  be reused out from under us.  */
9079               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
9080               gimple_seq_add_seq (pre_p, post);
9081
9082               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9083                                                   post_p);
9084
9085               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
9086             }
9087         }
9088
9089       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
9090     }
9091
9092   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9093   f_fpr = DECL_CHAIN (f_gpr);
9094   f_res = DECL_CHAIN (f_fpr);
9095   f_ovf = DECL_CHAIN (f_res);
9096   f_sav = DECL_CHAIN (f_ovf);
9097
9098   valist = build_va_arg_indirect_ref (valist);
9099   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9100   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9101                 f_fpr, NULL_TREE);
9102   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9103                 f_ovf, NULL_TREE);
9104   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9105                 f_sav, NULL_TREE);
9106
9107   size = int_size_in_bytes (type);
9108   rsize = (size + 3) / 4;
9109   align = 1;
9110
9111   if (TARGET_HARD_FLOAT && TARGET_FPRS
9112       && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
9113           || (TARGET_DOUBLE_FLOAT 
9114               && (TYPE_MODE (type) == DFmode 
9115                   || TYPE_MODE (type) == TFmode
9116                   || TYPE_MODE (type) == SDmode
9117                   || TYPE_MODE (type) == DDmode
9118                   || TYPE_MODE (type) == TDmode))))
9119     {
9120       /* FP args go in FP registers, if present.  */
9121       reg = fpr;
9122       n_reg = (size + 7) / 8;
9123       sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
9124       sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
9125       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
9126         align = 8;
9127     }
9128   else
9129     {
9130       /* Otherwise into GP registers.  */
9131       reg = gpr;
9132       n_reg = rsize;
9133       sav_ofs = 0;
9134       sav_scale = 4;
9135       if (n_reg == 2)
9136         align = 8;
9137     }
9138
9139   /* Pull the value out of the saved registers....  */
9140
9141   lab_over = NULL;
9142   addr = create_tmp_var (ptr_type_node, "addr");
9143
9144   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
9145   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
9146     align = 16;
9147   else
9148     {
9149       lab_false = create_artificial_label (input_location);
9150       lab_over = create_artificial_label (input_location);
9151
9152       /* Long long and SPE vectors are aligned in the registers.
9153          As are any other 2 gpr item such as complex int due to a
9154          historical mistake.  */
9155       u = reg;
9156       if (n_reg == 2 && reg == gpr)
9157         {
9158           regalign = 1;
9159           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9160                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
9161           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
9162                       unshare_expr (reg), u);
9163         }
9164       /* _Decimal128 is passed in even/odd fpr pairs; the stored
9165          reg number is 0 for f1, so we want to make it odd.  */
9166       else if (reg == fpr && TYPE_MODE (type) == TDmode)
9167         {
9168           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9169                       build_int_cst (TREE_TYPE (reg), 1));
9170           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
9171         }
9172
9173       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
9174       t = build2 (GE_EXPR, boolean_type_node, u, t);
9175       u = build1 (GOTO_EXPR, void_type_node, lab_false);
9176       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
9177       gimplify_and_add (t, pre_p);
9178
9179       t = sav;
9180       if (sav_ofs)
9181         t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
9182
9183       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9184                   build_int_cst (TREE_TYPE (reg), n_reg));
9185       u = fold_convert (sizetype, u);
9186       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
9187       t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
9188
9189       /* _Decimal32 varargs are located in the second word of the 64-bit
9190          FP register for 32-bit binaries.  */
9191       if (!TARGET_POWERPC64
9192           && TARGET_HARD_FLOAT && TARGET_FPRS
9193           && TYPE_MODE (type) == SDmode)
9194         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9195
9196       gimplify_assign (addr, t, pre_p);
9197
9198       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
9199
9200       stmt = gimple_build_label (lab_false);
9201       gimple_seq_add_stmt (pre_p, stmt);
9202
9203       if ((n_reg == 2 && !regalign) || n_reg > 2)
9204         {
9205           /* Ensure that we don't find any more args in regs.
9206              Alignment has taken care of for special cases.  */
9207           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
9208         }
9209     }
9210
9211   /* ... otherwise out of the overflow area.  */
9212
9213   /* Care for on-stack alignment if needed.  */
9214   t = ovf;
9215   if (align != 1)
9216     {
9217       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
9218       t = fold_convert (sizetype, t);
9219       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
9220                   size_int (-align));
9221       t = fold_convert (TREE_TYPE (ovf), t);
9222     }
9223   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
9224
9225   gimplify_assign (unshare_expr (addr), t, pre_p);
9226
9227   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9228   gimplify_assign (unshare_expr (ovf), t, pre_p);
9229
9230   if (lab_over)
9231     {
9232       stmt = gimple_build_label (lab_over);
9233       gimple_seq_add_stmt (pre_p, stmt);
9234     }
9235
9236   if (STRICT_ALIGNMENT
9237       && (TYPE_ALIGN (type)
9238           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
9239     {
9240       /* The value (of type complex double, for example) may not be
9241          aligned in memory in the saved registers, so copy via a
9242          temporary.  (This is the same code as used for SPARC.)  */
9243       tree tmp = create_tmp_var (type, "va_arg_tmp");
9244       tree dest_addr = build_fold_addr_expr (tmp);
9245
9246       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
9247                                    3, dest_addr, addr, size_int (rsize * 4));
9248
9249       gimplify_and_add (copy, pre_p);
9250       addr = dest_addr;
9251     }
9252
9253   addr = fold_convert (ptrtype, addr);
9254   return build_va_arg_indirect_ref (addr);
9255 }
9256
9257 /* Builtins.  */
9258
9259 static void
9260 def_builtin (int mask, const char *name, tree type, int code)
9261 {
9262   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
9263     {
9264       tree t;
9265       if (rs6000_builtin_decls[code])
9266         fatal_error ("internal error: builtin function to %s already processed.",
9267                      name);
9268
9269       rs6000_builtin_decls[code] = t =
9270         add_builtin_function (name, type, code, BUILT_IN_MD,
9271                               NULL, NULL_TREE);
9272
9273       gcc_assert (code >= 0 && code < (int)RS6000_BUILTIN_COUNT);
9274       switch (builtin_classify[code])
9275         {
9276         default:
9277           gcc_unreachable ();
9278
9279           /* assume builtin can do anything.  */
9280         case RS6000_BTC_MISC:
9281           break;
9282
9283           /* const function, function only depends on the inputs.  */
9284         case RS6000_BTC_CONST:
9285           TREE_READONLY (t) = 1;
9286           TREE_NOTHROW (t) = 1;
9287           break;
9288
9289           /* pure function, function can read global memory.  */
9290         case RS6000_BTC_PURE:
9291           DECL_PURE_P (t) = 1;
9292           TREE_NOTHROW (t) = 1;
9293           break;
9294
9295           /* Function is a math function.  If rounding mode is on, then treat
9296              the function as not reading global memory, but it can have
9297              arbitrary side effects.  If it is off, then assume the function is
9298              a const function.  This mimics the ATTR_MATHFN_FPROUNDING
9299              attribute in builtin-attribute.def that is used for the math
9300              functions. */
9301         case RS6000_BTC_FP_PURE:
9302           TREE_NOTHROW (t) = 1;
9303           if (flag_rounding_math)
9304             {
9305               DECL_PURE_P (t) = 1;
9306               DECL_IS_NOVOPS (t) = 1;
9307             }
9308           else
9309             TREE_READONLY (t) = 1;
9310           break;
9311         }
9312     }
9313 }
9314
9315 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
9316
9317 static const struct builtin_description bdesc_3arg[] =
9318 {
9319   { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
9320   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
9321   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
9322   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
9323   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
9324   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
9325   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
9326   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
9327   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
9328   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
9329   { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
9330   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2df, "__builtin_altivec_vperm_2df", ALTIVEC_BUILTIN_VPERM_2DF },
9331   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di, "__builtin_altivec_vperm_2di", ALTIVEC_BUILTIN_VPERM_2DI },
9332   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
9333   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
9334   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
9335   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
9336   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_altivec_vperm_2di_uns", ALTIVEC_BUILTIN_VPERM_2DI_UNS },
9337   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_altivec_vperm_4si_uns", ALTIVEC_BUILTIN_VPERM_4SI_UNS },
9338   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_altivec_vperm_8hi_uns", ALTIVEC_BUILTIN_VPERM_8HI_UNS },
9339   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi_uns", ALTIVEC_BUILTIN_VPERM_16QI_UNS },
9340   { MASK_ALTIVEC, CODE_FOR_vector_select_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
9341   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
9342   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
9343   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
9344   { MASK_ALTIVEC, CODE_FOR_vector_select_v2df, "__builtin_altivec_vsel_2df", ALTIVEC_BUILTIN_VSEL_2DF },
9345   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di, "__builtin_altivec_vsel_2di", ALTIVEC_BUILTIN_VSEL_2DI },
9346   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si_uns, "__builtin_altivec_vsel_4si_uns", ALTIVEC_BUILTIN_VSEL_4SI_UNS },
9347   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi_uns, "__builtin_altivec_vsel_8hi_uns", ALTIVEC_BUILTIN_VSEL_8HI_UNS },
9348   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi_uns, "__builtin_altivec_vsel_16qi_uns", ALTIVEC_BUILTIN_VSEL_16QI_UNS },
9349   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di_uns, "__builtin_altivec_vsel_2di_uns", ALTIVEC_BUILTIN_VSEL_2DI_UNS },
9350   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
9351   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
9352   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
9353   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
9354
9355   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
9356   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
9357   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
9358   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
9359   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
9360   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
9361   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
9362   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
9363   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
9364   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
9365   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
9366   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
9367   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
9368   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
9369   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
9370
9371   { MASK_VSX, CODE_FOR_vsx_fmaddv2df4, "__builtin_vsx_xvmadddp", VSX_BUILTIN_XVMADDDP },
9372   { MASK_VSX, CODE_FOR_vsx_fmsubv2df4, "__builtin_vsx_xvmsubdp", VSX_BUILTIN_XVMSUBDP },
9373   { MASK_VSX, CODE_FOR_vsx_fnmaddv2df4, "__builtin_vsx_xvnmadddp", VSX_BUILTIN_XVNMADDDP },
9374   { MASK_VSX, CODE_FOR_vsx_fnmsubv2df4, "__builtin_vsx_xvnmsubdp", VSX_BUILTIN_XVNMSUBDP },
9375
9376   { MASK_VSX, CODE_FOR_vsx_fmaddv4sf4, "__builtin_vsx_xvmaddsp", VSX_BUILTIN_XVMADDSP },
9377   { MASK_VSX, CODE_FOR_vsx_fmsubv4sf4, "__builtin_vsx_xvmsubsp", VSX_BUILTIN_XVMSUBSP },
9378   { MASK_VSX, CODE_FOR_vsx_fnmaddv4sf4, "__builtin_vsx_xvnmaddsp", VSX_BUILTIN_XVNMADDSP },
9379   { MASK_VSX, CODE_FOR_vsx_fnmsubv4sf4, "__builtin_vsx_xvnmsubsp", VSX_BUILTIN_XVNMSUBSP },
9380
9381   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msub", VSX_BUILTIN_VEC_MSUB },
9382   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmadd", VSX_BUILTIN_VEC_NMADD },
9383
9384   { MASK_VSX, CODE_FOR_vector_select_v2di, "__builtin_vsx_xxsel_2di", VSX_BUILTIN_XXSEL_2DI },
9385   { MASK_VSX, CODE_FOR_vector_select_v2df, "__builtin_vsx_xxsel_2df", VSX_BUILTIN_XXSEL_2DF },
9386   { MASK_VSX, CODE_FOR_vector_select_v4sf, "__builtin_vsx_xxsel_4sf", VSX_BUILTIN_XXSEL_4SF },
9387   { MASK_VSX, CODE_FOR_vector_select_v4si, "__builtin_vsx_xxsel_4si", VSX_BUILTIN_XXSEL_4SI },
9388   { MASK_VSX, CODE_FOR_vector_select_v8hi, "__builtin_vsx_xxsel_8hi", VSX_BUILTIN_XXSEL_8HI },
9389   { MASK_VSX, CODE_FOR_vector_select_v16qi, "__builtin_vsx_xxsel_16qi", VSX_BUILTIN_XXSEL_16QI },
9390   { MASK_VSX, CODE_FOR_vector_select_v2di_uns, "__builtin_vsx_xxsel_2di_uns", VSX_BUILTIN_XXSEL_2DI_UNS },
9391   { MASK_VSX, CODE_FOR_vector_select_v4si_uns, "__builtin_vsx_xxsel_4si_uns", VSX_BUILTIN_XXSEL_4SI_UNS },
9392   { MASK_VSX, CODE_FOR_vector_select_v8hi_uns, "__builtin_vsx_xxsel_8hi_uns", VSX_BUILTIN_XXSEL_8HI_UNS },
9393   { MASK_VSX, CODE_FOR_vector_select_v16qi_uns, "__builtin_vsx_xxsel_16qi_uns", VSX_BUILTIN_XXSEL_16QI_UNS },
9394
9395   { MASK_VSX, CODE_FOR_altivec_vperm_v2di, "__builtin_vsx_vperm_2di", VSX_BUILTIN_VPERM_2DI },
9396   { MASK_VSX, CODE_FOR_altivec_vperm_v2df, "__builtin_vsx_vperm_2df", VSX_BUILTIN_VPERM_2DF },
9397   { MASK_VSX, CODE_FOR_altivec_vperm_v4sf, "__builtin_vsx_vperm_4sf", VSX_BUILTIN_VPERM_4SF },
9398   { MASK_VSX, CODE_FOR_altivec_vperm_v4si, "__builtin_vsx_vperm_4si", VSX_BUILTIN_VPERM_4SI },
9399   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi, "__builtin_vsx_vperm_8hi", VSX_BUILTIN_VPERM_8HI },
9400   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi, "__builtin_vsx_vperm_16qi", VSX_BUILTIN_VPERM_16QI },
9401   { MASK_VSX, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_vsx_vperm_2di_uns", VSX_BUILTIN_VPERM_2DI_UNS },
9402   { MASK_VSX, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_vsx_vperm_4si_uns", VSX_BUILTIN_VPERM_4SI_UNS },
9403   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_vsx_vperm_8hi_uns", VSX_BUILTIN_VPERM_8HI_UNS },
9404   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_vsx_vperm_16qi_uns", VSX_BUILTIN_VPERM_16QI_UNS },
9405
9406   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2df, "__builtin_vsx_xxpermdi_2df", VSX_BUILTIN_XXPERMDI_2DF },
9407   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2di, "__builtin_vsx_xxpermdi_2di", VSX_BUILTIN_XXPERMDI_2DI },
9408   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4sf, "__builtin_vsx_xxpermdi_4sf", VSX_BUILTIN_XXPERMDI_4SF },
9409   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4si, "__builtin_vsx_xxpermdi_4si", VSX_BUILTIN_XXPERMDI_4SI },
9410   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v8hi, "__builtin_vsx_xxpermdi_8hi", VSX_BUILTIN_XXPERMDI_8HI },
9411   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v16qi, "__builtin_vsx_xxpermdi_16qi", VSX_BUILTIN_XXPERMDI_16QI },
9412   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxpermdi", VSX_BUILTIN_VEC_XXPERMDI },
9413   { MASK_VSX, CODE_FOR_vsx_set_v2df, "__builtin_vsx_set_2df", VSX_BUILTIN_SET_2DF },
9414   { MASK_VSX, CODE_FOR_vsx_set_v2di, "__builtin_vsx_set_2di", VSX_BUILTIN_SET_2DI },
9415
9416   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2di, "__builtin_vsx_xxsldwi_2di", VSX_BUILTIN_XXSLDWI_2DI },
9417   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2df, "__builtin_vsx_xxsldwi_2df", VSX_BUILTIN_XXSLDWI_2DF },
9418   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4sf, "__builtin_vsx_xxsldwi_4sf", VSX_BUILTIN_XXSLDWI_4SF },
9419   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4si, "__builtin_vsx_xxsldwi_4si", VSX_BUILTIN_XXSLDWI_4SI },
9420   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v8hi, "__builtin_vsx_xxsldwi_8hi", VSX_BUILTIN_XXSLDWI_8HI },
9421   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v16qi, "__builtin_vsx_xxsldwi_16qi", VSX_BUILTIN_XXSLDWI_16QI },
9422   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxsldwi", VSX_BUILTIN_VEC_XXSLDWI },
9423
9424   { 0, CODE_FOR_paired_msub, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
9425   { 0, CODE_FOR_paired_madd, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
9426   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
9427   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
9428   { 0, CODE_FOR_paired_nmsub, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
9429   { 0, CODE_FOR_paired_nmadd, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
9430   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
9431   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
9432   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
9433 };
9434
9435 /* DST operations: void foo (void *, const int, const char).  */
9436
9437 static const struct builtin_description bdesc_dst[] =
9438 {
9439   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
9440   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
9441   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
9442   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
9443
9444   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
9445   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
9446   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
9447   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
9448 };
9449
9450 /* Simple binary operations: VECc = foo (VECa, VECb).  */
9451
9452 static struct builtin_description bdesc_2arg[] =
9453 {
9454   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
9455   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
9456   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
9457   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
9458   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
9459   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
9460   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
9461   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
9462   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
9463   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
9464   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
9465   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
9466   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
9467   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
9468   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
9469   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
9470   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
9471   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
9472   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
9473   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
9474   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
9475   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
9476   { MASK_ALTIVEC, CODE_FOR_vector_eqv16qi, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
9477   { MASK_ALTIVEC, CODE_FOR_vector_eqv8hi, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
9478   { MASK_ALTIVEC, CODE_FOR_vector_eqv4si, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
9479   { MASK_ALTIVEC, CODE_FOR_vector_eqv4sf, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
9480   { MASK_ALTIVEC, CODE_FOR_vector_gev4sf, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
9481   { MASK_ALTIVEC, CODE_FOR_vector_gtuv16qi, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
9482   { MASK_ALTIVEC, CODE_FOR_vector_gtv16qi, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
9483   { MASK_ALTIVEC, CODE_FOR_vector_gtuv8hi, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
9484   { MASK_ALTIVEC, CODE_FOR_vector_gtv8hi, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
9485   { MASK_ALTIVEC, CODE_FOR_vector_gtuv4si, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
9486   { MASK_ALTIVEC, CODE_FOR_vector_gtv4si, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
9487   { MASK_ALTIVEC, CODE_FOR_vector_gtv4sf, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
9488   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
9489   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
9490   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
9491   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
9492   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
9493   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
9494   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
9495   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
9496   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
9497   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
9498   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
9499   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
9500   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
9501   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
9502   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
9503   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
9504   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
9505   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
9506   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
9507   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
9508   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
9509   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
9510   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
9511   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub_uns", ALTIVEC_BUILTIN_VMULEUB_UNS },
9512   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
9513   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
9514   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh_uns", ALTIVEC_BUILTIN_VMULEUH_UNS },
9515   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
9516   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
9517   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub_uns", ALTIVEC_BUILTIN_VMULOUB_UNS },
9518   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
9519   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
9520   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh_uns", ALTIVEC_BUILTIN_VMULOUH_UNS },
9521   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
9522   { MASK_ALTIVEC, CODE_FOR_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
9523   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
9524   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
9525   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
9526   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
9527   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
9528   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
9529   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
9530   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
9531   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
9532   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
9533   { MASK_ALTIVEC, CODE_FOR_recipv4sf3, "__builtin_altivec_vrecipdivfp", ALTIVEC_BUILTIN_VRECIPFP },
9534   { MASK_ALTIVEC, CODE_FOR_vrotlv16qi3, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
9535   { MASK_ALTIVEC, CODE_FOR_vrotlv8hi3, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
9536   { MASK_ALTIVEC, CODE_FOR_vrotlv4si3, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
9537   { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
9538   { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
9539   { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
9540   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
9541   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
9542   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
9543   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
9544   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
9545   { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
9546   { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
9547   { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
9548   { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
9549   { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
9550   { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
9551   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
9552   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
9553   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
9554   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
9555   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
9556   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
9557   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
9558   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
9559   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
9560   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
9561   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
9562   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
9563   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
9564   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
9565   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
9566   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
9567   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
9568   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
9569   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
9570   { MASK_ALTIVEC, CODE_FOR_vector_copysignv4sf3, "__builtin_altivec_copysignfp", ALTIVEC_BUILTIN_COPYSIGN_V4SF },
9571
9572   { MASK_VSX, CODE_FOR_addv2df3, "__builtin_vsx_xvadddp", VSX_BUILTIN_XVADDDP },
9573   { MASK_VSX, CODE_FOR_subv2df3, "__builtin_vsx_xvsubdp", VSX_BUILTIN_XVSUBDP },
9574   { MASK_VSX, CODE_FOR_mulv2df3, "__builtin_vsx_xvmuldp", VSX_BUILTIN_XVMULDP },
9575   { MASK_VSX, CODE_FOR_divv2df3, "__builtin_vsx_xvdivdp", VSX_BUILTIN_XVDIVDP },
9576   { MASK_VSX, CODE_FOR_recipv2df3, "__builtin_vsx_xvrecipdivdp", VSX_BUILTIN_RECIP_V2DF },
9577   { MASK_VSX, CODE_FOR_sminv2df3, "__builtin_vsx_xvmindp", VSX_BUILTIN_XVMINDP },
9578   { MASK_VSX, CODE_FOR_smaxv2df3, "__builtin_vsx_xvmaxdp", VSX_BUILTIN_XVMAXDP },
9579   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fe, "__builtin_vsx_xvtdivdp_fe", VSX_BUILTIN_XVTDIVDP_FE },
9580   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fg, "__builtin_vsx_xvtdivdp_fg", VSX_BUILTIN_XVTDIVDP_FG },
9581   { MASK_VSX, CODE_FOR_vector_eqv2df, "__builtin_vsx_xvcmpeqdp", VSX_BUILTIN_XVCMPEQDP },
9582   { MASK_VSX, CODE_FOR_vector_gtv2df, "__builtin_vsx_xvcmpgtdp", VSX_BUILTIN_XVCMPGTDP },
9583   { MASK_VSX, CODE_FOR_vector_gev2df, "__builtin_vsx_xvcmpgedp", VSX_BUILTIN_XVCMPGEDP },
9584
9585   { MASK_VSX, CODE_FOR_addv4sf3, "__builtin_vsx_xvaddsp", VSX_BUILTIN_XVADDSP },
9586   { MASK_VSX, CODE_FOR_subv4sf3, "__builtin_vsx_xvsubsp", VSX_BUILTIN_XVSUBSP },
9587   { MASK_VSX, CODE_FOR_mulv4sf3, "__builtin_vsx_xvmulsp", VSX_BUILTIN_XVMULSP },
9588   { MASK_VSX, CODE_FOR_divv4sf3, "__builtin_vsx_xvdivsp", VSX_BUILTIN_XVDIVSP },
9589   { MASK_VSX, CODE_FOR_recipv4sf3, "__builtin_vsx_xvrecipdivsp", VSX_BUILTIN_RECIP_V4SF },
9590   { MASK_VSX, CODE_FOR_sminv4sf3, "__builtin_vsx_xvminsp", VSX_BUILTIN_XVMINSP },
9591   { MASK_VSX, CODE_FOR_smaxv4sf3, "__builtin_vsx_xvmaxsp", VSX_BUILTIN_XVMAXSP },
9592   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fe, "__builtin_vsx_xvtdivsp_fe", VSX_BUILTIN_XVTDIVSP_FE },
9593   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fg, "__builtin_vsx_xvtdivsp_fg", VSX_BUILTIN_XVTDIVSP_FG },
9594   { MASK_VSX, CODE_FOR_vector_eqv4sf, "__builtin_vsx_xvcmpeqsp", VSX_BUILTIN_XVCMPEQSP },
9595   { MASK_VSX, CODE_FOR_vector_gtv4sf, "__builtin_vsx_xvcmpgtsp", VSX_BUILTIN_XVCMPGTSP },
9596   { MASK_VSX, CODE_FOR_vector_gev4sf, "__builtin_vsx_xvcmpgesp", VSX_BUILTIN_XVCMPGESP },
9597
9598   { MASK_VSX, CODE_FOR_smindf3, "__builtin_vsx_xsmindp", VSX_BUILTIN_XSMINDP },
9599   { MASK_VSX, CODE_FOR_smaxdf3, "__builtin_vsx_xsmaxdp", VSX_BUILTIN_XSMAXDP },
9600   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fe, "__builtin_vsx_xstdivdp_fe", VSX_BUILTIN_XSTDIVDP_FE },
9601   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fg, "__builtin_vsx_xstdivdp_fg", VSX_BUILTIN_XSTDIVDP_FG },
9602   { MASK_VSX, CODE_FOR_vector_copysignv2df3, "__builtin_vsx_cpsgndp", VSX_BUILTIN_CPSGNDP },
9603   { MASK_VSX, CODE_FOR_vector_copysignv4sf3, "__builtin_vsx_cpsgnsp", VSX_BUILTIN_CPSGNSP },
9604
9605   { MASK_VSX, CODE_FOR_vsx_concat_v2df, "__builtin_vsx_concat_2df", VSX_BUILTIN_CONCAT_2DF },
9606   { MASK_VSX, CODE_FOR_vsx_concat_v2di, "__builtin_vsx_concat_2di", VSX_BUILTIN_CONCAT_2DI },
9607   { MASK_VSX, CODE_FOR_vsx_splat_v2df, "__builtin_vsx_splat_2df", VSX_BUILTIN_SPLAT_2DF },
9608   { MASK_VSX, CODE_FOR_vsx_splat_v2di, "__builtin_vsx_splat_2di", VSX_BUILTIN_SPLAT_2DI },
9609   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4sf, "__builtin_vsx_xxmrghw", VSX_BUILTIN_XXMRGHW_4SF },
9610   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
9611   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
9612   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
9613   { MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
9614   { MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
9615   { MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
9616   { MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
9617
9618   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
9619   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
9620   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
9621   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
9622   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
9623   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
9624   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
9625   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
9626   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
9627   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
9628   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
9629   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
9630   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
9631   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
9632   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
9633   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
9634   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
9635   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
9636   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
9637   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
9638   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
9639   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
9640   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
9641   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
9642   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
9643   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
9644   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
9645   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
9646   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
9647   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
9648   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
9649   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
9650   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
9651   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
9652   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
9653   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
9654   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
9655   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
9656   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
9657   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_copysign", ALTIVEC_BUILTIN_VEC_COPYSIGN },
9658   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
9659   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
9660   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
9661   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
9662   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
9663   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
9664   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
9665   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
9666   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
9667   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
9668   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
9669   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
9670   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
9671   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
9672   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
9673   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
9674   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
9675   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
9676   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
9677   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
9678   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
9679   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
9680   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
9681   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
9682   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
9683   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
9684   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
9685   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
9686   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
9687   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
9688   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
9689   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
9690   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
9691   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
9692   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
9693   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
9694   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
9695   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
9696   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
9697   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
9698   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
9699   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
9700   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
9701   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
9702   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
9703   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
9704   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
9705   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
9706   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_recipdiv", ALTIVEC_BUILTIN_VEC_RECIP },
9707   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
9708   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
9709   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
9710   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
9711   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
9712   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
9713   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
9714   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
9715   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
9716   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
9717   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
9718   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
9719   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
9720   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
9721   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
9722   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
9723   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
9724   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
9725   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
9726   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
9727   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
9728   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
9729   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
9730   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
9731   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
9732   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
9733   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
9734   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
9735   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
9736   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
9737   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
9738   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
9739   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
9740   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
9741   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
9742   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
9743   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
9744   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
9745   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
9746   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
9747
9748   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_mul", VSX_BUILTIN_VEC_MUL },
9749   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_div", VSX_BUILTIN_VEC_DIV },
9750
9751   { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
9752   { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
9753   { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
9754   { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
9755   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
9756   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
9757   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
9758   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
9759   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
9760   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
9761
9762   /* Place holder, leave as first spe builtin.  */
9763   { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
9764   { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
9765   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
9766   { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
9767   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
9768   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
9769   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
9770   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
9771   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
9772   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
9773   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
9774   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
9775   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
9776   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
9777   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
9778   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
9779   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
9780   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
9781   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
9782   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
9783   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
9784   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
9785   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
9786   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
9787   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
9788   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
9789   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
9790   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
9791   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
9792   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
9793   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
9794   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
9795   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
9796   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
9797   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
9798   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
9799   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
9800   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
9801   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
9802   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
9803   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
9804   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
9805   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
9806   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
9807   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
9808   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
9809   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
9810   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
9811   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
9812   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
9813   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
9814   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
9815   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
9816   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
9817   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
9818   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
9819   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
9820   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
9821   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
9822   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
9823   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
9824   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
9825   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
9826   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
9827   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
9828   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
9829   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
9830   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
9831   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
9832   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
9833   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
9834   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
9835   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
9836   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
9837   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
9838   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
9839   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
9840   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
9841   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
9842   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
9843   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
9844   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
9845   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
9846   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
9847   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
9848   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
9849   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
9850   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
9851   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
9852   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
9853   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
9854   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
9855   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
9856   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
9857   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
9858   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
9859   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
9860   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
9861   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
9862   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
9863   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
9864   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
9865   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
9866   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
9867   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
9868   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
9869   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
9870   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
9871   { 0, CODE_FOR_subv2si3, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
9872
9873   /* SPE binary operations expecting a 5-bit unsigned literal.  */
9874   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
9875
9876   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
9877   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
9878   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
9879   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
9880   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
9881   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
9882   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
9883   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
9884   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
9885   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
9886   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
9887   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
9888   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
9889   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
9890   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
9891   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
9892   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
9893   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
9894   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
9895   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
9896   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
9897   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
9898   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
9899   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
9900   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
9901   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
9902
9903   /* Place-holder.  Leave as last binary SPE builtin.  */
9904   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
9905 };
9906
9907 /* AltiVec predicates.  */
9908
9909 struct builtin_description_predicates
9910 {
9911   const unsigned int mask;
9912   const enum insn_code icode;
9913   const char *const name;
9914   const enum rs6000_builtins code;
9915 };
9916
9917 static const struct builtin_description_predicates bdesc_altivec_preds[] =
9918 {
9919   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p",
9920     ALTIVEC_BUILTIN_VCMPBFP_P },
9921   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_eq_v4sf_p,
9922     "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
9923   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_ge_v4sf_p,
9924     "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
9925   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_gt_v4sf_p,
9926     "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
9927   { MASK_ALTIVEC, CODE_FOR_vector_eq_v4si_p, "__builtin_altivec_vcmpequw_p",
9928     ALTIVEC_BUILTIN_VCMPEQUW_P },
9929   { MASK_ALTIVEC, CODE_FOR_vector_gt_v4si_p, "__builtin_altivec_vcmpgtsw_p",
9930     ALTIVEC_BUILTIN_VCMPGTSW_P },
9931   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v4si_p, "__builtin_altivec_vcmpgtuw_p",
9932     ALTIVEC_BUILTIN_VCMPGTUW_P },
9933   { MASK_ALTIVEC, CODE_FOR_vector_eq_v8hi_p, "__builtin_altivec_vcmpequh_p",
9934     ALTIVEC_BUILTIN_VCMPEQUH_P },
9935   { MASK_ALTIVEC, CODE_FOR_vector_gt_v8hi_p, "__builtin_altivec_vcmpgtsh_p",
9936     ALTIVEC_BUILTIN_VCMPGTSH_P },
9937   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v8hi_p, "__builtin_altivec_vcmpgtuh_p",
9938     ALTIVEC_BUILTIN_VCMPGTUH_P },
9939   { MASK_ALTIVEC, CODE_FOR_vector_eq_v16qi_p, "__builtin_altivec_vcmpequb_p",
9940     ALTIVEC_BUILTIN_VCMPEQUB_P },
9941   { MASK_ALTIVEC, CODE_FOR_vector_gt_v16qi_p, "__builtin_altivec_vcmpgtsb_p",
9942     ALTIVEC_BUILTIN_VCMPGTSB_P },
9943   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v16qi_p, "__builtin_altivec_vcmpgtub_p",
9944     ALTIVEC_BUILTIN_VCMPGTUB_P },
9945
9946   { MASK_VSX, CODE_FOR_vector_eq_v4sf_p, "__builtin_vsx_xvcmpeqsp_p",
9947     VSX_BUILTIN_XVCMPEQSP_P },
9948   { MASK_VSX, CODE_FOR_vector_ge_v4sf_p, "__builtin_vsx_xvcmpgesp_p",
9949     VSX_BUILTIN_XVCMPGESP_P },
9950   { MASK_VSX, CODE_FOR_vector_gt_v4sf_p, "__builtin_vsx_xvcmpgtsp_p",
9951     VSX_BUILTIN_XVCMPGTSP_P },
9952   { MASK_VSX, CODE_FOR_vector_eq_v2df_p, "__builtin_vsx_xvcmpeqdp_p",
9953     VSX_BUILTIN_XVCMPEQDP_P },
9954   { MASK_VSX, CODE_FOR_vector_ge_v2df_p, "__builtin_vsx_xvcmpgedp_p",
9955     VSX_BUILTIN_XVCMPGEDP_P },
9956   { MASK_VSX, CODE_FOR_vector_gt_v2df_p, "__builtin_vsx_xvcmpgtdp_p",
9957     VSX_BUILTIN_XVCMPGTDP_P },
9958
9959   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpeq_p",
9960     ALTIVEC_BUILTIN_VCMPEQ_P },
9961   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpgt_p",
9962     ALTIVEC_BUILTIN_VCMPGT_P },
9963   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpge_p",
9964     ALTIVEC_BUILTIN_VCMPGE_P }
9965 };
9966
9967 /* SPE predicates.  */
9968 static struct builtin_description bdesc_spe_predicates[] =
9969 {
9970   /* Place-holder.  Leave as first.  */
9971   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
9972   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
9973   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
9974   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
9975   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
9976   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
9977   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
9978   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
9979   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
9980   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
9981   /* Place-holder.  Leave as last.  */
9982   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
9983 };
9984
9985 /* SPE evsel predicates.  */
9986 static struct builtin_description bdesc_spe_evsel[] =
9987 {
9988   /* Place-holder.  Leave as first.  */
9989   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
9990   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
9991   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
9992   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
9993   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
9994   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
9995   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
9996   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
9997   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
9998   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
9999   /* Place-holder.  Leave as last.  */
10000   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
10001 };
10002
10003 /* PAIRED predicates.  */
10004 static const struct builtin_description bdesc_paired_preds[] =
10005 {
10006   /* Place-holder.  Leave as first.  */
10007   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
10008   /* Place-holder.  Leave as last.  */
10009   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
10010 };
10011
10012 /* ABS* operations.  */
10013
10014 static const struct builtin_description bdesc_abs[] =
10015 {
10016   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
10017   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
10018   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
10019   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
10020   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
10021   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
10022   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI },
10023   { MASK_VSX, CODE_FOR_absv2df2, "__builtin_vsx_xvabsdp", VSX_BUILTIN_XVABSDP },
10024   { MASK_VSX, CODE_FOR_vsx_nabsv2df2, "__builtin_vsx_xvnabsdp", VSX_BUILTIN_XVNABSDP },
10025   { MASK_VSX, CODE_FOR_absv4sf2, "__builtin_vsx_xvabssp", VSX_BUILTIN_XVABSSP },
10026   { MASK_VSX, CODE_FOR_vsx_nabsv4sf2, "__builtin_vsx_xvnabssp", VSX_BUILTIN_XVNABSSP },
10027 };
10028
10029 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
10030    foo (VECa).  */
10031
10032 static struct builtin_description bdesc_1arg[] =
10033 {
10034   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
10035   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
10036   { MASK_ALTIVEC, CODE_FOR_rev4sf2, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
10037   { MASK_ALTIVEC, CODE_FOR_vector_floorv4sf2, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
10038   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
10039   { MASK_ALTIVEC, CODE_FOR_vector_ceilv4sf2, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
10040   { MASK_ALTIVEC, CODE_FOR_vector_btruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
10041   { MASK_ALTIVEC, CODE_FOR_rsqrtv4sf2, "__builtin_altivec_vrsqrtfp", ALTIVEC_BUILTIN_VRSQRTFP },
10042   { MASK_ALTIVEC, CODE_FOR_rsqrtev4sf2, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
10043   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
10044   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
10045   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
10046   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
10047   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
10048   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
10049   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
10050   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
10051   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
10052
10053   { MASK_VSX, CODE_FOR_negv2df2, "__builtin_vsx_xvnegdp", VSX_BUILTIN_XVNEGDP },
10054   { MASK_VSX, CODE_FOR_sqrtv2df2, "__builtin_vsx_xvsqrtdp", VSX_BUILTIN_XVSQRTDP },
10055   { MASK_VSX, CODE_FOR_rsqrtv2df2, "__builtin_vsx_xvrsqrtdp", VSX_BUILTIN_VEC_RSQRT_V2DF },
10056   { MASK_VSX, CODE_FOR_rsqrtev2df2, "__builtin_vsx_xvrsqrtedp", VSX_BUILTIN_XVRSQRTEDP },
10057   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fe, "__builtin_vsx_xvtsqrtdp_fe", VSX_BUILTIN_XVTSQRTDP_FE },
10058   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fg, "__builtin_vsx_xvtsqrtdp_fg", VSX_BUILTIN_XVTSQRTDP_FG },
10059   { MASK_VSX, CODE_FOR_vsx_frev2df2, "__builtin_vsx_xvredp", VSX_BUILTIN_XVREDP },
10060
10061   { MASK_VSX, CODE_FOR_negv4sf2, "__builtin_vsx_xvnegsp", VSX_BUILTIN_XVNEGSP },
10062   { MASK_VSX, CODE_FOR_sqrtv4sf2, "__builtin_vsx_xvsqrtsp", VSX_BUILTIN_XVSQRTSP },
10063   { MASK_VSX, CODE_FOR_rsqrtv4sf2, "__builtin_vsx_xvrsqrtsp", VSX_BUILTIN_VEC_RSQRT_V4SF },
10064   { MASK_VSX, CODE_FOR_rsqrtev4sf2, "__builtin_vsx_xvrsqrtesp", VSX_BUILTIN_XVRSQRTESP },
10065   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fe, "__builtin_vsx_xvtsqrtsp_fe", VSX_BUILTIN_XVTSQRTSP_FE },
10066   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fg, "__builtin_vsx_xvtsqrtsp_fg", VSX_BUILTIN_XVTSQRTSP_FG },
10067   { MASK_VSX, CODE_FOR_vsx_frev4sf2, "__builtin_vsx_xvresp", VSX_BUILTIN_XVRESP },
10068
10069   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvdpsp", VSX_BUILTIN_XSCVDPSP },
10070   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvspdp", VSX_BUILTIN_XSCVSPDP },
10071   { MASK_VSX, CODE_FOR_vsx_xvcvdpsp, "__builtin_vsx_xvcvdpsp", VSX_BUILTIN_XVCVDPSP },
10072   { MASK_VSX, CODE_FOR_vsx_xvcvspdp, "__builtin_vsx_xvcvspdp", VSX_BUILTIN_XVCVSPDP },
10073   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fe, "__builtin_vsx_xstsqrtdp_fe", VSX_BUILTIN_XSTSQRTDP_FE },
10074   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fg, "__builtin_vsx_xstsqrtdp_fg", VSX_BUILTIN_XSTSQRTDP_FG },
10075
10076   { MASK_VSX, CODE_FOR_vsx_fix_truncv2dfv2di2, "__builtin_vsx_xvcvdpsxds", VSX_BUILTIN_XVCVDPSXDS },
10077   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds", VSX_BUILTIN_XVCVDPUXDS },
10078   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds_uns", VSX_BUILTIN_XVCVDPUXDS_UNS },
10079   { MASK_VSX, CODE_FOR_vsx_floatv2div2df2, "__builtin_vsx_xvcvsxddp", VSX_BUILTIN_XVCVSXDDP },
10080   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp", VSX_BUILTIN_XVCVUXDDP },
10081   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp_uns", VSX_BUILTIN_XVCVUXDDP_UNS },
10082
10083   { MASK_VSX, CODE_FOR_vsx_fix_truncv4sfv4si2, "__builtin_vsx_xvcvspsxws", VSX_BUILTIN_XVCVSPSXWS },
10084   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv4sfv4si2, "__builtin_vsx_xvcvspuxws", VSX_BUILTIN_XVCVSPUXWS },
10085   { MASK_VSX, CODE_FOR_vsx_floatv4siv4sf2, "__builtin_vsx_xvcvsxwsp", VSX_BUILTIN_XVCVSXWSP },
10086   { MASK_VSX, CODE_FOR_vsx_floatunsv4siv4sf2, "__builtin_vsx_xvcvuxwsp", VSX_BUILTIN_XVCVUXWSP },
10087
10088   { MASK_VSX, CODE_FOR_vsx_xvcvdpsxws, "__builtin_vsx_xvcvdpsxws", VSX_BUILTIN_XVCVDPSXWS },
10089   { MASK_VSX, CODE_FOR_vsx_xvcvdpuxws, "__builtin_vsx_xvcvdpuxws", VSX_BUILTIN_XVCVDPUXWS },
10090   { MASK_VSX, CODE_FOR_vsx_xvcvsxwdp, "__builtin_vsx_xvcvsxwdp", VSX_BUILTIN_XVCVSXWDP },
10091   { MASK_VSX, CODE_FOR_vsx_xvcvuxwdp, "__builtin_vsx_xvcvuxwdp", VSX_BUILTIN_XVCVUXWDP },
10092   { MASK_VSX, CODE_FOR_vsx_xvrdpi, "__builtin_vsx_xvrdpi", VSX_BUILTIN_XVRDPI },
10093   { MASK_VSX, CODE_FOR_vsx_xvrdpic, "__builtin_vsx_xvrdpic", VSX_BUILTIN_XVRDPIC },
10094   { MASK_VSX, CODE_FOR_vsx_floorv2df2, "__builtin_vsx_xvrdpim", VSX_BUILTIN_XVRDPIM },
10095   { MASK_VSX, CODE_FOR_vsx_ceilv2df2, "__builtin_vsx_xvrdpip", VSX_BUILTIN_XVRDPIP },
10096   { MASK_VSX, CODE_FOR_vsx_btruncv2df2, "__builtin_vsx_xvrdpiz", VSX_BUILTIN_XVRDPIZ },
10097
10098   { MASK_VSX, CODE_FOR_vsx_xvcvspsxds, "__builtin_vsx_xvcvspsxds", VSX_BUILTIN_XVCVSPSXDS },
10099   { MASK_VSX, CODE_FOR_vsx_xvcvspuxds, "__builtin_vsx_xvcvspuxds", VSX_BUILTIN_XVCVSPUXDS },
10100   { MASK_VSX, CODE_FOR_vsx_xvcvsxdsp, "__builtin_vsx_xvcvsxdsp", VSX_BUILTIN_XVCVSXDSP },
10101   { MASK_VSX, CODE_FOR_vsx_xvcvuxdsp, "__builtin_vsx_xvcvuxdsp", VSX_BUILTIN_XVCVUXDSP },
10102   { MASK_VSX, CODE_FOR_vsx_xvrspi, "__builtin_vsx_xvrspi", VSX_BUILTIN_XVRSPI },
10103   { MASK_VSX, CODE_FOR_vsx_xvrspic, "__builtin_vsx_xvrspic", VSX_BUILTIN_XVRSPIC },
10104   { MASK_VSX, CODE_FOR_vsx_floorv4sf2, "__builtin_vsx_xvrspim", VSX_BUILTIN_XVRSPIM },
10105   { MASK_VSX, CODE_FOR_vsx_ceilv4sf2, "__builtin_vsx_xvrspip", VSX_BUILTIN_XVRSPIP },
10106   { MASK_VSX, CODE_FOR_vsx_btruncv4sf2, "__builtin_vsx_xvrspiz", VSX_BUILTIN_XVRSPIZ },
10107
10108   { MASK_VSX, CODE_FOR_vsx_xsrdpi, "__builtin_vsx_xsrdpi", VSX_BUILTIN_XSRDPI },
10109   { MASK_VSX, CODE_FOR_vsx_xsrdpic, "__builtin_vsx_xsrdpic", VSX_BUILTIN_XSRDPIC },
10110   { MASK_VSX, CODE_FOR_vsx_floordf2, "__builtin_vsx_xsrdpim", VSX_BUILTIN_XSRDPIM },
10111   { MASK_VSX, CODE_FOR_vsx_ceildf2, "__builtin_vsx_xsrdpip", VSX_BUILTIN_XSRDPIP },
10112   { MASK_VSX, CODE_FOR_vsx_btruncdf2, "__builtin_vsx_xsrdpiz", VSX_BUILTIN_XSRDPIZ },
10113
10114   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
10115   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
10116   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
10117   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
10118   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
10119   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
10120   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
10121   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
10122   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
10123   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrt", ALTIVEC_BUILTIN_VEC_RSQRT },
10124   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
10125   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
10126   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
10127   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
10128   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
10129   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
10130   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
10131   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
10132   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
10133   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
10134
10135   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nearbyint", ALTIVEC_BUILTIN_VEC_NEARBYINT },
10136   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_rint", ALTIVEC_BUILTIN_VEC_RINT },
10137   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sqrt", ALTIVEC_BUILTIN_VEC_SQRT },
10138
10139   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_floatv4siv4sf2, "__builtin_vec_float_sisf", VECTOR_BUILTIN_FLOAT_V4SI_V4SF },
10140   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_unsigned_floatv4siv4sf2, "__builtin_vec_uns_float_sisf", VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF },
10141   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fix_truncv4sfv4si2, "__builtin_vec_fix_sfsi", VECTOR_BUILTIN_FIX_V4SF_V4SI },
10142   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fixuns_truncv4sfv4si2, "__builtin_vec_fixuns_sfsi", VECTOR_BUILTIN_FIXUNS_V4SF_V4SI },
10143
10144   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
10145      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
10146   { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
10147   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
10148   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
10149   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
10150   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
10151   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
10152   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
10153   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
10154   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
10155   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
10156   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
10157   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
10158   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
10159   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
10160   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
10161   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
10162   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
10163   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
10164   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
10165   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
10166   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
10167   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
10168   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
10169   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
10170   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
10171   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
10172   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
10173   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
10174
10175   /* Place-holder.  Leave as last unary SPE builtin.  */
10176   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
10177
10178   { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
10179   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
10180   { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
10181   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
10182   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
10183 };
10184
10185 static rtx
10186 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
10187 {
10188   rtx pat;
10189   tree arg0 = CALL_EXPR_ARG (exp, 0);
10190   rtx op0 = expand_normal (arg0);
10191   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10192   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10193
10194   if (icode == CODE_FOR_nothing)
10195     /* Builtin not supported on this processor.  */
10196     return 0;
10197
10198   /* If we got invalid arguments bail out before generating bad rtl.  */
10199   if (arg0 == error_mark_node)
10200     return const0_rtx;
10201
10202   if (icode == CODE_FOR_altivec_vspltisb
10203       || icode == CODE_FOR_altivec_vspltish
10204       || icode == CODE_FOR_altivec_vspltisw
10205       || icode == CODE_FOR_spe_evsplatfi
10206       || icode == CODE_FOR_spe_evsplati)
10207     {
10208       /* Only allow 5-bit *signed* literals.  */
10209       if (GET_CODE (op0) != CONST_INT
10210           || INTVAL (op0) > 15
10211           || INTVAL (op0) < -16)
10212         {
10213           error ("argument 1 must be a 5-bit signed literal");
10214           return const0_rtx;
10215         }
10216     }
10217
10218   if (target == 0
10219       || GET_MODE (target) != tmode
10220       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10221     target = gen_reg_rtx (tmode);
10222
10223   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10224     op0 = copy_to_mode_reg (mode0, op0);
10225
10226   pat = GEN_FCN (icode) (target, op0);
10227   if (! pat)
10228     return 0;
10229   emit_insn (pat);
10230
10231   return target;
10232 }
10233
10234 static rtx
10235 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
10236 {
10237   rtx pat, scratch1, scratch2;
10238   tree arg0 = CALL_EXPR_ARG (exp, 0);
10239   rtx op0 = expand_normal (arg0);
10240   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10241   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10242
10243   /* If we have invalid arguments, bail out before generating bad rtl.  */
10244   if (arg0 == error_mark_node)
10245     return const0_rtx;
10246
10247   if (target == 0
10248       || GET_MODE (target) != tmode
10249       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10250     target = gen_reg_rtx (tmode);
10251
10252   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10253     op0 = copy_to_mode_reg (mode0, op0);
10254
10255   scratch1 = gen_reg_rtx (mode0);
10256   scratch2 = gen_reg_rtx (mode0);
10257
10258   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
10259   if (! pat)
10260     return 0;
10261   emit_insn (pat);
10262
10263   return target;
10264 }
10265
10266 static rtx
10267 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
10268 {
10269   rtx pat;
10270   tree arg0 = CALL_EXPR_ARG (exp, 0);
10271   tree arg1 = CALL_EXPR_ARG (exp, 1);
10272   rtx op0 = expand_normal (arg0);
10273   rtx op1 = expand_normal (arg1);
10274   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10275   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10276   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10277
10278   if (icode == CODE_FOR_nothing)
10279     /* Builtin not supported on this processor.  */
10280     return 0;
10281
10282   /* If we got invalid arguments bail out before generating bad rtl.  */
10283   if (arg0 == error_mark_node || arg1 == error_mark_node)
10284     return const0_rtx;
10285
10286   if (icode == CODE_FOR_altivec_vcfux
10287       || icode == CODE_FOR_altivec_vcfsx
10288       || icode == CODE_FOR_altivec_vctsxs
10289       || icode == CODE_FOR_altivec_vctuxs
10290       || icode == CODE_FOR_altivec_vspltb
10291       || icode == CODE_FOR_altivec_vsplth
10292       || icode == CODE_FOR_altivec_vspltw
10293       || icode == CODE_FOR_spe_evaddiw
10294       || icode == CODE_FOR_spe_evldd
10295       || icode == CODE_FOR_spe_evldh
10296       || icode == CODE_FOR_spe_evldw
10297       || icode == CODE_FOR_spe_evlhhesplat
10298       || icode == CODE_FOR_spe_evlhhossplat
10299       || icode == CODE_FOR_spe_evlhhousplat
10300       || icode == CODE_FOR_spe_evlwhe
10301       || icode == CODE_FOR_spe_evlwhos
10302       || icode == CODE_FOR_spe_evlwhou
10303       || icode == CODE_FOR_spe_evlwhsplat
10304       || icode == CODE_FOR_spe_evlwwsplat
10305       || icode == CODE_FOR_spe_evrlwi
10306       || icode == CODE_FOR_spe_evslwi
10307       || icode == CODE_FOR_spe_evsrwis
10308       || icode == CODE_FOR_spe_evsubifw
10309       || icode == CODE_FOR_spe_evsrwiu)
10310     {
10311       /* Only allow 5-bit unsigned literals.  */
10312       STRIP_NOPS (arg1);
10313       if (TREE_CODE (arg1) != INTEGER_CST
10314           || TREE_INT_CST_LOW (arg1) & ~0x1f)
10315         {
10316           error ("argument 2 must be a 5-bit unsigned literal");
10317           return const0_rtx;
10318         }
10319     }
10320
10321   if (target == 0
10322       || GET_MODE (target) != tmode
10323       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10324     target = gen_reg_rtx (tmode);
10325
10326   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10327     op0 = copy_to_mode_reg (mode0, op0);
10328   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10329     op1 = copy_to_mode_reg (mode1, op1);
10330
10331   pat = GEN_FCN (icode) (target, op0, op1);
10332   if (! pat)
10333     return 0;
10334   emit_insn (pat);
10335
10336   return target;
10337 }
10338
10339 static rtx
10340 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
10341 {
10342   rtx pat, scratch;
10343   tree cr6_form = CALL_EXPR_ARG (exp, 0);
10344   tree arg0 = CALL_EXPR_ARG (exp, 1);
10345   tree arg1 = CALL_EXPR_ARG (exp, 2);
10346   rtx op0 = expand_normal (arg0);
10347   rtx op1 = expand_normal (arg1);
10348   enum machine_mode tmode = SImode;
10349   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10350   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10351   int cr6_form_int;
10352
10353   if (TREE_CODE (cr6_form) != INTEGER_CST)
10354     {
10355       error ("argument 1 of __builtin_altivec_predicate must be a constant");
10356       return const0_rtx;
10357     }
10358   else
10359     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
10360
10361   gcc_assert (mode0 == mode1);
10362
10363   /* If we have invalid arguments, bail out before generating bad rtl.  */
10364   if (arg0 == error_mark_node || arg1 == error_mark_node)
10365     return const0_rtx;
10366
10367   if (target == 0
10368       || GET_MODE (target) != tmode
10369       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10370     target = gen_reg_rtx (tmode);
10371
10372   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10373     op0 = copy_to_mode_reg (mode0, op0);
10374   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10375     op1 = copy_to_mode_reg (mode1, op1);
10376
10377   scratch = gen_reg_rtx (mode0);
10378
10379   pat = GEN_FCN (icode) (scratch, op0, op1);
10380   if (! pat)
10381     return 0;
10382   emit_insn (pat);
10383
10384   /* The vec_any* and vec_all* predicates use the same opcodes for two
10385      different operations, but the bits in CR6 will be different
10386      depending on what information we want.  So we have to play tricks
10387      with CR6 to get the right bits out.
10388
10389      If you think this is disgusting, look at the specs for the
10390      AltiVec predicates.  */
10391
10392   switch (cr6_form_int)
10393     {
10394     case 0:
10395       emit_insn (gen_cr6_test_for_zero (target));
10396       break;
10397     case 1:
10398       emit_insn (gen_cr6_test_for_zero_reverse (target));
10399       break;
10400     case 2:
10401       emit_insn (gen_cr6_test_for_lt (target));
10402       break;
10403     case 3:
10404       emit_insn (gen_cr6_test_for_lt_reverse (target));
10405       break;
10406     default:
10407       error ("argument 1 of __builtin_altivec_predicate is out of range");
10408       break;
10409     }
10410
10411   return target;
10412 }
10413
10414 static rtx
10415 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
10416 {
10417   rtx pat, addr;
10418   tree arg0 = CALL_EXPR_ARG (exp, 0);
10419   tree arg1 = CALL_EXPR_ARG (exp, 1);
10420   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10421   enum machine_mode mode0 = Pmode;
10422   enum machine_mode mode1 = Pmode;
10423   rtx op0 = expand_normal (arg0);
10424   rtx op1 = expand_normal (arg1);
10425
10426   if (icode == CODE_FOR_nothing)
10427     /* Builtin not supported on this processor.  */
10428     return 0;
10429
10430   /* If we got invalid arguments bail out before generating bad rtl.  */
10431   if (arg0 == error_mark_node || arg1 == error_mark_node)
10432     return const0_rtx;
10433
10434   if (target == 0
10435       || GET_MODE (target) != tmode
10436       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10437     target = gen_reg_rtx (tmode);
10438
10439   op1 = copy_to_mode_reg (mode1, op1);
10440
10441   if (op0 == const0_rtx)
10442     {
10443       addr = gen_rtx_MEM (tmode, op1);
10444     }
10445   else
10446     {
10447       op0 = copy_to_mode_reg (mode0, op0);
10448       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
10449     }
10450
10451   pat = GEN_FCN (icode) (target, addr);
10452
10453   if (! pat)
10454     return 0;
10455   emit_insn (pat);
10456
10457   return target;
10458 }
10459
10460 static rtx
10461 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
10462 {
10463   rtx pat, addr;
10464   tree arg0 = CALL_EXPR_ARG (exp, 0);
10465   tree arg1 = CALL_EXPR_ARG (exp, 1);
10466   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10467   enum machine_mode mode0 = Pmode;
10468   enum machine_mode mode1 = Pmode;
10469   rtx op0 = expand_normal (arg0);
10470   rtx op1 = expand_normal (arg1);
10471
10472   if (icode == CODE_FOR_nothing)
10473     /* Builtin not supported on this processor.  */
10474     return 0;
10475
10476   /* If we got invalid arguments bail out before generating bad rtl.  */
10477   if (arg0 == error_mark_node || arg1 == error_mark_node)
10478     return const0_rtx;
10479
10480   if (target == 0
10481       || GET_MODE (target) != tmode
10482       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10483     target = gen_reg_rtx (tmode);
10484
10485   op1 = copy_to_mode_reg (mode1, op1);
10486
10487   if (op0 == const0_rtx)
10488     {
10489       addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
10490     }
10491   else
10492     {
10493       op0 = copy_to_mode_reg (mode0, op0);
10494       addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
10495     }
10496
10497   pat = GEN_FCN (icode) (target, addr);
10498
10499   if (! pat)
10500     return 0;
10501   emit_insn (pat);
10502
10503   return target;
10504 }
10505
10506 static rtx
10507 spe_expand_stv_builtin (enum insn_code icode, tree exp)
10508 {
10509   tree arg0 = CALL_EXPR_ARG (exp, 0);
10510   tree arg1 = CALL_EXPR_ARG (exp, 1);
10511   tree arg2 = CALL_EXPR_ARG (exp, 2);
10512   rtx op0 = expand_normal (arg0);
10513   rtx op1 = expand_normal (arg1);
10514   rtx op2 = expand_normal (arg2);
10515   rtx pat;
10516   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
10517   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
10518   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
10519
10520   /* Invalid arguments.  Bail before doing anything stoopid!  */
10521   if (arg0 == error_mark_node
10522       || arg1 == error_mark_node
10523       || arg2 == error_mark_node)
10524     return const0_rtx;
10525
10526   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
10527     op0 = copy_to_mode_reg (mode2, op0);
10528   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
10529     op1 = copy_to_mode_reg (mode0, op1);
10530   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
10531     op2 = copy_to_mode_reg (mode1, op2);
10532
10533   pat = GEN_FCN (icode) (op1, op2, op0);
10534   if (pat)
10535     emit_insn (pat);
10536   return NULL_RTX;
10537 }
10538
10539 static rtx
10540 paired_expand_stv_builtin (enum insn_code icode, tree exp)
10541 {
10542   tree arg0 = CALL_EXPR_ARG (exp, 0);
10543   tree arg1 = CALL_EXPR_ARG (exp, 1);
10544   tree arg2 = CALL_EXPR_ARG (exp, 2);
10545   rtx op0 = expand_normal (arg0);
10546   rtx op1 = expand_normal (arg1);
10547   rtx op2 = expand_normal (arg2);
10548   rtx pat, addr;
10549   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10550   enum machine_mode mode1 = Pmode;
10551   enum machine_mode mode2 = Pmode;
10552
10553   /* Invalid arguments.  Bail before doing anything stoopid!  */
10554   if (arg0 == error_mark_node
10555       || arg1 == error_mark_node
10556       || arg2 == error_mark_node)
10557     return const0_rtx;
10558
10559   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
10560     op0 = copy_to_mode_reg (tmode, op0);
10561
10562   op2 = copy_to_mode_reg (mode2, op2);
10563
10564   if (op1 == const0_rtx)
10565     {
10566       addr = gen_rtx_MEM (tmode, op2);
10567     }
10568   else
10569     {
10570       op1 = copy_to_mode_reg (mode1, op1);
10571       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10572     }
10573
10574   pat = GEN_FCN (icode) (addr, op0);
10575   if (pat)
10576     emit_insn (pat);
10577   return NULL_RTX;
10578 }
10579
10580 static rtx
10581 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
10582 {
10583   tree arg0 = CALL_EXPR_ARG (exp, 0);
10584   tree arg1 = CALL_EXPR_ARG (exp, 1);
10585   tree arg2 = CALL_EXPR_ARG (exp, 2);
10586   rtx op0 = expand_normal (arg0);
10587   rtx op1 = expand_normal (arg1);
10588   rtx op2 = expand_normal (arg2);
10589   rtx pat, addr;
10590   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10591   enum machine_mode mode1 = Pmode;
10592   enum machine_mode mode2 = Pmode;
10593
10594   /* Invalid arguments.  Bail before doing anything stoopid!  */
10595   if (arg0 == error_mark_node
10596       || arg1 == error_mark_node
10597       || arg2 == error_mark_node)
10598     return const0_rtx;
10599
10600   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
10601     op0 = copy_to_mode_reg (tmode, op0);
10602
10603   op2 = copy_to_mode_reg (mode2, op2);
10604
10605   if (op1 == const0_rtx)
10606     {
10607       addr = gen_rtx_MEM (tmode, op2);
10608     }
10609   else
10610     {
10611       op1 = copy_to_mode_reg (mode1, op1);
10612       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10613     }
10614
10615   pat = GEN_FCN (icode) (addr, op0);
10616   if (pat)
10617     emit_insn (pat);
10618   return NULL_RTX;
10619 }
10620
10621 static rtx
10622 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
10623 {
10624   rtx pat;
10625   tree arg0 = CALL_EXPR_ARG (exp, 0);
10626   tree arg1 = CALL_EXPR_ARG (exp, 1);
10627   tree arg2 = CALL_EXPR_ARG (exp, 2);
10628   rtx op0 = expand_normal (arg0);
10629   rtx op1 = expand_normal (arg1);
10630   rtx op2 = expand_normal (arg2);
10631   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10632   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10633   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10634   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
10635
10636   if (icode == CODE_FOR_nothing)
10637     /* Builtin not supported on this processor.  */
10638     return 0;
10639
10640   /* If we got invalid arguments bail out before generating bad rtl.  */
10641   if (arg0 == error_mark_node
10642       || arg1 == error_mark_node
10643       || arg2 == error_mark_node)
10644     return const0_rtx;
10645
10646   switch (icode)
10647     {
10648     case CODE_FOR_altivec_vsldoi_v4sf:
10649     case CODE_FOR_altivec_vsldoi_v4si:
10650     case CODE_FOR_altivec_vsldoi_v8hi:
10651     case CODE_FOR_altivec_vsldoi_v16qi:
10652       /* Only allow 4-bit unsigned literals.  */
10653       STRIP_NOPS (arg2);
10654       if (TREE_CODE (arg2) != INTEGER_CST
10655           || TREE_INT_CST_LOW (arg2) & ~0xf)
10656         {
10657           error ("argument 3 must be a 4-bit unsigned literal");
10658           return const0_rtx;
10659         }
10660       break;
10661
10662     case CODE_FOR_vsx_xxpermdi_v2df:
10663     case CODE_FOR_vsx_xxpermdi_v2di:
10664     case CODE_FOR_vsx_xxsldwi_v16qi:
10665     case CODE_FOR_vsx_xxsldwi_v8hi:
10666     case CODE_FOR_vsx_xxsldwi_v4si:
10667     case CODE_FOR_vsx_xxsldwi_v4sf:
10668     case CODE_FOR_vsx_xxsldwi_v2di:
10669     case CODE_FOR_vsx_xxsldwi_v2df:
10670       /* Only allow 2-bit unsigned literals.  */
10671       STRIP_NOPS (arg2);
10672       if (TREE_CODE (arg2) != INTEGER_CST
10673           || TREE_INT_CST_LOW (arg2) & ~0x3)
10674         {
10675           error ("argument 3 must be a 2-bit unsigned literal");
10676           return const0_rtx;
10677         }
10678       break;
10679
10680     case CODE_FOR_vsx_set_v2df:
10681     case CODE_FOR_vsx_set_v2di:
10682       /* Only allow 1-bit unsigned literals.  */
10683       STRIP_NOPS (arg2);
10684       if (TREE_CODE (arg2) != INTEGER_CST
10685           || TREE_INT_CST_LOW (arg2) & ~0x1)
10686         {
10687           error ("argument 3 must be a 1-bit unsigned literal");
10688           return const0_rtx;
10689         }
10690       break;
10691
10692     default:
10693       break;
10694     }
10695
10696   if (target == 0
10697       || GET_MODE (target) != tmode
10698       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10699     target = gen_reg_rtx (tmode);
10700
10701   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10702     op0 = copy_to_mode_reg (mode0, op0);
10703   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10704     op1 = copy_to_mode_reg (mode1, op1);
10705   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
10706     op2 = copy_to_mode_reg (mode2, op2);
10707
10708   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
10709     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
10710   else 
10711     pat = GEN_FCN (icode) (target, op0, op1, op2);
10712   if (! pat)
10713     return 0;
10714   emit_insn (pat);
10715
10716   return target;
10717 }
10718
10719 /* Expand the lvx builtins.  */
10720 static rtx
10721 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
10722 {
10723   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10724   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10725   tree arg0;
10726   enum machine_mode tmode, mode0;
10727   rtx pat, op0;
10728   enum insn_code icode;
10729
10730   switch (fcode)
10731     {
10732     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
10733       icode = CODE_FOR_vector_load_v16qi;
10734       break;
10735     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
10736       icode = CODE_FOR_vector_load_v8hi;
10737       break;
10738     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
10739       icode = CODE_FOR_vector_load_v4si;
10740       break;
10741     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
10742       icode = CODE_FOR_vector_load_v4sf;
10743       break;
10744     default:
10745       *expandedp = false;
10746       return NULL_RTX;
10747     }
10748
10749   *expandedp = true;
10750
10751   arg0 = CALL_EXPR_ARG (exp, 0);
10752   op0 = expand_normal (arg0);
10753   tmode = insn_data[icode].operand[0].mode;
10754   mode0 = insn_data[icode].operand[1].mode;
10755
10756   if (target == 0
10757       || GET_MODE (target) != tmode
10758       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10759     target = gen_reg_rtx (tmode);
10760
10761   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10762     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
10763
10764   pat = GEN_FCN (icode) (target, op0);
10765   if (! pat)
10766     return 0;
10767   emit_insn (pat);
10768   return target;
10769 }
10770
10771 /* Expand the stvx builtins.  */
10772 static rtx
10773 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
10774                            bool *expandedp)
10775 {
10776   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10777   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10778   tree arg0, arg1;
10779   enum machine_mode mode0, mode1;
10780   rtx pat, op0, op1;
10781   enum insn_code icode;
10782
10783   switch (fcode)
10784     {
10785     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
10786       icode = CODE_FOR_vector_store_v16qi;
10787       break;
10788     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
10789       icode = CODE_FOR_vector_store_v8hi;
10790       break;
10791     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
10792       icode = CODE_FOR_vector_store_v4si;
10793       break;
10794     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
10795       icode = CODE_FOR_vector_store_v4sf;
10796       break;
10797     default:
10798       *expandedp = false;
10799       return NULL_RTX;
10800     }
10801
10802   arg0 = CALL_EXPR_ARG (exp, 0);
10803   arg1 = CALL_EXPR_ARG (exp, 1);
10804   op0 = expand_normal (arg0);
10805   op1 = expand_normal (arg1);
10806   mode0 = insn_data[icode].operand[0].mode;
10807   mode1 = insn_data[icode].operand[1].mode;
10808
10809   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
10810     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
10811   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
10812     op1 = copy_to_mode_reg (mode1, op1);
10813
10814   pat = GEN_FCN (icode) (op0, op1);
10815   if (pat)
10816     emit_insn (pat);
10817
10818   *expandedp = true;
10819   return NULL_RTX;
10820 }
10821
10822 /* Expand the dst builtins.  */
10823 static rtx
10824 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
10825                             bool *expandedp)
10826 {
10827   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10828   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10829   tree arg0, arg1, arg2;
10830   enum machine_mode mode0, mode1;
10831   rtx pat, op0, op1, op2;
10832   const struct builtin_description *d;
10833   size_t i;
10834
10835   *expandedp = false;
10836
10837   /* Handle DST variants.  */
10838   d = bdesc_dst;
10839   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
10840     if (d->code == fcode)
10841       {
10842         arg0 = CALL_EXPR_ARG (exp, 0);
10843         arg1 = CALL_EXPR_ARG (exp, 1);
10844         arg2 = CALL_EXPR_ARG (exp, 2);
10845         op0 = expand_normal (arg0);
10846         op1 = expand_normal (arg1);
10847         op2 = expand_normal (arg2);
10848         mode0 = insn_data[d->icode].operand[0].mode;
10849         mode1 = insn_data[d->icode].operand[1].mode;
10850
10851         /* Invalid arguments, bail out before generating bad rtl.  */
10852         if (arg0 == error_mark_node
10853             || arg1 == error_mark_node
10854             || arg2 == error_mark_node)
10855           return const0_rtx;
10856
10857         *expandedp = true;
10858         STRIP_NOPS (arg2);
10859         if (TREE_CODE (arg2) != INTEGER_CST
10860             || TREE_INT_CST_LOW (arg2) & ~0x3)
10861           {
10862             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
10863             return const0_rtx;
10864           }
10865
10866         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
10867           op0 = copy_to_mode_reg (Pmode, op0);
10868         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
10869           op1 = copy_to_mode_reg (mode1, op1);
10870
10871         pat = GEN_FCN (d->icode) (op0, op1, op2);
10872         if (pat != 0)
10873           emit_insn (pat);
10874
10875         return NULL_RTX;
10876       }
10877
10878   return NULL_RTX;
10879 }
10880
10881 /* Expand vec_init builtin.  */
10882 static rtx
10883 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
10884 {
10885   enum machine_mode tmode = TYPE_MODE (type);
10886   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
10887   int i, n_elt = GET_MODE_NUNITS (tmode);
10888   rtvec v = rtvec_alloc (n_elt);
10889
10890   gcc_assert (VECTOR_MODE_P (tmode));
10891   gcc_assert (n_elt == call_expr_nargs (exp));
10892
10893   for (i = 0; i < n_elt; ++i)
10894     {
10895       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
10896       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
10897     }
10898
10899   if (!target || !register_operand (target, tmode))
10900     target = gen_reg_rtx (tmode);
10901
10902   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
10903   return target;
10904 }
10905
10906 /* Return the integer constant in ARG.  Constrain it to be in the range
10907    of the subparts of VEC_TYPE; issue an error if not.  */
10908
10909 static int
10910 get_element_number (tree vec_type, tree arg)
10911 {
10912   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
10913
10914   if (!host_integerp (arg, 1)
10915       || (elt = tree_low_cst (arg, 1), elt > max))
10916     {
10917       error ("selector must be an integer constant in the range 0..%wi", max);
10918       return 0;
10919     }
10920
10921   return elt;
10922 }
10923
10924 /* Expand vec_set builtin.  */
10925 static rtx
10926 altivec_expand_vec_set_builtin (tree exp)
10927 {
10928   enum machine_mode tmode, mode1;
10929   tree arg0, arg1, arg2;
10930   int elt;
10931   rtx op0, op1;
10932
10933   arg0 = CALL_EXPR_ARG (exp, 0);
10934   arg1 = CALL_EXPR_ARG (exp, 1);
10935   arg2 = CALL_EXPR_ARG (exp, 2);
10936
10937   tmode = TYPE_MODE (TREE_TYPE (arg0));
10938   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
10939   gcc_assert (VECTOR_MODE_P (tmode));
10940
10941   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
10942   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
10943   elt = get_element_number (TREE_TYPE (arg0), arg2);
10944
10945   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
10946     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
10947
10948   op0 = force_reg (tmode, op0);
10949   op1 = force_reg (mode1, op1);
10950
10951   rs6000_expand_vector_set (op0, op1, elt);
10952
10953   return op0;
10954 }
10955
10956 /* Expand vec_ext builtin.  */
10957 static rtx
10958 altivec_expand_vec_ext_builtin (tree exp, rtx target)
10959 {
10960   enum machine_mode tmode, mode0;
10961   tree arg0, arg1;
10962   int elt;
10963   rtx op0;
10964
10965   arg0 = CALL_EXPR_ARG (exp, 0);
10966   arg1 = CALL_EXPR_ARG (exp, 1);
10967
10968   op0 = expand_normal (arg0);
10969   elt = get_element_number (TREE_TYPE (arg0), arg1);
10970
10971   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
10972   mode0 = TYPE_MODE (TREE_TYPE (arg0));
10973   gcc_assert (VECTOR_MODE_P (mode0));
10974
10975   op0 = force_reg (mode0, op0);
10976
10977   if (optimize || !target || !register_operand (target, tmode))
10978     target = gen_reg_rtx (tmode);
10979
10980   rs6000_expand_vector_extract (target, op0, elt);
10981
10982   return target;
10983 }
10984
10985 /* Expand the builtin in EXP and store the result in TARGET.  Store
10986    true in *EXPANDEDP if we found a builtin to expand.  */
10987 static rtx
10988 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
10989 {
10990   const struct builtin_description *d;
10991   const struct builtin_description_predicates *dp;
10992   size_t i;
10993   enum insn_code icode;
10994   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10995   tree arg0;
10996   rtx op0, pat;
10997   enum machine_mode tmode, mode0;
10998   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10999
11000   if ((fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
11001        && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
11002       || (fcode >= VSX_BUILTIN_OVERLOADED_FIRST
11003           && fcode <= VSX_BUILTIN_OVERLOADED_LAST))
11004     {
11005       *expandedp = true;
11006       error ("unresolved overload for Altivec builtin %qF", fndecl);
11007       return const0_rtx;
11008     }
11009
11010   target = altivec_expand_ld_builtin (exp, target, expandedp);
11011   if (*expandedp)
11012     return target;
11013
11014   target = altivec_expand_st_builtin (exp, target, expandedp);
11015   if (*expandedp)
11016     return target;
11017
11018   target = altivec_expand_dst_builtin (exp, target, expandedp);
11019   if (*expandedp)
11020     return target;
11021
11022   *expandedp = true;
11023
11024   switch (fcode)
11025     {
11026     case ALTIVEC_BUILTIN_STVX:
11027       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, exp);
11028     case ALTIVEC_BUILTIN_STVEBX:
11029       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
11030     case ALTIVEC_BUILTIN_STVEHX:
11031       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
11032     case ALTIVEC_BUILTIN_STVEWX:
11033       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
11034     case ALTIVEC_BUILTIN_STVXL:
11035       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
11036
11037     case ALTIVEC_BUILTIN_STVLX:
11038       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
11039     case ALTIVEC_BUILTIN_STVLXL:
11040       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
11041     case ALTIVEC_BUILTIN_STVRX:
11042       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
11043     case ALTIVEC_BUILTIN_STVRXL:
11044       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
11045
11046     case ALTIVEC_BUILTIN_MFVSCR:
11047       icode = CODE_FOR_altivec_mfvscr;
11048       tmode = insn_data[icode].operand[0].mode;
11049
11050       if (target == 0
11051           || GET_MODE (target) != tmode
11052           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11053         target = gen_reg_rtx (tmode);
11054
11055       pat = GEN_FCN (icode) (target);
11056       if (! pat)
11057         return 0;
11058       emit_insn (pat);
11059       return target;
11060
11061     case ALTIVEC_BUILTIN_MTVSCR:
11062       icode = CODE_FOR_altivec_mtvscr;
11063       arg0 = CALL_EXPR_ARG (exp, 0);
11064       op0 = expand_normal (arg0);
11065       mode0 = insn_data[icode].operand[0].mode;
11066
11067       /* If we got invalid arguments bail out before generating bad rtl.  */
11068       if (arg0 == error_mark_node)
11069         return const0_rtx;
11070
11071       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11072         op0 = copy_to_mode_reg (mode0, op0);
11073
11074       pat = GEN_FCN (icode) (op0);
11075       if (pat)
11076         emit_insn (pat);
11077       return NULL_RTX;
11078
11079     case ALTIVEC_BUILTIN_DSSALL:
11080       emit_insn (gen_altivec_dssall ());
11081       return NULL_RTX;
11082
11083     case ALTIVEC_BUILTIN_DSS:
11084       icode = CODE_FOR_altivec_dss;
11085       arg0 = CALL_EXPR_ARG (exp, 0);
11086       STRIP_NOPS (arg0);
11087       op0 = expand_normal (arg0);
11088       mode0 = insn_data[icode].operand[0].mode;
11089
11090       /* If we got invalid arguments bail out before generating bad rtl.  */
11091       if (arg0 == error_mark_node)
11092         return const0_rtx;
11093
11094       if (TREE_CODE (arg0) != INTEGER_CST
11095           || TREE_INT_CST_LOW (arg0) & ~0x3)
11096         {
11097           error ("argument to dss must be a 2-bit unsigned literal");
11098           return const0_rtx;
11099         }
11100
11101       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11102         op0 = copy_to_mode_reg (mode0, op0);
11103
11104       emit_insn (gen_altivec_dss (op0));
11105       return NULL_RTX;
11106
11107     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
11108     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
11109     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
11110     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
11111     case VSX_BUILTIN_VEC_INIT_V2DF:
11112     case VSX_BUILTIN_VEC_INIT_V2DI:
11113       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
11114
11115     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
11116     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
11117     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
11118     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
11119     case VSX_BUILTIN_VEC_SET_V2DF:
11120     case VSX_BUILTIN_VEC_SET_V2DI:
11121       return altivec_expand_vec_set_builtin (exp);
11122
11123     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
11124     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
11125     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
11126     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
11127     case VSX_BUILTIN_VEC_EXT_V2DF:
11128     case VSX_BUILTIN_VEC_EXT_V2DI:
11129       return altivec_expand_vec_ext_builtin (exp, target);
11130
11131     default:
11132       break;
11133       /* Fall through.  */
11134     }
11135
11136   /* Expand abs* operations.  */
11137   d = bdesc_abs;
11138   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
11139     if (d->code == fcode)
11140       return altivec_expand_abs_builtin (d->icode, exp, target);
11141
11142   /* Expand the AltiVec predicates.  */
11143   dp = bdesc_altivec_preds;
11144   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
11145     if (dp->code == fcode)
11146       return altivec_expand_predicate_builtin (dp->icode, exp, target);
11147
11148   /* LV* are funky.  We initialized them differently.  */
11149   switch (fcode)
11150     {
11151     case ALTIVEC_BUILTIN_LVSL:
11152       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
11153                                         exp, target, false);
11154     case ALTIVEC_BUILTIN_LVSR:
11155       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
11156                                         exp, target, false);
11157     case ALTIVEC_BUILTIN_LVEBX:
11158       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
11159                                         exp, target, false);
11160     case ALTIVEC_BUILTIN_LVEHX:
11161       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
11162                                         exp, target, false);
11163     case ALTIVEC_BUILTIN_LVEWX:
11164       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
11165                                         exp, target, false);
11166     case ALTIVEC_BUILTIN_LVXL:
11167       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
11168                                         exp, target, false);
11169     case ALTIVEC_BUILTIN_LVX:
11170       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
11171                                         exp, target, false);
11172     case ALTIVEC_BUILTIN_LVLX:
11173       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
11174                                         exp, target, true);
11175     case ALTIVEC_BUILTIN_LVLXL:
11176       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
11177                                         exp, target, true);
11178     case ALTIVEC_BUILTIN_LVRX:
11179       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
11180                                         exp, target, true);
11181     case ALTIVEC_BUILTIN_LVRXL:
11182       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
11183                                         exp, target, true);
11184     default:
11185       break;
11186       /* Fall through.  */
11187     }
11188
11189   *expandedp = false;
11190   return NULL_RTX;
11191 }
11192
11193 /* Expand the builtin in EXP and store the result in TARGET.  Store
11194    true in *EXPANDEDP if we found a builtin to expand.  */
11195 static rtx
11196 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
11197 {
11198   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11199   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11200   const struct builtin_description *d;
11201   size_t i;
11202
11203   *expandedp = true;
11204
11205   switch (fcode)
11206     {
11207     case PAIRED_BUILTIN_STX:
11208       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
11209     case PAIRED_BUILTIN_LX:
11210       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
11211     default:
11212       break;
11213       /* Fall through.  */
11214     }
11215
11216   /* Expand the paired predicates.  */
11217   d = bdesc_paired_preds;
11218   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
11219     if (d->code == fcode)
11220       return paired_expand_predicate_builtin (d->icode, exp, target);
11221
11222   *expandedp = false;
11223   return NULL_RTX;
11224 }
11225
11226 /* Binops that need to be initialized manually, but can be expanded
11227    automagically by rs6000_expand_binop_builtin.  */
11228 static struct builtin_description bdesc_2arg_spe[] =
11229 {
11230   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
11231   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
11232   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
11233   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
11234   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
11235   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
11236   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
11237   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
11238   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
11239   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
11240   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
11241   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
11242   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
11243   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
11244   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
11245   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
11246   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
11247   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
11248   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
11249   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
11250   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
11251   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
11252 };
11253
11254 /* Expand the builtin in EXP and store the result in TARGET.  Store
11255    true in *EXPANDEDP if we found a builtin to expand.
11256
11257    This expands the SPE builtins that are not simple unary and binary
11258    operations.  */
11259 static rtx
11260 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
11261 {
11262   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11263   tree arg1, arg0;
11264   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11265   enum insn_code icode;
11266   enum machine_mode tmode, mode0;
11267   rtx pat, op0;
11268   struct builtin_description *d;
11269   size_t i;
11270
11271   *expandedp = true;
11272
11273   /* Syntax check for a 5-bit unsigned immediate.  */
11274   switch (fcode)
11275     {
11276     case SPE_BUILTIN_EVSTDD:
11277     case SPE_BUILTIN_EVSTDH:
11278     case SPE_BUILTIN_EVSTDW:
11279     case SPE_BUILTIN_EVSTWHE:
11280     case SPE_BUILTIN_EVSTWHO:
11281     case SPE_BUILTIN_EVSTWWE:
11282     case SPE_BUILTIN_EVSTWWO:
11283       arg1 = CALL_EXPR_ARG (exp, 2);
11284       if (TREE_CODE (arg1) != INTEGER_CST
11285           || TREE_INT_CST_LOW (arg1) & ~0x1f)
11286         {
11287           error ("argument 2 must be a 5-bit unsigned literal");
11288           return const0_rtx;
11289         }
11290       break;
11291     default:
11292       break;
11293     }
11294
11295   /* The evsplat*i instructions are not quite generic.  */
11296   switch (fcode)
11297     {
11298     case SPE_BUILTIN_EVSPLATFI:
11299       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
11300                                          exp, target);
11301     case SPE_BUILTIN_EVSPLATI:
11302       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
11303                                          exp, target);
11304     default:
11305       break;
11306     }
11307
11308   d = (struct builtin_description *) bdesc_2arg_spe;
11309   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
11310     if (d->code == fcode)
11311       return rs6000_expand_binop_builtin (d->icode, exp, target);
11312
11313   d = (struct builtin_description *) bdesc_spe_predicates;
11314   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
11315     if (d->code == fcode)
11316       return spe_expand_predicate_builtin (d->icode, exp, target);
11317
11318   d = (struct builtin_description *) bdesc_spe_evsel;
11319   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
11320     if (d->code == fcode)
11321       return spe_expand_evsel_builtin (d->icode, exp, target);
11322
11323   switch (fcode)
11324     {
11325     case SPE_BUILTIN_EVSTDDX:
11326       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
11327     case SPE_BUILTIN_EVSTDHX:
11328       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
11329     case SPE_BUILTIN_EVSTDWX:
11330       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
11331     case SPE_BUILTIN_EVSTWHEX:
11332       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
11333     case SPE_BUILTIN_EVSTWHOX:
11334       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
11335     case SPE_BUILTIN_EVSTWWEX:
11336       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
11337     case SPE_BUILTIN_EVSTWWOX:
11338       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
11339     case SPE_BUILTIN_EVSTDD:
11340       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
11341     case SPE_BUILTIN_EVSTDH:
11342       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
11343     case SPE_BUILTIN_EVSTDW:
11344       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
11345     case SPE_BUILTIN_EVSTWHE:
11346       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
11347     case SPE_BUILTIN_EVSTWHO:
11348       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
11349     case SPE_BUILTIN_EVSTWWE:
11350       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
11351     case SPE_BUILTIN_EVSTWWO:
11352       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
11353     case SPE_BUILTIN_MFSPEFSCR:
11354       icode = CODE_FOR_spe_mfspefscr;
11355       tmode = insn_data[icode].operand[0].mode;
11356
11357       if (target == 0
11358           || GET_MODE (target) != tmode
11359           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11360         target = gen_reg_rtx (tmode);
11361
11362       pat = GEN_FCN (icode) (target);
11363       if (! pat)
11364         return 0;
11365       emit_insn (pat);
11366       return target;
11367     case SPE_BUILTIN_MTSPEFSCR:
11368       icode = CODE_FOR_spe_mtspefscr;
11369       arg0 = CALL_EXPR_ARG (exp, 0);
11370       op0 = expand_normal (arg0);
11371       mode0 = insn_data[icode].operand[0].mode;
11372
11373       if (arg0 == error_mark_node)
11374         return const0_rtx;
11375
11376       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11377         op0 = copy_to_mode_reg (mode0, op0);
11378
11379       pat = GEN_FCN (icode) (op0);
11380       if (pat)
11381         emit_insn (pat);
11382       return NULL_RTX;
11383     default:
11384       break;
11385     }
11386
11387   *expandedp = false;
11388   return NULL_RTX;
11389 }
11390
11391 static rtx
11392 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11393 {
11394   rtx pat, scratch, tmp;
11395   tree form = CALL_EXPR_ARG (exp, 0);
11396   tree arg0 = CALL_EXPR_ARG (exp, 1);
11397   tree arg1 = CALL_EXPR_ARG (exp, 2);
11398   rtx op0 = expand_normal (arg0);
11399   rtx op1 = expand_normal (arg1);
11400   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11401   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11402   int form_int;
11403   enum rtx_code code;
11404
11405   if (TREE_CODE (form) != INTEGER_CST)
11406     {
11407       error ("argument 1 of __builtin_paired_predicate must be a constant");
11408       return const0_rtx;
11409     }
11410   else
11411     form_int = TREE_INT_CST_LOW (form);
11412
11413   gcc_assert (mode0 == mode1);
11414
11415   if (arg0 == error_mark_node || arg1 == error_mark_node)
11416     return const0_rtx;
11417
11418   if (target == 0
11419       || GET_MODE (target) != SImode
11420       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
11421     target = gen_reg_rtx (SImode);
11422   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
11423     op0 = copy_to_mode_reg (mode0, op0);
11424   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
11425     op1 = copy_to_mode_reg (mode1, op1);
11426
11427   scratch = gen_reg_rtx (CCFPmode);
11428
11429   pat = GEN_FCN (icode) (scratch, op0, op1);
11430   if (!pat)
11431     return const0_rtx;
11432
11433   emit_insn (pat);
11434
11435   switch (form_int)
11436     {
11437       /* LT bit.  */
11438     case 0:
11439       code = LT;
11440       break;
11441       /* GT bit.  */
11442     case 1:
11443       code = GT;
11444       break;
11445       /* EQ bit.  */
11446     case 2:
11447       code = EQ;
11448       break;
11449       /* UN bit.  */
11450     case 3:
11451       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11452       return target;
11453     default:
11454       error ("argument 1 of __builtin_paired_predicate is out of range");
11455       return const0_rtx;
11456     }
11457
11458   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11459   emit_move_insn (target, tmp);
11460   return target;
11461 }
11462
11463 static rtx
11464 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11465 {
11466   rtx pat, scratch, tmp;
11467   tree form = CALL_EXPR_ARG (exp, 0);
11468   tree arg0 = CALL_EXPR_ARG (exp, 1);
11469   tree arg1 = CALL_EXPR_ARG (exp, 2);
11470   rtx op0 = expand_normal (arg0);
11471   rtx op1 = expand_normal (arg1);
11472   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11473   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11474   int form_int;
11475   enum rtx_code code;
11476
11477   if (TREE_CODE (form) != INTEGER_CST)
11478     {
11479       error ("argument 1 of __builtin_spe_predicate must be a constant");
11480       return const0_rtx;
11481     }
11482   else
11483     form_int = TREE_INT_CST_LOW (form);
11484
11485   gcc_assert (mode0 == mode1);
11486
11487   if (arg0 == error_mark_node || arg1 == error_mark_node)
11488     return const0_rtx;
11489
11490   if (target == 0
11491       || GET_MODE (target) != SImode
11492       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
11493     target = gen_reg_rtx (SImode);
11494
11495   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11496     op0 = copy_to_mode_reg (mode0, op0);
11497   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11498     op1 = copy_to_mode_reg (mode1, op1);
11499
11500   scratch = gen_reg_rtx (CCmode);
11501
11502   pat = GEN_FCN (icode) (scratch, op0, op1);
11503   if (! pat)
11504     return const0_rtx;
11505   emit_insn (pat);
11506
11507   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
11508      _lower_.  We use one compare, but look in different bits of the
11509      CR for each variant.
11510
11511      There are 2 elements in each SPE simd type (upper/lower).  The CR
11512      bits are set as follows:
11513
11514      BIT0  | BIT 1  | BIT 2   | BIT 3
11515      U     |   L    | (U | L) | (U & L)
11516
11517      So, for an "all" relationship, BIT 3 would be set.
11518      For an "any" relationship, BIT 2 would be set.  Etc.
11519
11520      Following traditional nomenclature, these bits map to:
11521
11522      BIT0  | BIT 1  | BIT 2   | BIT 3
11523      LT    | GT     | EQ      | OV
11524
11525      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
11526   */
11527
11528   switch (form_int)
11529     {
11530       /* All variant.  OV bit.  */
11531     case 0:
11532       /* We need to get to the OV bit, which is the ORDERED bit.  We
11533          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
11534          that's ugly and will make validate_condition_mode die.
11535          So let's just use another pattern.  */
11536       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11537       return target;
11538       /* Any variant.  EQ bit.  */
11539     case 1:
11540       code = EQ;
11541       break;
11542       /* Upper variant.  LT bit.  */
11543     case 2:
11544       code = LT;
11545       break;
11546       /* Lower variant.  GT bit.  */
11547     case 3:
11548       code = GT;
11549       break;
11550     default:
11551       error ("argument 1 of __builtin_spe_predicate is out of range");
11552       return const0_rtx;
11553     }
11554
11555   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11556   emit_move_insn (target, tmp);
11557
11558   return target;
11559 }
11560
11561 /* The evsel builtins look like this:
11562
11563      e = __builtin_spe_evsel_OP (a, b, c, d);
11564
11565    and work like this:
11566
11567      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
11568      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
11569 */
11570
11571 static rtx
11572 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
11573 {
11574   rtx pat, scratch;
11575   tree arg0 = CALL_EXPR_ARG (exp, 0);
11576   tree arg1 = CALL_EXPR_ARG (exp, 1);
11577   tree arg2 = CALL_EXPR_ARG (exp, 2);
11578   tree arg3 = CALL_EXPR_ARG (exp, 3);
11579   rtx op0 = expand_normal (arg0);
11580   rtx op1 = expand_normal (arg1);
11581   rtx op2 = expand_normal (arg2);
11582   rtx op3 = expand_normal (arg3);
11583   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11584   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11585
11586   gcc_assert (mode0 == mode1);
11587
11588   if (arg0 == error_mark_node || arg1 == error_mark_node
11589       || arg2 == error_mark_node || arg3 == error_mark_node)
11590     return const0_rtx;
11591
11592   if (target == 0
11593       || GET_MODE (target) != mode0
11594       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
11595     target = gen_reg_rtx (mode0);
11596
11597   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11598     op0 = copy_to_mode_reg (mode0, op0);
11599   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11600     op1 = copy_to_mode_reg (mode0, op1);
11601   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
11602     op2 = copy_to_mode_reg (mode0, op2);
11603   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
11604     op3 = copy_to_mode_reg (mode0, op3);
11605
11606   /* Generate the compare.  */
11607   scratch = gen_reg_rtx (CCmode);
11608   pat = GEN_FCN (icode) (scratch, op0, op1);
11609   if (! pat)
11610     return const0_rtx;
11611   emit_insn (pat);
11612
11613   if (mode0 == V2SImode)
11614     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
11615   else
11616     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
11617
11618   return target;
11619 }
11620
11621 /* Expand an expression EXP that calls a built-in function,
11622    with result going to TARGET if that's convenient
11623    (and in mode MODE if that's convenient).
11624    SUBTARGET may be used as the target for computing one of EXP's operands.
11625    IGNORE is nonzero if the value is to be ignored.  */
11626
11627 static rtx
11628 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
11629                        enum machine_mode mode ATTRIBUTE_UNUSED,
11630                        int ignore ATTRIBUTE_UNUSED)
11631 {
11632   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11633   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11634   const struct builtin_description *d;
11635   size_t i;
11636   rtx ret;
11637   bool success;
11638
11639   switch (fcode)
11640     {
11641     case RS6000_BUILTIN_RECIP:
11642       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
11643
11644     case RS6000_BUILTIN_RECIPF:
11645       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
11646
11647     case RS6000_BUILTIN_RSQRTF:
11648       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
11649
11650     case RS6000_BUILTIN_RSQRT:
11651       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
11652
11653     case RS6000_BUILTIN_BSWAP_HI:
11654       return rs6000_expand_unop_builtin (CODE_FOR_bswaphi2, exp, target);
11655
11656     case POWER7_BUILTIN_BPERMD:
11657       return rs6000_expand_binop_builtin (((TARGET_64BIT)
11658                                            ? CODE_FOR_bpermd_di
11659                                            : CODE_FOR_bpermd_si), exp, target);
11660
11661     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
11662     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
11663       {
11664         int icode = (int) CODE_FOR_altivec_lvsr;
11665         enum machine_mode tmode = insn_data[icode].operand[0].mode;
11666         enum machine_mode mode = insn_data[icode].operand[1].mode;
11667         tree arg;
11668         rtx op, addr, pat;
11669
11670         gcc_assert (TARGET_ALTIVEC);
11671
11672         arg = CALL_EXPR_ARG (exp, 0);
11673         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
11674         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
11675         addr = memory_address (mode, op);
11676         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
11677           op = addr;
11678         else
11679           {
11680             /* For the load case need to negate the address.  */
11681             op = gen_reg_rtx (GET_MODE (addr));
11682             emit_insn (gen_rtx_SET (VOIDmode, op,
11683                                     gen_rtx_NEG (GET_MODE (addr), addr)));
11684           }
11685         op = gen_rtx_MEM (mode, op);
11686
11687         if (target == 0
11688             || GET_MODE (target) != tmode
11689             || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11690           target = gen_reg_rtx (tmode);
11691
11692         /*pat = gen_altivec_lvsr (target, op);*/
11693         pat = GEN_FCN (icode) (target, op);
11694         if (!pat)
11695           return 0;
11696         emit_insn (pat);
11697
11698         return target;
11699       }
11700
11701     case ALTIVEC_BUILTIN_VCFUX:
11702     case ALTIVEC_BUILTIN_VCFSX:
11703     case ALTIVEC_BUILTIN_VCTUXS:
11704     case ALTIVEC_BUILTIN_VCTSXS:
11705   /* FIXME: There's got to be a nicer way to handle this case than
11706      constructing a new CALL_EXPR.  */
11707       if (call_expr_nargs (exp) == 1)
11708         {
11709           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
11710                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
11711         }
11712       break;
11713
11714     default:
11715       break;
11716     }
11717
11718   if (TARGET_ALTIVEC)
11719     {
11720       ret = altivec_expand_builtin (exp, target, &success);
11721
11722       if (success)
11723         return ret;
11724     }
11725   if (TARGET_SPE)
11726     {
11727       ret = spe_expand_builtin (exp, target, &success);
11728
11729       if (success)
11730         return ret;
11731     }
11732   if (TARGET_PAIRED_FLOAT)
11733     {
11734       ret = paired_expand_builtin (exp, target, &success);
11735
11736       if (success)
11737         return ret;
11738     }  
11739
11740   gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
11741
11742   /* Handle simple unary operations.  */
11743   d = (struct builtin_description *) bdesc_1arg;
11744   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
11745     if (d->code == fcode)
11746       return rs6000_expand_unop_builtin (d->icode, exp, target);
11747
11748   /* Handle simple binary operations.  */
11749   d = (struct builtin_description *) bdesc_2arg;
11750   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
11751     if (d->code == fcode)
11752       return rs6000_expand_binop_builtin (d->icode, exp, target);
11753
11754   /* Handle simple ternary operations.  */
11755   d = bdesc_3arg;
11756   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
11757     if (d->code == fcode)
11758       return rs6000_expand_ternop_builtin (d->icode, exp, target);
11759
11760   gcc_unreachable ();
11761 }
11762
11763 static void
11764 rs6000_init_builtins (void)
11765 {
11766   tree tdecl;
11767   tree ftype;
11768
11769   V2SI_type_node = build_vector_type (intSI_type_node, 2);
11770   V2SF_type_node = build_vector_type (float_type_node, 2);
11771   V2DI_type_node = build_vector_type (intDI_type_node, 2);
11772   V2DF_type_node = build_vector_type (double_type_node, 2);
11773   V4HI_type_node = build_vector_type (intHI_type_node, 4);
11774   V4SI_type_node = build_vector_type (intSI_type_node, 4);
11775   V4SF_type_node = build_vector_type (float_type_node, 4);
11776   V8HI_type_node = build_vector_type (intHI_type_node, 8);
11777   V16QI_type_node = build_vector_type (intQI_type_node, 16);
11778
11779   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
11780   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
11781   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
11782   unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2);
11783
11784   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
11785   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
11786   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
11787   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
11788
11789   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
11790      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
11791      'vector unsigned short'.  */
11792
11793   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
11794   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
11795   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
11796   bool_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
11797   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
11798
11799   long_integer_type_internal_node = long_integer_type_node;
11800   long_unsigned_type_internal_node = long_unsigned_type_node;
11801   intQI_type_internal_node = intQI_type_node;
11802   uintQI_type_internal_node = unsigned_intQI_type_node;
11803   intHI_type_internal_node = intHI_type_node;
11804   uintHI_type_internal_node = unsigned_intHI_type_node;
11805   intSI_type_internal_node = intSI_type_node;
11806   uintSI_type_internal_node = unsigned_intSI_type_node;
11807   intDI_type_internal_node = intDI_type_node;
11808   uintDI_type_internal_node = unsigned_intDI_type_node;
11809   float_type_internal_node = float_type_node;
11810   double_type_internal_node = float_type_node;
11811   void_type_internal_node = void_type_node;
11812
11813   /* Initialize the modes for builtin_function_type, mapping a machine mode to
11814      tree type node.  */
11815   builtin_mode_to_type[QImode][0] = integer_type_node;
11816   builtin_mode_to_type[HImode][0] = integer_type_node;
11817   builtin_mode_to_type[SImode][0] = intSI_type_node;
11818   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
11819   builtin_mode_to_type[DImode][0] = intDI_type_node;
11820   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
11821   builtin_mode_to_type[SFmode][0] = float_type_node;
11822   builtin_mode_to_type[DFmode][0] = double_type_node;
11823   builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
11824   builtin_mode_to_type[V2SFmode][0] = V2SF_type_node;
11825   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
11826   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
11827   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
11828   builtin_mode_to_type[V4HImode][0] = V4HI_type_node;
11829   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
11830   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
11831   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
11832   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
11833   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
11834   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
11835   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
11836
11837   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
11838                       get_identifier ("__bool char"),
11839                       bool_char_type_node);
11840   TYPE_NAME (bool_char_type_node) = tdecl;
11841   (*lang_hooks.decls.pushdecl) (tdecl);
11842   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
11843                       get_identifier ("__bool short"),
11844                       bool_short_type_node);
11845   TYPE_NAME (bool_short_type_node) = tdecl;
11846   (*lang_hooks.decls.pushdecl) (tdecl);
11847   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
11848                       get_identifier ("__bool int"),
11849                       bool_int_type_node);
11850   TYPE_NAME (bool_int_type_node) = tdecl;
11851   (*lang_hooks.decls.pushdecl) (tdecl);
11852   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"),
11853                       pixel_type_node);
11854   TYPE_NAME (pixel_type_node) = tdecl;
11855   (*lang_hooks.decls.pushdecl) (tdecl);
11856
11857   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
11858   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
11859   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
11860   bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2);
11861   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
11862
11863   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
11864                       get_identifier ("__vector unsigned char"),
11865                       unsigned_V16QI_type_node);
11866   TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
11867   (*lang_hooks.decls.pushdecl) (tdecl);
11868   tdecl = build_decl (BUILTINS_LOCATION,
11869                       TYPE_DECL, get_identifier ("__vector signed char"),
11870                       V16QI_type_node);
11871   TYPE_NAME (V16QI_type_node) = tdecl;
11872   (*lang_hooks.decls.pushdecl) (tdecl);
11873   tdecl = build_decl (BUILTINS_LOCATION,
11874                       TYPE_DECL, get_identifier ("__vector __bool char"),
11875                       bool_V16QI_type_node);
11876   TYPE_NAME ( bool_V16QI_type_node) = tdecl;
11877   (*lang_hooks.decls.pushdecl) (tdecl);
11878
11879   tdecl = build_decl (BUILTINS_LOCATION,
11880                       TYPE_DECL, get_identifier ("__vector unsigned short"),
11881                       unsigned_V8HI_type_node);
11882   TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
11883   (*lang_hooks.decls.pushdecl) (tdecl);
11884   tdecl = build_decl (BUILTINS_LOCATION,
11885                       TYPE_DECL, get_identifier ("__vector signed short"),
11886                       V8HI_type_node);
11887   TYPE_NAME (V8HI_type_node) = tdecl;
11888   (*lang_hooks.decls.pushdecl) (tdecl);
11889   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
11890                       get_identifier ("__vector __bool short"),
11891                       bool_V8HI_type_node);
11892   TYPE_NAME (bool_V8HI_type_node) = tdecl;
11893   (*lang_hooks.decls.pushdecl) (tdecl);
11894
11895   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
11896                       get_identifier ("__vector unsigned int"),
11897                       unsigned_V4SI_type_node);
11898   TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
11899   (*lang_hooks.decls.pushdecl) (tdecl);
11900   tdecl = build_decl (BUILTINS_LOCATION,
11901                       TYPE_DECL, get_identifier ("__vector signed int"),
11902                       V4SI_type_node);
11903   TYPE_NAME (V4SI_type_node) = tdecl;
11904   (*lang_hooks.decls.pushdecl) (tdecl);
11905   tdecl = build_decl (BUILTINS_LOCATION,
11906                       TYPE_DECL, get_identifier ("__vector __bool int"),
11907                       bool_V4SI_type_node);
11908   TYPE_NAME (bool_V4SI_type_node) = tdecl;
11909   (*lang_hooks.decls.pushdecl) (tdecl);
11910
11911   tdecl = build_decl (BUILTINS_LOCATION,
11912                       TYPE_DECL, get_identifier ("__vector float"),
11913                       V4SF_type_node);
11914   TYPE_NAME (V4SF_type_node) = tdecl;
11915   (*lang_hooks.decls.pushdecl) (tdecl);
11916   tdecl = build_decl (BUILTINS_LOCATION,
11917                       TYPE_DECL, get_identifier ("__vector __pixel"),
11918                       pixel_V8HI_type_node);
11919   TYPE_NAME (pixel_V8HI_type_node) = tdecl;
11920   (*lang_hooks.decls.pushdecl) (tdecl);
11921
11922   if (TARGET_VSX)
11923     {
11924       tdecl = build_decl (BUILTINS_LOCATION,
11925                           TYPE_DECL, get_identifier ("__vector double"),
11926                           V2DF_type_node);
11927       TYPE_NAME (V2DF_type_node) = tdecl;
11928       (*lang_hooks.decls.pushdecl) (tdecl);
11929
11930       tdecl = build_decl (BUILTINS_LOCATION,
11931                           TYPE_DECL, get_identifier ("__vector long"),
11932                           V2DI_type_node);
11933       TYPE_NAME (V2DI_type_node) = tdecl;
11934       (*lang_hooks.decls.pushdecl) (tdecl);
11935
11936       tdecl = build_decl (BUILTINS_LOCATION,
11937                           TYPE_DECL, get_identifier ("__vector unsigned long"),
11938                           unsigned_V2DI_type_node);
11939       TYPE_NAME (unsigned_V2DI_type_node) = tdecl;
11940       (*lang_hooks.decls.pushdecl) (tdecl);
11941
11942       tdecl = build_decl (BUILTINS_LOCATION,
11943                           TYPE_DECL, get_identifier ("__vector __bool long"),
11944                           bool_V2DI_type_node);
11945       TYPE_NAME (bool_V2DI_type_node) = tdecl;
11946       (*lang_hooks.decls.pushdecl) (tdecl);
11947     }
11948
11949   if (TARGET_PAIRED_FLOAT)
11950     paired_init_builtins ();
11951   if (TARGET_SPE)
11952     spe_init_builtins ();
11953   if (TARGET_ALTIVEC)
11954     altivec_init_builtins ();
11955   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT || TARGET_VSX)
11956     rs6000_common_init_builtins ();
11957   if (TARGET_FRE)
11958     {
11959       ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
11960                                      RS6000_BUILTIN_RECIP,
11961                                      "__builtin_recipdiv");
11962       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
11963                    RS6000_BUILTIN_RECIP);
11964     }
11965   if (TARGET_FRES)
11966     {
11967       ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
11968                                      RS6000_BUILTIN_RECIPF,
11969                                      "__builtin_recipdivf");
11970       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
11971                    RS6000_BUILTIN_RECIPF);
11972     }
11973   if (TARGET_FRSQRTE)
11974     {
11975       ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
11976                                      RS6000_BUILTIN_RSQRT,
11977                                      "__builtin_rsqrt");
11978       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrt", ftype,
11979                    RS6000_BUILTIN_RSQRT);
11980     }
11981   if (TARGET_FRSQRTES)
11982     {
11983       ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
11984                                      RS6000_BUILTIN_RSQRTF,
11985                                      "__builtin_rsqrtf");
11986       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
11987                    RS6000_BUILTIN_RSQRTF);
11988     }
11989   if (TARGET_POPCNTD)
11990     {
11991       enum machine_mode mode = (TARGET_64BIT) ? DImode : SImode;
11992       tree ftype = builtin_function_type (mode, mode, mode, VOIDmode,
11993                                           POWER7_BUILTIN_BPERMD,
11994                                           "__builtin_bpermd");
11995       def_builtin (MASK_POPCNTD, "__builtin_bpermd", ftype,
11996                    POWER7_BUILTIN_BPERMD);
11997     }
11998   if (TARGET_POWERPC)
11999     {
12000       /* Don't use builtin_function_type here, as it maps HI/QI to SI.  */
12001       tree ftype = build_function_type_list (unsigned_intHI_type_node,
12002                                              unsigned_intHI_type_node,
12003                                              NULL_TREE);
12004       def_builtin (MASK_POWERPC, "__builtin_bswap16", ftype,
12005                    RS6000_BUILTIN_BSWAP_HI);
12006     }
12007
12008 #if TARGET_XCOFF
12009   /* AIX libm provides clog as __clog.  */
12010   if (built_in_decls [BUILT_IN_CLOG])
12011     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
12012 #endif
12013
12014 #ifdef SUBTARGET_INIT_BUILTINS
12015   SUBTARGET_INIT_BUILTINS;
12016 #endif
12017 }
12018
12019 /* Returns the rs6000 builtin decl for CODE.  */
12020
12021 static tree
12022 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
12023 {
12024   if (code >= RS6000_BUILTIN_COUNT)
12025     return error_mark_node;
12026
12027   return rs6000_builtin_decls[code];
12028 }
12029
12030 /* Search through a set of builtins and enable the mask bits.
12031    DESC is an array of builtins.
12032    SIZE is the total number of builtins.
12033    START is the builtin enum at which to start.
12034    END is the builtin enum at which to end.  */
12035 static void
12036 enable_mask_for_builtins (struct builtin_description *desc, int size,
12037                           enum rs6000_builtins start,
12038                           enum rs6000_builtins end)
12039 {
12040   int i;
12041
12042   for (i = 0; i < size; ++i)
12043     if (desc[i].code == start)
12044       break;
12045
12046   if (i == size)
12047     return;
12048
12049   for (; i < size; ++i)
12050     {
12051       /* Flip all the bits on.  */
12052       desc[i].mask = target_flags;
12053       if (desc[i].code == end)
12054         break;
12055     }
12056 }
12057
12058 static void
12059 spe_init_builtins (void)
12060 {
12061   tree endlink = void_list_node;
12062   tree puint_type_node = build_pointer_type (unsigned_type_node);
12063   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
12064   struct builtin_description *d;
12065   size_t i;
12066
12067   tree v2si_ftype_4_v2si
12068     = build_function_type
12069     (opaque_V2SI_type_node,
12070      tree_cons (NULL_TREE, opaque_V2SI_type_node,
12071                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12072                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12073                                       tree_cons (NULL_TREE, opaque_V2SI_type_node,
12074                                                  endlink)))));
12075
12076   tree v2sf_ftype_4_v2sf
12077     = build_function_type
12078     (opaque_V2SF_type_node,
12079      tree_cons (NULL_TREE, opaque_V2SF_type_node,
12080                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12081                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
12082                                       tree_cons (NULL_TREE, opaque_V2SF_type_node,
12083                                                  endlink)))));
12084
12085   tree int_ftype_int_v2si_v2si
12086     = build_function_type
12087     (integer_type_node,
12088      tree_cons (NULL_TREE, integer_type_node,
12089                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12090                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12091                                       endlink))));
12092
12093   tree int_ftype_int_v2sf_v2sf
12094     = build_function_type
12095     (integer_type_node,
12096      tree_cons (NULL_TREE, integer_type_node,
12097                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12098                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
12099                                       endlink))));
12100
12101   tree void_ftype_v2si_puint_int
12102     = build_function_type (void_type_node,
12103                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12104                                       tree_cons (NULL_TREE, puint_type_node,
12105                                                  tree_cons (NULL_TREE,
12106                                                             integer_type_node,
12107                                                             endlink))));
12108
12109   tree void_ftype_v2si_puint_char
12110     = build_function_type (void_type_node,
12111                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12112                                       tree_cons (NULL_TREE, puint_type_node,
12113                                                  tree_cons (NULL_TREE,
12114                                                             char_type_node,
12115                                                             endlink))));
12116
12117   tree void_ftype_v2si_pv2si_int
12118     = build_function_type (void_type_node,
12119                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12120                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12121                                                  tree_cons (NULL_TREE,
12122                                                             integer_type_node,
12123                                                             endlink))));
12124
12125   tree void_ftype_v2si_pv2si_char
12126     = build_function_type (void_type_node,
12127                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12128                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12129                                                  tree_cons (NULL_TREE,
12130                                                             char_type_node,
12131                                                             endlink))));
12132
12133   tree void_ftype_int
12134     = build_function_type (void_type_node,
12135                            tree_cons (NULL_TREE, integer_type_node, endlink));
12136
12137   tree int_ftype_void
12138     = build_function_type (integer_type_node, endlink);
12139
12140   tree v2si_ftype_pv2si_int
12141     = build_function_type (opaque_V2SI_type_node,
12142                            tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12143                                       tree_cons (NULL_TREE, integer_type_node,
12144                                                  endlink)));
12145
12146   tree v2si_ftype_puint_int
12147     = build_function_type (opaque_V2SI_type_node,
12148                            tree_cons (NULL_TREE, puint_type_node,
12149                                       tree_cons (NULL_TREE, integer_type_node,
12150                                                  endlink)));
12151
12152   tree v2si_ftype_pushort_int
12153     = build_function_type (opaque_V2SI_type_node,
12154                            tree_cons (NULL_TREE, pushort_type_node,
12155                                       tree_cons (NULL_TREE, integer_type_node,
12156                                                  endlink)));
12157
12158   tree v2si_ftype_signed_char
12159     = build_function_type (opaque_V2SI_type_node,
12160                            tree_cons (NULL_TREE, signed_char_type_node,
12161                                       endlink));
12162
12163   /* The initialization of the simple binary and unary builtins is
12164      done in rs6000_common_init_builtins, but we have to enable the
12165      mask bits here manually because we have run out of `target_flags'
12166      bits.  We really need to redesign this mask business.  */
12167
12168   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
12169                             ARRAY_SIZE (bdesc_2arg),
12170                             SPE_BUILTIN_EVADDW,
12171                             SPE_BUILTIN_EVXOR);
12172   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
12173                             ARRAY_SIZE (bdesc_1arg),
12174                             SPE_BUILTIN_EVABS,
12175                             SPE_BUILTIN_EVSUBFUSIAAW);
12176   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
12177                             ARRAY_SIZE (bdesc_spe_predicates),
12178                             SPE_BUILTIN_EVCMPEQ,
12179                             SPE_BUILTIN_EVFSTSTLT);
12180   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
12181                             ARRAY_SIZE (bdesc_spe_evsel),
12182                             SPE_BUILTIN_EVSEL_CMPGTS,
12183                             SPE_BUILTIN_EVSEL_FSTSTEQ);
12184
12185   (*lang_hooks.decls.pushdecl)
12186     (build_decl (BUILTINS_LOCATION, TYPE_DECL,
12187                  get_identifier ("__ev64_opaque__"),
12188                  opaque_V2SI_type_node));
12189
12190   /* Initialize irregular SPE builtins.  */
12191
12192   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
12193   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
12194   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
12195   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
12196   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
12197   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
12198   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
12199   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
12200   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
12201   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
12202   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
12203   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
12204   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
12205   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
12206   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
12207   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
12208   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
12209   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
12210
12211   /* Loads.  */
12212   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
12213   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
12214   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
12215   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
12216   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
12217   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
12218   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
12219   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
12220   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
12221   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
12222   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
12223   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
12224   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
12225   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
12226   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
12227   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
12228   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
12229   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
12230   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
12231   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
12232   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
12233   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
12234
12235   /* Predicates.  */
12236   d = (struct builtin_description *) bdesc_spe_predicates;
12237   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
12238     {
12239       tree type;
12240
12241       switch (insn_data[d->icode].operand[1].mode)
12242         {
12243         case V2SImode:
12244           type = int_ftype_int_v2si_v2si;
12245           break;
12246         case V2SFmode:
12247           type = int_ftype_int_v2sf_v2sf;
12248           break;
12249         default:
12250           gcc_unreachable ();
12251         }
12252
12253       def_builtin (d->mask, d->name, type, d->code);
12254     }
12255
12256   /* Evsel predicates.  */
12257   d = (struct builtin_description *) bdesc_spe_evsel;
12258   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
12259     {
12260       tree type;
12261
12262       switch (insn_data[d->icode].operand[1].mode)
12263         {
12264         case V2SImode:
12265           type = v2si_ftype_4_v2si;
12266           break;
12267         case V2SFmode:
12268           type = v2sf_ftype_4_v2sf;
12269           break;
12270         default:
12271           gcc_unreachable ();
12272         }
12273
12274       def_builtin (d->mask, d->name, type, d->code);
12275     }
12276 }
12277
12278 static void
12279 paired_init_builtins (void)
12280 {
12281   const struct builtin_description *d;
12282   size_t i;
12283   tree endlink = void_list_node;
12284
12285    tree int_ftype_int_v2sf_v2sf
12286     = build_function_type
12287     (integer_type_node,
12288      tree_cons (NULL_TREE, integer_type_node,
12289                 tree_cons (NULL_TREE, V2SF_type_node,
12290                            tree_cons (NULL_TREE, V2SF_type_node,
12291                                       endlink))));
12292   tree pcfloat_type_node =
12293     build_pointer_type (build_qualified_type
12294                         (float_type_node, TYPE_QUAL_CONST));
12295
12296   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
12297                                                            long_integer_type_node,
12298                                                            pcfloat_type_node,
12299                                                            NULL_TREE);
12300   tree void_ftype_v2sf_long_pcfloat =
12301     build_function_type_list (void_type_node,
12302                               V2SF_type_node,
12303                               long_integer_type_node,
12304                               pcfloat_type_node,
12305                               NULL_TREE);
12306
12307
12308   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
12309                PAIRED_BUILTIN_LX);
12310
12311
12312   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
12313                PAIRED_BUILTIN_STX);
12314
12315   /* Predicates.  */
12316   d = bdesc_paired_preds;
12317   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
12318     {
12319       tree type;
12320
12321       switch (insn_data[d->icode].operand[1].mode)
12322         {
12323         case V2SFmode:
12324           type = int_ftype_int_v2sf_v2sf;
12325           break;
12326         default:
12327           gcc_unreachable ();
12328         }
12329
12330       def_builtin (d->mask, d->name, type, d->code);
12331     }
12332 }
12333
12334 static void
12335 altivec_init_builtins (void)
12336 {
12337   const struct builtin_description *d;
12338   const struct builtin_description_predicates *dp;
12339   size_t i;
12340   tree ftype;
12341
12342   tree pfloat_type_node = build_pointer_type (float_type_node);
12343   tree pint_type_node = build_pointer_type (integer_type_node);
12344   tree pshort_type_node = build_pointer_type (short_integer_type_node);
12345   tree pchar_type_node = build_pointer_type (char_type_node);
12346
12347   tree pvoid_type_node = build_pointer_type (void_type_node);
12348
12349   tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
12350   tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
12351   tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
12352   tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
12353
12354   tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
12355
12356   tree int_ftype_opaque
12357     = build_function_type_list (integer_type_node,
12358                                 opaque_V4SI_type_node, NULL_TREE);
12359   tree opaque_ftype_opaque
12360     = build_function_type (integer_type_node,
12361                                 NULL_TREE);
12362   tree opaque_ftype_opaque_int
12363     = build_function_type_list (opaque_V4SI_type_node,
12364                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
12365   tree opaque_ftype_opaque_opaque_int
12366     = build_function_type_list (opaque_V4SI_type_node,
12367                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
12368                                 integer_type_node, NULL_TREE);
12369   tree int_ftype_int_opaque_opaque
12370     = build_function_type_list (integer_type_node,
12371                                 integer_type_node, opaque_V4SI_type_node,
12372                                 opaque_V4SI_type_node, NULL_TREE);
12373   tree int_ftype_int_v4si_v4si
12374     = build_function_type_list (integer_type_node,
12375                                 integer_type_node, V4SI_type_node,
12376                                 V4SI_type_node, NULL_TREE);
12377   tree v4sf_ftype_pcfloat
12378     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
12379   tree void_ftype_pfloat_v4sf
12380     = build_function_type_list (void_type_node,
12381                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
12382   tree v4si_ftype_pcint
12383     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
12384   tree void_ftype_pint_v4si
12385     = build_function_type_list (void_type_node,
12386                                 pint_type_node, V4SI_type_node, NULL_TREE);
12387   tree v8hi_ftype_pcshort
12388     = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
12389   tree void_ftype_pshort_v8hi
12390     = build_function_type_list (void_type_node,
12391                                 pshort_type_node, V8HI_type_node, NULL_TREE);
12392   tree v16qi_ftype_pcchar
12393     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
12394   tree void_ftype_pchar_v16qi
12395     = build_function_type_list (void_type_node,
12396                                 pchar_type_node, V16QI_type_node, NULL_TREE);
12397   tree void_ftype_v4si
12398     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
12399   tree v8hi_ftype_void
12400     = build_function_type (V8HI_type_node, void_list_node);
12401   tree void_ftype_void
12402     = build_function_type (void_type_node, void_list_node);
12403   tree void_ftype_int
12404     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
12405
12406   tree opaque_ftype_long_pcvoid
12407     = build_function_type_list (opaque_V4SI_type_node,
12408                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12409   tree v16qi_ftype_long_pcvoid
12410     = build_function_type_list (V16QI_type_node,
12411                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12412   tree v8hi_ftype_long_pcvoid
12413     = build_function_type_list (V8HI_type_node,
12414                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12415   tree v4si_ftype_long_pcvoid
12416     = build_function_type_list (V4SI_type_node,
12417                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12418
12419   tree void_ftype_opaque_long_pvoid
12420     = build_function_type_list (void_type_node,
12421                                 opaque_V4SI_type_node, long_integer_type_node,
12422                                 pvoid_type_node, NULL_TREE);
12423   tree void_ftype_v4si_long_pvoid
12424     = build_function_type_list (void_type_node,
12425                                 V4SI_type_node, long_integer_type_node,
12426                                 pvoid_type_node, NULL_TREE);
12427   tree void_ftype_v16qi_long_pvoid
12428     = build_function_type_list (void_type_node,
12429                                 V16QI_type_node, long_integer_type_node,
12430                                 pvoid_type_node, NULL_TREE);
12431   tree void_ftype_v8hi_long_pvoid
12432     = build_function_type_list (void_type_node,
12433                                 V8HI_type_node, long_integer_type_node,
12434                                 pvoid_type_node, NULL_TREE);
12435   tree int_ftype_int_v8hi_v8hi
12436     = build_function_type_list (integer_type_node,
12437                                 integer_type_node, V8HI_type_node,
12438                                 V8HI_type_node, NULL_TREE);
12439   tree int_ftype_int_v16qi_v16qi
12440     = build_function_type_list (integer_type_node,
12441                                 integer_type_node, V16QI_type_node,
12442                                 V16QI_type_node, NULL_TREE);
12443   tree int_ftype_int_v4sf_v4sf
12444     = build_function_type_list (integer_type_node,
12445                                 integer_type_node, V4SF_type_node,
12446                                 V4SF_type_node, NULL_TREE);
12447   tree int_ftype_int_v2df_v2df
12448     = build_function_type_list (integer_type_node,
12449                                 integer_type_node, V2DF_type_node,
12450                                 V2DF_type_node, NULL_TREE);
12451   tree v4si_ftype_v4si
12452     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
12453   tree v8hi_ftype_v8hi
12454     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
12455   tree v16qi_ftype_v16qi
12456     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
12457   tree v4sf_ftype_v4sf
12458     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
12459   tree v2df_ftype_v2df
12460     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
12461   tree void_ftype_pcvoid_int_int
12462     = build_function_type_list (void_type_node,
12463                                 pcvoid_type_node, integer_type_node,
12464                                 integer_type_node, NULL_TREE);
12465
12466   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
12467                ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
12468   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
12469                ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
12470   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
12471                ALTIVEC_BUILTIN_LD_INTERNAL_4si);
12472   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
12473                ALTIVEC_BUILTIN_ST_INTERNAL_4si);
12474   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
12475                ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
12476   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
12477                ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
12478   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
12479                ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
12480   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
12481                ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
12482   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
12483   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
12484   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
12485   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
12486   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
12487   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
12488   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
12489   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
12490   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
12491   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
12492   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
12493   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
12494   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
12495   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
12496   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
12497   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
12498   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
12499   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
12500   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
12501   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
12502   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
12503   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
12504   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
12505   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
12506   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
12507   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
12508   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
12509   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
12510   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
12511   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
12512
12513   if (rs6000_cpu == PROCESSOR_CELL)
12514     {
12515       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
12516       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
12517       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
12518       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
12519
12520       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
12521       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
12522       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
12523       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
12524
12525       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
12526       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
12527       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
12528       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
12529
12530       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
12531       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
12532       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
12533       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
12534     }
12535   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
12536   def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
12537   def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
12538
12539   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
12540   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
12541   def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
12542   def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
12543   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
12544   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
12545   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
12546   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
12547   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
12548   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
12549   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
12550   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
12551
12552   /* Add the DST variants.  */
12553   d = bdesc_dst;
12554   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
12555     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
12556
12557   /* Initialize the predicates.  */
12558   dp = bdesc_altivec_preds;
12559   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
12560     {
12561       enum machine_mode mode1;
12562       tree type;
12563       bool is_overloaded = ((dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
12564                              && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
12565                             || (dp->code >= VSX_BUILTIN_OVERLOADED_FIRST
12566                                 && dp->code <= VSX_BUILTIN_OVERLOADED_LAST));
12567
12568       if (is_overloaded)
12569         mode1 = VOIDmode;
12570       else
12571         mode1 = insn_data[dp->icode].operand[1].mode;
12572
12573       switch (mode1)
12574         {
12575         case VOIDmode:
12576           type = int_ftype_int_opaque_opaque;
12577           break;
12578         case V4SImode:
12579           type = int_ftype_int_v4si_v4si;
12580           break;
12581         case V8HImode:
12582           type = int_ftype_int_v8hi_v8hi;
12583           break;
12584         case V16QImode:
12585           type = int_ftype_int_v16qi_v16qi;
12586           break;
12587         case V4SFmode:
12588           type = int_ftype_int_v4sf_v4sf;
12589           break;
12590         case V2DFmode:
12591           type = int_ftype_int_v2df_v2df;
12592           break;
12593         default:
12594           gcc_unreachable ();
12595         }
12596
12597       def_builtin (dp->mask, dp->name, type, dp->code);
12598     }
12599
12600   /* Initialize the abs* operators.  */
12601   d = bdesc_abs;
12602   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
12603     {
12604       enum machine_mode mode0;
12605       tree type;
12606
12607       mode0 = insn_data[d->icode].operand[0].mode;
12608
12609       switch (mode0)
12610         {
12611         case V4SImode:
12612           type = v4si_ftype_v4si;
12613           break;
12614         case V8HImode:
12615           type = v8hi_ftype_v8hi;
12616           break;
12617         case V16QImode:
12618           type = v16qi_ftype_v16qi;
12619           break;
12620         case V4SFmode:
12621           type = v4sf_ftype_v4sf;
12622           break;
12623         case V2DFmode:
12624           type = v2df_ftype_v2df;
12625           break;
12626         default:
12627           gcc_unreachable ();
12628         }
12629
12630       def_builtin (d->mask, d->name, type, d->code);
12631     }
12632
12633   if (TARGET_ALTIVEC)
12634     {
12635       tree decl;
12636
12637       /* Initialize target builtin that implements
12638          targetm.vectorize.builtin_mask_for_load.  */
12639
12640       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
12641                                    v16qi_ftype_long_pcvoid,
12642                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
12643                                    BUILT_IN_MD, NULL, NULL_TREE);
12644       TREE_READONLY (decl) = 1;
12645       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
12646       altivec_builtin_mask_for_load = decl;
12647     }
12648
12649   /* Access to the vec_init patterns.  */
12650   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
12651                                     integer_type_node, integer_type_node,
12652                                     integer_type_node, NULL_TREE);
12653   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
12654                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
12655
12656   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
12657                                     short_integer_type_node,
12658                                     short_integer_type_node,
12659                                     short_integer_type_node,
12660                                     short_integer_type_node,
12661                                     short_integer_type_node,
12662                                     short_integer_type_node,
12663                                     short_integer_type_node, NULL_TREE);
12664   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
12665                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
12666
12667   ftype = build_function_type_list (V16QI_type_node, char_type_node,
12668                                     char_type_node, char_type_node,
12669                                     char_type_node, char_type_node,
12670                                     char_type_node, char_type_node,
12671                                     char_type_node, char_type_node,
12672                                     char_type_node, char_type_node,
12673                                     char_type_node, char_type_node,
12674                                     char_type_node, char_type_node,
12675                                     char_type_node, NULL_TREE);
12676   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
12677                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
12678
12679   ftype = build_function_type_list (V4SF_type_node, float_type_node,
12680                                     float_type_node, float_type_node,
12681                                     float_type_node, NULL_TREE);
12682   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
12683                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
12684
12685   if (TARGET_VSX)
12686     {
12687       ftype = build_function_type_list (V2DF_type_node, double_type_node,
12688                                         double_type_node, NULL_TREE);
12689       def_builtin (MASK_VSX, "__builtin_vec_init_v2df", ftype,
12690                    VSX_BUILTIN_VEC_INIT_V2DF);
12691
12692       ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
12693                                         intDI_type_node, NULL_TREE);
12694       def_builtin (MASK_VSX, "__builtin_vec_init_v2di", ftype,
12695                    VSX_BUILTIN_VEC_INIT_V2DI);
12696     }
12697
12698   /* Access to the vec_set patterns.  */
12699   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
12700                                     intSI_type_node,
12701                                     integer_type_node, NULL_TREE);
12702   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
12703                ALTIVEC_BUILTIN_VEC_SET_V4SI);
12704
12705   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
12706                                     intHI_type_node,
12707                                     integer_type_node, NULL_TREE);
12708   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
12709                ALTIVEC_BUILTIN_VEC_SET_V8HI);
12710
12711   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
12712                                     intQI_type_node,
12713                                     integer_type_node, NULL_TREE);
12714   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
12715                ALTIVEC_BUILTIN_VEC_SET_V16QI);
12716
12717   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
12718                                     float_type_node,
12719                                     integer_type_node, NULL_TREE);
12720   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_set_v4sf", ftype,
12721                ALTIVEC_BUILTIN_VEC_SET_V4SF);
12722
12723   if (TARGET_VSX)
12724     {
12725       ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
12726                                         double_type_node,
12727                                         integer_type_node, NULL_TREE);
12728       def_builtin (MASK_VSX, "__builtin_vec_set_v2df", ftype,
12729                    VSX_BUILTIN_VEC_SET_V2DF);
12730
12731       ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
12732                                         intDI_type_node,
12733                                         integer_type_node, NULL_TREE);
12734       def_builtin (MASK_VSX, "__builtin_vec_set_v2di", ftype,
12735                    VSX_BUILTIN_VEC_SET_V2DI);
12736     }
12737
12738   /* Access to the vec_extract patterns.  */
12739   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
12740                                     integer_type_node, NULL_TREE);
12741   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
12742                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
12743
12744   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
12745                                     integer_type_node, NULL_TREE);
12746   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
12747                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
12748
12749   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
12750                                     integer_type_node, NULL_TREE);
12751   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
12752                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
12753
12754   ftype = build_function_type_list (float_type_node, V4SF_type_node,
12755                                     integer_type_node, NULL_TREE);
12756   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_ext_v4sf", ftype,
12757                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
12758
12759   if (TARGET_VSX)
12760     {
12761       ftype = build_function_type_list (double_type_node, V2DF_type_node,
12762                                         integer_type_node, NULL_TREE);
12763       def_builtin (MASK_VSX, "__builtin_vec_ext_v2df", ftype,
12764                    VSX_BUILTIN_VEC_EXT_V2DF);
12765
12766       ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
12767                                         integer_type_node, NULL_TREE);
12768       def_builtin (MASK_VSX, "__builtin_vec_ext_v2di", ftype,
12769                    VSX_BUILTIN_VEC_EXT_V2DI);
12770     }
12771 }
12772
12773 /* Hash function for builtin functions with up to 3 arguments and a return
12774    type.  */
12775 static unsigned
12776 builtin_hash_function (const void *hash_entry)
12777 {
12778   unsigned ret = 0;
12779   int i;
12780   const struct builtin_hash_struct *bh =
12781     (const struct builtin_hash_struct *) hash_entry;
12782
12783   for (i = 0; i < 4; i++)
12784     {
12785       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
12786       ret = (ret * 2) + bh->uns_p[i];
12787     }
12788
12789   return ret;
12790 }
12791
12792 /* Compare builtin hash entries H1 and H2 for equivalence.  */
12793 static int
12794 builtin_hash_eq (const void *h1, const void *h2)
12795 {
12796   const struct builtin_hash_struct *p1 = (const struct builtin_hash_struct *) h1;
12797   const struct builtin_hash_struct *p2 = (const struct builtin_hash_struct *) h2;
12798
12799   return ((p1->mode[0] == p2->mode[0])
12800           && (p1->mode[1] == p2->mode[1])
12801           && (p1->mode[2] == p2->mode[2])
12802           && (p1->mode[3] == p2->mode[3])
12803           && (p1->uns_p[0] == p2->uns_p[0])
12804           && (p1->uns_p[1] == p2->uns_p[1])
12805           && (p1->uns_p[2] == p2->uns_p[2])
12806           && (p1->uns_p[3] == p2->uns_p[3]));
12807 }
12808
12809 /* Map types for builtin functions with an explicit return type and up to 3
12810    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
12811    of the argument.  */
12812 static tree
12813 builtin_function_type (enum machine_mode mode_ret, enum machine_mode mode_arg0,
12814                        enum machine_mode mode_arg1, enum machine_mode mode_arg2,
12815                        enum rs6000_builtins builtin, const char *name)
12816 {
12817   struct builtin_hash_struct h;
12818   struct builtin_hash_struct *h2;
12819   void **found;
12820   int num_args = 3;
12821   int i;
12822   tree ret_type = NULL_TREE;
12823   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
12824   tree args;
12825
12826   /* Create builtin_hash_table.  */
12827   if (builtin_hash_table == NULL)
12828     builtin_hash_table = htab_create_ggc (1500, builtin_hash_function,
12829                                           builtin_hash_eq, NULL);
12830
12831   h.type = NULL_TREE;
12832   h.mode[0] = mode_ret;
12833   h.mode[1] = mode_arg0;
12834   h.mode[2] = mode_arg1;
12835   h.mode[3] = mode_arg2;
12836   h.uns_p[0] = 0;
12837   h.uns_p[1] = 0;
12838   h.uns_p[2] = 0;
12839   h.uns_p[3] = 0;
12840
12841   /* If the builtin is a type that produces unsigned results or takes unsigned
12842      arguments, and it is returned as a decl for the vectorizer (such as
12843      widening multiplies, permute), make sure the arguments and return value
12844      are type correct.  */
12845   switch (builtin)
12846     {
12847       /* unsigned 2 argument functions.  */
12848     case ALTIVEC_BUILTIN_VMULEUB_UNS:
12849     case ALTIVEC_BUILTIN_VMULEUH_UNS:
12850     case ALTIVEC_BUILTIN_VMULOUB_UNS:
12851     case ALTIVEC_BUILTIN_VMULOUH_UNS:
12852       h.uns_p[0] = 1;
12853       h.uns_p[1] = 1;
12854       h.uns_p[2] = 1;
12855       break;
12856
12857       /* unsigned 3 argument functions.  */
12858     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
12859     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
12860     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
12861     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
12862     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
12863     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
12864     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
12865     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
12866     case VSX_BUILTIN_VPERM_16QI_UNS:
12867     case VSX_BUILTIN_VPERM_8HI_UNS:
12868     case VSX_BUILTIN_VPERM_4SI_UNS:
12869     case VSX_BUILTIN_VPERM_2DI_UNS:
12870     case VSX_BUILTIN_XXSEL_16QI_UNS:
12871     case VSX_BUILTIN_XXSEL_8HI_UNS:
12872     case VSX_BUILTIN_XXSEL_4SI_UNS:
12873     case VSX_BUILTIN_XXSEL_2DI_UNS:
12874       h.uns_p[0] = 1;
12875       h.uns_p[1] = 1;
12876       h.uns_p[2] = 1;
12877       h.uns_p[3] = 1;
12878       break;
12879
12880       /* signed permute functions with unsigned char mask.  */
12881     case ALTIVEC_BUILTIN_VPERM_16QI:
12882     case ALTIVEC_BUILTIN_VPERM_8HI:
12883     case ALTIVEC_BUILTIN_VPERM_4SI:
12884     case ALTIVEC_BUILTIN_VPERM_4SF:
12885     case ALTIVEC_BUILTIN_VPERM_2DI:
12886     case ALTIVEC_BUILTIN_VPERM_2DF:
12887     case VSX_BUILTIN_VPERM_16QI:
12888     case VSX_BUILTIN_VPERM_8HI:
12889     case VSX_BUILTIN_VPERM_4SI:
12890     case VSX_BUILTIN_VPERM_4SF:
12891     case VSX_BUILTIN_VPERM_2DI:
12892     case VSX_BUILTIN_VPERM_2DF:
12893       h.uns_p[3] = 1;
12894       break;
12895
12896       /* unsigned args, signed return.  */
12897     case VSX_BUILTIN_XVCVUXDDP_UNS:
12898     case VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF:
12899       h.uns_p[1] = 1;
12900       break;
12901
12902       /* signed args, unsigned return.  */
12903     case VSX_BUILTIN_XVCVDPUXDS_UNS:
12904     case VECTOR_BUILTIN_FIXUNS_V4SF_V4SI:
12905       h.uns_p[0] = 1;
12906       break;
12907
12908     default:
12909       break;
12910     }
12911
12912   /* Figure out how many args are present.  */
12913   while (num_args > 0 && h.mode[num_args] == VOIDmode)
12914     num_args--;
12915
12916   if (num_args == 0)
12917     fatal_error ("internal error: builtin function %s had no type", name);
12918
12919   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
12920   if (!ret_type && h.uns_p[0])
12921     ret_type = builtin_mode_to_type[h.mode[0]][0];
12922
12923   if (!ret_type)
12924     fatal_error ("internal error: builtin function %s had an unexpected "
12925                  "return type %s", name, GET_MODE_NAME (h.mode[0]));
12926
12927   for (i = 0; i < num_args; i++)
12928     {
12929       int m = (int) h.mode[i+1];
12930       int uns_p = h.uns_p[i+1];
12931
12932       arg_type[i] = builtin_mode_to_type[m][uns_p];
12933       if (!arg_type[i] && uns_p)
12934         arg_type[i] = builtin_mode_to_type[m][0];
12935
12936       if (!arg_type[i])
12937         fatal_error ("internal error: builtin function %s, argument %d "
12938                      "had unexpected argument type %s", name, i,
12939                      GET_MODE_NAME (m));
12940     }
12941
12942   found = htab_find_slot (builtin_hash_table, &h, INSERT);
12943   if (*found == NULL)
12944     {
12945       h2 = ggc_alloc_builtin_hash_struct ();
12946       *h2 = h;
12947       *found = (void *)h2;
12948       args = void_list_node;
12949
12950       for (i = num_args - 1; i >= 0; i--)
12951         args = tree_cons (NULL_TREE, arg_type[i], args);
12952
12953       h2->type = build_function_type (ret_type, args);
12954     }
12955
12956   return ((struct builtin_hash_struct *)(*found))->type;
12957 }
12958
12959 static void
12960 rs6000_common_init_builtins (void)
12961 {
12962   const struct builtin_description *d;
12963   size_t i;
12964
12965   tree opaque_ftype_opaque = NULL_TREE;
12966   tree opaque_ftype_opaque_opaque = NULL_TREE;
12967   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
12968   tree v2si_ftype_qi = NULL_TREE;
12969   tree v2si_ftype_v2si_qi = NULL_TREE;
12970   tree v2si_ftype_int_qi = NULL_TREE;
12971
12972   if (!TARGET_PAIRED_FLOAT)
12973     {
12974       builtin_mode_to_type[V2SImode][0] = opaque_V2SI_type_node;
12975       builtin_mode_to_type[V2SFmode][0] = opaque_V2SF_type_node;
12976     }
12977
12978   /* Add the ternary operators.  */
12979   d = bdesc_3arg;
12980   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
12981     {
12982       tree type;
12983       int mask = d->mask;
12984
12985       if ((mask != 0 && (mask & target_flags) == 0)
12986           || (mask == 0 && !TARGET_PAIRED_FLOAT))
12987         continue;
12988
12989       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
12990            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
12991           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
12992               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
12993         {
12994           if (! (type = opaque_ftype_opaque_opaque_opaque))
12995             type = opaque_ftype_opaque_opaque_opaque
12996               = build_function_type_list (opaque_V4SI_type_node,
12997                                           opaque_V4SI_type_node,
12998                                           opaque_V4SI_type_node,
12999                                           opaque_V4SI_type_node,
13000                                           NULL_TREE);
13001         }
13002       else
13003         {
13004           enum insn_code icode = d->icode;
13005           if (d->name == 0 || icode == CODE_FOR_nothing)
13006             continue;
13007
13008           type = builtin_function_type (insn_data[icode].operand[0].mode,
13009                                         insn_data[icode].operand[1].mode,
13010                                         insn_data[icode].operand[2].mode,
13011                                         insn_data[icode].operand[3].mode,
13012                                         d->code, d->name);
13013         }
13014
13015       def_builtin (d->mask, d->name, type, d->code);
13016     }
13017
13018   /* Add the binary operators.  */
13019   d = bdesc_2arg;
13020   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13021     {
13022       enum machine_mode mode0, mode1, mode2;
13023       tree type;
13024       int mask = d->mask;
13025
13026       if ((mask != 0 && (mask & target_flags) == 0)
13027           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13028         continue;
13029
13030       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13031            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13032           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13033               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13034         {
13035           if (! (type = opaque_ftype_opaque_opaque))
13036             type = opaque_ftype_opaque_opaque
13037               = build_function_type_list (opaque_V4SI_type_node,
13038                                           opaque_V4SI_type_node,
13039                                           opaque_V4SI_type_node,
13040                                           NULL_TREE);
13041         }
13042       else
13043         {
13044           enum insn_code icode = d->icode;
13045           if (d->name == 0 || icode == CODE_FOR_nothing)
13046             continue;
13047
13048           mode0 = insn_data[icode].operand[0].mode;
13049           mode1 = insn_data[icode].operand[1].mode;
13050           mode2 = insn_data[icode].operand[2].mode;
13051
13052           if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
13053             {
13054               if (! (type = v2si_ftype_v2si_qi))
13055                 type = v2si_ftype_v2si_qi
13056                   = build_function_type_list (opaque_V2SI_type_node,
13057                                               opaque_V2SI_type_node,
13058                                               char_type_node,
13059                                               NULL_TREE);
13060             }
13061
13062           else if (mode0 == V2SImode && GET_MODE_CLASS (mode1) == MODE_INT
13063                    && mode2 == QImode)
13064             {
13065               if (! (type = v2si_ftype_int_qi))
13066                 type = v2si_ftype_int_qi
13067                   = build_function_type_list (opaque_V2SI_type_node,
13068                                               integer_type_node,
13069                                               char_type_node,
13070                                               NULL_TREE);
13071             }
13072
13073           else
13074             type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
13075                                           d->code, d->name);
13076         }
13077
13078       def_builtin (d->mask, d->name, type, d->code);
13079     }
13080
13081   /* Add the simple unary operators.  */
13082   d = (struct builtin_description *) bdesc_1arg;
13083   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13084     {
13085       enum machine_mode mode0, mode1;
13086       tree type;
13087       int mask = d->mask;
13088
13089       if ((mask != 0 && (mask & target_flags) == 0)
13090           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13091         continue;
13092
13093       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13094            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13095           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13096               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13097         {
13098           if (! (type = opaque_ftype_opaque))
13099             type = opaque_ftype_opaque
13100               = build_function_type_list (opaque_V4SI_type_node,
13101                                           opaque_V4SI_type_node,
13102                                           NULL_TREE);
13103         }
13104       else
13105         {
13106           enum insn_code icode = d->icode;
13107           if (d->name == 0 || icode == CODE_FOR_nothing)
13108             continue;
13109
13110           mode0 = insn_data[icode].operand[0].mode;
13111           mode1 = insn_data[icode].operand[1].mode;
13112
13113           if (mode0 == V2SImode && mode1 == QImode)
13114             {
13115               if (! (type = v2si_ftype_qi))
13116                 type = v2si_ftype_qi
13117                   = build_function_type_list (opaque_V2SI_type_node,
13118                                               char_type_node,
13119                                               NULL_TREE);
13120             }
13121
13122           else
13123             type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
13124                                           d->code, d->name);
13125         }
13126
13127       def_builtin (d->mask, d->name, type, d->code);
13128     }
13129 }
13130
13131 static void
13132 rs6000_init_libfuncs (void)
13133 {
13134   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
13135       && !TARGET_POWER2 && !TARGET_POWERPC)
13136     {
13137       /* AIX library routines for float->int conversion.  */
13138       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
13139       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
13140       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
13141       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
13142     }
13143
13144   if (!TARGET_IEEEQUAD)
13145       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
13146     if (!TARGET_XL_COMPAT)
13147       {
13148         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
13149         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
13150         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
13151         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
13152
13153         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
13154           {
13155             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
13156             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
13157             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
13158             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
13159             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
13160             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
13161             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
13162
13163             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
13164             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
13165             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
13166             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
13167             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
13168             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
13169             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
13170             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
13171           }
13172
13173         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
13174           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
13175       }
13176     else
13177       {
13178         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
13179         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
13180         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
13181         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
13182       }
13183   else
13184     {
13185       /* 32-bit SVR4 quad floating point routines.  */
13186
13187       set_optab_libfunc (add_optab, TFmode, "_q_add");
13188       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
13189       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
13190       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
13191       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
13192       if (TARGET_PPC_GPOPT || TARGET_POWER2)
13193         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
13194
13195       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
13196       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
13197       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
13198       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
13199       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
13200       set_optab_libfunc (le_optab, TFmode, "_q_fle");
13201
13202       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
13203       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
13204       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
13205       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
13206       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
13207       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
13208       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
13209       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
13210     }
13211 }
13212
13213 \f
13214 /* Expand a block clear operation, and return 1 if successful.  Return 0
13215    if we should let the compiler generate normal code.
13216
13217    operands[0] is the destination
13218    operands[1] is the length
13219    operands[3] is the alignment */
13220
13221 int
13222 expand_block_clear (rtx operands[])
13223 {
13224   rtx orig_dest = operands[0];
13225   rtx bytes_rtx = operands[1];
13226   rtx align_rtx = operands[3];
13227   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
13228   HOST_WIDE_INT align;
13229   HOST_WIDE_INT bytes;
13230   int offset;
13231   int clear_bytes;
13232   int clear_step;
13233
13234   /* If this is not a fixed size move, just call memcpy */
13235   if (! constp)
13236     return 0;
13237
13238   /* This must be a fixed size alignment  */
13239   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13240   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13241
13242   /* Anything to clear? */
13243   bytes = INTVAL (bytes_rtx);
13244   if (bytes <= 0)
13245     return 1;
13246
13247   /* Use the builtin memset after a point, to avoid huge code bloat.
13248      When optimize_size, avoid any significant code bloat; calling
13249      memset is about 4 instructions, so allow for one instruction to
13250      load zero and three to do clearing.  */
13251   if (TARGET_ALTIVEC && align >= 128)
13252     clear_step = 16;
13253   else if (TARGET_POWERPC64 && align >= 32)
13254     clear_step = 8;
13255   else if (TARGET_SPE && align >= 64)
13256     clear_step = 8;
13257   else
13258     clear_step = 4;
13259
13260   if (optimize_size && bytes > 3 * clear_step)
13261     return 0;
13262   if (! optimize_size && bytes > 8 * clear_step)
13263     return 0;
13264
13265   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
13266     {
13267       enum machine_mode mode = BLKmode;
13268       rtx dest;
13269
13270       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
13271         {
13272           clear_bytes = 16;
13273           mode = V4SImode;
13274         }
13275       else if (bytes >= 8 && TARGET_SPE && align >= 64)
13276         {
13277           clear_bytes = 8;
13278           mode = V2SImode;
13279         }
13280       else if (bytes >= 8 && TARGET_POWERPC64
13281                /* 64-bit loads and stores require word-aligned
13282                   displacements.  */
13283                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13284         {
13285           clear_bytes = 8;
13286           mode = DImode;
13287         }
13288       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13289         {                       /* move 4 bytes */
13290           clear_bytes = 4;
13291           mode = SImode;
13292         }
13293       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13294         {                       /* move 2 bytes */
13295           clear_bytes = 2;
13296           mode = HImode;
13297         }
13298       else /* move 1 byte at a time */
13299         {
13300           clear_bytes = 1;
13301           mode = QImode;
13302         }
13303
13304       dest = adjust_address (orig_dest, mode, offset);
13305
13306       emit_move_insn (dest, CONST0_RTX (mode));
13307     }
13308
13309   return 1;
13310 }
13311
13312 \f
13313 /* Expand a block move operation, and return 1 if successful.  Return 0
13314    if we should let the compiler generate normal code.
13315
13316    operands[0] is the destination
13317    operands[1] is the source
13318    operands[2] is the length
13319    operands[3] is the alignment */
13320
13321 #define MAX_MOVE_REG 4
13322
13323 int
13324 expand_block_move (rtx operands[])
13325 {
13326   rtx orig_dest = operands[0];
13327   rtx orig_src  = operands[1];
13328   rtx bytes_rtx = operands[2];
13329   rtx align_rtx = operands[3];
13330   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
13331   int align;
13332   int bytes;
13333   int offset;
13334   int move_bytes;
13335   rtx stores[MAX_MOVE_REG];
13336   int num_reg = 0;
13337
13338   /* If this is not a fixed size move, just call memcpy */
13339   if (! constp)
13340     return 0;
13341
13342   /* This must be a fixed size alignment */
13343   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13344   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13345
13346   /* Anything to move? */
13347   bytes = INTVAL (bytes_rtx);
13348   if (bytes <= 0)
13349     return 1;
13350
13351   if (bytes > rs6000_block_move_inline_limit)
13352     return 0;
13353
13354   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
13355     {
13356       union {
13357         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
13358         rtx (*mov) (rtx, rtx);
13359       } gen_func;
13360       enum machine_mode mode = BLKmode;
13361       rtx src, dest;
13362
13363       /* Altivec first, since it will be faster than a string move
13364          when it applies, and usually not significantly larger.  */
13365       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
13366         {
13367           move_bytes = 16;
13368           mode = V4SImode;
13369           gen_func.mov = gen_movv4si;
13370         }
13371       else if (TARGET_SPE && bytes >= 8 && align >= 64)
13372         {
13373           move_bytes = 8;
13374           mode = V2SImode;
13375           gen_func.mov = gen_movv2si;
13376         }
13377       else if (TARGET_STRING
13378           && bytes > 24         /* move up to 32 bytes at a time */
13379           && ! fixed_regs[5]
13380           && ! fixed_regs[6]
13381           && ! fixed_regs[7]
13382           && ! fixed_regs[8]
13383           && ! fixed_regs[9]
13384           && ! fixed_regs[10]
13385           && ! fixed_regs[11]
13386           && ! fixed_regs[12])
13387         {
13388           move_bytes = (bytes > 32) ? 32 : bytes;
13389           gen_func.movmemsi = gen_movmemsi_8reg;
13390         }
13391       else if (TARGET_STRING
13392                && bytes > 16    /* move up to 24 bytes at a time */
13393                && ! fixed_regs[5]
13394                && ! fixed_regs[6]
13395                && ! fixed_regs[7]
13396                && ! fixed_regs[8]
13397                && ! fixed_regs[9]
13398                && ! fixed_regs[10])
13399         {
13400           move_bytes = (bytes > 24) ? 24 : bytes;
13401           gen_func.movmemsi = gen_movmemsi_6reg;
13402         }
13403       else if (TARGET_STRING
13404                && bytes > 8     /* move up to 16 bytes at a time */
13405                && ! fixed_regs[5]
13406                && ! fixed_regs[6]
13407                && ! fixed_regs[7]
13408                && ! fixed_regs[8])
13409         {
13410           move_bytes = (bytes > 16) ? 16 : bytes;
13411           gen_func.movmemsi = gen_movmemsi_4reg;
13412         }
13413       else if (bytes >= 8 && TARGET_POWERPC64
13414                /* 64-bit loads and stores require word-aligned
13415                   displacements.  */
13416                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13417         {
13418           move_bytes = 8;
13419           mode = DImode;
13420           gen_func.mov = gen_movdi;
13421         }
13422       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
13423         {                       /* move up to 8 bytes at a time */
13424           move_bytes = (bytes > 8) ? 8 : bytes;
13425           gen_func.movmemsi = gen_movmemsi_2reg;
13426         }
13427       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13428         {                       /* move 4 bytes */
13429           move_bytes = 4;
13430           mode = SImode;
13431           gen_func.mov = gen_movsi;
13432         }
13433       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13434         {                       /* move 2 bytes */
13435           move_bytes = 2;
13436           mode = HImode;
13437           gen_func.mov = gen_movhi;
13438         }
13439       else if (TARGET_STRING && bytes > 1)
13440         {                       /* move up to 4 bytes at a time */
13441           move_bytes = (bytes > 4) ? 4 : bytes;
13442           gen_func.movmemsi = gen_movmemsi_1reg;
13443         }
13444       else /* move 1 byte at a time */
13445         {
13446           move_bytes = 1;
13447           mode = QImode;
13448           gen_func.mov = gen_movqi;
13449         }
13450
13451       src = adjust_address (orig_src, mode, offset);
13452       dest = adjust_address (orig_dest, mode, offset);
13453
13454       if (mode != BLKmode)
13455         {
13456           rtx tmp_reg = gen_reg_rtx (mode);
13457
13458           emit_insn ((*gen_func.mov) (tmp_reg, src));
13459           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
13460         }
13461
13462       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
13463         {
13464           int i;
13465           for (i = 0; i < num_reg; i++)
13466             emit_insn (stores[i]);
13467           num_reg = 0;
13468         }
13469
13470       if (mode == BLKmode)
13471         {
13472           /* Move the address into scratch registers.  The movmemsi
13473              patterns require zero offset.  */
13474           if (!REG_P (XEXP (src, 0)))
13475             {
13476               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
13477               src = replace_equiv_address (src, src_reg);
13478             }
13479           set_mem_size (src, GEN_INT (move_bytes));
13480
13481           if (!REG_P (XEXP (dest, 0)))
13482             {
13483               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
13484               dest = replace_equiv_address (dest, dest_reg);
13485             }
13486           set_mem_size (dest, GEN_INT (move_bytes));
13487
13488           emit_insn ((*gen_func.movmemsi) (dest, src,
13489                                            GEN_INT (move_bytes & 31),
13490                                            align_rtx));
13491         }
13492     }
13493
13494   return 1;
13495 }
13496
13497 \f
13498 /* Return a string to perform a load_multiple operation.
13499    operands[0] is the vector.
13500    operands[1] is the source address.
13501    operands[2] is the first destination register.  */
13502
13503 const char *
13504 rs6000_output_load_multiple (rtx operands[3])
13505 {
13506   /* We have to handle the case where the pseudo used to contain the address
13507      is assigned to one of the output registers.  */
13508   int i, j;
13509   int words = XVECLEN (operands[0], 0);
13510   rtx xop[10];
13511
13512   if (XVECLEN (operands[0], 0) == 1)
13513     return "{l|lwz} %2,0(%1)";
13514
13515   for (i = 0; i < words; i++)
13516     if (refers_to_regno_p (REGNO (operands[2]) + i,
13517                            REGNO (operands[2]) + i + 1, operands[1], 0))
13518       {
13519         if (i == words-1)
13520           {
13521             xop[0] = GEN_INT (4 * (words-1));
13522             xop[1] = operands[1];
13523             xop[2] = operands[2];
13524             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
13525             return "";
13526           }
13527         else if (i == 0)
13528           {
13529             xop[0] = GEN_INT (4 * (words-1));
13530             xop[1] = operands[1];
13531             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
13532             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);
13533             return "";
13534           }
13535         else
13536           {
13537             for (j = 0; j < words; j++)
13538               if (j != i)
13539                 {
13540                   xop[0] = GEN_INT (j * 4);
13541                   xop[1] = operands[1];
13542                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
13543                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
13544                 }
13545             xop[0] = GEN_INT (i * 4);
13546             xop[1] = operands[1];
13547             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
13548             return "";
13549           }
13550       }
13551
13552   return "{lsi|lswi} %2,%1,%N0";
13553 }
13554
13555 \f
13556 /* A validation routine: say whether CODE, a condition code, and MODE
13557    match.  The other alternatives either don't make sense or should
13558    never be generated.  */
13559
13560 void
13561 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
13562 {
13563   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
13564                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
13565               && GET_MODE_CLASS (mode) == MODE_CC);
13566
13567   /* These don't make sense.  */
13568   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
13569               || mode != CCUNSmode);
13570
13571   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
13572               || mode == CCUNSmode);
13573
13574   gcc_assert (mode == CCFPmode
13575               || (code != ORDERED && code != UNORDERED
13576                   && code != UNEQ && code != LTGT
13577                   && code != UNGT && code != UNLT
13578                   && code != UNGE && code != UNLE));
13579
13580   /* These should never be generated except for
13581      flag_finite_math_only.  */
13582   gcc_assert (mode != CCFPmode
13583               || flag_finite_math_only
13584               || (code != LE && code != GE
13585                   && code != UNEQ && code != LTGT
13586                   && code != UNGT && code != UNLT));
13587
13588   /* These are invalid; the information is not there.  */
13589   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
13590 }
13591
13592 \f
13593 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
13594    mask required to convert the result of a rotate insn into a shift
13595    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
13596
13597 int
13598 includes_lshift_p (rtx shiftop, rtx andop)
13599 {
13600   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13601
13602   shift_mask <<= INTVAL (shiftop);
13603
13604   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13605 }
13606
13607 /* Similar, but for right shift.  */
13608
13609 int
13610 includes_rshift_p (rtx shiftop, rtx andop)
13611 {
13612   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13613
13614   shift_mask >>= INTVAL (shiftop);
13615
13616   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13617 }
13618
13619 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
13620    to perform a left shift.  It must have exactly SHIFTOP least
13621    significant 0's, then one or more 1's, then zero or more 0's.  */
13622
13623 int
13624 includes_rldic_lshift_p (rtx shiftop, rtx andop)
13625 {
13626   if (GET_CODE (andop) == CONST_INT)
13627     {
13628       HOST_WIDE_INT c, lsb, shift_mask;
13629
13630       c = INTVAL (andop);
13631       if (c == 0 || c == ~0)
13632         return 0;
13633
13634       shift_mask = ~0;
13635       shift_mask <<= INTVAL (shiftop);
13636
13637       /* Find the least significant one bit.  */
13638       lsb = c & -c;
13639
13640       /* It must coincide with the LSB of the shift mask.  */
13641       if (-lsb != shift_mask)
13642         return 0;
13643
13644       /* Invert to look for the next transition (if any).  */
13645       c = ~c;
13646
13647       /* Remove the low group of ones (originally low group of zeros).  */
13648       c &= -lsb;
13649
13650       /* Again find the lsb, and check we have all 1's above.  */
13651       lsb = c & -c;
13652       return c == -lsb;
13653     }
13654   else if (GET_CODE (andop) == CONST_DOUBLE
13655            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13656     {
13657       HOST_WIDE_INT low, high, lsb;
13658       HOST_WIDE_INT shift_mask_low, shift_mask_high;
13659
13660       low = CONST_DOUBLE_LOW (andop);
13661       if (HOST_BITS_PER_WIDE_INT < 64)
13662         high = CONST_DOUBLE_HIGH (andop);
13663
13664       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
13665           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
13666         return 0;
13667
13668       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13669         {
13670           shift_mask_high = ~0;
13671           if (INTVAL (shiftop) > 32)
13672             shift_mask_high <<= INTVAL (shiftop) - 32;
13673
13674           lsb = high & -high;
13675
13676           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
13677             return 0;
13678
13679           high = ~high;
13680           high &= -lsb;
13681
13682           lsb = high & -high;
13683           return high == -lsb;
13684         }
13685
13686       shift_mask_low = ~0;
13687       shift_mask_low <<= INTVAL (shiftop);
13688
13689       lsb = low & -low;
13690
13691       if (-lsb != shift_mask_low)
13692         return 0;
13693
13694       if (HOST_BITS_PER_WIDE_INT < 64)
13695         high = ~high;
13696       low = ~low;
13697       low &= -lsb;
13698
13699       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13700         {
13701           lsb = high & -high;
13702           return high == -lsb;
13703         }
13704
13705       lsb = low & -low;
13706       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
13707     }
13708   else
13709     return 0;
13710 }
13711
13712 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
13713    to perform a left shift.  It must have SHIFTOP or more least
13714    significant 0's, with the remainder of the word 1's.  */
13715
13716 int
13717 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
13718 {
13719   if (GET_CODE (andop) == CONST_INT)
13720     {
13721       HOST_WIDE_INT c, lsb, shift_mask;
13722
13723       shift_mask = ~0;
13724       shift_mask <<= INTVAL (shiftop);
13725       c = INTVAL (andop);
13726
13727       /* Find the least significant one bit.  */
13728       lsb = c & -c;
13729
13730       /* It must be covered by the shift mask.
13731          This test also rejects c == 0.  */
13732       if ((lsb & shift_mask) == 0)
13733         return 0;
13734
13735       /* Check we have all 1's above the transition, and reject all 1's.  */
13736       return c == -lsb && lsb != 1;
13737     }
13738   else if (GET_CODE (andop) == CONST_DOUBLE
13739            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13740     {
13741       HOST_WIDE_INT low, lsb, shift_mask_low;
13742
13743       low = CONST_DOUBLE_LOW (andop);
13744
13745       if (HOST_BITS_PER_WIDE_INT < 64)
13746         {
13747           HOST_WIDE_INT high, shift_mask_high;
13748
13749           high = CONST_DOUBLE_HIGH (andop);
13750
13751           if (low == 0)
13752             {
13753               shift_mask_high = ~0;
13754               if (INTVAL (shiftop) > 32)
13755                 shift_mask_high <<= INTVAL (shiftop) - 32;
13756
13757               lsb = high & -high;
13758
13759               if ((lsb & shift_mask_high) == 0)
13760                 return 0;
13761
13762               return high == -lsb;
13763             }
13764           if (high != ~0)
13765             return 0;
13766         }
13767
13768       shift_mask_low = ~0;
13769       shift_mask_low <<= INTVAL (shiftop);
13770
13771       lsb = low & -low;
13772
13773       if ((lsb & shift_mask_low) == 0)
13774         return 0;
13775
13776       return low == -lsb && lsb != 1;
13777     }
13778   else
13779     return 0;
13780 }
13781
13782 /* Return 1 if operands will generate a valid arguments to rlwimi
13783 instruction for insert with right shift in 64-bit mode.  The mask may
13784 not start on the first bit or stop on the last bit because wrap-around
13785 effects of instruction do not correspond to semantics of RTL insn.  */
13786
13787 int
13788 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
13789 {
13790   if (INTVAL (startop) > 32
13791       && INTVAL (startop) < 64
13792       && INTVAL (sizeop) > 1
13793       && INTVAL (sizeop) + INTVAL (startop) < 64
13794       && INTVAL (shiftop) > 0
13795       && INTVAL (sizeop) + INTVAL (shiftop) < 32
13796       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
13797     return 1;
13798
13799   return 0;
13800 }
13801
13802 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
13803    for lfq and stfq insns iff the registers are hard registers.   */
13804
13805 int
13806 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
13807 {
13808   /* We might have been passed a SUBREG.  */
13809   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
13810     return 0;
13811
13812   /* We might have been passed non floating point registers.  */
13813   if (!FP_REGNO_P (REGNO (reg1))
13814       || !FP_REGNO_P (REGNO (reg2)))
13815     return 0;
13816
13817   return (REGNO (reg1) == REGNO (reg2) - 1);
13818 }
13819
13820 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
13821    addr1 and addr2 must be in consecutive memory locations
13822    (addr2 == addr1 + 8).  */
13823
13824 int
13825 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
13826 {
13827   rtx addr1, addr2;
13828   unsigned int reg1, reg2;
13829   int offset1, offset2;
13830
13831   /* The mems cannot be volatile.  */
13832   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
13833     return 0;
13834
13835   addr1 = XEXP (mem1, 0);
13836   addr2 = XEXP (mem2, 0);
13837
13838   /* Extract an offset (if used) from the first addr.  */
13839   if (GET_CODE (addr1) == PLUS)
13840     {
13841       /* If not a REG, return zero.  */
13842       if (GET_CODE (XEXP (addr1, 0)) != REG)
13843         return 0;
13844       else
13845         {
13846           reg1 = REGNO (XEXP (addr1, 0));
13847           /* The offset must be constant!  */
13848           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
13849             return 0;
13850           offset1 = INTVAL (XEXP (addr1, 1));
13851         }
13852     }
13853   else if (GET_CODE (addr1) != REG)
13854     return 0;
13855   else
13856     {
13857       reg1 = REGNO (addr1);
13858       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
13859       offset1 = 0;
13860     }
13861
13862   /* And now for the second addr.  */
13863   if (GET_CODE (addr2) == PLUS)
13864     {
13865       /* If not a REG, return zero.  */
13866       if (GET_CODE (XEXP (addr2, 0)) != REG)
13867         return 0;
13868       else
13869         {
13870           reg2 = REGNO (XEXP (addr2, 0));
13871           /* The offset must be constant. */
13872           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
13873             return 0;
13874           offset2 = INTVAL (XEXP (addr2, 1));
13875         }
13876     }
13877   else if (GET_CODE (addr2) != REG)
13878     return 0;
13879   else
13880     {
13881       reg2 = REGNO (addr2);
13882       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
13883       offset2 = 0;
13884     }
13885
13886   /* Both of these must have the same base register.  */
13887   if (reg1 != reg2)
13888     return 0;
13889
13890   /* The offset for the second addr must be 8 more than the first addr.  */
13891   if (offset2 != offset1 + 8)
13892     return 0;
13893
13894   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
13895      instructions.  */
13896   return 1;
13897 }
13898 \f
13899
13900 rtx
13901 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
13902 {
13903   static bool eliminated = false;
13904   rtx ret;
13905
13906   if (mode != SDmode)
13907     ret = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
13908   else
13909     {
13910       rtx mem = cfun->machine->sdmode_stack_slot;
13911       gcc_assert (mem != NULL_RTX);
13912
13913       if (!eliminated)
13914         {
13915           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
13916           cfun->machine->sdmode_stack_slot = mem;
13917           eliminated = true;
13918         }
13919       ret = mem;
13920     }
13921
13922   if (TARGET_DEBUG_ADDR)
13923     {
13924       fprintf (stderr, "\nrs6000_secondary_memory_needed_rtx, mode %s, rtx:\n",
13925                GET_MODE_NAME (mode));
13926       if (!ret)
13927         fprintf (stderr, "\tNULL_RTX\n");
13928       else
13929         debug_rtx (ret);
13930     }
13931
13932   return ret;
13933 }
13934
13935 static tree
13936 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
13937 {
13938   /* Don't walk into types.  */
13939   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
13940     {
13941       *walk_subtrees = 0;
13942       return NULL_TREE;
13943     }
13944
13945   switch (TREE_CODE (*tp))
13946     {
13947     case VAR_DECL:
13948     case PARM_DECL:
13949     case FIELD_DECL:
13950     case RESULT_DECL:
13951     case SSA_NAME:
13952     case REAL_CST:
13953     case MEM_REF:
13954     case MISALIGNED_INDIRECT_REF:
13955     case VIEW_CONVERT_EXPR:
13956       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
13957         return *tp;
13958       break;
13959     default:
13960       break;
13961     }
13962
13963   return NULL_TREE;
13964 }
13965
13966 enum reload_reg_type {
13967   GPR_REGISTER_TYPE,
13968   VECTOR_REGISTER_TYPE,
13969   OTHER_REGISTER_TYPE
13970 };
13971
13972 static enum reload_reg_type
13973 rs6000_reload_register_type (enum reg_class rclass)
13974 {
13975   switch (rclass)
13976     {
13977     case GENERAL_REGS:
13978     case BASE_REGS:
13979       return GPR_REGISTER_TYPE;
13980
13981     case FLOAT_REGS:
13982     case ALTIVEC_REGS:
13983     case VSX_REGS:
13984       return VECTOR_REGISTER_TYPE;
13985
13986     default:
13987       return OTHER_REGISTER_TYPE;
13988     }
13989 }
13990
13991 /* Inform reload about cases where moving X with a mode MODE to a register in
13992    RCLASS requires an extra scratch or immediate register.  Return the class
13993    needed for the immediate register.
13994
13995    For VSX and Altivec, we may need a register to convert sp+offset into
13996    reg+sp.  */
13997
13998 static reg_class_t
13999 rs6000_secondary_reload (bool in_p,
14000                          rtx x,
14001                          reg_class_t rclass_i,
14002                          enum machine_mode mode,
14003                          secondary_reload_info *sri)
14004 {
14005   enum reg_class rclass = (enum reg_class) rclass_i;
14006   reg_class_t ret = ALL_REGS;
14007   enum insn_code icode;
14008   bool default_p = false;
14009
14010   sri->icode = CODE_FOR_nothing;
14011
14012   /* Convert vector loads and stores into gprs to use an additional base
14013      register.  */
14014   icode = rs6000_vector_reload[mode][in_p != false];
14015   if (icode != CODE_FOR_nothing)
14016     {
14017       ret = NO_REGS;
14018       sri->icode = CODE_FOR_nothing;
14019       sri->extra_cost = 0;
14020
14021       if (GET_CODE (x) == MEM)
14022         {
14023           rtx addr = XEXP (x, 0);
14024
14025           /* Loads to and stores from gprs can do reg+offset, and wouldn't need
14026              an extra register in that case, but it would need an extra
14027              register if the addressing is reg+reg or (reg+reg)&(-16).  */
14028           if (rclass == GENERAL_REGS || rclass == BASE_REGS)
14029             {
14030               if (!legitimate_indirect_address_p (addr, false)
14031                   && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14032                 {
14033                   sri->icode = icode;
14034                   /* account for splitting the loads, and converting the
14035                      address from reg+reg to reg.  */
14036                   sri->extra_cost = (((TARGET_64BIT) ? 3 : 5)
14037                                      + ((GET_CODE (addr) == AND) ? 1 : 0));
14038                 }
14039             }
14040           /* Loads to and stores from vector registers can only do reg+reg
14041              addressing.  Altivec registers can also do (reg+reg)&(-16).  */
14042           else if (rclass == VSX_REGS || rclass == ALTIVEC_REGS
14043                    || rclass == FLOAT_REGS || rclass == NO_REGS)
14044             {
14045               if (!VECTOR_MEM_ALTIVEC_P (mode)
14046                   && GET_CODE (addr) == AND
14047                   && GET_CODE (XEXP (addr, 1)) == CONST_INT
14048                   && INTVAL (XEXP (addr, 1)) == -16
14049                   && (legitimate_indirect_address_p (XEXP (addr, 0), false)
14050                       || legitimate_indexed_address_p (XEXP (addr, 0), false)))
14051                 {
14052                   sri->icode = icode;
14053                   sri->extra_cost = ((GET_CODE (XEXP (addr, 0)) == PLUS)
14054                                      ? 2 : 1);
14055                 }
14056               else if (!legitimate_indirect_address_p (addr, false)
14057                        && (rclass == NO_REGS
14058                            || !legitimate_indexed_address_p (addr, false)))
14059                 {
14060                   sri->icode = icode;
14061                   sri->extra_cost = 1;
14062                 }
14063               else
14064                 icode = CODE_FOR_nothing;
14065             }
14066           /* Any other loads, including to pseudo registers which haven't been
14067              assigned to a register yet, default to require a scratch
14068              register.  */
14069           else
14070             {
14071               sri->icode = icode;
14072               sri->extra_cost = 2;
14073             }
14074         }
14075       else if (REG_P (x))
14076         {
14077           int regno = true_regnum (x);
14078
14079           icode = CODE_FOR_nothing;
14080           if (regno < 0 || regno >= FIRST_PSEUDO_REGISTER)
14081             default_p = true;
14082           else
14083             {
14084               enum reg_class xclass = REGNO_REG_CLASS (regno);
14085               enum reload_reg_type rtype1 = rs6000_reload_register_type (rclass);
14086               enum reload_reg_type rtype2 = rs6000_reload_register_type (xclass);
14087
14088               /* If memory is needed, use default_secondary_reload to create the
14089                  stack slot.  */
14090               if (rtype1 != rtype2 || rtype1 == OTHER_REGISTER_TYPE)
14091                 default_p = true;
14092               else
14093                 ret = NO_REGS;
14094             }
14095         }
14096       else
14097         default_p = true;
14098     }
14099   else
14100     default_p = true;
14101
14102   if (default_p)
14103     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
14104
14105   gcc_assert (ret != ALL_REGS);
14106
14107   if (TARGET_DEBUG_ADDR)
14108     {
14109       fprintf (stderr,
14110                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
14111                "mode = %s",
14112                reg_class_names[ret],
14113                in_p ? "true" : "false",
14114                reg_class_names[rclass],
14115                GET_MODE_NAME (mode));
14116
14117       if (default_p)
14118         fprintf (stderr, ", default secondary reload");
14119
14120       if (sri->icode != CODE_FOR_nothing)
14121         fprintf (stderr, ", reload func = %s, extra cost = %d\n",
14122                  insn_data[sri->icode].name, sri->extra_cost);
14123       else
14124         fprintf (stderr, "\n");
14125
14126       debug_rtx (x);
14127     }
14128
14129   return ret;
14130 }
14131
14132 /* Fixup reload addresses for Altivec or VSX loads/stores to change SP+offset
14133    to SP+reg addressing.  */
14134
14135 void
14136 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
14137 {
14138   int regno = true_regnum (reg);
14139   enum machine_mode mode = GET_MODE (reg);
14140   enum reg_class rclass;
14141   rtx addr;
14142   rtx and_op2 = NULL_RTX;
14143   rtx addr_op1;
14144   rtx addr_op2;
14145   rtx scratch_or_premodify = scratch;
14146   rtx and_rtx;
14147   rtx cc_clobber;
14148
14149   if (TARGET_DEBUG_ADDR)
14150     {
14151       fprintf (stderr, "\nrs6000_secondary_reload_inner, type = %s\n",
14152                store_p ? "store" : "load");
14153       fprintf (stderr, "reg:\n");
14154       debug_rtx (reg);
14155       fprintf (stderr, "mem:\n");
14156       debug_rtx (mem);
14157       fprintf (stderr, "scratch:\n");
14158       debug_rtx (scratch);
14159     }
14160
14161   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14162   gcc_assert (GET_CODE (mem) == MEM);
14163   rclass = REGNO_REG_CLASS (regno);
14164   addr = XEXP (mem, 0);
14165
14166   switch (rclass)
14167     {
14168       /* GPRs can handle reg + small constant, all other addresses need to use
14169          the scratch register.  */
14170     case GENERAL_REGS:
14171     case BASE_REGS:
14172       if (GET_CODE (addr) == AND)
14173         {
14174           and_op2 = XEXP (addr, 1);
14175           addr = XEXP (addr, 0);
14176         }
14177
14178       if (GET_CODE (addr) == PRE_MODIFY)
14179         {
14180           scratch_or_premodify = XEXP (addr, 0);
14181           gcc_assert (REG_P (scratch_or_premodify));
14182           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14183           addr = XEXP (addr, 1);
14184         }
14185
14186       if (GET_CODE (addr) == PLUS
14187           && (!rs6000_legitimate_offset_address_p (TImode, addr, false)
14188               || and_op2 != NULL_RTX))
14189         {
14190           addr_op1 = XEXP (addr, 0);
14191           addr_op2 = XEXP (addr, 1);
14192           gcc_assert (legitimate_indirect_address_p (addr_op1, false));
14193
14194           if (!REG_P (addr_op2)
14195               && (GET_CODE (addr_op2) != CONST_INT
14196                   || !satisfies_constraint_I (addr_op2)))
14197             {
14198               if (TARGET_DEBUG_ADDR)
14199                 {
14200                   fprintf (stderr,
14201                            "\nMove plus addr to register %s, mode = %s: ",
14202                            rs6000_reg_names[REGNO (scratch)],
14203                            GET_MODE_NAME (mode));
14204                   debug_rtx (addr_op2);
14205                 }
14206               rs6000_emit_move (scratch, addr_op2, Pmode);
14207               addr_op2 = scratch;
14208             }
14209
14210           emit_insn (gen_rtx_SET (VOIDmode,
14211                                   scratch_or_premodify,
14212                                   gen_rtx_PLUS (Pmode,
14213                                                 addr_op1,
14214                                                 addr_op2)));
14215
14216           addr = scratch_or_premodify;
14217           scratch_or_premodify = scratch;
14218         }
14219       else if (!legitimate_indirect_address_p (addr, false)
14220                && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14221         {
14222           if (TARGET_DEBUG_ADDR)
14223             {
14224               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14225                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14226                        GET_MODE_NAME (mode));
14227               debug_rtx (addr);
14228             }
14229           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14230           addr = scratch_or_premodify;
14231           scratch_or_premodify = scratch;
14232         }
14233       break;
14234
14235       /* Float/Altivec registers can only handle reg+reg addressing.  Move
14236          other addresses into a scratch register.  */
14237     case FLOAT_REGS:
14238     case VSX_REGS:
14239     case ALTIVEC_REGS:
14240
14241       /* With float regs, we need to handle the AND ourselves, since we can't
14242          use the Altivec instruction with an implicit AND -16.  Allow scalar
14243          loads to float registers to use reg+offset even if VSX.  */
14244       if (GET_CODE (addr) == AND
14245           && (rclass != ALTIVEC_REGS || GET_MODE_SIZE (mode) != 16
14246               || GET_CODE (XEXP (addr, 1)) != CONST_INT
14247               || INTVAL (XEXP (addr, 1)) != -16
14248               || !VECTOR_MEM_ALTIVEC_P (mode)))
14249         {
14250           and_op2 = XEXP (addr, 1);
14251           addr = XEXP (addr, 0);
14252         }
14253
14254       /* If we aren't using a VSX load, save the PRE_MODIFY register and use it
14255          as the address later.  */
14256       if (GET_CODE (addr) == PRE_MODIFY
14257           && (!VECTOR_MEM_VSX_P (mode)
14258               || and_op2 != NULL_RTX
14259               || !legitimate_indexed_address_p (XEXP (addr, 1), false)))
14260         {
14261           scratch_or_premodify = XEXP (addr, 0);
14262           gcc_assert (legitimate_indirect_address_p (scratch_or_premodify,
14263                                                      false));
14264           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14265           addr = XEXP (addr, 1);
14266         }
14267
14268       if (legitimate_indirect_address_p (addr, false)   /* reg */
14269           || legitimate_indexed_address_p (addr, false) /* reg+reg */
14270           || GET_CODE (addr) == PRE_MODIFY              /* VSX pre-modify */
14271           || (GET_CODE (addr) == AND                    /* Altivec memory */
14272               && GET_CODE (XEXP (addr, 1)) == CONST_INT
14273               && INTVAL (XEXP (addr, 1)) == -16
14274               && VECTOR_MEM_ALTIVEC_P (mode))
14275           || (rclass == FLOAT_REGS                      /* legacy float mem */
14276               && GET_MODE_SIZE (mode) == 8
14277               && and_op2 == NULL_RTX
14278               && scratch_or_premodify == scratch
14279               && rs6000_legitimate_offset_address_p (mode, addr, false)))
14280         ;
14281
14282       else if (GET_CODE (addr) == PLUS)
14283         {
14284           addr_op1 = XEXP (addr, 0);
14285           addr_op2 = XEXP (addr, 1);
14286           gcc_assert (REG_P (addr_op1));
14287
14288           if (TARGET_DEBUG_ADDR)
14289             {
14290               fprintf (stderr, "\nMove plus addr to register %s, mode = %s: ",
14291                        rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14292               debug_rtx (addr_op2);
14293             }
14294           rs6000_emit_move (scratch, addr_op2, Pmode);
14295           emit_insn (gen_rtx_SET (VOIDmode,
14296                                   scratch_or_premodify,
14297                                   gen_rtx_PLUS (Pmode,
14298                                                 addr_op1,
14299                                                 scratch)));
14300           addr = scratch_or_premodify;
14301           scratch_or_premodify = scratch;
14302         }
14303
14304       else if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == CONST
14305                || GET_CODE (addr) == CONST_INT || REG_P (addr))
14306         {
14307           if (TARGET_DEBUG_ADDR)
14308             {
14309               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14310                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14311                        GET_MODE_NAME (mode));
14312               debug_rtx (addr);
14313             }
14314
14315           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14316           addr = scratch_or_premodify;
14317           scratch_or_premodify = scratch;
14318         }
14319
14320       else
14321         gcc_unreachable ();
14322
14323       break;
14324
14325     default:
14326       gcc_unreachable ();
14327     }
14328
14329   /* If the original address involved a pre-modify that we couldn't use the VSX
14330      memory instruction with update, and we haven't taken care of already,
14331      store the address in the pre-modify register and use that as the
14332      address.  */
14333   if (scratch_or_premodify != scratch && scratch_or_premodify != addr)
14334     {
14335       emit_insn (gen_rtx_SET (VOIDmode, scratch_or_premodify, addr));
14336       addr = scratch_or_premodify;
14337     }
14338
14339   /* If the original address involved an AND -16 and we couldn't use an ALTIVEC
14340      memory instruction, recreate the AND now, including the clobber which is
14341      generated by the general ANDSI3/ANDDI3 patterns for the
14342      andi. instruction.  */
14343   if (and_op2 != NULL_RTX)
14344     {
14345       if (! legitimate_indirect_address_p (addr, false))
14346         {
14347           emit_insn (gen_rtx_SET (VOIDmode, scratch, addr));
14348           addr = scratch;
14349         }
14350
14351       if (TARGET_DEBUG_ADDR)
14352         {
14353           fprintf (stderr, "\nAnd addr to register %s, mode = %s: ",
14354                    rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14355           debug_rtx (and_op2);
14356         }
14357
14358       and_rtx = gen_rtx_SET (VOIDmode,
14359                              scratch,
14360                              gen_rtx_AND (Pmode,
14361                                           addr,
14362                                           and_op2));
14363
14364       cc_clobber = gen_rtx_CLOBBER (CCmode, gen_rtx_SCRATCH (CCmode));
14365       emit_insn (gen_rtx_PARALLEL (VOIDmode,
14366                                    gen_rtvec (2, and_rtx, cc_clobber)));
14367       addr = scratch;
14368     }
14369
14370   /* Adjust the address if it changed.  */
14371   if (addr != XEXP (mem, 0))
14372     {
14373       mem = change_address (mem, mode, addr);
14374       if (TARGET_DEBUG_ADDR)
14375         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
14376     }
14377
14378   /* Now create the move.  */
14379   if (store_p)
14380     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
14381   else
14382     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
14383
14384   return;
14385 }
14386
14387 /* Target hook to return the cover classes for Integrated Register Allocator.
14388    Cover classes is a set of non-intersected register classes covering all hard
14389    registers used for register allocation purpose.  Any move between two
14390    registers of a cover class should be cheaper than load or store of the
14391    registers.  The value is array of register classes with LIM_REG_CLASSES used
14392    as the end marker.
14393
14394    We need two IRA_COVER_CLASSES, one for pre-VSX, and the other for VSX to
14395    account for the Altivec and Floating registers being subsets of the VSX
14396    register set under VSX, but distinct register sets on pre-VSX machines.  */
14397
14398 static const reg_class_t *
14399 rs6000_ira_cover_classes (void)
14400 {
14401   static const reg_class_t cover_pre_vsx[] = IRA_COVER_CLASSES_PRE_VSX;
14402   static const reg_class_t cover_vsx[]     = IRA_COVER_CLASSES_VSX;
14403
14404   return (TARGET_VSX) ? cover_vsx : cover_pre_vsx;
14405 }
14406
14407 /* Allocate a 64-bit stack slot to be used for copying SDmode
14408    values through if this function has any SDmode references.  */
14409
14410 static void
14411 rs6000_alloc_sdmode_stack_slot (void)
14412 {
14413   tree t;
14414   basic_block bb;
14415   gimple_stmt_iterator gsi;
14416
14417   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
14418
14419   FOR_EACH_BB (bb)
14420     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
14421       {
14422         tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
14423         if (ret)
14424           {
14425             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14426             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14427                                                                   SDmode, 0);
14428             return;
14429           }
14430       }
14431
14432   /* Check for any SDmode parameters of the function.  */
14433   for (t = DECL_ARGUMENTS (cfun->decl); t; t = DECL_CHAIN (t))
14434     {
14435       if (TREE_TYPE (t) == error_mark_node)
14436         continue;
14437
14438       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
14439           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
14440         {
14441           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14442           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14443                                                                 SDmode, 0);
14444           return;
14445         }
14446     }
14447 }
14448
14449 static void
14450 rs6000_instantiate_decls (void)
14451 {
14452   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
14453     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
14454 }
14455
14456 /* Given an rtx X being reloaded into a reg required to be
14457    in class CLASS, return the class of reg to actually use.
14458    In general this is just CLASS; but on some machines
14459    in some cases it is preferable to use a more restrictive class.
14460
14461    On the RS/6000, we have to return NO_REGS when we want to reload a
14462    floating-point CONST_DOUBLE to force it to be copied to memory.
14463
14464    We also don't want to reload integer values into floating-point
14465    registers if we can at all help it.  In fact, this can
14466    cause reload to die, if it tries to generate a reload of CTR
14467    into a FP register and discovers it doesn't have the memory location
14468    required.
14469
14470    ??? Would it be a good idea to have reload do the converse, that is
14471    try to reload floating modes into FP registers if possible?
14472  */
14473
14474 static enum reg_class
14475 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
14476 {
14477   enum machine_mode mode = GET_MODE (x);
14478
14479   if (VECTOR_UNIT_VSX_P (mode)
14480       && x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
14481     return rclass;
14482
14483   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
14484       && (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
14485       && easy_vector_constant (x, mode))
14486     return ALTIVEC_REGS;
14487
14488   if (CONSTANT_P (x) && reg_classes_intersect_p (rclass, FLOAT_REGS))
14489     return NO_REGS;
14490
14491   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
14492     return GENERAL_REGS;
14493
14494   /* For VSX, prefer the traditional registers for 64-bit values because we can
14495      use the non-VSX loads.  Prefer the Altivec registers if Altivec is
14496      handling the vector operations (i.e. V16QI, V8HI, and V4SI), or if we
14497      prefer Altivec loads..  */
14498   if (rclass == VSX_REGS)
14499     {
14500       if (GET_MODE_SIZE (mode) <= 8)
14501         return FLOAT_REGS;
14502
14503       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode))
14504         return ALTIVEC_REGS;
14505
14506       return rclass;
14507     }
14508
14509   return rclass;
14510 }
14511
14512 /* Debug version of rs6000_preferred_reload_class.  */
14513 static enum reg_class
14514 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
14515 {
14516   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
14517
14518   fprintf (stderr,
14519            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
14520            "mode = %s, x:\n",
14521            reg_class_names[ret], reg_class_names[rclass],
14522            GET_MODE_NAME (GET_MODE (x)));
14523   debug_rtx (x);
14524
14525   return ret;
14526 }
14527
14528 /* If we are copying between FP or AltiVec registers and anything else, we need
14529    a memory location.  The exception is when we are targeting ppc64 and the
14530    move to/from fpr to gpr instructions are available.  Also, under VSX, you
14531    can copy vector registers from the FP register set to the Altivec register
14532    set and vice versa.  */
14533
14534 static bool
14535 rs6000_secondary_memory_needed (enum reg_class class1,
14536                                 enum reg_class class2,
14537                                 enum machine_mode mode)
14538 {
14539   if (class1 == class2)
14540     return false;
14541
14542   /* Under VSX, there are 3 register classes that values could be in (VSX_REGS,
14543      ALTIVEC_REGS, and FLOAT_REGS).  We don't need to use memory to copy
14544      between these classes.  But we need memory for other things that can go in
14545      FLOAT_REGS like SFmode.  */
14546   if (TARGET_VSX
14547       && (VECTOR_MEM_VSX_P (mode) || VECTOR_UNIT_VSX_P (mode))
14548       && (class1 == VSX_REGS || class1 == ALTIVEC_REGS
14549           || class1 == FLOAT_REGS))
14550     return (class2 != VSX_REGS && class2 != ALTIVEC_REGS
14551             && class2 != FLOAT_REGS);
14552
14553   if (class1 == VSX_REGS || class2 == VSX_REGS)
14554     return true;
14555
14556   if (class1 == FLOAT_REGS
14557       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14558           || ((mode != DFmode)
14559               && (mode != DDmode)
14560               && (mode != DImode))))
14561     return true;
14562
14563   if (class2 == FLOAT_REGS
14564       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14565           || ((mode != DFmode)
14566               && (mode != DDmode)
14567               && (mode != DImode))))
14568     return true;
14569
14570   if (class1 == ALTIVEC_REGS || class2 == ALTIVEC_REGS)
14571     return true;
14572
14573   return false;
14574 }
14575
14576 /* Debug version of rs6000_secondary_memory_needed.  */
14577 static bool
14578 rs6000_debug_secondary_memory_needed (enum reg_class class1,
14579                                       enum reg_class class2,
14580                                       enum machine_mode mode)
14581 {
14582   bool ret = rs6000_secondary_memory_needed (class1, class2, mode);
14583
14584   fprintf (stderr,
14585            "rs6000_secondary_memory_needed, return: %s, class1 = %s, "
14586            "class2 = %s, mode = %s\n",
14587            ret ? "true" : "false", reg_class_names[class1],
14588            reg_class_names[class2], GET_MODE_NAME (mode));
14589
14590   return ret;
14591 }
14592
14593 /* Return the register class of a scratch register needed to copy IN into
14594    or out of a register in RCLASS in MODE.  If it can be done directly,
14595    NO_REGS is returned.  */
14596
14597 static enum reg_class
14598 rs6000_secondary_reload_class (enum reg_class rclass, enum machine_mode mode,
14599                                rtx in)
14600 {
14601   int regno;
14602
14603   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
14604 #if TARGET_MACHO
14605                      && MACHOPIC_INDIRECT
14606 #endif
14607                      ))
14608     {
14609       /* We cannot copy a symbolic operand directly into anything
14610          other than BASE_REGS for TARGET_ELF.  So indicate that a
14611          register from BASE_REGS is needed as an intermediate
14612          register.
14613
14614          On Darwin, pic addresses require a load from memory, which
14615          needs a base register.  */
14616       if (rclass != BASE_REGS
14617           && (GET_CODE (in) == SYMBOL_REF
14618               || GET_CODE (in) == HIGH
14619               || GET_CODE (in) == LABEL_REF
14620               || GET_CODE (in) == CONST))
14621         return BASE_REGS;
14622     }
14623
14624   if (GET_CODE (in) == REG)
14625     {
14626       regno = REGNO (in);
14627       if (regno >= FIRST_PSEUDO_REGISTER)
14628         {
14629           regno = true_regnum (in);
14630           if (regno >= FIRST_PSEUDO_REGISTER)
14631             regno = -1;
14632         }
14633     }
14634   else if (GET_CODE (in) == SUBREG)
14635     {
14636       regno = true_regnum (in);
14637       if (regno >= FIRST_PSEUDO_REGISTER)
14638         regno = -1;
14639     }
14640   else
14641     regno = -1;
14642
14643   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
14644      into anything.  */
14645   if (rclass == GENERAL_REGS || rclass == BASE_REGS
14646       || (regno >= 0 && INT_REGNO_P (regno)))
14647     return NO_REGS;
14648
14649   /* Constants, memory, and FP registers can go into FP registers.  */
14650   if ((regno == -1 || FP_REGNO_P (regno))
14651       && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
14652     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
14653
14654   /* Memory, and FP/altivec registers can go into fp/altivec registers under
14655      VSX.  */
14656   if (TARGET_VSX
14657       && (regno == -1 || VSX_REGNO_P (regno))
14658       && VSX_REG_CLASS_P (rclass))
14659     return NO_REGS;
14660
14661   /* Memory, and AltiVec registers can go into AltiVec registers.  */
14662   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
14663       && rclass == ALTIVEC_REGS)
14664     return NO_REGS;
14665
14666   /* We can copy among the CR registers.  */
14667   if ((rclass == CR_REGS || rclass == CR0_REGS)
14668       && regno >= 0 && CR_REGNO_P (regno))
14669     return NO_REGS;
14670
14671   /* Otherwise, we need GENERAL_REGS.  */
14672   return GENERAL_REGS;
14673 }
14674
14675 /* Debug version of rs6000_secondary_reload_class.  */
14676 static enum reg_class
14677 rs6000_debug_secondary_reload_class (enum reg_class rclass,
14678                                      enum machine_mode mode, rtx in)
14679 {
14680   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
14681   fprintf (stderr,
14682            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
14683            "mode = %s, input rtx:\n",
14684            reg_class_names[ret], reg_class_names[rclass],
14685            GET_MODE_NAME (mode));
14686   debug_rtx (in);
14687
14688   return ret;
14689 }
14690
14691 /* Return nonzero if for CLASS a mode change from FROM to TO is invalid.  */
14692
14693 static bool
14694 rs6000_cannot_change_mode_class (enum machine_mode from,
14695                                  enum machine_mode to,
14696                                  enum reg_class rclass)
14697 {
14698   unsigned from_size = GET_MODE_SIZE (from);
14699   unsigned to_size = GET_MODE_SIZE (to);
14700
14701   if (from_size != to_size)
14702     {
14703       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
14704       return ((from_size < 8 || to_size < 8 || TARGET_IEEEQUAD)
14705               && reg_classes_intersect_p (xclass, rclass));
14706     }
14707
14708   if (TARGET_E500_DOUBLE
14709       && ((((to) == DFmode) + ((from) == DFmode)) == 1
14710           || (((to) == TFmode) + ((from) == TFmode)) == 1
14711           || (((to) == DDmode) + ((from) == DDmode)) == 1
14712           || (((to) == TDmode) + ((from) == TDmode)) == 1
14713           || (((to) == DImode) + ((from) == DImode)) == 1))
14714     return true;
14715
14716   /* Since the VSX register set includes traditional floating point registers
14717      and altivec registers, just check for the size being different instead of
14718      trying to check whether the modes are vector modes.  Otherwise it won't
14719      allow say DF and DI to change classes.  */
14720   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
14721     return (from_size != 8 && from_size != 16);
14722
14723   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
14724       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
14725     return true;
14726
14727   if (TARGET_SPE && (SPE_VECTOR_MODE (from) + SPE_VECTOR_MODE (to)) == 1
14728       && reg_classes_intersect_p (GENERAL_REGS, rclass))
14729     return true;
14730
14731   return false;
14732 }
14733
14734 /* Debug version of rs6000_cannot_change_mode_class.  */
14735 static bool
14736 rs6000_debug_cannot_change_mode_class (enum machine_mode from,
14737                                        enum machine_mode to,
14738                                        enum reg_class rclass)
14739 {
14740   bool ret = rs6000_cannot_change_mode_class (from, to, rclass);
14741
14742   fprintf (stderr,
14743            "rs6000_cannot_change_mode_class, return %s, from = %s, "
14744            "to = %s, rclass = %s\n",
14745            ret ? "true" : "false",
14746            GET_MODE_NAME (from), GET_MODE_NAME (to),
14747            reg_class_names[rclass]);
14748
14749   return ret;
14750 }
14751 \f
14752 /* Given a comparison operation, return the bit number in CCR to test.  We
14753    know this is a valid comparison.
14754
14755    SCC_P is 1 if this is for an scc.  That means that %D will have been
14756    used instead of %C, so the bits will be in different places.
14757
14758    Return -1 if OP isn't a valid comparison for some reason.  */
14759
14760 int
14761 ccr_bit (rtx op, int scc_p)
14762 {
14763   enum rtx_code code = GET_CODE (op);
14764   enum machine_mode cc_mode;
14765   int cc_regnum;
14766   int base_bit;
14767   rtx reg;
14768
14769   if (!COMPARISON_P (op))
14770     return -1;
14771
14772   reg = XEXP (op, 0);
14773
14774   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
14775
14776   cc_mode = GET_MODE (reg);
14777   cc_regnum = REGNO (reg);
14778   base_bit = 4 * (cc_regnum - CR0_REGNO);
14779
14780   validate_condition_mode (code, cc_mode);
14781
14782   /* When generating a sCOND operation, only positive conditions are
14783      allowed.  */
14784   gcc_assert (!scc_p
14785               || code == EQ || code == GT || code == LT || code == UNORDERED
14786               || code == GTU || code == LTU);
14787
14788   switch (code)
14789     {
14790     case NE:
14791       return scc_p ? base_bit + 3 : base_bit + 2;
14792     case EQ:
14793       return base_bit + 2;
14794     case GT:  case GTU:  case UNLE:
14795       return base_bit + 1;
14796     case LT:  case LTU:  case UNGE:
14797       return base_bit;
14798     case ORDERED:  case UNORDERED:
14799       return base_bit + 3;
14800
14801     case GE:  case GEU:
14802       /* If scc, we will have done a cror to put the bit in the
14803          unordered position.  So test that bit.  For integer, this is ! LT
14804          unless this is an scc insn.  */
14805       return scc_p ? base_bit + 3 : base_bit;
14806
14807     case LE:  case LEU:
14808       return scc_p ? base_bit + 3 : base_bit + 1;
14809
14810     default:
14811       gcc_unreachable ();
14812     }
14813 }
14814 \f
14815 /* Return the GOT register.  */
14816
14817 rtx
14818 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
14819 {
14820   /* The second flow pass currently (June 1999) can't update
14821      regs_ever_live without disturbing other parts of the compiler, so
14822      update it here to make the prolog/epilogue code happy.  */
14823   if (!can_create_pseudo_p ()
14824       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
14825     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
14826
14827   crtl->uses_pic_offset_table = 1;
14828
14829   return pic_offset_table_rtx;
14830 }
14831 \f
14832 /* Function to init struct machine_function.
14833    This will be called, via a pointer variable,
14834    from push_function_context.  */
14835
14836 static struct machine_function *
14837 rs6000_init_machine_status (void)
14838 {
14839   return ggc_alloc_cleared_machine_function ();
14840 }
14841 \f
14842 /* These macros test for integers and extract the low-order bits.  */
14843 #define INT_P(X)  \
14844 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
14845  && GET_MODE (X) == VOIDmode)
14846
14847 #define INT_LOWPART(X) \
14848   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
14849
14850 int
14851 extract_MB (rtx op)
14852 {
14853   int i;
14854   unsigned long val = INT_LOWPART (op);
14855
14856   /* If the high bit is zero, the value is the first 1 bit we find
14857      from the left.  */
14858   if ((val & 0x80000000) == 0)
14859     {
14860       gcc_assert (val & 0xffffffff);
14861
14862       i = 1;
14863       while (((val <<= 1) & 0x80000000) == 0)
14864         ++i;
14865       return i;
14866     }
14867
14868   /* If the high bit is set and the low bit is not, or the mask is all
14869      1's, the value is zero.  */
14870   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
14871     return 0;
14872
14873   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
14874      from the right.  */
14875   i = 31;
14876   while (((val >>= 1) & 1) != 0)
14877     --i;
14878
14879   return i;
14880 }
14881
14882 int
14883 extract_ME (rtx op)
14884 {
14885   int i;
14886   unsigned long val = INT_LOWPART (op);
14887
14888   /* If the low bit is zero, the value is the first 1 bit we find from
14889      the right.  */
14890   if ((val & 1) == 0)
14891     {
14892       gcc_assert (val & 0xffffffff);
14893
14894       i = 30;
14895       while (((val >>= 1) & 1) == 0)
14896         --i;
14897
14898       return i;
14899     }
14900
14901   /* If the low bit is set and the high bit is not, or the mask is all
14902      1's, the value is 31.  */
14903   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
14904     return 31;
14905
14906   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
14907      from the left.  */
14908   i = 0;
14909   while (((val <<= 1) & 0x80000000) != 0)
14910     ++i;
14911
14912   return i;
14913 }
14914
14915 /* Locate some local-dynamic symbol still in use by this function
14916    so that we can print its name in some tls_ld pattern.  */
14917
14918 static const char *
14919 rs6000_get_some_local_dynamic_name (void)
14920 {
14921   rtx insn;
14922
14923   if (cfun->machine->some_ld_name)
14924     return cfun->machine->some_ld_name;
14925
14926   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
14927     if (INSN_P (insn)
14928         && for_each_rtx (&PATTERN (insn),
14929                          rs6000_get_some_local_dynamic_name_1, 0))
14930       return cfun->machine->some_ld_name;
14931
14932   gcc_unreachable ();
14933 }
14934
14935 /* Helper function for rs6000_get_some_local_dynamic_name.  */
14936
14937 static int
14938 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
14939 {
14940   rtx x = *px;
14941
14942   if (GET_CODE (x) == SYMBOL_REF)
14943     {
14944       const char *str = XSTR (x, 0);
14945       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
14946         {
14947           cfun->machine->some_ld_name = str;
14948           return 1;
14949         }
14950     }
14951
14952   return 0;
14953 }
14954
14955 /* Write out a function code label.  */
14956
14957 void
14958 rs6000_output_function_entry (FILE *file, const char *fname)
14959 {
14960   if (fname[0] != '.')
14961     {
14962       switch (DEFAULT_ABI)
14963         {
14964         default:
14965           gcc_unreachable ();
14966
14967         case ABI_AIX:
14968           if (DOT_SYMBOLS)
14969             putc ('.', file);
14970           else
14971             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
14972           break;
14973
14974         case ABI_V4:
14975         case ABI_DARWIN:
14976           break;
14977         }
14978     }
14979
14980   RS6000_OUTPUT_BASENAME (file, fname);
14981 }
14982
14983 /* Print an operand.  Recognize special options, documented below.  */
14984
14985 #if TARGET_ELF
14986 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
14987 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
14988 #else
14989 #define SMALL_DATA_RELOC "sda21"
14990 #define SMALL_DATA_REG 0
14991 #endif
14992
14993 void
14994 print_operand (FILE *file, rtx x, int code)
14995 {
14996   int i;
14997   HOST_WIDE_INT val;
14998   unsigned HOST_WIDE_INT uval;
14999
15000   switch (code)
15001     {
15002     case '.':
15003       /* Write out an instruction after the call which may be replaced
15004          with glue code by the loader.  This depends on the AIX version.  */
15005       asm_fprintf (file, RS6000_CALL_GLUE);
15006       return;
15007
15008       /* %a is output_address.  */
15009
15010     case 'A':
15011       /* If X is a constant integer whose low-order 5 bits are zero,
15012          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
15013          in the AIX assembler where "sri" with a zero shift count
15014          writes a trash instruction.  */
15015       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
15016         putc ('l', file);
15017       else
15018         putc ('r', file);
15019       return;
15020
15021     case 'b':
15022       /* If constant, low-order 16 bits of constant, unsigned.
15023          Otherwise, write normally.  */
15024       if (INT_P (x))
15025         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
15026       else
15027         print_operand (file, x, 0);
15028       return;
15029
15030     case 'B':
15031       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
15032          for 64-bit mask direction.  */
15033       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
15034       return;
15035
15036       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
15037          output_operand.  */
15038
15039     case 'c':
15040       /* X is a CR register.  Print the number of the GT bit of the CR.  */
15041       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15042         output_operand_lossage ("invalid %%c value");
15043       else
15044         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
15045       return;
15046
15047     case 'D':
15048       /* Like 'J' but get to the GT bit only.  */
15049       gcc_assert (GET_CODE (x) == REG);
15050
15051       /* Bit 1 is GT bit.  */
15052       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
15053
15054       /* Add one for shift count in rlinm for scc.  */
15055       fprintf (file, "%d", i + 1);
15056       return;
15057
15058     case 'E':
15059       /* X is a CR register.  Print the number of the EQ bit of the CR */
15060       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15061         output_operand_lossage ("invalid %%E value");
15062       else
15063         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
15064       return;
15065
15066     case 'f':
15067       /* X is a CR register.  Print the shift count needed to move it
15068          to the high-order four bits.  */
15069       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15070         output_operand_lossage ("invalid %%f value");
15071       else
15072         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
15073       return;
15074
15075     case 'F':
15076       /* Similar, but print the count for the rotate in the opposite
15077          direction.  */
15078       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15079         output_operand_lossage ("invalid %%F value");
15080       else
15081         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
15082       return;
15083
15084     case 'G':
15085       /* X is a constant integer.  If it is negative, print "m",
15086          otherwise print "z".  This is to make an aze or ame insn.  */
15087       if (GET_CODE (x) != CONST_INT)
15088         output_operand_lossage ("invalid %%G value");
15089       else if (INTVAL (x) >= 0)
15090         putc ('z', file);
15091       else
15092         putc ('m', file);
15093       return;
15094
15095     case 'h':
15096       /* If constant, output low-order five bits.  Otherwise, write
15097          normally.  */
15098       if (INT_P (x))
15099         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
15100       else
15101         print_operand (file, x, 0);
15102       return;
15103
15104     case 'H':
15105       /* If constant, output low-order six bits.  Otherwise, write
15106          normally.  */
15107       if (INT_P (x))
15108         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
15109       else
15110         print_operand (file, x, 0);
15111       return;
15112
15113     case 'I':
15114       /* Print `i' if this is a constant, else nothing.  */
15115       if (INT_P (x))
15116         putc ('i', file);
15117       return;
15118
15119     case 'j':
15120       /* Write the bit number in CCR for jump.  */
15121       i = ccr_bit (x, 0);
15122       if (i == -1)
15123         output_operand_lossage ("invalid %%j code");
15124       else
15125         fprintf (file, "%d", i);
15126       return;
15127
15128     case 'J':
15129       /* Similar, but add one for shift count in rlinm for scc and pass
15130          scc flag to `ccr_bit'.  */
15131       i = ccr_bit (x, 1);
15132       if (i == -1)
15133         output_operand_lossage ("invalid %%J code");
15134       else
15135         /* If we want bit 31, write a shift count of zero, not 32.  */
15136         fprintf (file, "%d", i == 31 ? 0 : i + 1);
15137       return;
15138
15139     case 'k':
15140       /* X must be a constant.  Write the 1's complement of the
15141          constant.  */
15142       if (! INT_P (x))
15143         output_operand_lossage ("invalid %%k value");
15144       else
15145         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
15146       return;
15147
15148     case 'K':
15149       /* X must be a symbolic constant on ELF.  Write an
15150          expression suitable for an 'addi' that adds in the low 16
15151          bits of the MEM.  */
15152       if (GET_CODE (x) == CONST)
15153         {
15154           if (GET_CODE (XEXP (x, 0)) != PLUS
15155               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
15156                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
15157               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
15158             output_operand_lossage ("invalid %%K value");
15159         }
15160       print_operand_address (file, x);
15161       fputs ("@l", file);
15162       return;
15163
15164       /* %l is output_asm_label.  */
15165
15166     case 'L':
15167       /* Write second word of DImode or DFmode reference.  Works on register
15168          or non-indexed memory only.  */
15169       if (GET_CODE (x) == REG)
15170         fputs (reg_names[REGNO (x) + 1], file);
15171       else if (GET_CODE (x) == MEM)
15172         {
15173           /* Handle possible auto-increment.  Since it is pre-increment and
15174              we have already done it, we can just use an offset of word.  */
15175           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15176               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15177             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15178                                            UNITS_PER_WORD));
15179           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15180             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15181                                            UNITS_PER_WORD));
15182           else
15183             output_address (XEXP (adjust_address_nv (x, SImode,
15184                                                      UNITS_PER_WORD),
15185                                   0));
15186
15187           if (small_data_operand (x, GET_MODE (x)))
15188             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15189                      reg_names[SMALL_DATA_REG]);
15190         }
15191       return;
15192
15193     case 'm':
15194       /* MB value for a mask operand.  */
15195       if (! mask_operand (x, SImode))
15196         output_operand_lossage ("invalid %%m value");
15197
15198       fprintf (file, "%d", extract_MB (x));
15199       return;
15200
15201     case 'M':
15202       /* ME value for a mask operand.  */
15203       if (! mask_operand (x, SImode))
15204         output_operand_lossage ("invalid %%M value");
15205
15206       fprintf (file, "%d", extract_ME (x));
15207       return;
15208
15209       /* %n outputs the negative of its operand.  */
15210
15211     case 'N':
15212       /* Write the number of elements in the vector times 4.  */
15213       if (GET_CODE (x) != PARALLEL)
15214         output_operand_lossage ("invalid %%N value");
15215       else
15216         fprintf (file, "%d", XVECLEN (x, 0) * 4);
15217       return;
15218
15219     case 'O':
15220       /* Similar, but subtract 1 first.  */
15221       if (GET_CODE (x) != PARALLEL)
15222         output_operand_lossage ("invalid %%O value");
15223       else
15224         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
15225       return;
15226
15227     case 'p':
15228       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
15229       if (! INT_P (x)
15230           || INT_LOWPART (x) < 0
15231           || (i = exact_log2 (INT_LOWPART (x))) < 0)
15232         output_operand_lossage ("invalid %%p value");
15233       else
15234         fprintf (file, "%d", i);
15235       return;
15236
15237     case 'P':
15238       /* The operand must be an indirect memory reference.  The result
15239          is the register name.  */
15240       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
15241           || REGNO (XEXP (x, 0)) >= 32)
15242         output_operand_lossage ("invalid %%P value");
15243       else
15244         fputs (reg_names[REGNO (XEXP (x, 0))], file);
15245       return;
15246
15247     case 'q':
15248       /* This outputs the logical code corresponding to a boolean
15249          expression.  The expression may have one or both operands
15250          negated (if one, only the first one).  For condition register
15251          logical operations, it will also treat the negated
15252          CR codes as NOTs, but not handle NOTs of them.  */
15253       {
15254         const char *const *t = 0;
15255         const char *s;
15256         enum rtx_code code = GET_CODE (x);
15257         static const char * const tbl[3][3] = {
15258           { "and", "andc", "nor" },
15259           { "or", "orc", "nand" },
15260           { "xor", "eqv", "xor" } };
15261
15262         if (code == AND)
15263           t = tbl[0];
15264         else if (code == IOR)
15265           t = tbl[1];
15266         else if (code == XOR)
15267           t = tbl[2];
15268         else
15269           output_operand_lossage ("invalid %%q value");
15270
15271         if (GET_CODE (XEXP (x, 0)) != NOT)
15272           s = t[0];
15273         else
15274           {
15275             if (GET_CODE (XEXP (x, 1)) == NOT)
15276               s = t[2];
15277             else
15278               s = t[1];
15279           }
15280
15281         fputs (s, file);
15282       }
15283       return;
15284
15285     case 'Q':
15286       if (TARGET_MFCRF)
15287         fputc (',', file);
15288         /* FALLTHRU */
15289       else
15290         return;
15291
15292     case 'R':
15293       /* X is a CR register.  Print the mask for `mtcrf'.  */
15294       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15295         output_operand_lossage ("invalid %%R value");
15296       else
15297         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
15298       return;
15299
15300     case 's':
15301       /* Low 5 bits of 32 - value */
15302       if (! INT_P (x))
15303         output_operand_lossage ("invalid %%s value");
15304       else
15305         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
15306       return;
15307
15308     case 'S':
15309       /* PowerPC64 mask position.  All 0's is excluded.
15310          CONST_INT 32-bit mask is considered sign-extended so any
15311          transition must occur within the CONST_INT, not on the boundary.  */
15312       if (! mask64_operand (x, DImode))
15313         output_operand_lossage ("invalid %%S value");
15314
15315       uval = INT_LOWPART (x);
15316
15317       if (uval & 1)     /* Clear Left */
15318         {
15319 #if HOST_BITS_PER_WIDE_INT > 64
15320           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15321 #endif
15322           i = 64;
15323         }
15324       else              /* Clear Right */
15325         {
15326           uval = ~uval;
15327 #if HOST_BITS_PER_WIDE_INT > 64
15328           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15329 #endif
15330           i = 63;
15331         }
15332       while (uval != 0)
15333         --i, uval >>= 1;
15334       gcc_assert (i >= 0);
15335       fprintf (file, "%d", i);
15336       return;
15337
15338     case 't':
15339       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
15340       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
15341
15342       /* Bit 3 is OV bit.  */
15343       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
15344
15345       /* If we want bit 31, write a shift count of zero, not 32.  */
15346       fprintf (file, "%d", i == 31 ? 0 : i + 1);
15347       return;
15348
15349     case 'T':
15350       /* Print the symbolic name of a branch target register.  */
15351       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
15352                                   && REGNO (x) != CTR_REGNO))
15353         output_operand_lossage ("invalid %%T value");
15354       else if (REGNO (x) == LR_REGNO)
15355         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
15356       else
15357         fputs ("ctr", file);
15358       return;
15359
15360     case 'u':
15361       /* High-order 16 bits of constant for use in unsigned operand.  */
15362       if (! INT_P (x))
15363         output_operand_lossage ("invalid %%u value");
15364       else
15365         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15366                  (INT_LOWPART (x) >> 16) & 0xffff);
15367       return;
15368
15369     case 'v':
15370       /* High-order 16 bits of constant for use in signed operand.  */
15371       if (! INT_P (x))
15372         output_operand_lossage ("invalid %%v value");
15373       else
15374         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15375                  (INT_LOWPART (x) >> 16) & 0xffff);
15376       return;
15377
15378     case 'U':
15379       /* Print `u' if this has an auto-increment or auto-decrement.  */
15380       if (GET_CODE (x) == MEM
15381           && (GET_CODE (XEXP (x, 0)) == PRE_INC
15382               || GET_CODE (XEXP (x, 0)) == PRE_DEC
15383               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
15384         putc ('u', file);
15385       return;
15386
15387     case 'V':
15388       /* Print the trap code for this operand.  */
15389       switch (GET_CODE (x))
15390         {
15391         case EQ:
15392           fputs ("eq", file);   /* 4 */
15393           break;
15394         case NE:
15395           fputs ("ne", file);   /* 24 */
15396           break;
15397         case LT:
15398           fputs ("lt", file);   /* 16 */
15399           break;
15400         case LE:
15401           fputs ("le", file);   /* 20 */
15402           break;
15403         case GT:
15404           fputs ("gt", file);   /* 8 */
15405           break;
15406         case GE:
15407           fputs ("ge", file);   /* 12 */
15408           break;
15409         case LTU:
15410           fputs ("llt", file);  /* 2 */
15411           break;
15412         case LEU:
15413           fputs ("lle", file);  /* 6 */
15414           break;
15415         case GTU:
15416           fputs ("lgt", file);  /* 1 */
15417           break;
15418         case GEU:
15419           fputs ("lge", file);  /* 5 */
15420           break;
15421         default:
15422           gcc_unreachable ();
15423         }
15424       break;
15425
15426     case 'w':
15427       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
15428          normally.  */
15429       if (INT_P (x))
15430         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
15431                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
15432       else
15433         print_operand (file, x, 0);
15434       return;
15435
15436     case 'W':
15437       /* MB value for a PowerPC64 rldic operand.  */
15438       val = (GET_CODE (x) == CONST_INT
15439              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
15440
15441       if (val < 0)
15442         i = -1;
15443       else
15444         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
15445           if ((val <<= 1) < 0)
15446             break;
15447
15448 #if HOST_BITS_PER_WIDE_INT == 32
15449       if (GET_CODE (x) == CONST_INT && i >= 0)
15450         i += 32;  /* zero-extend high-part was all 0's */
15451       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
15452         {
15453           val = CONST_DOUBLE_LOW (x);
15454
15455           gcc_assert (val);
15456           if (val < 0)
15457             --i;
15458           else
15459             for ( ; i < 64; i++)
15460               if ((val <<= 1) < 0)
15461                 break;
15462         }
15463 #endif
15464
15465       fprintf (file, "%d", i + 1);
15466       return;
15467
15468     case 'x':
15469       /* X is a FPR or Altivec register used in a VSX context.  */
15470       if (GET_CODE (x) != REG || !VSX_REGNO_P (REGNO (x)))
15471         output_operand_lossage ("invalid %%x value");
15472       else
15473         {
15474           int reg = REGNO (x);
15475           int vsx_reg = (FP_REGNO_P (reg)
15476                          ? reg - 32
15477                          : reg - FIRST_ALTIVEC_REGNO + 32);
15478
15479 #ifdef TARGET_REGNAMES      
15480           if (TARGET_REGNAMES)
15481             fprintf (file, "%%vs%d", vsx_reg);
15482           else
15483 #endif
15484             fprintf (file, "%d", vsx_reg);
15485         }
15486       return;
15487
15488     case 'X':
15489       if (GET_CODE (x) == MEM
15490           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
15491               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
15492                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
15493         putc ('x', file);
15494       return;
15495
15496     case 'Y':
15497       /* Like 'L', for third word of TImode  */
15498       if (GET_CODE (x) == REG)
15499         fputs (reg_names[REGNO (x) + 2], file);
15500       else if (GET_CODE (x) == MEM)
15501         {
15502           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15503               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15504             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15505           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15506             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15507           else
15508             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
15509           if (small_data_operand (x, GET_MODE (x)))
15510             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15511                      reg_names[SMALL_DATA_REG]);
15512         }
15513       return;
15514
15515     case 'z':
15516       /* X is a SYMBOL_REF.  Write out the name preceded by a
15517          period and without any trailing data in brackets.  Used for function
15518          names.  If we are configured for System V (or the embedded ABI) on
15519          the PowerPC, do not emit the period, since those systems do not use
15520          TOCs and the like.  */
15521       gcc_assert (GET_CODE (x) == SYMBOL_REF);
15522
15523       /* Mark the decl as referenced so that cgraph will output the
15524          function.  */
15525       if (SYMBOL_REF_DECL (x))
15526         mark_decl_referenced (SYMBOL_REF_DECL (x));
15527
15528       /* For macho, check to see if we need a stub.  */
15529       if (TARGET_MACHO)
15530         {
15531           const char *name = XSTR (x, 0);
15532 #if TARGET_MACHO
15533           if (darwin_emit_branch_islands
15534               && MACHOPIC_INDIRECT
15535               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
15536             name = machopic_indirection_name (x, /*stub_p=*/true);
15537 #endif
15538           assemble_name (file, name);
15539         }
15540       else if (!DOT_SYMBOLS)
15541         assemble_name (file, XSTR (x, 0));
15542       else
15543         rs6000_output_function_entry (file, XSTR (x, 0));
15544       return;
15545
15546     case 'Z':
15547       /* Like 'L', for last word of TImode.  */
15548       if (GET_CODE (x) == REG)
15549         fputs (reg_names[REGNO (x) + 3], file);
15550       else if (GET_CODE (x) == MEM)
15551         {
15552           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15553               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15554             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15555           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15556             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15557           else
15558             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
15559           if (small_data_operand (x, GET_MODE (x)))
15560             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15561                      reg_names[SMALL_DATA_REG]);
15562         }
15563       return;
15564
15565       /* Print AltiVec or SPE memory operand.  */
15566     case 'y':
15567       {
15568         rtx tmp;
15569
15570         gcc_assert (GET_CODE (x) == MEM);
15571
15572         tmp = XEXP (x, 0);
15573
15574         /* Ugly hack because %y is overloaded.  */
15575         if ((TARGET_SPE || TARGET_E500_DOUBLE)
15576             && (GET_MODE_SIZE (GET_MODE (x)) == 8
15577                 || GET_MODE (x) == TFmode
15578                 || GET_MODE (x) == TImode))
15579           {
15580             /* Handle [reg].  */
15581             if (GET_CODE (tmp) == REG)
15582               {
15583                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
15584                 break;
15585               }
15586             /* Handle [reg+UIMM].  */
15587             else if (GET_CODE (tmp) == PLUS &&
15588                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
15589               {
15590                 int x;
15591
15592                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
15593
15594                 x = INTVAL (XEXP (tmp, 1));
15595                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
15596                 break;
15597               }
15598
15599             /* Fall through.  Must be [reg+reg].  */
15600           }
15601         if (VECTOR_MEM_ALTIVEC_P (GET_MODE (x))
15602             && GET_CODE (tmp) == AND
15603             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
15604             && INTVAL (XEXP (tmp, 1)) == -16)
15605           tmp = XEXP (tmp, 0);
15606         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
15607                  && GET_CODE (tmp) == PRE_MODIFY)
15608           tmp = XEXP (tmp, 1);
15609         if (GET_CODE (tmp) == REG)
15610           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
15611         else
15612           {
15613             if (!GET_CODE (tmp) == PLUS
15614                 || !REG_P (XEXP (tmp, 0))
15615                 || !REG_P (XEXP (tmp, 1)))
15616               {
15617                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
15618                 break;
15619               }
15620
15621             if (REGNO (XEXP (tmp, 0)) == 0)
15622               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
15623                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
15624             else
15625               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
15626                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
15627           }
15628         break;
15629       }
15630
15631     case 0:
15632       if (GET_CODE (x) == REG)
15633         fprintf (file, "%s", reg_names[REGNO (x)]);
15634       else if (GET_CODE (x) == MEM)
15635         {
15636           /* We need to handle PRE_INC and PRE_DEC here, since we need to
15637              know the width from the mode.  */
15638           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
15639             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
15640                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15641           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
15642             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
15643                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15644           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15645             output_address (XEXP (XEXP (x, 0), 1));
15646           else
15647             output_address (XEXP (x, 0));
15648         }
15649       else
15650         output_addr_const (file, x);
15651       return;
15652
15653     case '&':
15654       assemble_name (file, rs6000_get_some_local_dynamic_name ());
15655       return;
15656
15657     default:
15658       output_operand_lossage ("invalid %%xn code");
15659     }
15660 }
15661 \f
15662 /* Print the address of an operand.  */
15663
15664 void
15665 print_operand_address (FILE *file, rtx x)
15666 {
15667   if (GET_CODE (x) == REG)
15668     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
15669   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
15670            || GET_CODE (x) == LABEL_REF)
15671     {
15672       output_addr_const (file, x);
15673       if (small_data_operand (x, GET_MODE (x)))
15674         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15675                  reg_names[SMALL_DATA_REG]);
15676       else
15677         gcc_assert (!TARGET_TOC);
15678     }
15679   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
15680     {
15681       gcc_assert (REG_P (XEXP (x, 0)));
15682       if (REGNO (XEXP (x, 0)) == 0)
15683         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
15684                  reg_names[ REGNO (XEXP (x, 0)) ]);
15685       else
15686         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
15687                  reg_names[ REGNO (XEXP (x, 1)) ]);
15688     }
15689   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
15690     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
15691              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
15692 #if TARGET_MACHO
15693   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
15694            && CONSTANT_P (XEXP (x, 1)))
15695     {
15696       fprintf (file, "lo16(");
15697       output_addr_const (file, XEXP (x, 1));
15698       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15699     }
15700 #endif
15701   else if (legitimate_constant_pool_address_p (x, true))
15702     {
15703       /* This hack along with a corresponding hack in
15704          rs6000_output_addr_const_extra arranges to output addends
15705          where the assembler expects to find them.  eg.
15706          (lo_sum (reg 9)
15707          .       (const (plus (unspec [symbol_ref ("x") tocrel]) 8)))
15708          without this hack would be output as "x@toc+8@l(9)".  We
15709          want "x+8@toc@l(9)".  */
15710       output_addr_const (file, tocrel_base);
15711       if (GET_CODE (x) == LO_SUM)
15712         fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15713       else
15714         fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
15715     }
15716 #if TARGET_ELF
15717   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
15718            && CONSTANT_P (XEXP (x, 1)))
15719     {
15720       output_addr_const (file, XEXP (x, 1));
15721       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15722     }
15723 #endif
15724   else
15725     gcc_unreachable ();
15726 }
15727 \f
15728 /* Implement OUTPUT_ADDR_CONST_EXTRA for address X.  */
15729
15730 bool
15731 rs6000_output_addr_const_extra (FILE *file, rtx x)
15732 {
15733   if (GET_CODE (x) == UNSPEC)
15734     switch (XINT (x, 1))
15735       {
15736       case UNSPEC_TOCREL:
15737         gcc_assert (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF);
15738         output_addr_const (file, XVECEXP (x, 0, 0));
15739         if (x == tocrel_base && tocrel_offset != const0_rtx)
15740           {
15741             if (INTVAL (tocrel_offset) >= 0)
15742               fprintf (file, "+");
15743             output_addr_const (file, tocrel_offset);
15744           }
15745         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
15746           {
15747             putc ('-', file);
15748             assemble_name (file, toc_label_name);
15749           }
15750         else if (TARGET_ELF)
15751           fputs ("@toc", file);
15752         return true;
15753
15754 #if TARGET_MACHO
15755       case UNSPEC_MACHOPIC_OFFSET:
15756         output_addr_const (file, XVECEXP (x, 0, 0));
15757         putc ('-', file);
15758         machopic_output_function_base_name (file);
15759         return true;
15760 #endif
15761       }
15762   return false;
15763 }
15764 \f
15765 /* Target hook for assembling integer objects.  The PowerPC version has
15766    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
15767    is defined.  It also needs to handle DI-mode objects on 64-bit
15768    targets.  */
15769
15770 static bool
15771 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
15772 {
15773 #ifdef RELOCATABLE_NEEDS_FIXUP
15774   /* Special handling for SI values.  */
15775   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
15776     {
15777       static int recurse = 0;
15778
15779       /* For -mrelocatable, we mark all addresses that need to be fixed up
15780          in the .fixup section.  */
15781       if (TARGET_RELOCATABLE
15782           && in_section != toc_section
15783           && in_section != text_section
15784           && !unlikely_text_section_p (in_section)
15785           && !recurse
15786           && GET_CODE (x) != CONST_INT
15787           && GET_CODE (x) != CONST_DOUBLE
15788           && CONSTANT_P (x))
15789         {
15790           char buf[256];
15791
15792           recurse = 1;
15793           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
15794           fixuplabelno++;
15795           ASM_OUTPUT_LABEL (asm_out_file, buf);
15796           fprintf (asm_out_file, "\t.long\t(");
15797           output_addr_const (asm_out_file, x);
15798           fprintf (asm_out_file, ")@fixup\n");
15799           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
15800           ASM_OUTPUT_ALIGN (asm_out_file, 2);
15801           fprintf (asm_out_file, "\t.long\t");
15802           assemble_name (asm_out_file, buf);
15803           fprintf (asm_out_file, "\n\t.previous\n");
15804           recurse = 0;
15805           return true;
15806         }
15807       /* Remove initial .'s to turn a -mcall-aixdesc function
15808          address into the address of the descriptor, not the function
15809          itself.  */
15810       else if (GET_CODE (x) == SYMBOL_REF
15811                && XSTR (x, 0)[0] == '.'
15812                && DEFAULT_ABI == ABI_AIX)
15813         {
15814           const char *name = XSTR (x, 0);
15815           while (*name == '.')
15816             name++;
15817
15818           fprintf (asm_out_file, "\t.long\t%s\n", name);
15819           return true;
15820         }
15821     }
15822 #endif /* RELOCATABLE_NEEDS_FIXUP */
15823   return default_assemble_integer (x, size, aligned_p);
15824 }
15825
15826 #ifdef HAVE_GAS_HIDDEN
15827 /* Emit an assembler directive to set symbol visibility for DECL to
15828    VISIBILITY_TYPE.  */
15829
15830 static void
15831 rs6000_assemble_visibility (tree decl, int vis)
15832 {
15833   /* Functions need to have their entry point symbol visibility set as
15834      well as their descriptor symbol visibility.  */
15835   if (DEFAULT_ABI == ABI_AIX
15836       && DOT_SYMBOLS
15837       && TREE_CODE (decl) == FUNCTION_DECL)
15838     {
15839       static const char * const visibility_types[] = {
15840         NULL, "internal", "hidden", "protected"
15841       };
15842
15843       const char *name, *type;
15844
15845       name = ((* targetm.strip_name_encoding)
15846               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
15847       type = visibility_types[vis];
15848
15849       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
15850       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
15851     }
15852   else
15853     default_assemble_visibility (decl, vis);
15854 }
15855 #endif
15856 \f
15857 enum rtx_code
15858 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
15859 {
15860   /* Reversal of FP compares takes care -- an ordered compare
15861      becomes an unordered compare and vice versa.  */
15862   if (mode == CCFPmode
15863       && (!flag_finite_math_only
15864           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
15865           || code == UNEQ || code == LTGT))
15866     return reverse_condition_maybe_unordered (code);
15867   else
15868     return reverse_condition (code);
15869 }
15870
15871 /* Generate a compare for CODE.  Return a brand-new rtx that
15872    represents the result of the compare.  */
15873
15874 static rtx
15875 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
15876 {
15877   enum machine_mode comp_mode;
15878   rtx compare_result;
15879   enum rtx_code code = GET_CODE (cmp);
15880   rtx op0 = XEXP (cmp, 0);
15881   rtx op1 = XEXP (cmp, 1);
15882
15883   if (FLOAT_MODE_P (mode))
15884     comp_mode = CCFPmode;
15885   else if (code == GTU || code == LTU
15886            || code == GEU || code == LEU)
15887     comp_mode = CCUNSmode;
15888   else if ((code == EQ || code == NE)
15889            && GET_CODE (op0) == SUBREG
15890            && GET_CODE (op1) == SUBREG
15891            && SUBREG_PROMOTED_UNSIGNED_P (op0)
15892            && SUBREG_PROMOTED_UNSIGNED_P (op1))
15893     /* These are unsigned values, perhaps there will be a later
15894        ordering compare that can be shared with this one.
15895        Unfortunately we cannot detect the signedness of the operands
15896        for non-subregs.  */
15897     comp_mode = CCUNSmode;
15898   else
15899     comp_mode = CCmode;
15900
15901   /* First, the compare.  */
15902   compare_result = gen_reg_rtx (comp_mode);
15903
15904   /* E500 FP compare instructions on the GPRs.  Yuck!  */
15905   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
15906       && FLOAT_MODE_P (mode))
15907     {
15908       rtx cmp, or_result, compare_result2;
15909       enum machine_mode op_mode = GET_MODE (op0);
15910
15911       if (op_mode == VOIDmode)
15912         op_mode = GET_MODE (op1);
15913
15914       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
15915          This explains the following mess.  */
15916
15917       switch (code)
15918         {
15919         case EQ: case UNEQ: case NE: case LTGT:
15920           switch (op_mode)
15921             {
15922             case SFmode:
15923               cmp = (flag_finite_math_only && !flag_trapping_math)
15924                 ? gen_tstsfeq_gpr (compare_result, op0, op1)
15925                 : gen_cmpsfeq_gpr (compare_result, op0, op1);
15926               break;
15927
15928             case DFmode:
15929               cmp = (flag_finite_math_only && !flag_trapping_math)
15930                 ? gen_tstdfeq_gpr (compare_result, op0, op1)
15931                 : gen_cmpdfeq_gpr (compare_result, op0, op1);
15932               break;
15933
15934             case TFmode:
15935               cmp = (flag_finite_math_only && !flag_trapping_math)
15936                 ? gen_tsttfeq_gpr (compare_result, op0, op1)
15937                 : gen_cmptfeq_gpr (compare_result, op0, op1);
15938               break;
15939
15940             default:
15941               gcc_unreachable ();
15942             }
15943           break;
15944
15945         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
15946           switch (op_mode)
15947             {
15948             case SFmode:
15949               cmp = (flag_finite_math_only && !flag_trapping_math)
15950                 ? gen_tstsfgt_gpr (compare_result, op0, op1)
15951                 : gen_cmpsfgt_gpr (compare_result, op0, op1);
15952               break;
15953
15954             case DFmode:
15955               cmp = (flag_finite_math_only && !flag_trapping_math)
15956                 ? gen_tstdfgt_gpr (compare_result, op0, op1)
15957                 : gen_cmpdfgt_gpr (compare_result, op0, op1);
15958               break;
15959
15960             case TFmode:
15961               cmp = (flag_finite_math_only && !flag_trapping_math)
15962                 ? gen_tsttfgt_gpr (compare_result, op0, op1)
15963                 : gen_cmptfgt_gpr (compare_result, op0, op1);
15964               break;
15965
15966             default:
15967               gcc_unreachable ();
15968             }
15969           break;
15970
15971         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
15972           switch (op_mode)
15973             {
15974             case SFmode:
15975               cmp = (flag_finite_math_only && !flag_trapping_math)
15976                 ? gen_tstsflt_gpr (compare_result, op0, op1)
15977                 : gen_cmpsflt_gpr (compare_result, op0, op1);
15978               break;
15979
15980             case DFmode:
15981               cmp = (flag_finite_math_only && !flag_trapping_math)
15982                 ? gen_tstdflt_gpr (compare_result, op0, op1)
15983                 : gen_cmpdflt_gpr (compare_result, op0, op1);
15984               break;
15985
15986             case TFmode:
15987               cmp = (flag_finite_math_only && !flag_trapping_math)
15988                 ? gen_tsttflt_gpr (compare_result, op0, op1)
15989                 : gen_cmptflt_gpr (compare_result, op0, op1);
15990               break;
15991
15992             default:
15993               gcc_unreachable ();
15994             }
15995           break;
15996         default:
15997           gcc_unreachable ();
15998         }
15999
16000       /* Synthesize LE and GE from LT/GT || EQ.  */
16001       if (code == LE || code == GE || code == LEU || code == GEU)
16002         {
16003           emit_insn (cmp);
16004
16005           switch (code)
16006             {
16007             case LE: code = LT; break;
16008             case GE: code = GT; break;
16009             case LEU: code = LT; break;
16010             case GEU: code = GT; break;
16011             default: gcc_unreachable ();
16012             }
16013
16014           compare_result2 = gen_reg_rtx (CCFPmode);
16015
16016           /* Do the EQ.  */
16017           switch (op_mode)
16018             {
16019             case SFmode:
16020               cmp = (flag_finite_math_only && !flag_trapping_math)
16021                 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
16022                 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
16023               break;
16024
16025             case DFmode:
16026               cmp = (flag_finite_math_only && !flag_trapping_math)
16027                 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
16028                 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
16029               break;
16030
16031             case TFmode:
16032               cmp = (flag_finite_math_only && !flag_trapping_math)
16033                 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
16034                 : gen_cmptfeq_gpr (compare_result2, op0, op1);
16035               break;
16036
16037             default:
16038               gcc_unreachable ();
16039             }
16040           emit_insn (cmp);
16041
16042           /* OR them together.  */
16043           or_result = gen_reg_rtx (CCFPmode);
16044           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
16045                                            compare_result2);
16046           compare_result = or_result;
16047           code = EQ;
16048         }
16049       else
16050         {
16051           if (code == NE || code == LTGT)
16052             code = NE;
16053           else
16054             code = EQ;
16055         }
16056
16057       emit_insn (cmp);
16058     }
16059   else
16060     {
16061       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
16062          CLOBBERs to match cmptf_internal2 pattern.  */
16063       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
16064           && GET_MODE (op0) == TFmode
16065           && !TARGET_IEEEQUAD
16066           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
16067         emit_insn (gen_rtx_PARALLEL (VOIDmode,
16068           gen_rtvec (10,
16069                      gen_rtx_SET (VOIDmode,
16070                                   compare_result,
16071                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
16072                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16073                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16074                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16075                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16076                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16077                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16078                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16079                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16080                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
16081       else if (GET_CODE (op1) == UNSPEC
16082                && XINT (op1, 1) == UNSPEC_SP_TEST)
16083         {
16084           rtx op1b = XVECEXP (op1, 0, 0);
16085           comp_mode = CCEQmode;
16086           compare_result = gen_reg_rtx (CCEQmode);
16087           if (TARGET_64BIT)
16088             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
16089           else
16090             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
16091         }
16092       else
16093         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
16094                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
16095     }
16096
16097   /* Some kinds of FP comparisons need an OR operation;
16098      under flag_finite_math_only we don't bother.  */
16099   if (FLOAT_MODE_P (mode)
16100       && !flag_finite_math_only
16101       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
16102       && (code == LE || code == GE
16103           || code == UNEQ || code == LTGT
16104           || code == UNGT || code == UNLT))
16105     {
16106       enum rtx_code or1, or2;
16107       rtx or1_rtx, or2_rtx, compare2_rtx;
16108       rtx or_result = gen_reg_rtx (CCEQmode);
16109
16110       switch (code)
16111         {
16112         case LE: or1 = LT;  or2 = EQ;  break;
16113         case GE: or1 = GT;  or2 = EQ;  break;
16114         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
16115         case LTGT: or1 = LT;  or2 = GT;  break;
16116         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
16117         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
16118         default:  gcc_unreachable ();
16119         }
16120       validate_condition_mode (or1, comp_mode);
16121       validate_condition_mode (or2, comp_mode);
16122       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
16123       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
16124       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
16125                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
16126                                       const_true_rtx);
16127       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
16128
16129       compare_result = or_result;
16130       code = EQ;
16131     }
16132
16133   validate_condition_mode (code, GET_MODE (compare_result));
16134
16135   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
16136 }
16137
16138
16139 /* Emit the RTL for an sISEL pattern.  */
16140
16141 void
16142 rs6000_emit_sISEL (enum machine_mode mode ATTRIBUTE_UNUSED, rtx operands[])
16143 {
16144   rs6000_emit_int_cmove (operands[0], operands[1], const1_rtx, const0_rtx);
16145 }
16146
16147 void
16148 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
16149 {
16150   rtx condition_rtx;
16151   enum machine_mode op_mode;
16152   enum rtx_code cond_code;
16153   rtx result = operands[0];
16154
16155   if (TARGET_ISEL && (mode == SImode || mode == DImode))
16156     {
16157       rs6000_emit_sISEL (mode, operands);
16158       return;
16159     }
16160
16161   condition_rtx = rs6000_generate_compare (operands[1], mode);
16162   cond_code = GET_CODE (condition_rtx);
16163
16164   if (FLOAT_MODE_P (mode)
16165       && !TARGET_FPRS && TARGET_HARD_FLOAT)
16166     {
16167       rtx t;
16168
16169       PUT_MODE (condition_rtx, SImode);
16170       t = XEXP (condition_rtx, 0);
16171
16172       gcc_assert (cond_code == NE || cond_code == EQ);
16173
16174       if (cond_code == NE)
16175         emit_insn (gen_e500_flip_gt_bit (t, t));
16176
16177       emit_insn (gen_move_from_CR_gt_bit (result, t));
16178       return;
16179     }
16180
16181   if (cond_code == NE
16182       || cond_code == GE || cond_code == LE
16183       || cond_code == GEU || cond_code == LEU
16184       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
16185     {
16186       rtx not_result = gen_reg_rtx (CCEQmode);
16187       rtx not_op, rev_cond_rtx;
16188       enum machine_mode cc_mode;
16189
16190       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
16191
16192       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
16193                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
16194       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
16195       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
16196       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
16197     }
16198
16199   op_mode = GET_MODE (XEXP (operands[1], 0));
16200   if (op_mode == VOIDmode)
16201     op_mode = GET_MODE (XEXP (operands[1], 1));
16202
16203   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
16204     {
16205       PUT_MODE (condition_rtx, DImode);
16206       convert_move (result, condition_rtx, 0);
16207     }
16208   else
16209     {
16210       PUT_MODE (condition_rtx, SImode);
16211       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
16212     }
16213 }
16214
16215 /* Emit a branch of kind CODE to location LOC.  */
16216
16217 void
16218 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
16219 {
16220   rtx condition_rtx, loc_ref;
16221
16222   condition_rtx = rs6000_generate_compare (operands[0], mode);
16223   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
16224   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
16225                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
16226                                                      loc_ref, pc_rtx)));
16227 }
16228
16229 /* Return the string to output a conditional branch to LABEL, which is
16230    the operand number of the label, or -1 if the branch is really a
16231    conditional return.
16232
16233    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
16234    condition code register and its mode specifies what kind of
16235    comparison we made.
16236
16237    REVERSED is nonzero if we should reverse the sense of the comparison.
16238
16239    INSN is the insn.  */
16240
16241 char *
16242 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
16243 {
16244   static char string[64];
16245   enum rtx_code code = GET_CODE (op);
16246   rtx cc_reg = XEXP (op, 0);
16247   enum machine_mode mode = GET_MODE (cc_reg);
16248   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
16249   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
16250   int really_reversed = reversed ^ need_longbranch;
16251   char *s = string;
16252   const char *ccode;
16253   const char *pred;
16254   rtx note;
16255
16256   validate_condition_mode (code, mode);
16257
16258   /* Work out which way this really branches.  We could use
16259      reverse_condition_maybe_unordered here always but this
16260      makes the resulting assembler clearer.  */
16261   if (really_reversed)
16262     {
16263       /* Reversal of FP compares takes care -- an ordered compare
16264          becomes an unordered compare and vice versa.  */
16265       if (mode == CCFPmode)
16266         code = reverse_condition_maybe_unordered (code);
16267       else
16268         code = reverse_condition (code);
16269     }
16270
16271   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
16272     {
16273       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
16274          to the GT bit.  */
16275       switch (code)
16276         {
16277         case EQ:
16278           /* Opposite of GT.  */
16279           code = GT;
16280           break;
16281
16282         case NE:
16283           code = UNLE;
16284           break;
16285
16286         default:
16287           gcc_unreachable ();
16288         }
16289     }
16290
16291   switch (code)
16292     {
16293       /* Not all of these are actually distinct opcodes, but
16294          we distinguish them for clarity of the resulting assembler.  */
16295     case NE: case LTGT:
16296       ccode = "ne"; break;
16297     case EQ: case UNEQ:
16298       ccode = "eq"; break;
16299     case GE: case GEU:
16300       ccode = "ge"; break;
16301     case GT: case GTU: case UNGT:
16302       ccode = "gt"; break;
16303     case LE: case LEU:
16304       ccode = "le"; break;
16305     case LT: case LTU: case UNLT:
16306       ccode = "lt"; break;
16307     case UNORDERED: ccode = "un"; break;
16308     case ORDERED: ccode = "nu"; break;
16309     case UNGE: ccode = "nl"; break;
16310     case UNLE: ccode = "ng"; break;
16311     default:
16312       gcc_unreachable ();
16313     }
16314
16315   /* Maybe we have a guess as to how likely the branch is.
16316      The old mnemonics don't have a way to specify this information.  */
16317   pred = "";
16318   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
16319   if (note != NULL_RTX)
16320     {
16321       /* PROB is the difference from 50%.  */
16322       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
16323
16324       /* Only hint for highly probable/improbable branches on newer
16325          cpus as static prediction overrides processor dynamic
16326          prediction.  For older cpus we may as well always hint, but
16327          assume not taken for branches that are very close to 50% as a
16328          mispredicted taken branch is more expensive than a
16329          mispredicted not-taken branch.  */
16330       if (rs6000_always_hint
16331           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
16332               && br_prob_note_reliable_p (note)))
16333         {
16334           if (abs (prob) > REG_BR_PROB_BASE / 20
16335               && ((prob > 0) ^ need_longbranch))
16336             pred = "+";
16337           else
16338             pred = "-";
16339         }
16340     }
16341
16342   if (label == NULL)
16343     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
16344   else
16345     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
16346
16347   /* We need to escape any '%' characters in the reg_names string.
16348      Assume they'd only be the first character....  */
16349   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
16350     *s++ = '%';
16351   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
16352
16353   if (label != NULL)
16354     {
16355       /* If the branch distance was too far, we may have to use an
16356          unconditional branch to go the distance.  */
16357       if (need_longbranch)
16358         s += sprintf (s, ",$+8\n\tb %s", label);
16359       else
16360         s += sprintf (s, ",%s", label);
16361     }
16362
16363   return string;
16364 }
16365
16366 /* Return the string to flip the GT bit on a CR.  */
16367 char *
16368 output_e500_flip_gt_bit (rtx dst, rtx src)
16369 {
16370   static char string[64];
16371   int a, b;
16372
16373   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
16374               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
16375
16376   /* GT bit.  */
16377   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
16378   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
16379
16380   sprintf (string, "crnot %d,%d", a, b);
16381   return string;
16382 }
16383
16384 /* Return insn for VSX or Altivec comparisons.  */
16385
16386 static rtx
16387 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
16388 {
16389   rtx mask;
16390   enum machine_mode mode = GET_MODE (op0);
16391
16392   switch (code)
16393     {
16394     default:
16395       break;
16396
16397     case GE:
16398       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
16399         return NULL_RTX;
16400
16401     case EQ:
16402     case GT:
16403     case GTU:
16404       mask = gen_reg_rtx (mode);
16405       emit_insn (gen_rtx_SET (VOIDmode,
16406                               mask,
16407                               gen_rtx_fmt_ee (code, mode, op0, op1)));
16408       return mask;
16409     }
16410
16411   return NULL_RTX;
16412 }
16413
16414 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
16415    DMODE is expected destination mode. This is a recursive function.  */
16416
16417 static rtx
16418 rs6000_emit_vector_compare (enum rtx_code rcode,
16419                             rtx op0, rtx op1,
16420                             enum machine_mode dmode)
16421 {
16422   rtx mask;
16423   bool swap_operands = false;
16424   bool try_again = false;
16425
16426   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
16427   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
16428
16429   /* See if the comparison works as is.  */
16430   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16431   if (mask)
16432     return mask;
16433
16434   switch (rcode)
16435     {
16436     case LT:
16437       rcode = GT;
16438       swap_operands = true;
16439       try_again = true;
16440       break;
16441     case LTU:
16442       rcode = GTU;
16443       swap_operands = true;
16444       try_again = true;
16445       break;
16446     case NE:
16447     case UNLE:
16448     case UNLT:
16449     case UNGE:
16450     case UNGT:
16451       /* Invert condition and try again.
16452          e.g., A != B becomes ~(A==B).  */
16453       {
16454         enum rtx_code rev_code;
16455         enum insn_code nor_code;
16456         rtx mask2;
16457
16458         rev_code = reverse_condition_maybe_unordered (rcode);
16459         if (rev_code == UNKNOWN)
16460           return NULL_RTX;
16461
16462         nor_code = optab_handler (one_cmpl_optab, dmode);
16463         if (nor_code == CODE_FOR_nothing)
16464           return NULL_RTX;
16465
16466         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
16467         if (!mask2)
16468           return NULL_RTX;
16469
16470         mask = gen_reg_rtx (dmode);
16471         emit_insn (GEN_FCN (nor_code) (mask, mask2));
16472         return mask;
16473       }
16474       break;
16475     case GE:
16476     case GEU:
16477     case LE:
16478     case LEU:
16479       /* Try GT/GTU/LT/LTU OR EQ */
16480       {
16481         rtx c_rtx, eq_rtx;
16482         enum insn_code ior_code;
16483         enum rtx_code new_code;
16484
16485         switch (rcode)
16486           {
16487           case  GE:
16488             new_code = GT;
16489             break;
16490
16491           case GEU:
16492             new_code = GTU;
16493             break;
16494
16495           case LE:
16496             new_code = LT;
16497             break;
16498
16499           case LEU:
16500             new_code = LTU;
16501             break;
16502
16503           default:
16504             gcc_unreachable ();
16505           }
16506
16507         ior_code = optab_handler (ior_optab, dmode);
16508         if (ior_code == CODE_FOR_nothing)
16509           return NULL_RTX;
16510
16511         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
16512         if (!c_rtx)
16513           return NULL_RTX;
16514
16515         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
16516         if (!eq_rtx)
16517           return NULL_RTX;
16518
16519         mask = gen_reg_rtx (dmode);
16520         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
16521         return mask;
16522       }
16523       break;
16524     default:
16525       return NULL_RTX;
16526     }
16527
16528   if (try_again)
16529     {
16530       if (swap_operands)
16531         {
16532           rtx tmp;
16533           tmp = op0;
16534           op0 = op1;
16535           op1 = tmp;
16536         }
16537
16538       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16539       if (mask)
16540         return mask;
16541     }
16542
16543   /* You only get two chances.  */
16544   return NULL_RTX;
16545 }
16546
16547 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
16548    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
16549    operands for the relation operation COND.  */
16550
16551 int
16552 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
16553                               rtx cond, rtx cc_op0, rtx cc_op1)
16554 {
16555   enum machine_mode dest_mode = GET_MODE (dest);
16556   enum rtx_code rcode = GET_CODE (cond);
16557   enum machine_mode cc_mode = CCmode;
16558   rtx mask;
16559   rtx cond2;
16560   rtx tmp;
16561   bool invert_move = false;
16562
16563   if (VECTOR_UNIT_NONE_P (dest_mode))
16564     return 0;
16565
16566   switch (rcode)
16567     {
16568       /* Swap operands if we can, and fall back to doing the operation as
16569          specified, and doing a NOR to invert the test.  */
16570     case NE:
16571     case UNLE:
16572     case UNLT:
16573     case UNGE:
16574     case UNGT:
16575       /* Invert condition and try again.
16576          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
16577       invert_move = true;
16578       rcode = reverse_condition_maybe_unordered (rcode);
16579       if (rcode == UNKNOWN)
16580         return 0;
16581       break;
16582
16583       /* Mark unsigned tests with CCUNSmode.  */
16584     case GTU:
16585     case GEU:
16586     case LTU:
16587     case LEU:
16588       cc_mode = CCUNSmode;
16589       break;
16590
16591     default:
16592       break;
16593     }
16594
16595   /* Get the vector mask for the given relational operations.  */
16596   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
16597
16598   if (!mask)
16599     return 0;
16600
16601   if (invert_move)
16602     {
16603       tmp = op_true;
16604       op_true = op_false;
16605       op_false = tmp;
16606     }
16607
16608   cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, const0_rtx);
16609   emit_insn (gen_rtx_SET (VOIDmode,
16610                           dest,
16611                           gen_rtx_IF_THEN_ELSE (dest_mode,
16612                                                 cond2,
16613                                                 op_true,
16614                                                 op_false)));
16615   return 1;
16616 }
16617
16618 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
16619    operands of the last comparison is nonzero/true, FALSE_COND if it
16620    is zero/false.  Return 0 if the hardware has no such operation.  */
16621
16622 int
16623 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
16624 {
16625   enum rtx_code code = GET_CODE (op);
16626   rtx op0 = XEXP (op, 0);
16627   rtx op1 = XEXP (op, 1);
16628   REAL_VALUE_TYPE c1;
16629   enum machine_mode compare_mode = GET_MODE (op0);
16630   enum machine_mode result_mode = GET_MODE (dest);
16631   rtx temp;
16632   bool is_against_zero;
16633
16634   /* These modes should always match.  */
16635   if (GET_MODE (op1) != compare_mode
16636       /* In the isel case however, we can use a compare immediate, so
16637          op1 may be a small constant.  */
16638       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
16639     return 0;
16640   if (GET_MODE (true_cond) != result_mode)
16641     return 0;
16642   if (GET_MODE (false_cond) != result_mode)
16643     return 0;
16644
16645   /* First, work out if the hardware can do this at all, or
16646      if it's too slow....  */
16647   if (!FLOAT_MODE_P (compare_mode))
16648     {
16649       if (TARGET_ISEL)
16650         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
16651       return 0;
16652     }
16653   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
16654            && SCALAR_FLOAT_MODE_P (compare_mode))
16655     return 0;
16656
16657   is_against_zero = op1 == CONST0_RTX (compare_mode);
16658
16659   /* A floating-point subtract might overflow, underflow, or produce
16660      an inexact result, thus changing the floating-point flags, so it
16661      can't be generated if we care about that.  It's safe if one side
16662      of the construct is zero, since then no subtract will be
16663      generated.  */
16664   if (SCALAR_FLOAT_MODE_P (compare_mode)
16665       && flag_trapping_math && ! is_against_zero)
16666     return 0;
16667
16668   /* Eliminate half of the comparisons by switching operands, this
16669      makes the remaining code simpler.  */
16670   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
16671       || code == LTGT || code == LT || code == UNLE)
16672     {
16673       code = reverse_condition_maybe_unordered (code);
16674       temp = true_cond;
16675       true_cond = false_cond;
16676       false_cond = temp;
16677     }
16678
16679   /* UNEQ and LTGT take four instructions for a comparison with zero,
16680      it'll probably be faster to use a branch here too.  */
16681   if (code == UNEQ && HONOR_NANS (compare_mode))
16682     return 0;
16683
16684   if (GET_CODE (op1) == CONST_DOUBLE)
16685     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
16686
16687   /* We're going to try to implement comparisons by performing
16688      a subtract, then comparing against zero.  Unfortunately,
16689      Inf - Inf is NaN which is not zero, and so if we don't
16690      know that the operand is finite and the comparison
16691      would treat EQ different to UNORDERED, we can't do it.  */
16692   if (HONOR_INFINITIES (compare_mode)
16693       && code != GT && code != UNGE
16694       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
16695       /* Constructs of the form (a OP b ? a : b) are safe.  */
16696       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
16697           || (! rtx_equal_p (op0, true_cond)
16698               && ! rtx_equal_p (op1, true_cond))))
16699     return 0;
16700
16701   /* At this point we know we can use fsel.  */
16702
16703   /* Reduce the comparison to a comparison against zero.  */
16704   if (! is_against_zero)
16705     {
16706       temp = gen_reg_rtx (compare_mode);
16707       emit_insn (gen_rtx_SET (VOIDmode, temp,
16708                               gen_rtx_MINUS (compare_mode, op0, op1)));
16709       op0 = temp;
16710       op1 = CONST0_RTX (compare_mode);
16711     }
16712
16713   /* If we don't care about NaNs we can reduce some of the comparisons
16714      down to faster ones.  */
16715   if (! HONOR_NANS (compare_mode))
16716     switch (code)
16717       {
16718       case GT:
16719         code = LE;
16720         temp = true_cond;
16721         true_cond = false_cond;
16722         false_cond = temp;
16723         break;
16724       case UNGE:
16725         code = GE;
16726         break;
16727       case UNEQ:
16728         code = EQ;
16729         break;
16730       default:
16731         break;
16732       }
16733
16734   /* Now, reduce everything down to a GE.  */
16735   switch (code)
16736     {
16737     case GE:
16738       break;
16739
16740     case LE:
16741       temp = gen_reg_rtx (compare_mode);
16742       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
16743       op0 = temp;
16744       break;
16745
16746     case ORDERED:
16747       temp = gen_reg_rtx (compare_mode);
16748       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
16749       op0 = temp;
16750       break;
16751
16752     case EQ:
16753       temp = gen_reg_rtx (compare_mode);
16754       emit_insn (gen_rtx_SET (VOIDmode, temp,
16755                               gen_rtx_NEG (compare_mode,
16756                                            gen_rtx_ABS (compare_mode, op0))));
16757       op0 = temp;
16758       break;
16759
16760     case UNGE:
16761       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
16762       temp = gen_reg_rtx (result_mode);
16763       emit_insn (gen_rtx_SET (VOIDmode, temp,
16764                               gen_rtx_IF_THEN_ELSE (result_mode,
16765                                                     gen_rtx_GE (VOIDmode,
16766                                                                 op0, op1),
16767                                                     true_cond, false_cond)));
16768       false_cond = true_cond;
16769       true_cond = temp;
16770
16771       temp = gen_reg_rtx (compare_mode);
16772       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
16773       op0 = temp;
16774       break;
16775
16776     case GT:
16777       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
16778       temp = gen_reg_rtx (result_mode);
16779       emit_insn (gen_rtx_SET (VOIDmode, temp,
16780                               gen_rtx_IF_THEN_ELSE (result_mode,
16781                                                     gen_rtx_GE (VOIDmode,
16782                                                                 op0, op1),
16783                                                     true_cond, false_cond)));
16784       true_cond = false_cond;
16785       false_cond = temp;
16786
16787       temp = gen_reg_rtx (compare_mode);
16788       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
16789       op0 = temp;
16790       break;
16791
16792     default:
16793       gcc_unreachable ();
16794     }
16795
16796   emit_insn (gen_rtx_SET (VOIDmode, dest,
16797                           gen_rtx_IF_THEN_ELSE (result_mode,
16798                                                 gen_rtx_GE (VOIDmode,
16799                                                             op0, op1),
16800                                                 true_cond, false_cond)));
16801   return 1;
16802 }
16803
16804 /* Same as above, but for ints (isel).  */
16805
16806 static int
16807 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
16808 {
16809   rtx condition_rtx, cr;
16810   enum machine_mode mode = GET_MODE (dest);
16811   enum rtx_code cond_code;
16812   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
16813   bool signedp;
16814
16815   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
16816     return 0;
16817
16818   /* We still have to do the compare, because isel doesn't do a
16819      compare, it just looks at the CRx bits set by a previous compare
16820      instruction.  */
16821   condition_rtx = rs6000_generate_compare (op, mode);
16822   cond_code = GET_CODE (condition_rtx);
16823   cr = XEXP (condition_rtx, 0);
16824   signedp = GET_MODE (cr) == CCmode;
16825
16826   isel_func = (mode == SImode
16827                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
16828                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
16829
16830   switch (cond_code)
16831     {
16832     case LT: case GT: case LTU: case GTU: case EQ:
16833       /* isel handles these directly.  */
16834       break;
16835
16836     default:
16837       /* We need to swap the sense of the comparison.  */
16838       {
16839         rtx t = true_cond;
16840         true_cond = false_cond;
16841         false_cond = t;
16842         PUT_CODE (condition_rtx, reverse_condition (cond_code));
16843       }
16844       break;
16845     }
16846
16847   false_cond = force_reg (mode, false_cond);
16848   if (true_cond != const0_rtx)
16849     true_cond = force_reg (mode, true_cond);
16850
16851   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
16852
16853   return 1;
16854 }
16855
16856 const char *
16857 output_isel (rtx *operands)
16858 {
16859   enum rtx_code code;
16860
16861   code = GET_CODE (operands[1]);
16862
16863   gcc_assert (!(code == GE || code == GEU || code == LE || code == LEU || code == NE));
16864
16865   return "isel %0,%2,%3,%j1";
16866 }
16867
16868 void
16869 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
16870 {
16871   enum machine_mode mode = GET_MODE (op0);
16872   enum rtx_code c;
16873   rtx target;
16874
16875   /* VSX/altivec have direct min/max insns.  */
16876   if ((code == SMAX || code == SMIN) && VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode))
16877     {
16878       emit_insn (gen_rtx_SET (VOIDmode,
16879                               dest,
16880                               gen_rtx_fmt_ee (code, mode, op0, op1)));
16881       return;
16882     }
16883
16884   if (code == SMAX || code == SMIN)
16885     c = GE;
16886   else
16887     c = GEU;
16888
16889   if (code == SMAX || code == UMAX)
16890     target = emit_conditional_move (dest, c, op0, op1, mode,
16891                                     op0, op1, mode, 0);
16892   else
16893     target = emit_conditional_move (dest, c, op0, op1, mode,
16894                                     op1, op0, mode, 0);
16895   gcc_assert (target);
16896   if (target != dest)
16897     emit_move_insn (dest, target);
16898 }
16899
16900 /* Emit instructions to perform a load-reserved/store-conditional operation.
16901    The operation performed is an atomic
16902    (set M (CODE:MODE M OP))
16903    If not NULL, BEFORE is atomically set to M before the operation, and
16904    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
16905    If SYNC_P then a memory barrier is emitted before the operation.
16906    Either OP or M may be wrapped in a NOT operation.  */
16907
16908 void
16909 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
16910                   rtx m, rtx op, rtx before_param, rtx after_param,
16911                   bool sync_p)
16912 {
16913   enum machine_mode used_mode;
16914   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
16915   rtx used_m;
16916   rtvec vec;
16917   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
16918   rtx shift = NULL_RTX;
16919
16920   if (sync_p)
16921     emit_insn (gen_lwsync ());
16922
16923     used_m = m;
16924
16925   /* If this is smaller than SImode, we'll have to use SImode with
16926      adjustments.  */
16927   if (mode == QImode || mode == HImode)
16928     {
16929       rtx newop, oldop;
16930
16931       if (MEM_ALIGN (used_m) >= 32)
16932         {
16933           int ishift = 0;
16934           if (BYTES_BIG_ENDIAN)
16935             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
16936
16937           shift = GEN_INT (ishift);
16938           used_m = change_address (used_m, SImode, 0);
16939         }
16940       else
16941         {
16942           rtx addrSI, aligned_addr;
16943           int shift_mask = mode == QImode ? 0x18 : 0x10;
16944
16945           addrSI = gen_lowpart_common (SImode,
16946                                        force_reg (Pmode, XEXP (used_m, 0)));
16947           addrSI = force_reg (SImode, addrSI);
16948           shift = gen_reg_rtx (SImode);
16949
16950           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
16951                                  GEN_INT (shift_mask)));
16952           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
16953
16954           aligned_addr = expand_binop (Pmode, and_optab,
16955                                        XEXP (used_m, 0),
16956                                        GEN_INT (-4), NULL_RTX,
16957                                        1, OPTAB_LIB_WIDEN);
16958           used_m = change_address (used_m, SImode, aligned_addr);
16959           set_mem_align (used_m, 32);
16960         }
16961       /* It's safe to keep the old alias set of USED_M, because
16962          the operation is atomic and only affects the original
16963          USED_M.  */
16964       m = used_m;
16965
16966       if (GET_CODE (op) == NOT)
16967         {
16968           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
16969           oldop = gen_rtx_NOT (SImode, oldop);
16970         }
16971       else
16972         oldop = lowpart_subreg (SImode, op, mode);
16973
16974       switch (code)
16975         {
16976         case IOR:
16977         case XOR:
16978           newop = expand_binop (SImode, and_optab,
16979                                 oldop, GEN_INT (imask), NULL_RTX,
16980                                 1, OPTAB_LIB_WIDEN);
16981           emit_insn (gen_ashlsi3 (newop, newop, shift));
16982           break;
16983
16984         case NOT: /* NAND */
16985           newop = expand_binop (SImode, ior_optab,
16986                                 oldop, GEN_INT (~imask), NULL_RTX,
16987                                 1, OPTAB_LIB_WIDEN);
16988           emit_insn (gen_rotlsi3 (newop, newop, shift));
16989           break;
16990
16991         case AND:
16992           newop = expand_binop (SImode, ior_optab,
16993                                 oldop, GEN_INT (~imask), NULL_RTX,
16994                                 1, OPTAB_LIB_WIDEN);
16995           emit_insn (gen_rotlsi3 (newop, newop, shift));
16996           break;
16997
16998         case PLUS:
16999         case MINUS:
17000           {
17001             rtx mask;
17002
17003             newop = expand_binop (SImode, and_optab,
17004                                   oldop, GEN_INT (imask), NULL_RTX,
17005                                   1, OPTAB_LIB_WIDEN);
17006             emit_insn (gen_ashlsi3 (newop, newop, shift));
17007
17008             mask = gen_reg_rtx (SImode);
17009             emit_move_insn (mask, GEN_INT (imask));
17010             emit_insn (gen_ashlsi3 (mask, mask, shift));
17011
17012             if (code == PLUS)
17013               newop = gen_rtx_PLUS (SImode, m, newop);
17014             else
17015               newop = gen_rtx_MINUS (SImode, m, newop);
17016             newop = gen_rtx_AND (SImode, newop, mask);
17017             newop = gen_rtx_IOR (SImode, newop,
17018                                  gen_rtx_AND (SImode,
17019                                               gen_rtx_NOT (SImode, mask),
17020                                               m));
17021             break;
17022           }
17023
17024         default:
17025           gcc_unreachable ();
17026         }
17027
17028       op = newop;
17029       used_mode = SImode;
17030       before = gen_reg_rtx (used_mode);
17031       after = gen_reg_rtx (used_mode);
17032     }
17033   else
17034     {
17035       used_mode = mode;
17036       before = before_param;
17037       after = after_param;
17038
17039       if (before == NULL_RTX)
17040         before = gen_reg_rtx (used_mode);
17041       if (after == NULL_RTX)
17042         after = gen_reg_rtx (used_mode);
17043     }
17044
17045   if ((code == PLUS || code == MINUS)
17046       && used_mode != mode)
17047     the_op = op;  /* Computed above.  */
17048   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
17049     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
17050   else if (code == NOT)
17051     the_op = gen_rtx_fmt_ee (IOR, used_mode,
17052                              gen_rtx_NOT (used_mode, m),
17053                              gen_rtx_NOT (used_mode, op));
17054   else
17055     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
17056
17057   set_after = gen_rtx_SET (VOIDmode, after, the_op);
17058   set_before = gen_rtx_SET (VOIDmode, before, used_m);
17059   set_atomic = gen_rtx_SET (VOIDmode, used_m,
17060                             gen_rtx_UNSPEC (used_mode,
17061                                             gen_rtvec (1, the_op),
17062                                             UNSPEC_SYNC_OP));
17063   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
17064
17065   if ((code == PLUS || code == MINUS) && used_mode != mode)
17066     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
17067                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
17068   else
17069     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
17070   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
17071
17072   /* Shift and mask the return values properly.  */
17073   if (used_mode != mode && before_param)
17074     {
17075       emit_insn (gen_lshrsi3 (before, before, shift));
17076       convert_move (before_param, before, 1);
17077     }
17078
17079   if (used_mode != mode && after_param)
17080     {
17081       emit_insn (gen_lshrsi3 (after, after, shift));
17082       convert_move (after_param, after, 1);
17083     }
17084
17085   /* The previous sequence will end with a branch that's dependent on
17086      the conditional store, so placing an isync will ensure that no
17087      other instructions (especially, no load or store instructions)
17088      can start before the atomic operation completes.  */
17089   if (sync_p)
17090     emit_insn (gen_isync ());
17091 }
17092
17093 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
17094    COND is true.  Mark the jump as unlikely to be taken.  */
17095
17096 static void
17097 emit_unlikely_jump (rtx cond, rtx label)
17098 {
17099   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
17100   rtx x;
17101
17102   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
17103   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
17104   add_reg_note (x, REG_BR_PROB, very_unlikely);
17105 }
17106
17107 /* A subroutine of the atomic operation splitters.  Emit a load-locked
17108    instruction in MODE.  */
17109
17110 static void
17111 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
17112 {
17113   rtx (*fn) (rtx, rtx) = NULL;
17114   if (mode == SImode)
17115     fn = gen_load_locked_si;
17116   else if (mode == DImode)
17117     fn = gen_load_locked_di;
17118   emit_insn (fn (reg, mem));
17119 }
17120
17121 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
17122    instruction in MODE.  */
17123
17124 static void
17125 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
17126 {
17127   rtx (*fn) (rtx, rtx, rtx) = NULL;
17128   if (mode == SImode)
17129     fn = gen_store_conditional_si;
17130   else if (mode == DImode)
17131     fn = gen_store_conditional_di;
17132
17133   /* Emit sync before stwcx. to address PPC405 Erratum.  */
17134   if (PPC405_ERRATUM77)
17135     emit_insn (gen_memory_barrier ());
17136
17137   emit_insn (fn (res, mem, val));
17138 }
17139
17140 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
17141    to perform.  MEM is the memory on which to operate.  VAL is the second
17142    operand of the binary operator.  BEFORE and AFTER are optional locations to
17143    return the value of MEM either before of after the operation.  SCRATCH is
17144    a scratch register.  */
17145
17146 void
17147 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
17148                        rtx before, rtx after, rtx scratch)
17149 {
17150   enum machine_mode mode = GET_MODE (mem);
17151   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17152
17153   emit_insn (gen_lwsync ());
17154
17155   label = gen_label_rtx ();
17156   emit_label (label);
17157   label = gen_rtx_LABEL_REF (VOIDmode, label);
17158
17159   if (before == NULL_RTX)
17160     before = scratch;
17161   emit_load_locked (mode, before, mem);
17162
17163   if (code == NOT)
17164     x = gen_rtx_IOR (mode,
17165                      gen_rtx_NOT (mode, before),
17166                      gen_rtx_NOT (mode, val));
17167   else if (code == AND)
17168     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
17169   else
17170     x = gen_rtx_fmt_ee (code, mode, before, val);
17171
17172   if (after != NULL_RTX)
17173     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
17174   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17175
17176   emit_store_conditional (mode, cond, mem, scratch);
17177
17178   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17179   emit_unlikely_jump (x, label);
17180
17181   emit_insn (gen_isync ());
17182 }
17183
17184 /* Expand an atomic compare and swap operation.  MEM is the memory on which
17185    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
17186    value to be stored.  SCRATCH is a scratch GPR.  */
17187
17188 void
17189 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
17190                                rtx scratch)
17191 {
17192   enum machine_mode mode = GET_MODE (mem);
17193   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17194
17195   emit_insn (gen_lwsync ());
17196
17197   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17198   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17199   emit_label (XEXP (label1, 0));
17200
17201   emit_load_locked (mode, retval, mem);
17202
17203   x = gen_rtx_COMPARE (CCmode, retval, oldval);
17204   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17205
17206   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17207   emit_unlikely_jump (x, label2);
17208
17209   emit_move_insn (scratch, newval);
17210   emit_store_conditional (mode, cond, mem, scratch);
17211
17212   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17213   emit_unlikely_jump (x, label1);
17214
17215   emit_insn (gen_isync ());
17216   emit_label (XEXP (label2, 0));
17217 }
17218
17219 /* Expand an atomic test and set operation.  MEM is the memory on which
17220    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
17221
17222 void
17223 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
17224 {
17225   enum machine_mode mode = GET_MODE (mem);
17226   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17227
17228   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17229   emit_label (XEXP (label, 0));
17230
17231   emit_load_locked (mode, retval, mem);
17232   emit_move_insn (scratch, val);
17233   emit_store_conditional (mode, cond, mem, scratch);
17234
17235   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17236   emit_unlikely_jump (x, label);
17237
17238   emit_insn (gen_isync ());
17239 }
17240
17241 void
17242 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
17243 {
17244   enum machine_mode mode = GET_MODE (mem);
17245   rtx addrSI, align, wdst, shift, mask;
17246   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
17247   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17248
17249   /* Shift amount for subword relative to aligned word.  */
17250   addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
17251   addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
17252   shift = gen_reg_rtx (SImode);
17253   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17254                          GEN_INT (shift_mask)));
17255   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17256
17257   /* Shift and mask old value into position within word.  */
17258   oldval = convert_modes (SImode, mode, oldval, 1);
17259   oldval = expand_binop (SImode, and_optab,
17260                          oldval, GEN_INT (imask), NULL_RTX,
17261                          1, OPTAB_LIB_WIDEN);
17262   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
17263
17264   /* Shift and mask new value into position within word.  */
17265   newval = convert_modes (SImode, mode, newval, 1);
17266   newval = expand_binop (SImode, and_optab,
17267                          newval, GEN_INT (imask), NULL_RTX,
17268                          1, OPTAB_LIB_WIDEN);
17269   emit_insn (gen_ashlsi3 (newval, newval, shift));
17270
17271   /* Mask for insertion.  */
17272   mask = gen_reg_rtx (SImode);
17273   emit_move_insn (mask, GEN_INT (imask));
17274   emit_insn (gen_ashlsi3 (mask, mask, shift));
17275
17276   /* Address of aligned word containing subword.  */
17277   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
17278                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
17279   mem = change_address (mem, SImode, align);
17280   set_mem_align (mem, 32);
17281   MEM_VOLATILE_P (mem) = 1;
17282
17283   wdst = gen_reg_rtx (SImode);
17284   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
17285                                                     oldval, newval, mem));
17286
17287   /* Shift the result back.  */
17288   emit_insn (gen_lshrsi3 (wdst, wdst, shift));
17289
17290   emit_move_insn (dst, gen_lowpart (mode, wdst));
17291 }
17292
17293 void
17294 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
17295                                   rtx oldval, rtx newval, rtx mem,
17296                                   rtx scratch)
17297 {
17298   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17299
17300   emit_insn (gen_lwsync ());
17301   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17302   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17303   emit_label (XEXP (label1, 0));
17304
17305   emit_load_locked (SImode, scratch, mem);
17306
17307   /* Mask subword within loaded value for comparison with oldval.
17308      Use UNSPEC_AND to avoid clobber.*/
17309   emit_insn (gen_rtx_SET (SImode, dest,
17310                           gen_rtx_UNSPEC (SImode,
17311                                           gen_rtvec (2, scratch, mask),
17312                                           UNSPEC_AND)));
17313
17314   x = gen_rtx_COMPARE (CCmode, dest, oldval);
17315   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17316
17317   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17318   emit_unlikely_jump (x, label2);
17319
17320   /* Clear subword within loaded value for insertion of new value.  */
17321   emit_insn (gen_rtx_SET (SImode, scratch,
17322                           gen_rtx_AND (SImode,
17323                                        gen_rtx_NOT (SImode, mask), scratch)));
17324   emit_insn (gen_iorsi3 (scratch, scratch, newval));
17325   emit_store_conditional (SImode, cond, mem, scratch);
17326
17327   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17328   emit_unlikely_jump (x, label1);
17329
17330   emit_insn (gen_isync ());
17331   emit_label (XEXP (label2, 0));
17332 }
17333
17334
17335   /* Emit instructions to move SRC to DST.  Called by splitters for
17336    multi-register moves.  It will emit at most one instruction for
17337    each register that is accessed; that is, it won't emit li/lis pairs
17338    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
17339    register.  */
17340
17341 void
17342 rs6000_split_multireg_move (rtx dst, rtx src)
17343 {
17344   /* The register number of the first register being moved.  */
17345   int reg;
17346   /* The mode that is to be moved.  */
17347   enum machine_mode mode;
17348   /* The mode that the move is being done in, and its size.  */
17349   enum machine_mode reg_mode;
17350   int reg_mode_size;
17351   /* The number of registers that will be moved.  */
17352   int nregs;
17353
17354   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
17355   mode = GET_MODE (dst);
17356   nregs = hard_regno_nregs[reg][mode];
17357   if (FP_REGNO_P (reg))
17358     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : 
17359         ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
17360   else if (ALTIVEC_REGNO_P (reg))
17361     reg_mode = V16QImode;
17362   else if (TARGET_E500_DOUBLE && mode == TFmode)
17363     reg_mode = DFmode;
17364   else
17365     reg_mode = word_mode;
17366   reg_mode_size = GET_MODE_SIZE (reg_mode);
17367
17368   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
17369
17370   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
17371     {
17372       /* Move register range backwards, if we might have destructive
17373          overlap.  */
17374       int i;
17375       for (i = nregs - 1; i >= 0; i--)
17376         emit_insn (gen_rtx_SET (VOIDmode,
17377                                 simplify_gen_subreg (reg_mode, dst, mode,
17378                                                      i * reg_mode_size),
17379                                 simplify_gen_subreg (reg_mode, src, mode,
17380                                                      i * reg_mode_size)));
17381     }
17382   else
17383     {
17384       int i;
17385       int j = -1;
17386       bool used_update = false;
17387       rtx restore_basereg = NULL_RTX;
17388
17389       if (MEM_P (src) && INT_REGNO_P (reg))
17390         {
17391           rtx breg;
17392
17393           if (GET_CODE (XEXP (src, 0)) == PRE_INC
17394               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
17395             {
17396               rtx delta_rtx;
17397               breg = XEXP (XEXP (src, 0), 0);
17398               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
17399                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
17400                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
17401               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17402               src = replace_equiv_address (src, breg);
17403             }
17404           else if (! rs6000_offsettable_memref_p (src))
17405             {
17406               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
17407                 {
17408                   rtx basereg = XEXP (XEXP (src, 0), 0);
17409                   if (TARGET_UPDATE)
17410                     {
17411                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
17412                       emit_insn (gen_rtx_SET (VOIDmode, ndst,
17413                                  gen_rtx_MEM (reg_mode, XEXP (src, 0))));
17414                       used_update = true;
17415                     }
17416                   else
17417                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17418                                XEXP (XEXP (src, 0), 1)));
17419                   src = replace_equiv_address (src, basereg);
17420                 }
17421               else
17422                 {
17423                   rtx basereg = gen_rtx_REG (Pmode, reg);
17424                   emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
17425                   src = replace_equiv_address (src, basereg);
17426                 }
17427             }
17428
17429           breg = XEXP (src, 0);
17430           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
17431             breg = XEXP (breg, 0);
17432
17433           /* If the base register we are using to address memory is
17434              also a destination reg, then change that register last.  */
17435           if (REG_P (breg)
17436               && REGNO (breg) >= REGNO (dst)
17437               && REGNO (breg) < REGNO (dst) + nregs)
17438             j = REGNO (breg) - REGNO (dst);
17439         }
17440       else if (MEM_P (dst) && INT_REGNO_P (reg))
17441         {
17442           rtx breg;
17443
17444           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
17445               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
17446             {
17447               rtx delta_rtx;
17448               breg = XEXP (XEXP (dst, 0), 0);
17449               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
17450                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
17451                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
17452
17453               /* We have to update the breg before doing the store.
17454                  Use store with update, if available.  */
17455
17456               if (TARGET_UPDATE)
17457                 {
17458                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17459                   emit_insn (TARGET_32BIT
17460                              ? (TARGET_POWERPC64
17461                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
17462                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
17463                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
17464                   used_update = true;
17465                 }
17466               else
17467                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17468               dst = replace_equiv_address (dst, breg);
17469             }
17470           else if (!rs6000_offsettable_memref_p (dst)
17471                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
17472             {
17473               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
17474                 {
17475                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17476                   if (TARGET_UPDATE)
17477                     {
17478                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17479                       emit_insn (gen_rtx_SET (VOIDmode,
17480                                  gen_rtx_MEM (reg_mode, XEXP (dst, 0)), nsrc));
17481                       used_update = true;
17482                     }
17483                   else
17484                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17485                                XEXP (XEXP (dst, 0), 1)));
17486                   dst = replace_equiv_address (dst, basereg);
17487                 }
17488               else
17489                 {
17490                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17491                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
17492                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
17493                               && REG_P (basereg)
17494                               && REG_P (offsetreg)
17495                               && REGNO (basereg) != REGNO (offsetreg));
17496                   if (REGNO (basereg) == 0)
17497                     {
17498                       rtx tmp = offsetreg;
17499                       offsetreg = basereg;
17500                       basereg = tmp;
17501                     }
17502                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
17503                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
17504                   dst = replace_equiv_address (dst, basereg);
17505                 }
17506             }
17507           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
17508             gcc_assert (rs6000_offsettable_memref_p (dst));
17509         }
17510
17511       for (i = 0; i < nregs; i++)
17512         {
17513           /* Calculate index to next subword.  */
17514           ++j;
17515           if (j == nregs)
17516             j = 0;
17517
17518           /* If compiler already emitted move of first word by
17519              store with update, no need to do anything.  */
17520           if (j == 0 && used_update)
17521             continue;
17522
17523           emit_insn (gen_rtx_SET (VOIDmode,
17524                                   simplify_gen_subreg (reg_mode, dst, mode,
17525                                                        j * reg_mode_size),
17526                                   simplify_gen_subreg (reg_mode, src, mode,
17527                                                        j * reg_mode_size)));
17528         }
17529       if (restore_basereg != NULL_RTX)
17530         emit_insn (restore_basereg);
17531     }
17532 }
17533
17534 \f
17535 /* This page contains routines that are used to determine what the
17536    function prologue and epilogue code will do and write them out.  */
17537
17538 /* Return the first fixed-point register that is required to be
17539    saved. 32 if none.  */
17540
17541 int
17542 first_reg_to_save (void)
17543 {
17544   int first_reg;
17545
17546   /* Find lowest numbered live register.  */
17547   for (first_reg = 13; first_reg <= 31; first_reg++)
17548     if (df_regs_ever_live_p (first_reg)
17549         && (! call_used_regs[first_reg]
17550             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
17551                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
17552                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
17553                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
17554       break;
17555
17556 #if TARGET_MACHO
17557   if (flag_pic
17558       && crtl->uses_pic_offset_table
17559       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
17560     return RS6000_PIC_OFFSET_TABLE_REGNUM;
17561 #endif
17562
17563   return first_reg;
17564 }
17565
17566 /* Similar, for FP regs.  */
17567
17568 int
17569 first_fp_reg_to_save (void)
17570 {
17571   int first_reg;
17572
17573   /* Find lowest numbered live register.  */
17574   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
17575     if (df_regs_ever_live_p (first_reg))
17576       break;
17577
17578   return first_reg;
17579 }
17580
17581 /* Similar, for AltiVec regs.  */
17582
17583 static int
17584 first_altivec_reg_to_save (void)
17585 {
17586   int i;
17587
17588   /* Stack frame remains as is unless we are in AltiVec ABI.  */
17589   if (! TARGET_ALTIVEC_ABI)
17590     return LAST_ALTIVEC_REGNO + 1;
17591
17592   /* On Darwin, the unwind routines are compiled without
17593      TARGET_ALTIVEC, and use save_world to save/restore the
17594      altivec registers when necessary.  */
17595   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17596       && ! TARGET_ALTIVEC)
17597     return FIRST_ALTIVEC_REGNO + 20;
17598
17599   /* Find lowest numbered live register.  */
17600   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
17601     if (df_regs_ever_live_p (i))
17602       break;
17603
17604   return i;
17605 }
17606
17607 /* Return a 32-bit mask of the AltiVec registers we need to set in
17608    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
17609    the 32-bit word is 0.  */
17610
17611 static unsigned int
17612 compute_vrsave_mask (void)
17613 {
17614   unsigned int i, mask = 0;
17615
17616   /* On Darwin, the unwind routines are compiled without
17617      TARGET_ALTIVEC, and use save_world to save/restore the
17618      call-saved altivec registers when necessary.  */
17619   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17620       && ! TARGET_ALTIVEC)
17621     mask |= 0xFFF;
17622
17623   /* First, find out if we use _any_ altivec registers.  */
17624   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
17625     if (df_regs_ever_live_p (i))
17626       mask |= ALTIVEC_REG_BIT (i);
17627
17628   if (mask == 0)
17629     return mask;
17630
17631   /* Next, remove the argument registers from the set.  These must
17632      be in the VRSAVE mask set by the caller, so we don't need to add
17633      them in again.  More importantly, the mask we compute here is
17634      used to generate CLOBBERs in the set_vrsave insn, and we do not
17635      wish the argument registers to die.  */
17636   for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
17637     mask &= ~ALTIVEC_REG_BIT (i);
17638
17639   /* Similarly, remove the return value from the set.  */
17640   {
17641     bool yes = false;
17642     diddle_return_value (is_altivec_return_reg, &yes);
17643     if (yes)
17644       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
17645   }
17646
17647   return mask;
17648 }
17649
17650 /* For a very restricted set of circumstances, we can cut down the
17651    size of prologues/epilogues by calling our own save/restore-the-world
17652    routines.  */
17653
17654 static void
17655 compute_save_world_info (rs6000_stack_t *info_ptr)
17656 {
17657   info_ptr->world_save_p = 1;
17658   info_ptr->world_save_p
17659     = (WORLD_SAVE_P (info_ptr)
17660        && DEFAULT_ABI == ABI_DARWIN
17661        && ! (cfun->calls_setjmp && flag_exceptions)
17662        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
17663        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
17664        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
17665        && info_ptr->cr_save_p);
17666
17667   /* This will not work in conjunction with sibcalls.  Make sure there
17668      are none.  (This check is expensive, but seldom executed.) */
17669   if (WORLD_SAVE_P (info_ptr))
17670     {
17671       rtx insn;
17672       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
17673         if ( GET_CODE (insn) == CALL_INSN
17674              && SIBLING_CALL_P (insn))
17675           {
17676             info_ptr->world_save_p = 0;
17677             break;
17678           }
17679     }
17680
17681   if (WORLD_SAVE_P (info_ptr))
17682     {
17683       /* Even if we're not touching VRsave, make sure there's room on the
17684          stack for it, if it looks like we're calling SAVE_WORLD, which
17685          will attempt to save it. */
17686       info_ptr->vrsave_size  = 4;
17687
17688       /* If we are going to save the world, we need to save the link register too.  */
17689       info_ptr->lr_save_p = 1;
17690
17691       /* "Save" the VRsave register too if we're saving the world.  */
17692       if (info_ptr->vrsave_mask == 0)
17693         info_ptr->vrsave_mask = compute_vrsave_mask ();
17694
17695       /* Because the Darwin register save/restore routines only handle
17696          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
17697          check.  */
17698       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
17699                   && (info_ptr->first_altivec_reg_save
17700                       >= FIRST_SAVED_ALTIVEC_REGNO));
17701     }
17702   return;
17703 }
17704
17705
17706 static void
17707 is_altivec_return_reg (rtx reg, void *xyes)
17708 {
17709   bool *yes = (bool *) xyes;
17710   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
17711     *yes = true;
17712 }
17713
17714 \f
17715 /* Calculate the stack information for the current function.  This is
17716    complicated by having two separate calling sequences, the AIX calling
17717    sequence and the V.4 calling sequence.
17718
17719    AIX (and Darwin/Mac OS X) stack frames look like:
17720                                                           32-bit  64-bit
17721         SP----> +---------------------------------------+
17722                 | back chain to caller                  | 0       0
17723                 +---------------------------------------+
17724                 | saved CR                              | 4       8 (8-11)
17725                 +---------------------------------------+
17726                 | saved LR                              | 8       16
17727                 +---------------------------------------+
17728                 | reserved for compilers                | 12      24
17729                 +---------------------------------------+
17730                 | reserved for binders                  | 16      32
17731                 +---------------------------------------+
17732                 | saved TOC pointer                     | 20      40
17733                 +---------------------------------------+
17734                 | Parameter save area (P)               | 24      48
17735                 +---------------------------------------+
17736                 | Alloca space (A)                      | 24+P    etc.
17737                 +---------------------------------------+
17738                 | Local variable space (L)              | 24+P+A
17739                 +---------------------------------------+
17740                 | Float/int conversion temporary (X)    | 24+P+A+L
17741                 +---------------------------------------+
17742                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
17743                 +---------------------------------------+
17744                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
17745                 +---------------------------------------+
17746                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
17747                 +---------------------------------------+
17748                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
17749                 +---------------------------------------+
17750                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
17751                 +---------------------------------------+
17752         old SP->| back chain to caller's caller         |
17753                 +---------------------------------------+
17754
17755    The required alignment for AIX configurations is two words (i.e., 8
17756    or 16 bytes).
17757
17758
17759    V.4 stack frames look like:
17760
17761         SP----> +---------------------------------------+
17762                 | back chain to caller                  | 0
17763                 +---------------------------------------+
17764                 | caller's saved LR                     | 4
17765                 +---------------------------------------+
17766                 | Parameter save area (P)               | 8
17767                 +---------------------------------------+
17768                 | Alloca space (A)                      | 8+P
17769                 +---------------------------------------+
17770                 | Varargs save area (V)                 | 8+P+A
17771                 +---------------------------------------+
17772                 | Local variable space (L)              | 8+P+A+V
17773                 +---------------------------------------+
17774                 | Float/int conversion temporary (X)    | 8+P+A+V+L
17775                 +---------------------------------------+
17776                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
17777                 +---------------------------------------+
17778                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
17779                 +---------------------------------------+
17780                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
17781                 +---------------------------------------+
17782                 | SPE: area for 64-bit GP registers     |
17783                 +---------------------------------------+
17784                 | SPE alignment padding                 |
17785                 +---------------------------------------+
17786                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
17787                 +---------------------------------------+
17788                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
17789                 +---------------------------------------+
17790                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
17791                 +---------------------------------------+
17792         old SP->| back chain to caller's caller         |
17793                 +---------------------------------------+
17794
17795    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
17796    given.  (But note below and in sysv4.h that we require only 8 and
17797    may round up the size of our stack frame anyways.  The historical
17798    reason is early versions of powerpc-linux which didn't properly
17799    align the stack at program startup.  A happy side-effect is that
17800    -mno-eabi libraries can be used with -meabi programs.)
17801
17802    The EABI configuration defaults to the V.4 layout.  However,
17803    the stack alignment requirements may differ.  If -mno-eabi is not
17804    given, the required stack alignment is 8 bytes; if -mno-eabi is
17805    given, the required alignment is 16 bytes.  (But see V.4 comment
17806    above.)  */
17807
17808 #ifndef ABI_STACK_BOUNDARY
17809 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
17810 #endif
17811
17812 static rs6000_stack_t *
17813 rs6000_stack_info (void)
17814 {
17815   static rs6000_stack_t info;
17816   rs6000_stack_t *info_ptr = &info;
17817   int reg_size = TARGET_32BIT ? 4 : 8;
17818   int ehrd_size;
17819   int save_align;
17820   int first_gp;
17821   HOST_WIDE_INT non_fixed_size;
17822
17823   memset (&info, 0, sizeof (info));
17824
17825   if (TARGET_SPE)
17826     {
17827       /* Cache value so we don't rescan instruction chain over and over.  */
17828       if (cfun->machine->insn_chain_scanned_p == 0)
17829         cfun->machine->insn_chain_scanned_p
17830           = spe_func_has_64bit_regs_p () + 1;
17831       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
17832     }
17833
17834   /* Select which calling sequence.  */
17835   info_ptr->abi = DEFAULT_ABI;
17836
17837   /* Calculate which registers need to be saved & save area size.  */
17838   info_ptr->first_gp_reg_save = first_reg_to_save ();
17839   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
17840      even if it currently looks like we won't.  Reload may need it to
17841      get at a constant; if so, it will have already created a constant
17842      pool entry for it.  */
17843   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
17844        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
17845        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
17846       && crtl->uses_const_pool
17847       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
17848     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
17849   else
17850     first_gp = info_ptr->first_gp_reg_save;
17851
17852   info_ptr->gp_size = reg_size * (32 - first_gp);
17853
17854   /* For the SPE, we have an additional upper 32-bits on each GPR.
17855      Ideally we should save the entire 64-bits only when the upper
17856      half is used in SIMD instructions.  Since we only record
17857      registers live (not the size they are used in), this proves
17858      difficult because we'd have to traverse the instruction chain at
17859      the right time, taking reload into account.  This is a real pain,
17860      so we opt to save the GPRs in 64-bits always if but one register
17861      gets used in 64-bits.  Otherwise, all the registers in the frame
17862      get saved in 32-bits.
17863
17864      So... since when we save all GPRs (except the SP) in 64-bits, the
17865      traditional GP save area will be empty.  */
17866   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
17867     info_ptr->gp_size = 0;
17868
17869   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
17870   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
17871
17872   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
17873   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
17874                                  - info_ptr->first_altivec_reg_save);
17875
17876   /* Does this function call anything?  */
17877   info_ptr->calls_p = (! current_function_is_leaf
17878                        || cfun->machine->ra_needs_full_frame);
17879
17880   /* Determine if we need to save the link register.  */
17881   if ((DEFAULT_ABI == ABI_AIX
17882        && crtl->profile
17883        && !TARGET_PROFILE_KERNEL)
17884 #ifdef TARGET_RELOCATABLE
17885       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
17886 #endif
17887       || (info_ptr->first_fp_reg_save != 64
17888           && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
17889       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
17890       || info_ptr->calls_p
17891       || rs6000_ra_ever_killed ())
17892     {
17893       info_ptr->lr_save_p = 1;
17894       df_set_regs_ever_live (LR_REGNO, true);
17895     }
17896
17897   /* Determine if we need to save the condition code registers.  */
17898   if (df_regs_ever_live_p (CR2_REGNO)
17899       || df_regs_ever_live_p (CR3_REGNO)
17900       || df_regs_ever_live_p (CR4_REGNO))
17901     {
17902       info_ptr->cr_save_p = 1;
17903       if (DEFAULT_ABI == ABI_V4)
17904         info_ptr->cr_size = reg_size;
17905     }
17906
17907   /* If the current function calls __builtin_eh_return, then we need
17908      to allocate stack space for registers that will hold data for
17909      the exception handler.  */
17910   if (crtl->calls_eh_return)
17911     {
17912       unsigned int i;
17913       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
17914         continue;
17915
17916       /* SPE saves EH registers in 64-bits.  */
17917       ehrd_size = i * (TARGET_SPE_ABI
17918                        && info_ptr->spe_64bit_regs_used != 0
17919                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
17920     }
17921   else
17922     ehrd_size = 0;
17923
17924   /* Determine various sizes.  */
17925   info_ptr->reg_size     = reg_size;
17926   info_ptr->fixed_size   = RS6000_SAVE_AREA;
17927   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
17928   info_ptr->parm_size    = RS6000_ALIGN (crtl->outgoing_args_size,
17929                                          TARGET_ALTIVEC ? 16 : 8);
17930   if (FRAME_GROWS_DOWNWARD)
17931     info_ptr->vars_size
17932       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
17933                        + info_ptr->parm_size,
17934                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
17935          - (info_ptr->fixed_size + info_ptr->vars_size
17936             + info_ptr->parm_size);
17937
17938   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
17939     info_ptr->spe_gp_size = 8 * (32 - first_gp);
17940   else
17941     info_ptr->spe_gp_size = 0;
17942
17943   if (TARGET_ALTIVEC_ABI)
17944     info_ptr->vrsave_mask = compute_vrsave_mask ();
17945   else
17946     info_ptr->vrsave_mask = 0;
17947
17948   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
17949     info_ptr->vrsave_size  = 4;
17950   else
17951     info_ptr->vrsave_size  = 0;
17952
17953   compute_save_world_info (info_ptr);
17954
17955   /* Calculate the offsets.  */
17956   switch (DEFAULT_ABI)
17957     {
17958     case ABI_NONE:
17959     default:
17960       gcc_unreachable ();
17961
17962     case ABI_AIX:
17963     case ABI_DARWIN:
17964       info_ptr->fp_save_offset   = - info_ptr->fp_size;
17965       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
17966
17967       if (TARGET_ALTIVEC_ABI)
17968         {
17969           info_ptr->vrsave_save_offset
17970             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
17971
17972           /* Align stack so vector save area is on a quadword boundary.
17973              The padding goes above the vectors.  */
17974           if (info_ptr->altivec_size != 0)
17975             info_ptr->altivec_padding_size
17976               = info_ptr->vrsave_save_offset & 0xF;
17977           else
17978             info_ptr->altivec_padding_size = 0;
17979
17980           info_ptr->altivec_save_offset
17981             = info_ptr->vrsave_save_offset
17982             - info_ptr->altivec_padding_size
17983             - info_ptr->altivec_size;
17984           gcc_assert (info_ptr->altivec_size == 0
17985                       || info_ptr->altivec_save_offset % 16 == 0);
17986
17987           /* Adjust for AltiVec case.  */
17988           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
17989         }
17990       else
17991         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
17992       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
17993       info_ptr->lr_save_offset   = 2*reg_size;
17994       break;
17995
17996     case ABI_V4:
17997       info_ptr->fp_save_offset   = - info_ptr->fp_size;
17998       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
17999       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
18000
18001       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18002         {
18003           /* Align stack so SPE GPR save area is aligned on a
18004              double-word boundary.  */
18005           if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
18006             info_ptr->spe_padding_size
18007               = 8 - (-info_ptr->cr_save_offset % 8);
18008           else
18009             info_ptr->spe_padding_size = 0;
18010
18011           info_ptr->spe_gp_save_offset
18012             = info_ptr->cr_save_offset
18013             - info_ptr->spe_padding_size
18014             - info_ptr->spe_gp_size;
18015
18016           /* Adjust for SPE case.  */
18017           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
18018         }
18019       else if (TARGET_ALTIVEC_ABI)
18020         {
18021           info_ptr->vrsave_save_offset
18022             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
18023
18024           /* Align stack so vector save area is on a quadword boundary.  */
18025           if (info_ptr->altivec_size != 0)
18026             info_ptr->altivec_padding_size
18027               = 16 - (-info_ptr->vrsave_save_offset % 16);
18028           else
18029             info_ptr->altivec_padding_size = 0;
18030
18031           info_ptr->altivec_save_offset
18032             = info_ptr->vrsave_save_offset
18033             - info_ptr->altivec_padding_size
18034             - info_ptr->altivec_size;
18035
18036           /* Adjust for AltiVec case.  */
18037           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
18038         }
18039       else
18040         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
18041       info_ptr->ehrd_offset      -= ehrd_size;
18042       info_ptr->lr_save_offset   = reg_size;
18043       break;
18044     }
18045
18046   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
18047   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
18048                                          + info_ptr->gp_size
18049                                          + info_ptr->altivec_size
18050                                          + info_ptr->altivec_padding_size
18051                                          + info_ptr->spe_gp_size
18052                                          + info_ptr->spe_padding_size
18053                                          + ehrd_size
18054                                          + info_ptr->cr_size
18055                                          + info_ptr->vrsave_size,
18056                                          save_align);
18057
18058   non_fixed_size         = (info_ptr->vars_size
18059                             + info_ptr->parm_size
18060                             + info_ptr->save_size);
18061
18062   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
18063                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
18064
18065   /* Determine if we need to allocate any stack frame:
18066
18067      For AIX we need to push the stack if a frame pointer is needed
18068      (because the stack might be dynamically adjusted), if we are
18069      debugging, if we make calls, or if the sum of fp_save, gp_save,
18070      and local variables are more than the space needed to save all
18071      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
18072      + 18*8 = 288 (GPR13 reserved).
18073
18074      For V.4 we don't have the stack cushion that AIX uses, but assume
18075      that the debugger can handle stackless frames.  */
18076
18077   if (info_ptr->calls_p)
18078     info_ptr->push_p = 1;
18079
18080   else if (DEFAULT_ABI == ABI_V4)
18081     info_ptr->push_p = non_fixed_size != 0;
18082
18083   else if (frame_pointer_needed)
18084     info_ptr->push_p = 1;
18085
18086   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
18087     info_ptr->push_p = 1;
18088
18089   else
18090     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
18091
18092   /* Zero offsets if we're not saving those registers.  */
18093   if (info_ptr->fp_size == 0)
18094     info_ptr->fp_save_offset = 0;
18095
18096   if (info_ptr->gp_size == 0)
18097     info_ptr->gp_save_offset = 0;
18098
18099   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
18100     info_ptr->altivec_save_offset = 0;
18101
18102   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
18103     info_ptr->vrsave_save_offset = 0;
18104
18105   if (! TARGET_SPE_ABI
18106       || info_ptr->spe_64bit_regs_used == 0
18107       || info_ptr->spe_gp_size == 0)
18108     info_ptr->spe_gp_save_offset = 0;
18109
18110   if (! info_ptr->lr_save_p)
18111     info_ptr->lr_save_offset = 0;
18112
18113   if (! info_ptr->cr_save_p)
18114     info_ptr->cr_save_offset = 0;
18115
18116   return info_ptr;
18117 }
18118
18119 /* Return true if the current function uses any GPRs in 64-bit SIMD
18120    mode.  */
18121
18122 static bool
18123 spe_func_has_64bit_regs_p (void)
18124 {
18125   rtx insns, insn;
18126
18127   /* Functions that save and restore all the call-saved registers will
18128      need to save/restore the registers in 64-bits.  */
18129   if (crtl->calls_eh_return
18130       || cfun->calls_setjmp
18131       || crtl->has_nonlocal_goto)
18132     return true;
18133
18134   insns = get_insns ();
18135
18136   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
18137     {
18138       if (INSN_P (insn))
18139         {
18140           rtx i;
18141
18142           /* FIXME: This should be implemented with attributes...
18143
18144                  (set_attr "spe64" "true")....then,
18145                  if (get_spe64(insn)) return true;
18146
18147              It's the only reliable way to do the stuff below.  */
18148
18149           i = PATTERN (insn);
18150           if (GET_CODE (i) == SET)
18151             {
18152               enum machine_mode mode = GET_MODE (SET_SRC (i));
18153
18154               if (SPE_VECTOR_MODE (mode))
18155                 return true;
18156               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
18157                 return true;
18158             }
18159         }
18160     }
18161
18162   return false;
18163 }
18164
18165 static void
18166 debug_stack_info (rs6000_stack_t *info)
18167 {
18168   const char *abi_string;
18169
18170   if (! info)
18171     info = rs6000_stack_info ();
18172
18173   fprintf (stderr, "\nStack information for function %s:\n",
18174            ((current_function_decl && DECL_NAME (current_function_decl))
18175             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
18176             : "<unknown>"));
18177
18178   switch (info->abi)
18179     {
18180     default:             abi_string = "Unknown";        break;
18181     case ABI_NONE:       abi_string = "NONE";           break;
18182     case ABI_AIX:        abi_string = "AIX";            break;
18183     case ABI_DARWIN:     abi_string = "Darwin";         break;
18184     case ABI_V4:         abi_string = "V.4";            break;
18185     }
18186
18187   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
18188
18189   if (TARGET_ALTIVEC_ABI)
18190     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
18191
18192   if (TARGET_SPE_ABI)
18193     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
18194
18195   if (info->first_gp_reg_save != 32)
18196     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
18197
18198   if (info->first_fp_reg_save != 64)
18199     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
18200
18201   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
18202     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
18203              info->first_altivec_reg_save);
18204
18205   if (info->lr_save_p)
18206     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
18207
18208   if (info->cr_save_p)
18209     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
18210
18211   if (info->vrsave_mask)
18212     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
18213
18214   if (info->push_p)
18215     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
18216
18217   if (info->calls_p)
18218     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
18219
18220   if (info->gp_save_offset)
18221     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
18222
18223   if (info->fp_save_offset)
18224     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
18225
18226   if (info->altivec_save_offset)
18227     fprintf (stderr, "\taltivec_save_offset = %5d\n",
18228              info->altivec_save_offset);
18229
18230   if (info->spe_gp_save_offset)
18231     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
18232              info->spe_gp_save_offset);
18233
18234   if (info->vrsave_save_offset)
18235     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
18236              info->vrsave_save_offset);
18237
18238   if (info->lr_save_offset)
18239     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
18240
18241   if (info->cr_save_offset)
18242     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
18243
18244   if (info->varargs_save_offset)
18245     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
18246
18247   if (info->total_size)
18248     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
18249              info->total_size);
18250
18251   if (info->vars_size)
18252     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
18253              info->vars_size);
18254
18255   if (info->parm_size)
18256     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
18257
18258   if (info->fixed_size)
18259     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
18260
18261   if (info->gp_size)
18262     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
18263
18264   if (info->spe_gp_size)
18265     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
18266
18267   if (info->fp_size)
18268     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
18269
18270   if (info->altivec_size)
18271     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
18272
18273   if (info->vrsave_size)
18274     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
18275
18276   if (info->altivec_padding_size)
18277     fprintf (stderr, "\taltivec_padding_size= %5d\n",
18278              info->altivec_padding_size);
18279
18280   if (info->spe_padding_size)
18281     fprintf (stderr, "\tspe_padding_size    = %5d\n",
18282              info->spe_padding_size);
18283
18284   if (info->cr_size)
18285     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
18286
18287   if (info->save_size)
18288     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
18289
18290   if (info->reg_size != 4)
18291     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
18292
18293   fprintf (stderr, "\n");
18294 }
18295
18296 rtx
18297 rs6000_return_addr (int count, rtx frame)
18298 {
18299   /* Currently we don't optimize very well between prolog and body
18300      code and for PIC code the code can be actually quite bad, so
18301      don't try to be too clever here.  */
18302   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
18303     {
18304       cfun->machine->ra_needs_full_frame = 1;
18305
18306       return
18307         gen_rtx_MEM
18308           (Pmode,
18309            memory_address
18310            (Pmode,
18311             plus_constant (copy_to_reg
18312                            (gen_rtx_MEM (Pmode,
18313                                          memory_address (Pmode, frame))),
18314                            RETURN_ADDRESS_OFFSET)));
18315     }
18316
18317   cfun->machine->ra_need_lr = 1;
18318   return get_hard_reg_initial_val (Pmode, LR_REGNO);
18319 }
18320
18321 /* Say whether a function is a candidate for sibcall handling or not.
18322    We do not allow indirect calls to be optimized into sibling calls.
18323    Also, we can't do it if there are any vector parameters; there's
18324    nowhere to put the VRsave code so it works; note that functions with
18325    vector parameters are required to have a prototype, so the argument
18326    type info must be available here.  (The tail recursion case can work
18327    with vector parameters, but there's no way to distinguish here.) */
18328 static bool
18329 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
18330 {
18331   tree type;
18332   if (decl)
18333     {
18334       if (TARGET_ALTIVEC_VRSAVE)
18335         {
18336           for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
18337                type; type = TREE_CHAIN (type))
18338             {
18339               if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
18340                 return false;
18341             }
18342         }
18343       if (DEFAULT_ABI == ABI_DARWIN
18344           || ((*targetm.binds_local_p) (decl)
18345               && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
18346         {
18347           tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
18348
18349           if (!lookup_attribute ("longcall", attr_list)
18350               || lookup_attribute ("shortcall", attr_list))
18351             return true;
18352         }
18353     }
18354   return false;
18355 }
18356
18357 /* NULL if INSN insn is valid within a low-overhead loop.
18358    Otherwise return why doloop cannot be applied.
18359    PowerPC uses the COUNT register for branch on table instructions.  */
18360
18361 static const char *
18362 rs6000_invalid_within_doloop (const_rtx insn)
18363 {
18364   if (CALL_P (insn))
18365     return "Function call in the loop.";
18366
18367   if (JUMP_P (insn)
18368       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
18369           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
18370     return "Computed branch in the loop.";
18371
18372   return NULL;
18373 }
18374
18375 static int
18376 rs6000_ra_ever_killed (void)
18377 {
18378   rtx top;
18379   rtx reg;
18380   rtx insn;
18381
18382   if (cfun->is_thunk)
18383     return 0;
18384
18385   if (cfun->machine->lr_save_state)
18386     return cfun->machine->lr_save_state - 1;
18387
18388   /* regs_ever_live has LR marked as used if any sibcalls are present,
18389      but this should not force saving and restoring in the
18390      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
18391      clobbers LR, so that is inappropriate.  */
18392
18393   /* Also, the prologue can generate a store into LR that
18394      doesn't really count, like this:
18395
18396         move LR->R0
18397         bcl to set PIC register
18398         move LR->R31
18399         move R0->LR
18400
18401      When we're called from the epilogue, we need to avoid counting
18402      this as a store.  */
18403
18404   push_topmost_sequence ();
18405   top = get_insns ();
18406   pop_topmost_sequence ();
18407   reg = gen_rtx_REG (Pmode, LR_REGNO);
18408
18409   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
18410     {
18411       if (INSN_P (insn))
18412         {
18413           if (CALL_P (insn))
18414             {
18415               if (!SIBLING_CALL_P (insn))
18416                 return 1;
18417             }
18418           else if (find_regno_note (insn, REG_INC, LR_REGNO))
18419             return 1;
18420           else if (set_of (reg, insn) != NULL_RTX
18421                    && !prologue_epilogue_contains (insn))
18422             return 1;
18423         }
18424     }
18425   return 0;
18426 }
18427 \f
18428 /* Emit instructions needed to load the TOC register.
18429    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
18430    a constant pool; or for SVR4 -fpic.  */
18431
18432 void
18433 rs6000_emit_load_toc_table (int fromprolog)
18434 {
18435   rtx dest;
18436   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
18437
18438   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
18439     {
18440       char buf[30];
18441       rtx lab, tmp1, tmp2, got;
18442
18443       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18444       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18445       if (flag_pic == 2)
18446         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18447       else
18448         got = rs6000_got_sym ();
18449       tmp1 = tmp2 = dest;
18450       if (!fromprolog)
18451         {
18452           tmp1 = gen_reg_rtx (Pmode);
18453           tmp2 = gen_reg_rtx (Pmode);
18454         }
18455       emit_insn (gen_load_toc_v4_PIC_1 (lab));
18456       emit_move_insn (tmp1,
18457                              gen_rtx_REG (Pmode, LR_REGNO));
18458       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
18459       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
18460     }
18461   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
18462     {
18463       emit_insn (gen_load_toc_v4_pic_si ());
18464       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18465     }
18466   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
18467     {
18468       char buf[30];
18469       rtx temp0 = (fromprolog
18470                    ? gen_rtx_REG (Pmode, 0)
18471                    : gen_reg_rtx (Pmode));
18472
18473       if (fromprolog)
18474         {
18475           rtx symF, symL;
18476
18477           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18478           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18479
18480           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
18481           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18482
18483           emit_insn (gen_load_toc_v4_PIC_1 (symF));
18484           emit_move_insn (dest,
18485                           gen_rtx_REG (Pmode, LR_REGNO));
18486           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
18487         }
18488       else
18489         {
18490           rtx tocsym, lab;
18491
18492           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18493           lab = gen_label_rtx ();
18494           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
18495           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18496           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
18497         }
18498       emit_insn (gen_addsi3 (dest, temp0, dest));
18499     }
18500   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
18501     {
18502       /* This is for AIX code running in non-PIC ELF32.  */
18503       char buf[30];
18504       rtx realsym;
18505       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
18506       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18507
18508       emit_insn (gen_elf_high (dest, realsym));
18509       emit_insn (gen_elf_low (dest, dest, realsym));
18510     }
18511   else
18512     {
18513       gcc_assert (DEFAULT_ABI == ABI_AIX);
18514
18515       if (TARGET_32BIT)
18516         emit_insn (gen_load_toc_aix_si (dest));
18517       else
18518         emit_insn (gen_load_toc_aix_di (dest));
18519     }
18520 }
18521
18522 /* Emit instructions to restore the link register after determining where
18523    its value has been stored.  */
18524
18525 void
18526 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
18527 {
18528   rs6000_stack_t *info = rs6000_stack_info ();
18529   rtx operands[2];
18530
18531   operands[0] = source;
18532   operands[1] = scratch;
18533
18534   if (info->lr_save_p)
18535     {
18536       rtx frame_rtx = stack_pointer_rtx;
18537       HOST_WIDE_INT sp_offset = 0;
18538       rtx tmp;
18539
18540       if (frame_pointer_needed
18541           || cfun->calls_alloca
18542           || info->total_size > 32767)
18543         {
18544           tmp = gen_frame_mem (Pmode, frame_rtx);
18545           emit_move_insn (operands[1], tmp);
18546           frame_rtx = operands[1];
18547         }
18548       else if (info->push_p)
18549         sp_offset = info->total_size;
18550
18551       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
18552       tmp = gen_frame_mem (Pmode, tmp);
18553       emit_move_insn (tmp, operands[0]);
18554     }
18555   else
18556     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
18557
18558   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
18559      state of lr_save_p so any change from here on would be a bug.  In
18560      particular, stop rs6000_ra_ever_killed from considering the SET
18561      of lr we may have added just above.  */ 
18562   cfun->machine->lr_save_state = info->lr_save_p + 1;
18563 }
18564
18565 static GTY(()) alias_set_type set = -1;
18566
18567 alias_set_type
18568 get_TOC_alias_set (void)
18569 {
18570   if (set == -1)
18571     set = new_alias_set ();
18572   return set;
18573 }
18574
18575 /* This returns nonzero if the current function uses the TOC.  This is
18576    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
18577    is generated by the ABI_V4 load_toc_* patterns.  */
18578 #if TARGET_ELF
18579 static int
18580 uses_TOC (void)
18581 {
18582   rtx insn;
18583
18584   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
18585     if (INSN_P (insn))
18586       {
18587         rtx pat = PATTERN (insn);
18588         int i;
18589
18590         if (GET_CODE (pat) == PARALLEL)
18591           for (i = 0; i < XVECLEN (pat, 0); i++)
18592             {
18593               rtx sub = XVECEXP (pat, 0, i);
18594               if (GET_CODE (sub) == USE)
18595                 {
18596                   sub = XEXP (sub, 0);
18597                   if (GET_CODE (sub) == UNSPEC
18598                       && XINT (sub, 1) == UNSPEC_TOC)
18599                     return 1;
18600                 }
18601             }
18602       }
18603   return 0;
18604 }
18605 #endif
18606
18607 rtx
18608 create_TOC_reference (rtx symbol, rtx largetoc_reg)
18609 {
18610   rtx tocrel, tocreg;
18611
18612   if (TARGET_DEBUG_ADDR)
18613     {
18614       if (GET_CODE (symbol) == SYMBOL_REF)
18615         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
18616                  XSTR (symbol, 0));
18617       else
18618         {
18619           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
18620                    GET_RTX_NAME (GET_CODE (symbol)));
18621           debug_rtx (symbol);
18622         }
18623     }
18624
18625   if (!can_create_pseudo_p ())
18626     df_set_regs_ever_live (TOC_REGISTER, true);
18627
18628   tocrel = gen_rtx_CONST (Pmode,
18629                           gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol),
18630                                           UNSPEC_TOCREL));
18631   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
18632   if (TARGET_CMODEL != CMODEL_SMALL)
18633     {
18634       rtx hi = gen_rtx_PLUS (Pmode, tocreg, gen_rtx_HIGH (Pmode, tocrel));
18635       if (largetoc_reg != NULL)
18636         {
18637           emit_move_insn (largetoc_reg, hi);
18638           hi = largetoc_reg;
18639         }
18640       return gen_rtx_LO_SUM (Pmode, hi, copy_rtx (tocrel));
18641     }
18642   else
18643     return gen_rtx_PLUS (Pmode, tocreg, tocrel);
18644 }
18645
18646 /* Issue assembly directives that create a reference to the given DWARF
18647    FRAME_TABLE_LABEL from the current function section.  */
18648 void
18649 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
18650 {
18651   fprintf (asm_out_file, "\t.ref %s\n",
18652            TARGET_STRIP_NAME_ENCODING (frame_table_label));
18653 }
18654
18655 /* If _Unwind_* has been called from within the same module,
18656    toc register is not guaranteed to be saved to 40(1) on function
18657    entry.  Save it there in that case.  */
18658
18659 void
18660 rs6000_aix_emit_builtin_unwind_init (void)
18661 {
18662   rtx mem;
18663   rtx stack_top = gen_reg_rtx (Pmode);
18664   rtx opcode_addr = gen_reg_rtx (Pmode);
18665   rtx opcode = gen_reg_rtx (SImode);
18666   rtx tocompare = gen_reg_rtx (SImode);
18667   rtx no_toc_save_needed = gen_label_rtx ();
18668
18669   mem = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
18670   emit_move_insn (stack_top, mem);
18671
18672   mem = gen_frame_mem (Pmode,
18673                        gen_rtx_PLUS (Pmode, stack_top,
18674                                      GEN_INT (2 * GET_MODE_SIZE (Pmode))));
18675   emit_move_insn (opcode_addr, mem);
18676   emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
18677   emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
18678                                            : 0xE8410028, SImode));
18679
18680   do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
18681                            SImode, NULL_RTX, NULL_RTX,
18682                            no_toc_save_needed, -1);
18683
18684   mem = gen_frame_mem (Pmode,
18685                        gen_rtx_PLUS (Pmode, stack_top,
18686                                      GEN_INT (5 * GET_MODE_SIZE (Pmode))));
18687   emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
18688   emit_label (no_toc_save_needed);
18689 }
18690 \f
18691 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
18692    and the change to the stack pointer.  */
18693
18694 static void
18695 rs6000_emit_stack_tie (void)
18696 {
18697   rtx mem = gen_frame_mem (BLKmode,
18698                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
18699
18700   emit_insn (gen_stack_tie (mem));
18701 }
18702
18703 /* Emit the correct code for allocating stack space, as insns.
18704    If COPY_REG, make sure a copy of the old frame is left there.
18705    The generated code may use hard register 0 as a temporary.  */
18706
18707 static void
18708 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg)
18709 {
18710   rtx insn;
18711   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
18712   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
18713   rtx todec = gen_int_mode (-size, Pmode);
18714   rtx par, set, mem;
18715
18716   if (INTVAL (todec) != -size)
18717     {
18718       warning (0, "stack frame too large");
18719       emit_insn (gen_trap ());
18720       return;
18721     }
18722
18723   if (crtl->limit_stack)
18724     {
18725       if (REG_P (stack_limit_rtx)
18726           && REGNO (stack_limit_rtx) > 1
18727           && REGNO (stack_limit_rtx) <= 31)
18728         {
18729           emit_insn (gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size)));
18730           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
18731                                     const0_rtx));
18732         }
18733       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
18734                && TARGET_32BIT
18735                && DEFAULT_ABI == ABI_V4)
18736         {
18737           rtx toload = gen_rtx_CONST (VOIDmode,
18738                                       gen_rtx_PLUS (Pmode,
18739                                                     stack_limit_rtx,
18740                                                     GEN_INT (size)));
18741
18742           emit_insn (gen_elf_high (tmp_reg, toload));
18743           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
18744           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
18745                                     const0_rtx));
18746         }
18747       else
18748         warning (0, "stack limit expression is not supported");
18749     }
18750
18751   if (copy_reg)
18752     emit_move_insn (copy_reg, stack_reg);
18753
18754   if (size > 32767)
18755     {
18756       /* Need a note here so that try_split doesn't get confused.  */
18757       if (get_last_insn () == NULL_RTX)
18758         emit_note (NOTE_INSN_DELETED);
18759       insn = emit_move_insn (tmp_reg, todec);
18760       try_split (PATTERN (insn), insn, 0);
18761       todec = tmp_reg;
18762     }
18763   
18764   insn = emit_insn (TARGET_32BIT
18765                     ? gen_movsi_update_stack (stack_reg, stack_reg,
18766                                         todec, stack_reg)
18767                     : gen_movdi_di_update_stack (stack_reg, stack_reg,
18768                                            todec, stack_reg));
18769   /* Since we didn't use gen_frame_mem to generate the MEM, grab
18770      it now and set the alias set/attributes. The above gen_*_update
18771      calls will generate a PARALLEL with the MEM set being the first
18772      operation. */
18773   par = PATTERN (insn);
18774   gcc_assert (GET_CODE (par) == PARALLEL);
18775   set = XVECEXP (par, 0, 0);
18776   gcc_assert (GET_CODE (set) == SET);
18777   mem = SET_DEST (set);
18778   gcc_assert (MEM_P (mem));
18779   MEM_NOTRAP_P (mem) = 1;
18780   set_mem_alias_set (mem, get_frame_alias_set ());
18781
18782   RTX_FRAME_RELATED_P (insn) = 1;
18783   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
18784                 gen_rtx_SET (VOIDmode, stack_reg,
18785                              gen_rtx_PLUS (Pmode, stack_reg,
18786                                            GEN_INT (-size))));
18787 }
18788
18789 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
18790    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
18791    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
18792    deduce these equivalences by itself so it wasn't necessary to hold
18793    its hand so much.  */
18794
18795 static void
18796 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
18797                       rtx reg2, rtx rreg)
18798 {
18799   rtx real, temp;
18800
18801   /* copy_rtx will not make unique copies of registers, so we need to
18802      ensure we don't have unwanted sharing here.  */
18803   if (reg == reg2)
18804     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
18805
18806   if (reg == rreg)
18807     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
18808
18809   real = copy_rtx (PATTERN (insn));
18810
18811   if (reg2 != NULL_RTX)
18812     real = replace_rtx (real, reg2, rreg);
18813
18814   real = replace_rtx (real, reg,
18815                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
18816                                                         STACK_POINTER_REGNUM),
18817                                     GEN_INT (val)));
18818
18819   /* We expect that 'real' is either a SET or a PARALLEL containing
18820      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
18821      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
18822
18823   if (GET_CODE (real) == SET)
18824     {
18825       rtx set = real;
18826
18827       temp = simplify_rtx (SET_SRC (set));
18828       if (temp)
18829         SET_SRC (set) = temp;
18830       temp = simplify_rtx (SET_DEST (set));
18831       if (temp)
18832         SET_DEST (set) = temp;
18833       if (GET_CODE (SET_DEST (set)) == MEM)
18834         {
18835           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
18836           if (temp)
18837             XEXP (SET_DEST (set), 0) = temp;
18838         }
18839     }
18840   else
18841     {
18842       int i;
18843
18844       gcc_assert (GET_CODE (real) == PARALLEL);
18845       for (i = 0; i < XVECLEN (real, 0); i++)
18846         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
18847           {
18848             rtx set = XVECEXP (real, 0, i);
18849
18850             temp = simplify_rtx (SET_SRC (set));
18851             if (temp)
18852               SET_SRC (set) = temp;
18853             temp = simplify_rtx (SET_DEST (set));
18854             if (temp)
18855               SET_DEST (set) = temp;
18856             if (GET_CODE (SET_DEST (set)) == MEM)
18857               {
18858                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
18859                 if (temp)
18860                   XEXP (SET_DEST (set), 0) = temp;
18861               }
18862             RTX_FRAME_RELATED_P (set) = 1;
18863           }
18864     }
18865
18866   RTX_FRAME_RELATED_P (insn) = 1;
18867   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
18868 }
18869
18870 /* Returns an insn that has a vrsave set operation with the
18871    appropriate CLOBBERs.  */
18872
18873 static rtx
18874 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
18875 {
18876   int nclobs, i;
18877   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
18878   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
18879
18880   clobs[0]
18881     = gen_rtx_SET (VOIDmode,
18882                    vrsave,
18883                    gen_rtx_UNSPEC_VOLATILE (SImode,
18884                                             gen_rtvec (2, reg, vrsave),
18885                                             UNSPECV_SET_VRSAVE));
18886
18887   nclobs = 1;
18888
18889   /* We need to clobber the registers in the mask so the scheduler
18890      does not move sets to VRSAVE before sets of AltiVec registers.
18891
18892      However, if the function receives nonlocal gotos, reload will set
18893      all call saved registers live.  We will end up with:
18894
18895         (set (reg 999) (mem))
18896         (parallel [ (set (reg vrsave) (unspec blah))
18897                     (clobber (reg 999))])
18898
18899      The clobber will cause the store into reg 999 to be dead, and
18900      flow will attempt to delete an epilogue insn.  In this case, we
18901      need an unspec use/set of the register.  */
18902
18903   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
18904     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
18905       {
18906         if (!epiloguep || call_used_regs [i])
18907           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
18908                                              gen_rtx_REG (V4SImode, i));
18909         else
18910           {
18911             rtx reg = gen_rtx_REG (V4SImode, i);
18912
18913             clobs[nclobs++]
18914               = gen_rtx_SET (VOIDmode,
18915                              reg,
18916                              gen_rtx_UNSPEC (V4SImode,
18917                                              gen_rtvec (1, reg), 27));
18918           }
18919       }
18920
18921   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
18922
18923   for (i = 0; i < nclobs; ++i)
18924     XVECEXP (insn, 0, i) = clobs[i];
18925
18926   return insn;
18927 }
18928
18929 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
18930    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
18931
18932 static void
18933 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
18934                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
18935 {
18936   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
18937   rtx replacea, replaceb;
18938
18939   int_rtx = GEN_INT (offset);
18940
18941   /* Some cases that need register indexed addressing.  */
18942   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
18943       || (TARGET_VSX && VSX_VECTOR_MODE (mode))
18944       || (TARGET_E500_DOUBLE && mode == DFmode)
18945       || (TARGET_SPE_ABI
18946           && SPE_VECTOR_MODE (mode)
18947           && !SPE_CONST_OFFSET_OK (offset)))
18948     {
18949       /* Whomever calls us must make sure r11 is available in the
18950          flow path of instructions in the prologue.  */
18951       offset_rtx = gen_rtx_REG (Pmode, 11);
18952       emit_move_insn (offset_rtx, int_rtx);
18953
18954       replacea = offset_rtx;
18955       replaceb = int_rtx;
18956     }
18957   else
18958     {
18959       offset_rtx = int_rtx;
18960       replacea = NULL_RTX;
18961       replaceb = NULL_RTX;
18962     }
18963
18964   reg = gen_rtx_REG (mode, regno);
18965   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
18966   mem = gen_frame_mem (mode, addr);
18967
18968   insn = emit_move_insn (mem, reg);
18969
18970   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
18971 }
18972
18973 /* Emit an offset memory reference suitable for a frame store, while
18974    converting to a valid addressing mode.  */
18975
18976 static rtx
18977 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
18978 {
18979   rtx int_rtx, offset_rtx;
18980
18981   int_rtx = GEN_INT (offset);
18982
18983   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
18984       || (TARGET_E500_DOUBLE && mode == DFmode))
18985     {
18986       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
18987       emit_move_insn (offset_rtx, int_rtx);
18988     }
18989   else
18990     offset_rtx = int_rtx;
18991
18992   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
18993 }
18994
18995 /* Look for user-defined global regs.  We should not save and restore these,
18996    and cannot use stmw/lmw if there are any in its range.  */
18997
18998 static bool
18999 no_global_regs_above (int first, bool gpr)
19000 {
19001   int i;
19002   int last = gpr ? 32 : 64;
19003   for (i = first; i < last; i++)
19004     if (global_regs[i])
19005       return false;
19006   return true;
19007 }
19008
19009 #ifndef TARGET_FIX_AND_CONTINUE
19010 #define TARGET_FIX_AND_CONTINUE 0
19011 #endif
19012
19013 /* It's really GPR 13 and FPR 14, but we need the smaller of the two.  */
19014 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
19015 #define LAST_SAVRES_REGISTER 31
19016 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
19017
19018 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
19019
19020 /* Temporary holding space for an out-of-line register save/restore
19021    routine name.  */
19022 static char savres_routine_name[30];
19023
19024 /* Return the name for an out-of-line register save/restore routine.
19025    We are saving/restoring GPRs if GPR is true.  */
19026
19027 static char *
19028 rs6000_savres_routine_name (rs6000_stack_t *info, int regno,
19029                             bool savep, bool gpr, bool lr)
19030 {
19031   const char *prefix = "";
19032   const char *suffix = "";
19033
19034   /* Different targets are supposed to define
19035      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
19036      routine name could be defined with:
19037
19038      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
19039
19040      This is a nice idea in practice, but in reality, things are
19041      complicated in several ways:
19042
19043      - ELF targets have save/restore routines for GPRs.
19044
19045      - SPE targets use different prefixes for 32/64-bit registers, and
19046        neither of them fit neatly in the FOO_{PREFIX,SUFFIX} regimen.
19047
19048      - PPC64 ELF targets have routines for save/restore of GPRs that
19049        differ in what they do with the link register, so having a set
19050        prefix doesn't work.  (We only use one of the save routines at
19051        the moment, though.)
19052
19053      - PPC32 elf targets have "exit" versions of the restore routines
19054        that restore the link register and can save some extra space.
19055        These require an extra suffix.  (There are also "tail" versions
19056        of the restore routines and "GOT" versions of the save routines,
19057        but we don't generate those at present.  Same problems apply,
19058        though.)
19059
19060      We deal with all this by synthesizing our own prefix/suffix and
19061      using that for the simple sprintf call shown above.  */
19062   if (TARGET_SPE)
19063     {
19064       /* No floating point saves on the SPE.  */
19065       gcc_assert (gpr);
19066
19067       if (savep)
19068         prefix = info->spe_64bit_regs_used ? "_save64gpr_" : "_save32gpr_";
19069       else
19070         prefix = info->spe_64bit_regs_used ? "_rest64gpr_" : "_rest32gpr_";
19071
19072       if (lr)
19073         suffix = "_x";
19074     }
19075   else if (DEFAULT_ABI == ABI_V4)
19076     {
19077       if (TARGET_64BIT)
19078         goto aix_names;
19079
19080       if (gpr)
19081         prefix = savep ? "_savegpr_" : "_restgpr_";
19082       else
19083         prefix = savep ? "_savefpr_" : "_restfpr_";
19084
19085       if (lr)
19086         suffix = "_x";
19087     }
19088   else if (DEFAULT_ABI == ABI_AIX)
19089     {
19090 #ifndef POWERPC_LINUX
19091       /* No out-of-line save/restore routines for GPRs on AIX.  */
19092       gcc_assert (!TARGET_AIX || !gpr);
19093 #endif
19094
19095     aix_names:
19096       if (gpr)
19097         prefix = (savep
19098                   ? (lr ? "_savegpr0_" : "_savegpr1_")
19099                   : (lr ? "_restgpr0_" : "_restgpr1_"));
19100 #ifdef POWERPC_LINUX
19101       else if (lr)
19102         prefix = (savep ? "_savefpr_" : "_restfpr_");
19103 #endif
19104       else
19105         {
19106           prefix = savep ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
19107           suffix = savep ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
19108         }
19109     }
19110   else if (DEFAULT_ABI == ABI_DARWIN)
19111     sorry ("Out-of-line save/restore routines not supported on Darwin");
19112
19113   sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
19114
19115   return savres_routine_name;
19116 }
19117
19118 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
19119    We are saving/restoring GPRs if GPR is true.  */
19120
19121 static rtx
19122 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep,
19123                            bool gpr, bool lr)
19124 {
19125   int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
19126   rtx sym;
19127   int select = ((savep ? 1 : 0) << 2
19128                 | ((TARGET_SPE_ABI
19129                     /* On the SPE, we never have any FPRs, but we do have
19130                        32/64-bit versions of the routines.  */
19131                     ? (info->spe_64bit_regs_used ? 1 : 0)
19132                     : (gpr ? 1 : 0)) << 1)
19133                 | (lr ? 1: 0));
19134
19135   /* Don't generate bogus routine names.  */
19136   gcc_assert (FIRST_SAVRES_REGISTER <= regno
19137               && regno <= LAST_SAVRES_REGISTER);
19138
19139   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
19140
19141   if (sym == NULL)
19142     {
19143       char *name;
19144
19145       name = rs6000_savres_routine_name (info, regno, savep, gpr, lr);
19146
19147       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
19148         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
19149       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
19150     }
19151
19152   return sym;
19153 }
19154
19155 /* Emit a sequence of insns, including a stack tie if needed, for
19156    resetting the stack pointer.  If SAVRES is true, then don't reset the
19157    stack pointer, but move the base of the frame into r11 for use by
19158    out-of-line register restore routines.  */
19159
19160 static rtx
19161 rs6000_emit_stack_reset (rs6000_stack_t *info,
19162                          rtx sp_reg_rtx, rtx frame_reg_rtx,
19163                          int sp_offset, bool savres)
19164 {
19165   /* This blockage is needed so that sched doesn't decide to move
19166      the sp change before the register restores.  */
19167   if (frame_reg_rtx != sp_reg_rtx
19168       || (TARGET_SPE_ABI
19169           && info->spe_64bit_regs_used != 0
19170           && info->first_gp_reg_save != 32))
19171     rs6000_emit_stack_tie ();
19172   
19173   if (frame_reg_rtx != sp_reg_rtx)
19174     {
19175       if (sp_offset != 0)
19176         {
19177           rtx dest_reg = savres ? gen_rtx_REG (Pmode, 11) : sp_reg_rtx;
19178           return emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx,
19179                                            GEN_INT (sp_offset)));
19180         }
19181       else if (!savres)
19182         return emit_move_insn (sp_reg_rtx, frame_reg_rtx);
19183     }
19184   else if (sp_offset != 0)
19185     {
19186       /* If we are restoring registers out-of-line, we will be using the
19187          "exit" variants of the restore routines, which will reset the
19188          stack for us.  But we do need to point r11 into the right place
19189          for those routines.  */
19190       rtx dest_reg = (savres
19191                       ? gen_rtx_REG (Pmode, 11)
19192                       : sp_reg_rtx);
19193
19194       rtx insn = emit_insn (gen_add3_insn (dest_reg, sp_reg_rtx,
19195                                            GEN_INT (sp_offset)));
19196       if (!savres)
19197         return insn;
19198     }
19199   return NULL_RTX;
19200 }
19201
19202 /* Construct a parallel rtx describing the effect of a call to an
19203    out-of-line register save/restore routine.  */
19204
19205 static rtx
19206 rs6000_make_savres_rtx (rs6000_stack_t *info,
19207                         rtx frame_reg_rtx, int save_area_offset,
19208                         enum machine_mode reg_mode,
19209                         bool savep, bool gpr, bool lr)
19210 {
19211   int i;
19212   int offset, start_reg, end_reg, n_regs;
19213   int reg_size = GET_MODE_SIZE (reg_mode);
19214   rtx sym;
19215   rtvec p;
19216
19217   offset = 0;
19218   start_reg = (gpr
19219                ? info->first_gp_reg_save
19220                : info->first_fp_reg_save);
19221   end_reg = gpr ? 32 : 64;
19222   n_regs = end_reg - start_reg;
19223   p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
19224
19225   if (!savep && lr)
19226     RTVEC_ELT (p, offset++) = gen_rtx_RETURN (VOIDmode);
19227
19228   RTVEC_ELT (p, offset++)
19229     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
19230
19231   sym = rs6000_savres_routine_sym (info, savep, gpr, lr);
19232   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
19233   RTVEC_ELT (p, offset++)
19234     = gen_rtx_USE (VOIDmode,
19235                    gen_rtx_REG (Pmode, DEFAULT_ABI != ABI_AIX ? 11
19236                                        : gpr && !lr ? 12
19237                                        : 1));
19238
19239   for (i = 0; i < end_reg - start_reg; i++)
19240     {
19241       rtx addr, reg, mem;
19242       reg = gen_rtx_REG (reg_mode, start_reg + i);
19243       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19244                            GEN_INT (save_area_offset + reg_size*i));
19245       mem = gen_frame_mem (reg_mode, addr);
19246
19247       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
19248                                                savep ? mem : reg,
19249                                                savep ? reg : mem);
19250     }
19251
19252   if (savep && lr)
19253     {
19254       rtx addr, reg, mem;
19255       reg = gen_rtx_REG (Pmode, 0);
19256       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19257                            GEN_INT (info->lr_save_offset));
19258       mem = gen_frame_mem (Pmode, addr);
19259       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode, mem, reg);
19260     }
19261
19262   return gen_rtx_PARALLEL (VOIDmode, p);
19263 }
19264
19265 /* Determine whether the gp REG is really used.  */
19266
19267 static bool
19268 rs6000_reg_live_or_pic_offset_p (int reg)
19269 {
19270   return ((df_regs_ever_live_p (reg)
19271            && (!call_used_regs[reg]
19272                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19273                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
19274           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19275               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
19276                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
19277 }
19278
19279 enum {
19280   SAVRES_MULTIPLE = 0x1,
19281   SAVRES_INLINE_FPRS = 0x2,
19282   SAVRES_INLINE_GPRS = 0x4,
19283   SAVRES_NOINLINE_GPRS_SAVES_LR = 0x8,
19284   SAVRES_NOINLINE_FPRS_SAVES_LR = 0x10,
19285   SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x20
19286 };
19287
19288 /* Determine the strategy for savings/restoring registers.  */
19289
19290 static int
19291 rs6000_savres_strategy (rs6000_stack_t *info, bool savep,
19292                         int using_static_chain_p, int sibcall)
19293 {
19294   bool using_multiple_p;
19295   bool common;
19296   bool savres_fprs_inline;
19297   bool savres_gprs_inline;
19298   bool noclobber_global_gprs
19299     = no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true);
19300   int strategy;
19301
19302   using_multiple_p = (TARGET_MULTIPLE && ! TARGET_POWERPC64
19303                       && (!TARGET_SPE_ABI
19304                           || info->spe_64bit_regs_used == 0)
19305                       && info->first_gp_reg_save < 31
19306                       && noclobber_global_gprs);
19307   /* Don't bother to try to save things out-of-line if r11 is occupied
19308      by the static chain.  It would require too much fiddling and the
19309      static chain is rarely used anyway.  */
19310   common = (using_static_chain_p
19311             || sibcall
19312             || crtl->calls_eh_return
19313             || !info->lr_save_p
19314             || cfun->machine->ra_need_lr
19315             || info->total_size > 32767);
19316   savres_fprs_inline = (common
19317                         || info->first_fp_reg_save == 64
19318                         || !no_global_regs_above (info->first_fp_reg_save,
19319                                                   /*gpr=*/false)
19320                         /* The out-of-line FP routines use
19321                            double-precision stores; we can't use those
19322                            routines if we don't have such stores.  */
19323                         || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT)
19324                         || FP_SAVE_INLINE (info->first_fp_reg_save));
19325   savres_gprs_inline = (common
19326                         /* Saving CR interferes with the exit routines
19327                            used on the SPE, so just punt here.  */
19328                         || (!savep
19329                             && TARGET_SPE_ABI
19330                             && info->spe_64bit_regs_used != 0
19331                             && info->cr_save_p != 0)
19332                         || info->first_gp_reg_save == 32
19333                         || !noclobber_global_gprs
19334                         || GP_SAVE_INLINE (info->first_gp_reg_save));
19335
19336   if (savep)
19337     /* If we are going to use store multiple, then don't even bother
19338      with the out-of-line routines, since the store-multiple instruction
19339      will always be smaller.  */
19340     savres_gprs_inline = savres_gprs_inline || using_multiple_p;
19341   else
19342     {
19343       /* The situation is more complicated with load multiple.  We'd
19344          prefer to use the out-of-line routines for restores, since the
19345          "exit" out-of-line routines can handle the restore of LR and
19346          the frame teardown.  But we can only use the out-of-line
19347          routines if we know that we've used store multiple or
19348          out-of-line routines in the prologue, i.e. if we've saved all
19349          the registers from first_gp_reg_save.  Otherwise, we risk
19350          loading garbage from the stack.  Furthermore, we can only use
19351          the "exit" out-of-line gpr restore if we haven't saved any
19352          fprs.  */
19353       bool saved_all = !savres_gprs_inline || using_multiple_p;
19354
19355       if (saved_all && info->first_fp_reg_save != 64)
19356         /* We can't use the exit routine; use load multiple if it's
19357            available.  */
19358         savres_gprs_inline = savres_gprs_inline || using_multiple_p;
19359     }
19360
19361   strategy = (using_multiple_p
19362               | (savres_fprs_inline << 1)
19363               | (savres_gprs_inline << 2));
19364 #ifdef POWERPC_LINUX
19365   if (TARGET_64BIT)
19366     {
19367       if (!savres_fprs_inline)
19368         strategy |= SAVRES_NOINLINE_FPRS_SAVES_LR;
19369       else if (!savres_gprs_inline && info->first_fp_reg_save == 64)
19370         strategy |= SAVRES_NOINLINE_GPRS_SAVES_LR;
19371     }
19372 #else
19373   if (TARGET_AIX && !savres_fprs_inline)
19374     strategy |= SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR;
19375 #endif
19376   return strategy;
19377 }
19378
19379 /* Emit function prologue as insns.  */
19380
19381 void
19382 rs6000_emit_prologue (void)
19383 {
19384   rs6000_stack_t *info = rs6000_stack_info ();
19385   enum machine_mode reg_mode = Pmode;
19386   int reg_size = TARGET_32BIT ? 4 : 8;
19387   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19388   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
19389   rtx frame_reg_rtx = sp_reg_rtx;
19390   rtx cr_save_rtx = NULL_RTX;
19391   rtx insn;
19392   int strategy;
19393   int saving_FPRs_inline;
19394   int saving_GPRs_inline;
19395   int using_store_multiple;
19396   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
19397                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
19398                               && call_used_regs[STATIC_CHAIN_REGNUM]);
19399   HOST_WIDE_INT sp_offset = 0;
19400
19401   if (TARGET_FIX_AND_CONTINUE)
19402     {
19403       /* gdb on darwin arranges to forward a function from the old
19404          address by modifying the first 5 instructions of the function
19405          to branch to the overriding function.  This is necessary to
19406          permit function pointers that point to the old function to
19407          actually forward to the new function.  */
19408       emit_insn (gen_nop ());
19409       emit_insn (gen_nop ());
19410       emit_insn (gen_nop ());
19411       emit_insn (gen_nop ());
19412       emit_insn (gen_nop ());
19413     }
19414
19415   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
19416     {
19417       reg_mode = V2SImode;
19418       reg_size = 8;
19419     }
19420
19421   strategy = rs6000_savres_strategy (info, /*savep=*/true,
19422                                      /*static_chain_p=*/using_static_chain_p,
19423                                      /*sibcall=*/0);
19424   using_store_multiple = strategy & SAVRES_MULTIPLE;
19425   saving_FPRs_inline = strategy & SAVRES_INLINE_FPRS;
19426   saving_GPRs_inline = strategy & SAVRES_INLINE_GPRS;
19427
19428   /* For V.4, update stack before we do any saving and set back pointer.  */
19429   if (! WORLD_SAVE_P (info)
19430       && info->push_p
19431       && (DEFAULT_ABI == ABI_V4
19432           || crtl->calls_eh_return))
19433     {
19434       bool need_r11 = (TARGET_SPE
19435                        ? (!saving_GPRs_inline
19436                           && info->spe_64bit_regs_used == 0)
19437                        : (!saving_FPRs_inline || !saving_GPRs_inline));
19438       rtx copy_reg = need_r11 ? gen_rtx_REG (Pmode, 11) : NULL;
19439
19440       if (info->total_size < 32767)
19441         sp_offset = info->total_size;
19442       else if (need_r11)
19443         frame_reg_rtx = copy_reg;
19444       else if (info->cr_save_p
19445                || info->lr_save_p
19446                || info->first_fp_reg_save < 64
19447                || info->first_gp_reg_save < 32
19448                || info->altivec_size != 0
19449                || info->vrsave_mask != 0
19450                || crtl->calls_eh_return)
19451         {
19452           copy_reg = frame_ptr_rtx;
19453           frame_reg_rtx = copy_reg;
19454         }
19455       else
19456         {
19457           /* The prologue won't be saving any regs so there is no need
19458              to set up a frame register to access any frame save area.
19459              We also won't be using sp_offset anywhere below, but set
19460              the correct value anyway to protect against future
19461              changes to this function.  */
19462           sp_offset = info->total_size;
19463         }
19464       rs6000_emit_allocate_stack (info->total_size, copy_reg);
19465       if (frame_reg_rtx != sp_reg_rtx)
19466         rs6000_emit_stack_tie ();
19467     }
19468
19469   /* Handle world saves specially here.  */
19470   if (WORLD_SAVE_P (info))
19471     {
19472       int i, j, sz;
19473       rtx treg;
19474       rtvec p;
19475       rtx reg0;
19476
19477       /* save_world expects lr in r0. */
19478       reg0 = gen_rtx_REG (Pmode, 0);
19479       if (info->lr_save_p)
19480         {
19481           insn = emit_move_insn (reg0,
19482                                  gen_rtx_REG (Pmode, LR_REGNO));
19483           RTX_FRAME_RELATED_P (insn) = 1;
19484         }
19485
19486       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
19487          assumptions about the offsets of various bits of the stack
19488          frame.  */
19489       gcc_assert (info->gp_save_offset == -220
19490                   && info->fp_save_offset == -144
19491                   && info->lr_save_offset == 8
19492                   && info->cr_save_offset == 4
19493                   && info->push_p
19494                   && info->lr_save_p
19495                   && (!crtl->calls_eh_return
19496                        || info->ehrd_offset == -432)
19497                   && info->vrsave_save_offset == -224
19498                   && info->altivec_save_offset == -416);
19499
19500       treg = gen_rtx_REG (SImode, 11);
19501       emit_move_insn (treg, GEN_INT (-info->total_size));
19502
19503       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
19504          in R11.  It also clobbers R12, so beware!  */
19505
19506       /* Preserve CR2 for save_world prologues */
19507       sz = 5;
19508       sz += 32 - info->first_gp_reg_save;
19509       sz += 64 - info->first_fp_reg_save;
19510       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
19511       p = rtvec_alloc (sz);
19512       j = 0;
19513       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
19514                                             gen_rtx_REG (SImode,
19515                                                          LR_REGNO));
19516       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
19517                                         gen_rtx_SYMBOL_REF (Pmode,
19518                                                             "*save_world"));
19519       /* We do floats first so that the instruction pattern matches
19520          properly.  */
19521       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
19522         {
19523           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19524                                    ? DFmode : SFmode), 
19525                                  info->first_fp_reg_save + i);
19526           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19527                                    GEN_INT (info->fp_save_offset
19528                                             + sp_offset + 8 * i));
19529           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19530                                      ? DFmode : SFmode), addr);
19531
19532           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19533         }
19534       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
19535         {
19536           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
19537           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19538                                    GEN_INT (info->altivec_save_offset
19539                                             + sp_offset + 16 * i));
19540           rtx mem = gen_frame_mem (V4SImode, addr);
19541
19542           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19543         }
19544       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
19545         {
19546           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
19547           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19548                                    GEN_INT (info->gp_save_offset
19549                                             + sp_offset + reg_size * i));
19550           rtx mem = gen_frame_mem (reg_mode, addr);
19551
19552           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19553         }
19554
19555       {
19556         /* CR register traditionally saved as CR2.  */
19557         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
19558         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19559                                  GEN_INT (info->cr_save_offset
19560                                           + sp_offset));
19561         rtx mem = gen_frame_mem (reg_mode, addr);
19562
19563         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19564       }
19565       /* Explain about use of R0.  */
19566       if (info->lr_save_p)
19567         {
19568           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19569                                    GEN_INT (info->lr_save_offset
19570                                             + sp_offset));
19571           rtx mem = gen_frame_mem (reg_mode, addr);
19572
19573           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
19574         }
19575       /* Explain what happens to the stack pointer.  */
19576       {
19577         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
19578         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
19579       }
19580
19581       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
19582       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19583                             treg, GEN_INT (-info->total_size));
19584       sp_offset = info->total_size;
19585     }
19586
19587   /* If we use the link register, get it into r0.  */
19588   if (!WORLD_SAVE_P (info) && info->lr_save_p)
19589     {
19590       rtx addr, reg, mem;
19591
19592       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
19593                              gen_rtx_REG (Pmode, LR_REGNO));
19594       RTX_FRAME_RELATED_P (insn) = 1;
19595
19596       if (!(strategy & (SAVRES_NOINLINE_GPRS_SAVES_LR
19597                         | SAVRES_NOINLINE_FPRS_SAVES_LR)))
19598         {
19599           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19600                                GEN_INT (info->lr_save_offset + sp_offset));
19601           reg = gen_rtx_REG (Pmode, 0);
19602           mem = gen_rtx_MEM (Pmode, addr);
19603           /* This should not be of rs6000_sr_alias_set, because of
19604              __builtin_return_address.  */
19605
19606           insn = emit_move_insn (mem, reg);
19607           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19608                                 NULL_RTX, NULL_RTX);
19609         }
19610     }
19611
19612   /* If we need to save CR, put it into r12 or r11.  */
19613   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
19614     {
19615       rtx set;
19616
19617       cr_save_rtx
19618         = gen_rtx_REG (SImode, DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline
19619                        ? 11 : 12);
19620       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
19621       RTX_FRAME_RELATED_P (insn) = 1;
19622       /* Now, there's no way that dwarf2out_frame_debug_expr is going
19623          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
19624          But that's OK.  All we have to do is specify that _one_ condition
19625          code register is saved in this stack slot.  The thrower's epilogue
19626          will then restore all the call-saved registers.
19627          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
19628       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
19629                          gen_rtx_REG (SImode, CR2_REGNO));
19630       add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
19631     }
19632
19633   /* Do any required saving of fpr's.  If only one or two to save, do
19634      it ourselves.  Otherwise, call function.  */
19635   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
19636     {
19637       int i;
19638       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
19639         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
19640              && ! call_used_regs[info->first_fp_reg_save+i]))
19641           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, 
19642                            (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19643                             ? DFmode : SFmode,
19644                            info->first_fp_reg_save + i,
19645                            info->fp_save_offset + sp_offset + 8 * i,
19646                            info->total_size);
19647     }
19648   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
19649     {
19650       rtx par;
19651
19652       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
19653                                     info->fp_save_offset + sp_offset,
19654                                     DFmode,
19655                                     /*savep=*/true, /*gpr=*/false,
19656                                     /*lr=*/(strategy
19657                                             & SAVRES_NOINLINE_FPRS_SAVES_LR)
19658                                            != 0);
19659       insn = emit_insn (par);
19660       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19661                             NULL_RTX, NULL_RTX);
19662     }
19663
19664   /* Save GPRs.  This is done as a PARALLEL if we are using
19665      the store-multiple instructions.  */
19666   if (!WORLD_SAVE_P (info)
19667       && TARGET_SPE_ABI
19668       && info->spe_64bit_regs_used != 0
19669       && info->first_gp_reg_save != 32)
19670     {
19671       int i;
19672       rtx spe_save_area_ptr;
19673  
19674       /* Determine whether we can address all of the registers that need
19675          to be saved with an offset from the stack pointer that fits in
19676          the small const field for SPE memory instructions.  */
19677       int spe_regs_addressable_via_sp
19678         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
19679                                + (32 - info->first_gp_reg_save - 1) * reg_size)
19680            && saving_GPRs_inline);
19681       int spe_offset;
19682  
19683       if (spe_regs_addressable_via_sp)
19684         {
19685           spe_save_area_ptr = frame_reg_rtx;
19686           spe_offset = info->spe_gp_save_offset + sp_offset;
19687         }
19688       else
19689         {
19690           /* Make r11 point to the start of the SPE save area.  We need
19691              to be careful here if r11 is holding the static chain.  If
19692              it is, then temporarily save it in r0.  We would use r0 as
19693              our base register here, but using r0 as a base register in
19694              loads and stores means something different from what we
19695              would like.  */
19696           int ool_adjust = (saving_GPRs_inline
19697                             ? 0
19698                             : (info->first_gp_reg_save
19699                                - (FIRST_SAVRES_REGISTER+1))*8);
19700           HOST_WIDE_INT offset = (info->spe_gp_save_offset
19701                                   + sp_offset - ool_adjust);
19702
19703           if (using_static_chain_p)
19704             {
19705               rtx r0 = gen_rtx_REG (Pmode, 0);
19706               gcc_assert (info->first_gp_reg_save > 11);
19707  
19708               emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
19709             }
19710  
19711           spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
19712           insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
19713                                         frame_reg_rtx,
19714                                         GEN_INT (offset)));
19715           /* We need to make sure the move to r11 gets noted for
19716              properly outputting unwind information.  */
19717           if (!saving_GPRs_inline)
19718             rs6000_frame_related (insn, frame_reg_rtx, offset,
19719                                   NULL_RTX, NULL_RTX);
19720           spe_offset = 0;
19721         }
19722  
19723       if (saving_GPRs_inline)
19724         {
19725           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
19726             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
19727               {
19728                 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
19729                 rtx offset, addr, mem;
19730
19731                 /* We're doing all this to ensure that the offset fits into
19732                    the immediate offset of 'evstdd'.  */
19733                 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
19734  
19735                 offset = GEN_INT (reg_size * i + spe_offset);
19736                 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
19737                 mem = gen_rtx_MEM (V2SImode, addr);
19738   
19739                 insn = emit_move_insn (mem, reg);
19740            
19741                 rs6000_frame_related (insn, spe_save_area_ptr,
19742                                       info->spe_gp_save_offset
19743                                       + sp_offset + reg_size * i,
19744                                       offset, const0_rtx);
19745               }
19746         }
19747       else
19748         {
19749           rtx par;
19750
19751           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
19752                                         0, reg_mode,
19753                                         /*savep=*/true, /*gpr=*/true,
19754                                         /*lr=*/false);
19755           insn = emit_insn (par);
19756           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19757                                 NULL_RTX, NULL_RTX);
19758         }
19759                                         
19760  
19761       /* Move the static chain pointer back.  */
19762       if (using_static_chain_p && !spe_regs_addressable_via_sp)
19763         emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
19764     }
19765   else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
19766     {
19767       rtx par;
19768
19769       /* Need to adjust r11 (r12) if we saved any FPRs.  */
19770       if (info->first_fp_reg_save != 64)
19771         {
19772           rtx dest_reg = gen_rtx_REG (reg_mode, DEFAULT_ABI == ABI_AIX
19773                                       ? 12 : 11);
19774           rtx offset = GEN_INT (sp_offset
19775                                 + (-8 * (64-info->first_fp_reg_save)));
19776           emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx, offset));
19777         }
19778
19779       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
19780                                     info->gp_save_offset + sp_offset,
19781                                     reg_mode,
19782                                     /*savep=*/true, /*gpr=*/true,
19783                                     /*lr=*/(strategy
19784                                             & SAVRES_NOINLINE_GPRS_SAVES_LR)
19785                                            != 0);
19786       insn = emit_insn (par);
19787       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19788                             NULL_RTX, NULL_RTX);
19789     }
19790   else if (!WORLD_SAVE_P (info) && using_store_multiple)
19791     {
19792       rtvec p;
19793       int i;
19794       p = rtvec_alloc (32 - info->first_gp_reg_save);
19795       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
19796         {
19797           rtx addr, reg, mem;
19798           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
19799           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19800                                GEN_INT (info->gp_save_offset
19801                                         + sp_offset
19802                                         + reg_size * i));
19803           mem = gen_frame_mem (reg_mode, addr);
19804
19805           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
19806         }
19807       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
19808       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19809                             NULL_RTX, NULL_RTX);
19810     }
19811   else if (!WORLD_SAVE_P (info))
19812     {
19813       int i;
19814       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
19815         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
19816           {
19817             rtx addr, reg, mem;
19818             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
19819
19820             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19821                                  GEN_INT (info->gp_save_offset
19822                                           + sp_offset
19823                                           + reg_size * i));
19824             mem = gen_frame_mem (reg_mode, addr);
19825
19826             insn = emit_move_insn (mem, reg);
19827             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19828                                   NULL_RTX, NULL_RTX);
19829           }
19830     }
19831
19832   /* ??? There's no need to emit actual instructions here, but it's the
19833      easiest way to get the frame unwind information emitted.  */
19834   if (crtl->calls_eh_return)
19835     {
19836       unsigned int i, regno;
19837
19838       /* In AIX ABI we need to pretend we save r2 here.  */
19839       if (TARGET_AIX)
19840         {
19841           rtx addr, reg, mem;
19842
19843           reg = gen_rtx_REG (reg_mode, 2);
19844           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19845                                GEN_INT (sp_offset + 5 * reg_size));
19846           mem = gen_frame_mem (reg_mode, addr);
19847
19848           insn = emit_move_insn (mem, reg);
19849           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19850                                 NULL_RTX, NULL_RTX);
19851           PATTERN (insn) = gen_blockage ();
19852         }
19853
19854       for (i = 0; ; ++i)
19855         {
19856           regno = EH_RETURN_DATA_REGNO (i);
19857           if (regno == INVALID_REGNUM)
19858             break;
19859
19860           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
19861                            info->ehrd_offset + sp_offset
19862                            + reg_size * (int) i,
19863                            info->total_size);
19864         }
19865     }
19866
19867   /* Save CR if we use any that must be preserved.  */
19868   if (!WORLD_SAVE_P (info) && info->cr_save_p)
19869     {
19870       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19871                                GEN_INT (info->cr_save_offset + sp_offset));
19872       rtx mem = gen_frame_mem (SImode, addr);
19873       /* See the large comment above about why CR2_REGNO is used.  */
19874       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
19875
19876       /* If r12 was used to hold the original sp, copy cr into r0 now
19877          that it's free.  */
19878       if (REGNO (frame_reg_rtx) == 12)
19879         {
19880           rtx set;
19881
19882           cr_save_rtx = gen_rtx_REG (SImode, 0);
19883           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
19884           RTX_FRAME_RELATED_P (insn) = 1;
19885           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
19886           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
19887         }
19888       insn = emit_move_insn (mem, cr_save_rtx);
19889
19890       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19891                             NULL_RTX, NULL_RTX);
19892     }
19893
19894   /* Update stack and set back pointer unless this is V.4,
19895      for which it was done previously.  */
19896   if (!WORLD_SAVE_P (info) && info->push_p
19897       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
19898     {
19899       rtx copy_reg = NULL;
19900
19901       if (info->total_size < 32767)
19902         sp_offset = info->total_size;
19903       else if (info->altivec_size != 0
19904                || info->vrsave_mask != 0)
19905         {
19906           copy_reg = frame_ptr_rtx;
19907           frame_reg_rtx = copy_reg;
19908         }
19909       else
19910         sp_offset = info->total_size;
19911       rs6000_emit_allocate_stack (info->total_size, copy_reg);
19912       if (frame_reg_rtx != sp_reg_rtx)
19913         rs6000_emit_stack_tie ();
19914     }
19915
19916   /* Set frame pointer, if needed.  */
19917   if (frame_pointer_needed)
19918     {
19919       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
19920                              sp_reg_rtx);
19921       RTX_FRAME_RELATED_P (insn) = 1;
19922     }
19923
19924   /* Save AltiVec registers if needed.  Save here because the red zone does
19925      not include AltiVec registers.  */
19926   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
19927     {
19928       int i;
19929
19930       /* There should be a non inline version of this, for when we
19931          are saving lots of vector registers.  */
19932       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
19933         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
19934           {
19935             rtx areg, savereg, mem;
19936             int offset;
19937
19938             offset = info->altivec_save_offset + sp_offset
19939               + 16 * (i - info->first_altivec_reg_save);
19940
19941             savereg = gen_rtx_REG (V4SImode, i);
19942
19943             areg = gen_rtx_REG (Pmode, 0);
19944             emit_move_insn (areg, GEN_INT (offset));
19945
19946             /* AltiVec addressing mode is [reg+reg].  */
19947             mem = gen_frame_mem (V4SImode,
19948                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
19949
19950             insn = emit_move_insn (mem, savereg);
19951
19952             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
19953                                   areg, GEN_INT (offset));
19954           }
19955     }
19956
19957   /* VRSAVE is a bit vector representing which AltiVec registers
19958      are used.  The OS uses this to determine which vector
19959      registers to save on a context switch.  We need to save
19960      VRSAVE on the stack frame, add whatever AltiVec registers we
19961      used in this function, and do the corresponding magic in the
19962      epilogue.  */
19963
19964   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
19965       && info->vrsave_mask != 0)
19966     {
19967       rtx reg, mem, vrsave;
19968       int offset;
19969
19970       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
19971          as frame_reg_rtx and r11 as the static chain pointer for
19972          nested functions.  */
19973       reg = gen_rtx_REG (SImode, 0);
19974       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
19975       if (TARGET_MACHO)
19976         emit_insn (gen_get_vrsave_internal (reg));
19977       else
19978         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
19979
19980       if (!WORLD_SAVE_P (info))
19981         {
19982           /* Save VRSAVE.  */
19983           offset = info->vrsave_save_offset + sp_offset;
19984           mem = gen_frame_mem (SImode,
19985                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
19986                                              GEN_INT (offset)));
19987           insn = emit_move_insn (mem, reg);
19988         }
19989
19990       /* Include the registers in the mask.  */
19991       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
19992
19993       insn = emit_insn (generate_set_vrsave (reg, info, 0));
19994     }
19995
19996   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
19997   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
19998       || (DEFAULT_ABI == ABI_V4
19999           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
20000           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
20001     {
20002       /* If emit_load_toc_table will use the link register, we need to save
20003          it.  We use R12 for this purpose because emit_load_toc_table
20004          can use register 0.  This allows us to use a plain 'blr' to return
20005          from the procedure more often.  */
20006       int save_LR_around_toc_setup = (TARGET_ELF
20007                                       && DEFAULT_ABI != ABI_AIX
20008                                       && flag_pic
20009                                       && ! info->lr_save_p
20010                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
20011       if (save_LR_around_toc_setup)
20012         {
20013           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20014
20015           insn = emit_move_insn (frame_ptr_rtx, lr);
20016           RTX_FRAME_RELATED_P (insn) = 1;
20017
20018           rs6000_emit_load_toc_table (TRUE);
20019
20020           insn = emit_move_insn (lr, frame_ptr_rtx);
20021           RTX_FRAME_RELATED_P (insn) = 1;
20022         }
20023       else
20024         rs6000_emit_load_toc_table (TRUE);
20025     }
20026
20027 #if TARGET_MACHO
20028   if (DEFAULT_ABI == ABI_DARWIN
20029       && flag_pic && crtl->uses_pic_offset_table)
20030     {
20031       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20032       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
20033
20034       /* Save and restore LR locally around this call (in R0).  */
20035       if (!info->lr_save_p)
20036         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
20037
20038       emit_insn (gen_load_macho_picbase (src));
20039
20040       emit_move_insn (gen_rtx_REG (Pmode,
20041                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
20042                       lr);
20043
20044       if (!info->lr_save_p)
20045         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
20046     }
20047 #endif
20048 }
20049
20050 /* Write function prologue.  */
20051
20052 static void
20053 rs6000_output_function_prologue (FILE *file,
20054                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
20055 {
20056   rs6000_stack_t *info = rs6000_stack_info ();
20057
20058   if (TARGET_DEBUG_STACK)
20059     debug_stack_info (info);
20060
20061   /* Write .extern for any function we will call to save and restore
20062      fp values.  */
20063   if (info->first_fp_reg_save < 64
20064       && !FP_SAVE_INLINE (info->first_fp_reg_save))
20065     {
20066       char *name;
20067       int regno = info->first_fp_reg_save - 32;
20068
20069       name = rs6000_savres_routine_name (info, regno, /*savep=*/true,
20070                                          /*gpr=*/false, /*lr=*/false);
20071       fprintf (file, "\t.extern %s\n", name);
20072
20073       name = rs6000_savres_routine_name (info, regno, /*savep=*/false,
20074                                          /*gpr=*/false, /*lr=*/true);
20075       fprintf (file, "\t.extern %s\n", name);
20076     }
20077
20078   /* Write .extern for AIX common mode routines, if needed.  */
20079   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
20080     {
20081       fputs ("\t.extern __mulh\n", file);
20082       fputs ("\t.extern __mull\n", file);
20083       fputs ("\t.extern __divss\n", file);
20084       fputs ("\t.extern __divus\n", file);
20085       fputs ("\t.extern __quoss\n", file);
20086       fputs ("\t.extern __quous\n", file);
20087       common_mode_defined = 1;
20088     }
20089
20090   if (! HAVE_prologue)
20091     {
20092       rtx prologue;
20093
20094       start_sequence ();
20095
20096       /* A NOTE_INSN_DELETED is supposed to be at the start and end of
20097          the "toplevel" insn chain.  */
20098       emit_note (NOTE_INSN_DELETED);
20099       rs6000_emit_prologue ();
20100       emit_note (NOTE_INSN_DELETED);
20101
20102       /* Expand INSN_ADDRESSES so final() doesn't crash.  */
20103       {
20104         rtx insn;
20105         unsigned addr = 0;
20106         for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
20107           {
20108             INSN_ADDRESSES_NEW (insn, addr);
20109             addr += 4;
20110           }
20111       }
20112
20113       prologue = get_insns ();
20114       end_sequence ();
20115
20116       if (TARGET_DEBUG_STACK)
20117         debug_rtx_list (prologue, 100);
20118
20119       emit_insn_before_noloc (prologue, BB_HEAD (ENTRY_BLOCK_PTR->next_bb),
20120                               ENTRY_BLOCK_PTR);
20121     }
20122
20123   rs6000_pic_labelno++;
20124 }
20125
20126 /* Non-zero if vmx regs are restored before the frame pop, zero if
20127    we restore after the pop when possible.  */
20128 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
20129
20130 /* Reload CR from REG.  */
20131
20132 static void
20133 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
20134 {
20135   int count = 0;
20136   int i;
20137
20138   if (using_mfcr_multiple)
20139     {
20140       for (i = 0; i < 8; i++)
20141         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20142           count++;
20143       gcc_assert (count);
20144     }
20145
20146   if (using_mfcr_multiple && count > 1)
20147     {
20148       rtvec p;
20149       int ndx;
20150
20151       p = rtvec_alloc (count);
20152
20153       ndx = 0;
20154       for (i = 0; i < 8; i++)
20155         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20156           {
20157             rtvec r = rtvec_alloc (2);
20158             RTVEC_ELT (r, 0) = reg;
20159             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
20160             RTVEC_ELT (p, ndx) =
20161               gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
20162                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
20163             ndx++;
20164           }
20165       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20166       gcc_assert (ndx == count);
20167     }
20168   else
20169     for (i = 0; i < 8; i++)
20170       if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20171         {
20172           emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
20173                                                        CR0_REGNO+i),
20174                                           reg));
20175         }
20176 }
20177
20178 /* Return true if OFFSET from stack pointer can be clobbered by signals.
20179    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
20180    below stack pointer not cloberred by signals.  */
20181
20182 static inline bool
20183 offset_below_red_zone_p (HOST_WIDE_INT offset)
20184 {
20185   return offset < (DEFAULT_ABI == ABI_V4
20186                    ? 0
20187                    : TARGET_32BIT ? -220 : -288);
20188 }
20189
20190 /* Emit function epilogue as insns.  */
20191
20192 void
20193 rs6000_emit_epilogue (int sibcall)
20194 {
20195   rs6000_stack_t *info;
20196   int restoring_GPRs_inline;
20197   int restoring_FPRs_inline;
20198   int using_load_multiple;
20199   int using_mtcr_multiple;
20200   int use_backchain_to_restore_sp;
20201   int restore_lr;
20202   int strategy;
20203   int sp_offset = 0;
20204   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
20205   rtx frame_reg_rtx = sp_reg_rtx;
20206   rtx cfa_restores = NULL_RTX;
20207   rtx insn;
20208   rtx cr_save_reg = NULL_RTX;
20209   enum machine_mode reg_mode = Pmode;
20210   int reg_size = TARGET_32BIT ? 4 : 8;
20211   int i;
20212
20213   info = rs6000_stack_info ();
20214
20215   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
20216     {
20217       reg_mode = V2SImode;
20218       reg_size = 8;
20219     }
20220
20221   strategy = rs6000_savres_strategy (info, /*savep=*/false,
20222                                      /*static_chain_p=*/0, sibcall);
20223   using_load_multiple = strategy & SAVRES_MULTIPLE;
20224   restoring_FPRs_inline = strategy & SAVRES_INLINE_FPRS;
20225   restoring_GPRs_inline = strategy & SAVRES_INLINE_GPRS;
20226   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
20227                          || rs6000_cpu == PROCESSOR_PPC603
20228                          || rs6000_cpu == PROCESSOR_PPC750
20229                          || optimize_size);
20230   /* Restore via the backchain when we have a large frame, since this
20231      is more efficient than an addis, addi pair.  The second condition
20232      here will not trigger at the moment;  We don't actually need a
20233      frame pointer for alloca, but the generic parts of the compiler
20234      give us one anyway.  */
20235   use_backchain_to_restore_sp = (info->total_size > 32767
20236                                  || info->total_size
20237                                      + (info->lr_save_p ? info->lr_save_offset : 0)
20238                                        > 32767
20239                                  || (cfun->calls_alloca
20240                                      && !frame_pointer_needed));
20241   restore_lr = (info->lr_save_p
20242                 && (restoring_FPRs_inline
20243                     || (strategy & SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR))
20244                 && (restoring_GPRs_inline
20245                     || info->first_fp_reg_save < 64));
20246
20247   if (WORLD_SAVE_P (info))
20248     {
20249       int i, j;
20250       char rname[30];
20251       const char *alloc_rname;
20252       rtvec p;
20253
20254       /* eh_rest_world_r10 will return to the location saved in the LR
20255          stack slot (which is not likely to be our caller.)
20256          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
20257          rest_world is similar, except any R10 parameter is ignored.
20258          The exception-handling stuff that was here in 2.95 is no
20259          longer necessary.  */
20260
20261       p = rtvec_alloc (9
20262                        + 1
20263                        + 32 - info->first_gp_reg_save
20264                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
20265                        + 63 + 1 - info->first_fp_reg_save);
20266
20267       strcpy (rname, ((crtl->calls_eh_return) ?
20268                       "*eh_rest_world_r10" : "*rest_world"));
20269       alloc_rname = ggc_strdup (rname);
20270
20271       j = 0;
20272       RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
20273       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
20274                                         gen_rtx_REG (Pmode,
20275                                                      LR_REGNO));
20276       RTVEC_ELT (p, j++)
20277         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
20278       /* The instruction pattern requires a clobber here;
20279          it is shared with the restVEC helper. */
20280       RTVEC_ELT (p, j++)
20281         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
20282
20283       {
20284         /* CR register traditionally saved as CR2.  */
20285         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20286         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20287                                  GEN_INT (info->cr_save_offset));
20288         rtx mem = gen_frame_mem (reg_mode, addr);
20289
20290         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20291       }
20292
20293       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20294         {
20295           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20296           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20297                                    GEN_INT (info->gp_save_offset
20298                                             + reg_size * i));
20299           rtx mem = gen_frame_mem (reg_mode, addr);
20300
20301           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20302         }
20303       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
20304         {
20305           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
20306           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20307                                    GEN_INT (info->altivec_save_offset
20308                                             + 16 * i));
20309           rtx mem = gen_frame_mem (V4SImode, addr);
20310
20311           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20312         }
20313       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
20314         {
20315           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20316                                    ? DFmode : SFmode), 
20317                                  info->first_fp_reg_save + i);
20318           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20319                                    GEN_INT (info->fp_save_offset
20320                                             + 8 * i));
20321           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20322                                      ? DFmode : SFmode), addr);
20323
20324           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20325         }
20326       RTVEC_ELT (p, j++)
20327         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
20328       RTVEC_ELT (p, j++)
20329         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
20330       RTVEC_ELT (p, j++)
20331         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
20332       RTVEC_ELT (p, j++)
20333         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
20334       RTVEC_ELT (p, j++)
20335         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
20336       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
20337
20338       return;
20339     }
20340
20341   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
20342   if (info->push_p)
20343     sp_offset = info->total_size;
20344
20345   /* Restore AltiVec registers if we must do so before adjusting the
20346      stack.  */
20347   if (TARGET_ALTIVEC_ABI
20348       && info->altivec_size != 0
20349       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20350           || (DEFAULT_ABI != ABI_V4
20351               && offset_below_red_zone_p (info->altivec_save_offset))))
20352     {
20353       int i;
20354
20355       if (use_backchain_to_restore_sp)
20356         {
20357           frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20358           emit_move_insn (frame_reg_rtx,
20359                           gen_rtx_MEM (Pmode, sp_reg_rtx));
20360           sp_offset = 0;
20361         }
20362       else if (frame_pointer_needed)
20363         frame_reg_rtx = hard_frame_pointer_rtx;
20364
20365       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20366         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20367           {
20368             rtx addr, areg, mem, reg;
20369
20370             areg = gen_rtx_REG (Pmode, 0);
20371             emit_move_insn
20372               (areg, GEN_INT (info->altivec_save_offset
20373                               + sp_offset
20374                               + 16 * (i - info->first_altivec_reg_save)));
20375
20376             /* AltiVec addressing mode is [reg+reg].  */
20377             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20378             mem = gen_frame_mem (V4SImode, addr);
20379
20380             reg = gen_rtx_REG (V4SImode, i);
20381             emit_move_insn (reg, mem);
20382             if (offset_below_red_zone_p (info->altivec_save_offset
20383                                          + (i - info->first_altivec_reg_save)
20384                                            * 16))
20385               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20386                                              cfa_restores);
20387           }
20388     }
20389
20390   /* Restore VRSAVE if we must do so before adjusting the stack.  */
20391   if (TARGET_ALTIVEC
20392       && TARGET_ALTIVEC_VRSAVE
20393       && info->vrsave_mask != 0
20394       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20395           || (DEFAULT_ABI != ABI_V4
20396               && offset_below_red_zone_p (info->vrsave_save_offset))))
20397     {
20398       rtx addr, mem, reg;
20399
20400       if (frame_reg_rtx == sp_reg_rtx)
20401         {
20402           if (use_backchain_to_restore_sp)
20403             {
20404               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20405               emit_move_insn (frame_reg_rtx,
20406                               gen_rtx_MEM (Pmode, sp_reg_rtx));
20407               sp_offset = 0;
20408             }
20409           else if (frame_pointer_needed)
20410             frame_reg_rtx = hard_frame_pointer_rtx;
20411         }
20412
20413       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20414                            GEN_INT (info->vrsave_save_offset + sp_offset));
20415       mem = gen_frame_mem (SImode, addr);
20416       reg = gen_rtx_REG (SImode, 12);
20417       emit_move_insn (reg, mem);
20418
20419       emit_insn (generate_set_vrsave (reg, info, 1));
20420     }
20421
20422   insn = NULL_RTX;
20423   /* If we have a large stack frame, restore the old stack pointer
20424      using the backchain.  */
20425   if (use_backchain_to_restore_sp)
20426     {
20427       if (frame_reg_rtx == sp_reg_rtx)
20428         {
20429           /* Under V.4, don't reset the stack pointer until after we're done
20430              loading the saved registers.  */
20431           if (DEFAULT_ABI == ABI_V4)
20432             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20433
20434           insn = emit_move_insn (frame_reg_rtx,
20435                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
20436           sp_offset = 0;
20437         }
20438       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20439                && DEFAULT_ABI == ABI_V4)
20440         /* frame_reg_rtx has been set up by the altivec restore.  */
20441         ;
20442       else
20443         {
20444           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
20445           frame_reg_rtx = sp_reg_rtx;
20446         }
20447     }
20448   /* If we have a frame pointer, we can restore the old stack pointer
20449      from it.  */
20450   else if (frame_pointer_needed)
20451     {
20452       frame_reg_rtx = sp_reg_rtx;
20453       if (DEFAULT_ABI == ABI_V4)
20454         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20455       /* Prevent reordering memory accesses against stack pointer restore.  */
20456       else if (cfun->calls_alloca
20457                || offset_below_red_zone_p (-info->total_size))
20458         {
20459           rtx mem1 = gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx);
20460           rtx mem2 = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20461           MEM_NOTRAP_P (mem1) = 1;
20462           MEM_NOTRAP_P (mem2) = 1;
20463           emit_insn (gen_frame_tie (mem1, mem2));
20464         }
20465
20466       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
20467                                        GEN_INT (info->total_size)));
20468       sp_offset = 0;
20469     }
20470   else if (info->push_p
20471            && DEFAULT_ABI != ABI_V4
20472            && !crtl->calls_eh_return)
20473     {
20474       /* Prevent reordering memory accesses against stack pointer restore.  */
20475       if (cfun->calls_alloca
20476           || offset_below_red_zone_p (-info->total_size))
20477         {
20478           rtx mem = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20479           MEM_NOTRAP_P (mem) = 1;
20480           emit_insn (gen_stack_tie (mem));
20481         }
20482       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
20483                                        GEN_INT (info->total_size)));
20484       sp_offset = 0;
20485     }
20486   if (insn && frame_reg_rtx == sp_reg_rtx)
20487     {
20488       if (cfa_restores)
20489         {
20490           REG_NOTES (insn) = cfa_restores;
20491           cfa_restores = NULL_RTX;
20492         }
20493       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
20494       RTX_FRAME_RELATED_P (insn) = 1;
20495     }
20496
20497   /* Restore AltiVec registers if we have not done so already.  */
20498   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20499       && TARGET_ALTIVEC_ABI
20500       && info->altivec_size != 0
20501       && (DEFAULT_ABI == ABI_V4
20502           || !offset_below_red_zone_p (info->altivec_save_offset)))
20503     {
20504       int i;
20505
20506       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20507         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20508           {
20509             rtx addr, areg, mem, reg;
20510
20511             areg = gen_rtx_REG (Pmode, 0);
20512             emit_move_insn
20513               (areg, GEN_INT (info->altivec_save_offset
20514                               + sp_offset
20515                               + 16 * (i - info->first_altivec_reg_save)));
20516
20517             /* AltiVec addressing mode is [reg+reg].  */
20518             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20519             mem = gen_frame_mem (V4SImode, addr);
20520
20521             reg = gen_rtx_REG (V4SImode, i);
20522             emit_move_insn (reg, mem);
20523             if (DEFAULT_ABI == ABI_V4)
20524               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20525                                              cfa_restores);
20526           }
20527     }
20528
20529   /* Restore VRSAVE if we have not done so already.  */
20530   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20531       && TARGET_ALTIVEC
20532       && TARGET_ALTIVEC_VRSAVE
20533       && info->vrsave_mask != 0
20534       && (DEFAULT_ABI == ABI_V4
20535           || !offset_below_red_zone_p (info->vrsave_save_offset)))
20536     {
20537       rtx addr, mem, reg;
20538
20539       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20540                            GEN_INT (info->vrsave_save_offset + sp_offset));
20541       mem = gen_frame_mem (SImode, addr);
20542       reg = gen_rtx_REG (SImode, 12);
20543       emit_move_insn (reg, mem);
20544
20545       emit_insn (generate_set_vrsave (reg, info, 1));
20546     }
20547
20548   /* Get the old lr if we saved it.  If we are restoring registers
20549      out-of-line, then the out-of-line routines can do this for us.  */
20550   if (restore_lr && restoring_GPRs_inline)
20551     {
20552       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
20553                                       info->lr_save_offset + sp_offset);
20554
20555       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
20556     }
20557
20558   /* Get the old cr if we saved it.  */
20559   if (info->cr_save_p)
20560     {
20561       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20562                                GEN_INT (info->cr_save_offset + sp_offset));
20563       rtx mem = gen_frame_mem (SImode, addr);
20564
20565       cr_save_reg = gen_rtx_REG (SImode,
20566                                  DEFAULT_ABI == ABI_AIX
20567                                  && !restoring_GPRs_inline
20568                                  && info->first_fp_reg_save < 64
20569                                  ? 11 : 12);
20570       emit_move_insn (cr_save_reg, mem);
20571     }
20572
20573   /* Set LR here to try to overlap restores below.  LR is always saved
20574      above incoming stack, so it never needs REG_CFA_RESTORE.  */
20575   if (restore_lr && restoring_GPRs_inline)
20576     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
20577                     gen_rtx_REG (Pmode, 0));
20578
20579   /* Load exception handler data registers, if needed.  */
20580   if (crtl->calls_eh_return)
20581     {
20582       unsigned int i, regno;
20583
20584       if (TARGET_AIX)
20585         {
20586           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20587                                    GEN_INT (sp_offset + 5 * reg_size));
20588           rtx mem = gen_frame_mem (reg_mode, addr);
20589
20590           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
20591         }
20592
20593       for (i = 0; ; ++i)
20594         {
20595           rtx mem;
20596
20597           regno = EH_RETURN_DATA_REGNO (i);
20598           if (regno == INVALID_REGNUM)
20599             break;
20600
20601           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
20602                                       info->ehrd_offset + sp_offset
20603                                       + reg_size * (int) i);
20604
20605           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
20606         }
20607     }
20608
20609   /* Restore GPRs.  This is done as a PARALLEL if we are using
20610      the load-multiple instructions.  */
20611   if (TARGET_SPE_ABI
20612       && info->spe_64bit_regs_used != 0
20613       && info->first_gp_reg_save != 32)
20614     {
20615       /* Determine whether we can address all of the registers that need
20616          to be saved with an offset from the stack pointer that fits in
20617          the small const field for SPE memory instructions.  */
20618       int spe_regs_addressable_via_sp
20619         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
20620                                + (32 - info->first_gp_reg_save - 1) * reg_size)
20621            && restoring_GPRs_inline);
20622       int spe_offset;
20623
20624       if (spe_regs_addressable_via_sp)
20625         spe_offset = info->spe_gp_save_offset + sp_offset;
20626       else
20627         {
20628           rtx old_frame_reg_rtx = frame_reg_rtx;
20629           /* Make r11 point to the start of the SPE save area.  We worried about
20630              not clobbering it when we were saving registers in the prologue.
20631              There's no need to worry here because the static chain is passed
20632              anew to every function.  */
20633           int ool_adjust = (restoring_GPRs_inline
20634                             ? 0
20635                             : (info->first_gp_reg_save
20636                                - (FIRST_SAVRES_REGISTER+1))*8);
20637
20638           if (frame_reg_rtx == sp_reg_rtx)
20639             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20640           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
20641                                  GEN_INT (info->spe_gp_save_offset
20642                                           + sp_offset
20643                                           - ool_adjust)));
20644           /* Keep the invariant that frame_reg_rtx + sp_offset points
20645              at the top of the stack frame.  */
20646           sp_offset = -info->spe_gp_save_offset;
20647
20648           spe_offset = 0;
20649         }
20650
20651       if (restoring_GPRs_inline)
20652         {
20653           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20654             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20655               {
20656                 rtx offset, addr, mem, reg;
20657
20658                 /* We're doing all this to ensure that the immediate offset
20659                    fits into the immediate field of 'evldd'.  */
20660                 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
20661
20662                 offset = GEN_INT (spe_offset + reg_size * i);
20663                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
20664                 mem = gen_rtx_MEM (V2SImode, addr);
20665                 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20666
20667                 insn = emit_move_insn (reg, mem);
20668                 if (DEFAULT_ABI == ABI_V4)
20669                   {
20670                     if (frame_pointer_needed
20671                         && info->first_gp_reg_save + i
20672                            == HARD_FRAME_POINTER_REGNUM)
20673                       {
20674                         add_reg_note (insn, REG_CFA_DEF_CFA,
20675                                       plus_constant (frame_reg_rtx,
20676                                                      sp_offset));
20677                         RTX_FRAME_RELATED_P (insn) = 1;
20678                       }
20679
20680                     cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20681                                                    cfa_restores);
20682                   }
20683               }
20684         }
20685       else
20686         {
20687           rtx par;
20688
20689           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
20690                                         0, reg_mode,
20691                                         /*savep=*/false, /*gpr=*/true,
20692                                         /*lr=*/true);
20693           emit_jump_insn (par);
20694           /* We don't want anybody else emitting things after we jumped
20695              back.  */
20696           return;
20697         }
20698     }
20699   else if (!restoring_GPRs_inline)
20700     {
20701       /* We are jumping to an out-of-line function.  */
20702       bool can_use_exit = info->first_fp_reg_save == 64;
20703       rtx par;
20704
20705       /* Emit stack reset code if we need it.  */
20706       if (can_use_exit)
20707         rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
20708                                  sp_offset, can_use_exit);
20709       else
20710         {
20711           emit_insn (gen_add3_insn (gen_rtx_REG (Pmode, DEFAULT_ABI == ABI_AIX
20712                                                         ? 12 : 11),
20713                                     frame_reg_rtx,
20714                                     GEN_INT (sp_offset - info->fp_size)));
20715           if (REGNO (frame_reg_rtx) == 11)
20716             sp_offset += info->fp_size;
20717         }
20718
20719       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20720                                     info->gp_save_offset, reg_mode,
20721                                     /*savep=*/false, /*gpr=*/true,
20722                                     /*lr=*/can_use_exit);
20723
20724       if (can_use_exit)
20725         {
20726           if (info->cr_save_p)
20727             {
20728               rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
20729               if (DEFAULT_ABI == ABI_V4)
20730                 cfa_restores
20731                   = alloc_reg_note (REG_CFA_RESTORE,
20732                                     gen_rtx_REG (SImode, CR2_REGNO),
20733                                     cfa_restores);
20734             }
20735
20736           emit_jump_insn (par);
20737
20738           /* We don't want anybody else emitting things after we jumped
20739              back.  */
20740           return;
20741         }
20742
20743       insn = emit_insn (par);
20744       if (DEFAULT_ABI == ABI_V4)
20745         {
20746           if (frame_pointer_needed)
20747             {
20748               add_reg_note (insn, REG_CFA_DEF_CFA,
20749                             plus_constant (frame_reg_rtx, sp_offset));
20750               RTX_FRAME_RELATED_P (insn) = 1;
20751             }
20752
20753           for (i = info->first_gp_reg_save; i < 32; i++)
20754             cfa_restores
20755               = alloc_reg_note (REG_CFA_RESTORE,
20756                                 gen_rtx_REG (reg_mode, i), cfa_restores);
20757         }
20758     }
20759   else if (using_load_multiple)
20760     {
20761       rtvec p;
20762       p = rtvec_alloc (32 - info->first_gp_reg_save);
20763       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20764         {
20765           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20766                                    GEN_INT (info->gp_save_offset
20767                                             + sp_offset
20768                                             + reg_size * i));
20769           rtx mem = gen_frame_mem (reg_mode, addr);
20770           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20771
20772           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, reg, mem);
20773           if (DEFAULT_ABI == ABI_V4)
20774             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20775                                            cfa_restores);
20776         }
20777       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20778       if (DEFAULT_ABI == ABI_V4 && frame_pointer_needed)
20779         {
20780           add_reg_note (insn, REG_CFA_DEF_CFA,
20781                         plus_constant (frame_reg_rtx, sp_offset));
20782           RTX_FRAME_RELATED_P (insn) = 1;
20783         }
20784     }
20785   else
20786     {
20787       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20788         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20789           {
20790             rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20791                                      GEN_INT (info->gp_save_offset
20792                                               + sp_offset
20793                                               + reg_size * i));
20794             rtx mem = gen_frame_mem (reg_mode, addr);
20795             rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20796
20797             insn = emit_move_insn (reg, mem);
20798             if (DEFAULT_ABI == ABI_V4)
20799               {
20800                 if (frame_pointer_needed
20801                     && info->first_gp_reg_save + i
20802                        == HARD_FRAME_POINTER_REGNUM)
20803                   {
20804                     add_reg_note (insn, REG_CFA_DEF_CFA,
20805                                   plus_constant (frame_reg_rtx, sp_offset));
20806                     RTX_FRAME_RELATED_P (insn) = 1;
20807                   }
20808
20809                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20810                                                cfa_restores);
20811               }
20812           }
20813     }
20814
20815   if (restore_lr && !restoring_GPRs_inline)
20816     {
20817       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
20818                                      info->lr_save_offset + sp_offset);
20819
20820       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
20821       emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
20822                       gen_rtx_REG (Pmode, 0));
20823     }
20824
20825   /* Restore fpr's if we need to do it without calling a function.  */
20826   if (restoring_FPRs_inline)
20827     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20828       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
20829            && ! call_used_regs[info->first_fp_reg_save+i]))
20830         {
20831           rtx addr, mem, reg;
20832           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20833                                GEN_INT (info->fp_save_offset
20834                                         + sp_offset
20835                                         + 8 * i));
20836           mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20837                                  ? DFmode : SFmode), addr);
20838           reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20839                                ? DFmode : SFmode),
20840                              info->first_fp_reg_save + i);
20841
20842           emit_move_insn (reg, mem);
20843           if (DEFAULT_ABI == ABI_V4)
20844             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20845                                            cfa_restores);
20846         }
20847
20848   /* If we saved cr, restore it here.  Just those that were used.  */
20849   if (info->cr_save_p)
20850     {
20851       rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
20852       if (DEFAULT_ABI == ABI_V4)
20853         cfa_restores
20854           = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, CR2_REGNO),
20855                             cfa_restores);
20856     }
20857
20858   /* If this is V.4, unwind the stack pointer after all of the loads
20859      have been done.  */
20860   insn = rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
20861                                   sp_offset, !restoring_FPRs_inline);
20862   if (insn)
20863     {
20864       if (cfa_restores)
20865         {
20866           REG_NOTES (insn) = cfa_restores;
20867           cfa_restores = NULL_RTX;
20868         }
20869       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
20870       RTX_FRAME_RELATED_P (insn) = 1;
20871     }
20872
20873   if (crtl->calls_eh_return)
20874     {
20875       rtx sa = EH_RETURN_STACKADJ_RTX;
20876       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
20877     }
20878
20879   if (!sibcall)
20880     {
20881       rtvec p;
20882       bool lr = (strategy & SAVRES_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
20883       if (! restoring_FPRs_inline)
20884         p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
20885       else
20886         p = rtvec_alloc (2);
20887
20888       RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
20889       RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
20890                           ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
20891                           : gen_rtx_CLOBBER (VOIDmode,
20892                                              gen_rtx_REG (Pmode, 65)));
20893
20894       /* If we have to restore more than two FP registers, branch to the
20895          restore function.  It will return to our caller.  */
20896       if (! restoring_FPRs_inline)
20897         {
20898           int i;
20899           rtx sym;
20900
20901           sym = rs6000_savres_routine_sym (info,
20902                                            /*savep=*/false,
20903                                            /*gpr=*/false,
20904                                            /*lr=*/lr);
20905           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
20906           RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
20907                                           gen_rtx_REG (Pmode,
20908                                                        DEFAULT_ABI == ABI_AIX
20909                                                        ? 1 : 11));
20910           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20911             {
20912               rtx addr, mem;
20913               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
20914                                    GEN_INT (info->fp_save_offset + 8*i));
20915               mem = gen_frame_mem (DFmode, addr);
20916
20917               RTVEC_ELT (p, i+4) =
20918                 gen_rtx_SET (VOIDmode,
20919                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
20920                              mem);
20921             }
20922         }
20923
20924       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
20925     }
20926 }
20927
20928 /* Write function epilogue.  */
20929
20930 static void
20931 rs6000_output_function_epilogue (FILE *file,
20932                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
20933 {
20934   if (! HAVE_epilogue)
20935     {
20936       rtx insn = get_last_insn ();
20937       /* If the last insn was a BARRIER, we don't have to write anything except
20938          the trace table.  */
20939       if (GET_CODE (insn) == NOTE)
20940         insn = prev_nonnote_insn (insn);
20941       if (insn == 0 ||  GET_CODE (insn) != BARRIER)
20942         {
20943           /* This is slightly ugly, but at least we don't have two
20944              copies of the epilogue-emitting code.  */
20945           start_sequence ();
20946
20947           /* A NOTE_INSN_DELETED is supposed to be at the start
20948              and end of the "toplevel" insn chain.  */
20949           emit_note (NOTE_INSN_DELETED);
20950           rs6000_emit_epilogue (FALSE);
20951           emit_note (NOTE_INSN_DELETED);
20952
20953           /* Expand INSN_ADDRESSES so final() doesn't crash.  */
20954           {
20955             rtx insn;
20956             unsigned addr = 0;
20957             for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
20958               {
20959                 INSN_ADDRESSES_NEW (insn, addr);
20960                 addr += 4;
20961               }
20962           }
20963
20964           if (TARGET_DEBUG_STACK)
20965             debug_rtx_list (get_insns (), 100);
20966           final (get_insns (), file, FALSE);
20967           end_sequence ();
20968         }
20969     }
20970
20971 #if TARGET_MACHO
20972   macho_branch_islands ();
20973   /* Mach-O doesn't support labels at the end of objects, so if
20974      it looks like we might want one, insert a NOP.  */
20975   {
20976     rtx insn = get_last_insn ();
20977     while (insn
20978            && NOTE_P (insn)
20979            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
20980       insn = PREV_INSN (insn);
20981     if (insn
20982         && (LABEL_P (insn)
20983             || (NOTE_P (insn)
20984                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
20985       fputs ("\tnop\n", file);
20986   }
20987 #endif
20988
20989   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
20990      on its format.
20991
20992      We don't output a traceback table if -finhibit-size-directive was
20993      used.  The documentation for -finhibit-size-directive reads
20994      ``don't output a @code{.size} assembler directive, or anything
20995      else that would cause trouble if the function is split in the
20996      middle, and the two halves are placed at locations far apart in
20997      memory.''  The traceback table has this property, since it
20998      includes the offset from the start of the function to the
20999      traceback table itself.
21000
21001      System V.4 Powerpc's (and the embedded ABI derived from it) use a
21002      different traceback table.  */
21003   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
21004       && rs6000_traceback != traceback_none && !cfun->is_thunk)
21005     {
21006       const char *fname = NULL;
21007       const char *language_string = lang_hooks.name;
21008       int fixed_parms = 0, float_parms = 0, parm_info = 0;
21009       int i;
21010       int optional_tbtab;
21011       rs6000_stack_t *info = rs6000_stack_info ();
21012
21013       if (rs6000_traceback == traceback_full)
21014         optional_tbtab = 1;
21015       else if (rs6000_traceback == traceback_part)
21016         optional_tbtab = 0;
21017       else
21018         optional_tbtab = !optimize_size && !TARGET_ELF;
21019
21020       if (optional_tbtab)
21021         {
21022           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
21023           while (*fname == '.') /* V.4 encodes . in the name */
21024             fname++;
21025
21026           /* Need label immediately before tbtab, so we can compute
21027              its offset from the function start.  */
21028           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21029           ASM_OUTPUT_LABEL (file, fname);
21030         }
21031
21032       /* The .tbtab pseudo-op can only be used for the first eight
21033          expressions, since it can't handle the possibly variable
21034          length fields that follow.  However, if you omit the optional
21035          fields, the assembler outputs zeros for all optional fields
21036          anyways, giving each variable length field is minimum length
21037          (as defined in sys/debug.h).  Thus we can not use the .tbtab
21038          pseudo-op at all.  */
21039
21040       /* An all-zero word flags the start of the tbtab, for debuggers
21041          that have to find it by searching forward from the entry
21042          point or from the current pc.  */
21043       fputs ("\t.long 0\n", file);
21044
21045       /* Tbtab format type.  Use format type 0.  */
21046       fputs ("\t.byte 0,", file);
21047
21048       /* Language type.  Unfortunately, there does not seem to be any
21049          official way to discover the language being compiled, so we
21050          use language_string.
21051          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
21052          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
21053          a number, so for now use 9.  LTO isn't assigned a number either,
21054          so for now use 0.  */
21055       if (! strcmp (language_string, "GNU C")
21056           || ! strcmp (language_string, "GNU GIMPLE"))
21057         i = 0;
21058       else if (! strcmp (language_string, "GNU F77")
21059                || ! strcmp (language_string, "GNU Fortran"))
21060         i = 1;
21061       else if (! strcmp (language_string, "GNU Pascal"))
21062         i = 2;
21063       else if (! strcmp (language_string, "GNU Ada"))
21064         i = 3;
21065       else if (! strcmp (language_string, "GNU C++")
21066                || ! strcmp (language_string, "GNU Objective-C++"))
21067         i = 9;
21068       else if (! strcmp (language_string, "GNU Java"))
21069         i = 13;
21070       else if (! strcmp (language_string, "GNU Objective-C"))
21071         i = 14;
21072       else
21073         gcc_unreachable ();
21074       fprintf (file, "%d,", i);
21075
21076       /* 8 single bit fields: global linkage (not set for C extern linkage,
21077          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
21078          from start of procedure stored in tbtab, internal function, function
21079          has controlled storage, function has no toc, function uses fp,
21080          function logs/aborts fp operations.  */
21081       /* Assume that fp operations are used if any fp reg must be saved.  */
21082       fprintf (file, "%d,",
21083                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
21084
21085       /* 6 bitfields: function is interrupt handler, name present in
21086          proc table, function calls alloca, on condition directives
21087          (controls stack walks, 3 bits), saves condition reg, saves
21088          link reg.  */
21089       /* The `function calls alloca' bit seems to be set whenever reg 31 is
21090          set up as a frame pointer, even when there is no alloca call.  */
21091       fprintf (file, "%d,",
21092                ((optional_tbtab << 6)
21093                 | ((optional_tbtab & frame_pointer_needed) << 5)
21094                 | (info->cr_save_p << 1)
21095                 | (info->lr_save_p)));
21096
21097       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
21098          (6 bits).  */
21099       fprintf (file, "%d,",
21100                (info->push_p << 7) | (64 - info->first_fp_reg_save));
21101
21102       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
21103       fprintf (file, "%d,", (32 - first_reg_to_save ()));
21104
21105       if (optional_tbtab)
21106         {
21107           /* Compute the parameter info from the function decl argument
21108              list.  */
21109           tree decl;
21110           int next_parm_info_bit = 31;
21111
21112           for (decl = DECL_ARGUMENTS (current_function_decl);
21113                decl; decl = DECL_CHAIN (decl))
21114             {
21115               rtx parameter = DECL_INCOMING_RTL (decl);
21116               enum machine_mode mode = GET_MODE (parameter);
21117
21118               if (GET_CODE (parameter) == REG)
21119                 {
21120                   if (SCALAR_FLOAT_MODE_P (mode))
21121                     {
21122                       int bits;
21123
21124                       float_parms++;
21125
21126                       switch (mode)
21127                         {
21128                         case SFmode:
21129                         case SDmode:
21130                           bits = 0x2;
21131                           break;
21132
21133                         case DFmode:
21134                         case DDmode:
21135                         case TFmode:
21136                         case TDmode:
21137                           bits = 0x3;
21138                           break;
21139
21140                         default:
21141                           gcc_unreachable ();
21142                         }
21143
21144                       /* If only one bit will fit, don't or in this entry.  */
21145                       if (next_parm_info_bit > 0)
21146                         parm_info |= (bits << (next_parm_info_bit - 1));
21147                       next_parm_info_bit -= 2;
21148                     }
21149                   else
21150                     {
21151                       fixed_parms += ((GET_MODE_SIZE (mode)
21152                                        + (UNITS_PER_WORD - 1))
21153                                       / UNITS_PER_WORD);
21154                       next_parm_info_bit -= 1;
21155                     }
21156                 }
21157             }
21158         }
21159
21160       /* Number of fixed point parameters.  */
21161       /* This is actually the number of words of fixed point parameters; thus
21162          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
21163       fprintf (file, "%d,", fixed_parms);
21164
21165       /* 2 bitfields: number of floating point parameters (7 bits), parameters
21166          all on stack.  */
21167       /* This is actually the number of fp registers that hold parameters;
21168          and thus the maximum value is 13.  */
21169       /* Set parameters on stack bit if parameters are not in their original
21170          registers, regardless of whether they are on the stack?  Xlc
21171          seems to set the bit when not optimizing.  */
21172       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
21173
21174       if (! optional_tbtab)
21175         return;
21176
21177       /* Optional fields follow.  Some are variable length.  */
21178
21179       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
21180          11 double float.  */
21181       /* There is an entry for each parameter in a register, in the order that
21182          they occur in the parameter list.  Any intervening arguments on the
21183          stack are ignored.  If the list overflows a long (max possible length
21184          34 bits) then completely leave off all elements that don't fit.  */
21185       /* Only emit this long if there was at least one parameter.  */
21186       if (fixed_parms || float_parms)
21187         fprintf (file, "\t.long %d\n", parm_info);
21188
21189       /* Offset from start of code to tb table.  */
21190       fputs ("\t.long ", file);
21191       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21192       RS6000_OUTPUT_BASENAME (file, fname);
21193       putc ('-', file);
21194       rs6000_output_function_entry (file, fname);
21195       putc ('\n', file);
21196
21197       /* Interrupt handler mask.  */
21198       /* Omit this long, since we never set the interrupt handler bit
21199          above.  */
21200
21201       /* Number of CTL (controlled storage) anchors.  */
21202       /* Omit this long, since the has_ctl bit is never set above.  */
21203
21204       /* Displacement into stack of each CTL anchor.  */
21205       /* Omit this list of longs, because there are no CTL anchors.  */
21206
21207       /* Length of function name.  */
21208       if (*fname == '*')
21209         ++fname;
21210       fprintf (file, "\t.short %d\n", (int) strlen (fname));
21211
21212       /* Function name.  */
21213       assemble_string (fname, strlen (fname));
21214
21215       /* Register for alloca automatic storage; this is always reg 31.
21216          Only emit this if the alloca bit was set above.  */
21217       if (frame_pointer_needed)
21218         fputs ("\t.byte 31\n", file);
21219
21220       fputs ("\t.align 2\n", file);
21221     }
21222 }
21223 \f
21224 /* A C compound statement that outputs the assembler code for a thunk
21225    function, used to implement C++ virtual function calls with
21226    multiple inheritance.  The thunk acts as a wrapper around a virtual
21227    function, adjusting the implicit object parameter before handing
21228    control off to the real function.
21229
21230    First, emit code to add the integer DELTA to the location that
21231    contains the incoming first argument.  Assume that this argument
21232    contains a pointer, and is the one used to pass the `this' pointer
21233    in C++.  This is the incoming argument *before* the function
21234    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
21235    values of all other incoming arguments.
21236
21237    After the addition, emit code to jump to FUNCTION, which is a
21238    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
21239    not touch the return address.  Hence returning from FUNCTION will
21240    return to whoever called the current `thunk'.
21241
21242    The effect must be as if FUNCTION had been called directly with the
21243    adjusted first argument.  This macro is responsible for emitting
21244    all of the code for a thunk function; output_function_prologue()
21245    and output_function_epilogue() are not invoked.
21246
21247    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
21248    been extracted from it.)  It might possibly be useful on some
21249    targets, but probably not.
21250
21251    If you do not define this macro, the target-independent code in the
21252    C++ frontend will generate a less efficient heavyweight thunk that
21253    calls FUNCTION instead of jumping to it.  The generic approach does
21254    not support varargs.  */
21255
21256 static void
21257 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
21258                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
21259                         tree function)
21260 {
21261   rtx this_rtx, insn, funexp;
21262
21263   reload_completed = 1;
21264   epilogue_completed = 1;
21265
21266   /* Mark the end of the (empty) prologue.  */
21267   emit_note (NOTE_INSN_PROLOGUE_END);
21268
21269   /* Find the "this" pointer.  If the function returns a structure,
21270      the structure return pointer is in r3.  */
21271   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
21272     this_rtx = gen_rtx_REG (Pmode, 4);
21273   else
21274     this_rtx = gen_rtx_REG (Pmode, 3);
21275
21276   /* Apply the constant offset, if required.  */
21277   if (delta)
21278     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
21279
21280   /* Apply the offset from the vtable, if required.  */
21281   if (vcall_offset)
21282     {
21283       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
21284       rtx tmp = gen_rtx_REG (Pmode, 12);
21285
21286       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
21287       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
21288         {
21289           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
21290           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
21291         }
21292       else
21293         {
21294           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
21295
21296           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
21297         }
21298       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
21299     }
21300
21301   /* Generate a tail call to the target function.  */
21302   if (!TREE_USED (function))
21303     {
21304       assemble_external (function);
21305       TREE_USED (function) = 1;
21306     }
21307   funexp = XEXP (DECL_RTL (function), 0);
21308   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
21309
21310 #if TARGET_MACHO
21311   if (MACHOPIC_INDIRECT)
21312     funexp = machopic_indirect_call_target (funexp);
21313 #endif
21314
21315   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
21316      generate sibcall RTL explicitly.  */
21317   insn = emit_call_insn (
21318            gen_rtx_PARALLEL (VOIDmode,
21319              gen_rtvec (4,
21320                         gen_rtx_CALL (VOIDmode,
21321                                       funexp, const0_rtx),
21322                         gen_rtx_USE (VOIDmode, const0_rtx),
21323                         gen_rtx_USE (VOIDmode,
21324                                      gen_rtx_REG (SImode,
21325                                                   LR_REGNO)),
21326                         gen_rtx_RETURN (VOIDmode))));
21327   SIBLING_CALL_P (insn) = 1;
21328   emit_barrier ();
21329
21330   /* Run just enough of rest_of_compilation to get the insns emitted.
21331      There's not really enough bulk here to make other passes such as
21332      instruction scheduling worth while.  Note that use_thunk calls
21333      assemble_start_function and assemble_end_function.  */
21334   insn = get_insns ();
21335   insn_locators_alloc ();
21336   shorten_branches (insn);
21337   final_start_function (insn, file, 1);
21338   final (insn, file, 1);
21339   final_end_function ();
21340
21341   reload_completed = 0;
21342   epilogue_completed = 0;
21343 }
21344 \f
21345 /* A quick summary of the various types of 'constant-pool tables'
21346    under PowerPC:
21347
21348    Target       Flags           Name            One table per
21349    AIX          (none)          AIX TOC         object file
21350    AIX          -mfull-toc      AIX TOC         object file
21351    AIX          -mminimal-toc   AIX minimal TOC translation unit
21352    SVR4/EABI    (none)          SVR4 SDATA      object file
21353    SVR4/EABI    -fpic           SVR4 pic        object file
21354    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
21355    SVR4/EABI    -mrelocatable   EABI TOC        function
21356    SVR4/EABI    -maix           AIX TOC         object file
21357    SVR4/EABI    -maix -mminimal-toc
21358                                 AIX minimal TOC translation unit
21359
21360    Name                 Reg.    Set by  entries       contains:
21361                                         made by  addrs? fp?     sum?
21362
21363    AIX TOC              2       crt0    as       Y      option  option
21364    AIX minimal TOC      30      prolog  gcc      Y      Y       option
21365    SVR4 SDATA           13      crt0    gcc      N      Y       N
21366    SVR4 pic             30      prolog  ld       Y      not yet N
21367    SVR4 PIC             30      prolog  gcc      Y      option  option
21368    EABI TOC             30      prolog  gcc      Y      option  option
21369
21370 */
21371
21372 /* Hash functions for the hash table.  */
21373
21374 static unsigned
21375 rs6000_hash_constant (rtx k)
21376 {
21377   enum rtx_code code = GET_CODE (k);
21378   enum machine_mode mode = GET_MODE (k);
21379   unsigned result = (code << 3) ^ mode;
21380   const char *format;
21381   int flen, fidx;
21382
21383   format = GET_RTX_FORMAT (code);
21384   flen = strlen (format);
21385   fidx = 0;
21386
21387   switch (code)
21388     {
21389     case LABEL_REF:
21390       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
21391
21392     case CONST_DOUBLE:
21393       if (mode != VOIDmode)
21394         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
21395       flen = 2;
21396       break;
21397
21398     case CODE_LABEL:
21399       fidx = 3;
21400       break;
21401
21402     default:
21403       break;
21404     }
21405
21406   for (; fidx < flen; fidx++)
21407     switch (format[fidx])
21408       {
21409       case 's':
21410         {
21411           unsigned i, len;
21412           const char *str = XSTR (k, fidx);
21413           len = strlen (str);
21414           result = result * 613 + len;
21415           for (i = 0; i < len; i++)
21416             result = result * 613 + (unsigned) str[i];
21417           break;
21418         }
21419       case 'u':
21420       case 'e':
21421         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
21422         break;
21423       case 'i':
21424       case 'n':
21425         result = result * 613 + (unsigned) XINT (k, fidx);
21426         break;
21427       case 'w':
21428         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
21429           result = result * 613 + (unsigned) XWINT (k, fidx);
21430         else
21431           {
21432             size_t i;
21433             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
21434               result = result * 613 + (unsigned) (XWINT (k, fidx)
21435                                                   >> CHAR_BIT * i);
21436           }
21437         break;
21438       case '0':
21439         break;
21440       default:
21441         gcc_unreachable ();
21442       }
21443
21444   return result;
21445 }
21446
21447 static unsigned
21448 toc_hash_function (const void *hash_entry)
21449 {
21450   const struct toc_hash_struct *thc =
21451     (const struct toc_hash_struct *) hash_entry;
21452   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
21453 }
21454
21455 /* Compare H1 and H2 for equivalence.  */
21456
21457 static int
21458 toc_hash_eq (const void *h1, const void *h2)
21459 {
21460   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
21461   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
21462
21463   if (((const struct toc_hash_struct *) h1)->key_mode
21464       != ((const struct toc_hash_struct *) h2)->key_mode)
21465     return 0;
21466
21467   return rtx_equal_p (r1, r2);
21468 }
21469
21470 /* These are the names given by the C++ front-end to vtables, and
21471    vtable-like objects.  Ideally, this logic should not be here;
21472    instead, there should be some programmatic way of inquiring as
21473    to whether or not an object is a vtable.  */
21474
21475 #define VTABLE_NAME_P(NAME)                             \
21476   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
21477   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
21478   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
21479   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
21480   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
21481
21482 #ifdef NO_DOLLAR_IN_LABEL
21483 /* Return a GGC-allocated character string translating dollar signs in
21484    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
21485
21486 const char *
21487 rs6000_xcoff_strip_dollar (const char *name)
21488 {
21489   char *strip, *p;
21490   int len;
21491
21492   p = strchr (name, '$');
21493
21494   if (p == 0 || p == name)
21495     return name;
21496
21497   len = strlen (name);
21498   strip = (char *) alloca (len + 1);
21499   strcpy (strip, name);
21500   p = strchr (strip, '$');
21501   while (p)
21502     {
21503       *p = '_';
21504       p = strchr (p + 1, '$');
21505     }
21506
21507   return ggc_alloc_string (strip, len);
21508 }
21509 #endif
21510
21511 void
21512 rs6000_output_symbol_ref (FILE *file, rtx x)
21513 {
21514   /* Currently C++ toc references to vtables can be emitted before it
21515      is decided whether the vtable is public or private.  If this is
21516      the case, then the linker will eventually complain that there is
21517      a reference to an unknown section.  Thus, for vtables only,
21518      we emit the TOC reference to reference the symbol and not the
21519      section.  */
21520   const char *name = XSTR (x, 0);
21521
21522   if (VTABLE_NAME_P (name))
21523     {
21524       RS6000_OUTPUT_BASENAME (file, name);
21525     }
21526   else
21527     assemble_name (file, name);
21528 }
21529
21530 /* Output a TOC entry.  We derive the entry name from what is being
21531    written.  */
21532
21533 void
21534 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
21535 {
21536   char buf[256];
21537   const char *name = buf;
21538   rtx base = x;
21539   HOST_WIDE_INT offset = 0;
21540
21541   gcc_assert (!TARGET_NO_TOC);
21542
21543   /* When the linker won't eliminate them, don't output duplicate
21544      TOC entries (this happens on AIX if there is any kind of TOC,
21545      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
21546      CODE_LABELs.  */
21547   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
21548     {
21549       struct toc_hash_struct *h;
21550       void * * found;
21551
21552       /* Create toc_hash_table.  This can't be done at OVERRIDE_OPTIONS
21553          time because GGC is not initialized at that point.  */
21554       if (toc_hash_table == NULL)
21555         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
21556                                           toc_hash_eq, NULL);
21557
21558       h = ggc_alloc_toc_hash_struct ();
21559       h->key = x;
21560       h->key_mode = mode;
21561       h->labelno = labelno;
21562
21563       found = htab_find_slot (toc_hash_table, h, INSERT);
21564       if (*found == NULL)
21565         *found = h;
21566       else  /* This is indeed a duplicate.
21567                Set this label equal to that label.  */
21568         {
21569           fputs ("\t.set ", file);
21570           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
21571           fprintf (file, "%d,", labelno);
21572           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
21573           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
21574                                               found)->labelno));
21575           return;
21576         }
21577     }
21578
21579   /* If we're going to put a double constant in the TOC, make sure it's
21580      aligned properly when strict alignment is on.  */
21581   if (GET_CODE (x) == CONST_DOUBLE
21582       && STRICT_ALIGNMENT
21583       && GET_MODE_BITSIZE (mode) >= 64
21584       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
21585     ASM_OUTPUT_ALIGN (file, 3);
21586   }
21587
21588   (*targetm.asm_out.internal_label) (file, "LC", labelno);
21589
21590   /* Handle FP constants specially.  Note that if we have a minimal
21591      TOC, things we put here aren't actually in the TOC, so we can allow
21592      FP constants.  */
21593   if (GET_CODE (x) == CONST_DOUBLE &&
21594       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
21595     {
21596       REAL_VALUE_TYPE rv;
21597       long k[4];
21598
21599       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
21600       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
21601         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
21602       else
21603         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
21604
21605       if (TARGET_64BIT)
21606         {
21607           if (TARGET_MINIMAL_TOC)
21608             fputs (DOUBLE_INT_ASM_OP, file);
21609           else
21610             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
21611                      k[0] & 0xffffffff, k[1] & 0xffffffff,
21612                      k[2] & 0xffffffff, k[3] & 0xffffffff);
21613           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
21614                    k[0] & 0xffffffff, k[1] & 0xffffffff,
21615                    k[2] & 0xffffffff, k[3] & 0xffffffff);
21616           return;
21617         }
21618       else
21619         {
21620           if (TARGET_MINIMAL_TOC)
21621             fputs ("\t.long ", file);
21622           else
21623             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
21624                      k[0] & 0xffffffff, k[1] & 0xffffffff,
21625                      k[2] & 0xffffffff, k[3] & 0xffffffff);
21626           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
21627                    k[0] & 0xffffffff, k[1] & 0xffffffff,
21628                    k[2] & 0xffffffff, k[3] & 0xffffffff);
21629           return;
21630         }
21631     }
21632   else if (GET_CODE (x) == CONST_DOUBLE &&
21633            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
21634     {
21635       REAL_VALUE_TYPE rv;
21636       long k[2];
21637
21638       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
21639
21640       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
21641         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
21642       else
21643         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
21644
21645       if (TARGET_64BIT)
21646         {
21647           if (TARGET_MINIMAL_TOC)
21648             fputs (DOUBLE_INT_ASM_OP, file);
21649           else
21650             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
21651                      k[0] & 0xffffffff, k[1] & 0xffffffff);
21652           fprintf (file, "0x%lx%08lx\n",
21653                    k[0] & 0xffffffff, k[1] & 0xffffffff);
21654           return;
21655         }
21656       else
21657         {
21658           if (TARGET_MINIMAL_TOC)
21659             fputs ("\t.long ", file);
21660           else
21661             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
21662                      k[0] & 0xffffffff, k[1] & 0xffffffff);
21663           fprintf (file, "0x%lx,0x%lx\n",
21664                    k[0] & 0xffffffff, k[1] & 0xffffffff);
21665           return;
21666         }
21667     }
21668   else if (GET_CODE (x) == CONST_DOUBLE &&
21669            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
21670     {
21671       REAL_VALUE_TYPE rv;
21672       long l;
21673
21674       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
21675       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
21676         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
21677       else
21678         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
21679
21680       if (TARGET_64BIT)
21681         {
21682           if (TARGET_MINIMAL_TOC)
21683             fputs (DOUBLE_INT_ASM_OP, file);
21684           else
21685             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
21686           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
21687           return;
21688         }
21689       else
21690         {
21691           if (TARGET_MINIMAL_TOC)
21692             fputs ("\t.long ", file);
21693           else
21694             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
21695           fprintf (file, "0x%lx\n", l & 0xffffffff);
21696           return;
21697         }
21698     }
21699   else if (GET_MODE (x) == VOIDmode
21700            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
21701     {
21702       unsigned HOST_WIDE_INT low;
21703       HOST_WIDE_INT high;
21704
21705       if (GET_CODE (x) == CONST_DOUBLE)
21706         {
21707           low = CONST_DOUBLE_LOW (x);
21708           high = CONST_DOUBLE_HIGH (x);
21709         }
21710       else
21711 #if HOST_BITS_PER_WIDE_INT == 32
21712         {
21713           low = INTVAL (x);
21714           high = (low & 0x80000000) ? ~0 : 0;
21715         }
21716 #else
21717         {
21718           low = INTVAL (x) & 0xffffffff;
21719           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
21720         }
21721 #endif
21722
21723       /* TOC entries are always Pmode-sized, but since this
21724          is a bigendian machine then if we're putting smaller
21725          integer constants in the TOC we have to pad them.
21726          (This is still a win over putting the constants in
21727          a separate constant pool, because then we'd have
21728          to have both a TOC entry _and_ the actual constant.)
21729
21730          For a 32-bit target, CONST_INT values are loaded and shifted
21731          entirely within `low' and can be stored in one TOC entry.  */
21732
21733       /* It would be easy to make this work, but it doesn't now.  */
21734       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
21735
21736       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
21737         {
21738 #if HOST_BITS_PER_WIDE_INT == 32
21739           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
21740                          POINTER_SIZE, &low, &high, 0);
21741 #else
21742           low |= high << 32;
21743           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
21744           high = (HOST_WIDE_INT) low >> 32;
21745           low &= 0xffffffff;
21746 #endif
21747         }
21748
21749       if (TARGET_64BIT)
21750         {
21751           if (TARGET_MINIMAL_TOC)
21752             fputs (DOUBLE_INT_ASM_OP, file);
21753           else
21754             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
21755                      (long) high & 0xffffffff, (long) low & 0xffffffff);
21756           fprintf (file, "0x%lx%08lx\n",
21757                    (long) high & 0xffffffff, (long) low & 0xffffffff);
21758           return;
21759         }
21760       else
21761         {
21762           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
21763             {
21764               if (TARGET_MINIMAL_TOC)
21765                 fputs ("\t.long ", file);
21766               else
21767                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
21768                          (long) high & 0xffffffff, (long) low & 0xffffffff);
21769               fprintf (file, "0x%lx,0x%lx\n",
21770                        (long) high & 0xffffffff, (long) low & 0xffffffff);
21771             }
21772           else
21773             {
21774               if (TARGET_MINIMAL_TOC)
21775                 fputs ("\t.long ", file);
21776               else
21777                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
21778               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
21779             }
21780           return;
21781         }
21782     }
21783
21784   if (GET_CODE (x) == CONST)
21785     {
21786       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
21787                   && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
21788
21789       base = XEXP (XEXP (x, 0), 0);
21790       offset = INTVAL (XEXP (XEXP (x, 0), 1));
21791     }
21792
21793   switch (GET_CODE (base))
21794     {
21795     case SYMBOL_REF:
21796       name = XSTR (base, 0);
21797       break;
21798
21799     case LABEL_REF:
21800       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
21801                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
21802       break;
21803
21804     case CODE_LABEL:
21805       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
21806       break;
21807
21808     default:
21809       gcc_unreachable ();
21810     }
21811
21812   if (TARGET_MINIMAL_TOC)
21813     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
21814   else
21815     {
21816       fputs ("\t.tc ", file);
21817       RS6000_OUTPUT_BASENAME (file, name);
21818
21819       if (offset < 0)
21820         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
21821       else if (offset)
21822         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
21823
21824       fputs ("[TC],", file);
21825     }
21826
21827   /* Currently C++ toc references to vtables can be emitted before it
21828      is decided whether the vtable is public or private.  If this is
21829      the case, then the linker will eventually complain that there is
21830      a TOC reference to an unknown section.  Thus, for vtables only,
21831      we emit the TOC reference to reference the symbol and not the
21832      section.  */
21833   if (VTABLE_NAME_P (name))
21834     {
21835       RS6000_OUTPUT_BASENAME (file, name);
21836       if (offset < 0)
21837         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
21838       else if (offset > 0)
21839         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
21840     }
21841   else
21842     output_addr_const (file, x);
21843   putc ('\n', file);
21844 }
21845 \f
21846 /* Output an assembler pseudo-op to write an ASCII string of N characters
21847    starting at P to FILE.
21848
21849    On the RS/6000, we have to do this using the .byte operation and
21850    write out special characters outside the quoted string.
21851    Also, the assembler is broken; very long strings are truncated,
21852    so we must artificially break them up early.  */
21853
21854 void
21855 output_ascii (FILE *file, const char *p, int n)
21856 {
21857   char c;
21858   int i, count_string;
21859   const char *for_string = "\t.byte \"";
21860   const char *for_decimal = "\t.byte ";
21861   const char *to_close = NULL;
21862
21863   count_string = 0;
21864   for (i = 0; i < n; i++)
21865     {
21866       c = *p++;
21867       if (c >= ' ' && c < 0177)
21868         {
21869           if (for_string)
21870             fputs (for_string, file);
21871           putc (c, file);
21872
21873           /* Write two quotes to get one.  */
21874           if (c == '"')
21875             {
21876               putc (c, file);
21877               ++count_string;
21878             }
21879
21880           for_string = NULL;
21881           for_decimal = "\"\n\t.byte ";
21882           to_close = "\"\n";
21883           ++count_string;
21884
21885           if (count_string >= 512)
21886             {
21887               fputs (to_close, file);
21888
21889               for_string = "\t.byte \"";
21890               for_decimal = "\t.byte ";
21891               to_close = NULL;
21892               count_string = 0;
21893             }
21894         }
21895       else
21896         {
21897           if (for_decimal)
21898             fputs (for_decimal, file);
21899           fprintf (file, "%d", c);
21900
21901           for_string = "\n\t.byte \"";
21902           for_decimal = ", ";
21903           to_close = "\n";
21904           count_string = 0;
21905         }
21906     }
21907
21908   /* Now close the string if we have written one.  Then end the line.  */
21909   if (to_close)
21910     fputs (to_close, file);
21911 }
21912 \f
21913 /* Generate a unique section name for FILENAME for a section type
21914    represented by SECTION_DESC.  Output goes into BUF.
21915
21916    SECTION_DESC can be any string, as long as it is different for each
21917    possible section type.
21918
21919    We name the section in the same manner as xlc.  The name begins with an
21920    underscore followed by the filename (after stripping any leading directory
21921    names) with the last period replaced by the string SECTION_DESC.  If
21922    FILENAME does not contain a period, SECTION_DESC is appended to the end of
21923    the name.  */
21924
21925 void
21926 rs6000_gen_section_name (char **buf, const char *filename,
21927                          const char *section_desc)
21928 {
21929   const char *q, *after_last_slash, *last_period = 0;
21930   char *p;
21931   int len;
21932
21933   after_last_slash = filename;
21934   for (q = filename; *q; q++)
21935     {
21936       if (*q == '/')
21937         after_last_slash = q + 1;
21938       else if (*q == '.')
21939         last_period = q;
21940     }
21941
21942   len = strlen (after_last_slash) + strlen (section_desc) + 2;
21943   *buf = (char *) xmalloc (len);
21944
21945   p = *buf;
21946   *p++ = '_';
21947
21948   for (q = after_last_slash; *q; q++)
21949     {
21950       if (q == last_period)
21951         {
21952           strcpy (p, section_desc);
21953           p += strlen (section_desc);
21954           break;
21955         }
21956
21957       else if (ISALNUM (*q))
21958         *p++ = *q;
21959     }
21960
21961   if (last_period == 0)
21962     strcpy (p, section_desc);
21963   else
21964     *p = '\0';
21965 }
21966 \f
21967 /* Emit profile function.  */
21968
21969 void
21970 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
21971 {
21972   /* Non-standard profiling for kernels, which just saves LR then calls
21973      _mcount without worrying about arg saves.  The idea is to change
21974      the function prologue as little as possible as it isn't easy to
21975      account for arg save/restore code added just for _mcount.  */
21976   if (TARGET_PROFILE_KERNEL)
21977     return;
21978
21979   if (DEFAULT_ABI == ABI_AIX)
21980     {
21981 #ifndef NO_PROFILE_COUNTERS
21982 # define NO_PROFILE_COUNTERS 0
21983 #endif
21984       if (NO_PROFILE_COUNTERS)
21985         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
21986                            LCT_NORMAL, VOIDmode, 0);
21987       else
21988         {
21989           char buf[30];
21990           const char *label_name;
21991           rtx fun;
21992
21993           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
21994           label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
21995           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
21996
21997           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
21998                              LCT_NORMAL, VOIDmode, 1, fun, Pmode);
21999         }
22000     }
22001   else if (DEFAULT_ABI == ABI_DARWIN)
22002     {
22003       const char *mcount_name = RS6000_MCOUNT;
22004       int caller_addr_regno = LR_REGNO;
22005
22006       /* Be conservative and always set this, at least for now.  */
22007       crtl->uses_pic_offset_table = 1;
22008
22009 #if TARGET_MACHO
22010       /* For PIC code, set up a stub and collect the caller's address
22011          from r0, which is where the prologue puts it.  */
22012       if (MACHOPIC_INDIRECT
22013           && crtl->uses_pic_offset_table)
22014         caller_addr_regno = 0;
22015 #endif
22016       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
22017                          LCT_NORMAL, VOIDmode, 1,
22018                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
22019     }
22020 }
22021
22022 /* Write function profiler code.  */
22023
22024 void
22025 output_function_profiler (FILE *file, int labelno)
22026 {
22027   char buf[100];
22028
22029   switch (DEFAULT_ABI)
22030     {
22031     default:
22032       gcc_unreachable ();
22033
22034     case ABI_V4:
22035       if (!TARGET_32BIT)
22036         {
22037           warning (0, "no profiling of 64-bit code for this ABI");
22038           return;
22039         }
22040       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22041       fprintf (file, "\tmflr %s\n", reg_names[0]);
22042       if (NO_PROFILE_COUNTERS)
22043         {
22044           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22045                        reg_names[0], reg_names[1]);
22046         }
22047       else if (TARGET_SECURE_PLT && flag_pic)
22048         {
22049           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
22050                        reg_names[0], reg_names[1]);
22051           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22052           asm_fprintf (file, "\t{cau|addis} %s,%s,",
22053                        reg_names[12], reg_names[12]);
22054           assemble_name (file, buf);
22055           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
22056           assemble_name (file, buf);
22057           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
22058         }
22059       else if (flag_pic == 1)
22060         {
22061           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
22062           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22063                        reg_names[0], reg_names[1]);
22064           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22065           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
22066           assemble_name (file, buf);
22067           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
22068         }
22069       else if (flag_pic > 1)
22070         {
22071           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22072                        reg_names[0], reg_names[1]);
22073           /* Now, we need to get the address of the label.  */
22074           fputs ("\tbcl 20,31,1f\n\t.long ", file);
22075           assemble_name (file, buf);
22076           fputs ("-.\n1:", file);
22077           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
22078           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
22079                        reg_names[0], reg_names[11]);
22080           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
22081                        reg_names[0], reg_names[0], reg_names[11]);
22082         }
22083       else
22084         {
22085           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
22086           assemble_name (file, buf);
22087           fputs ("@ha\n", file);
22088           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22089                        reg_names[0], reg_names[1]);
22090           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
22091           assemble_name (file, buf);
22092           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
22093         }
22094
22095       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
22096       fprintf (file, "\tbl %s%s\n",
22097                RS6000_MCOUNT, flag_pic ? "@plt" : "");
22098       break;
22099
22100     case ABI_AIX:
22101     case ABI_DARWIN:
22102       if (!TARGET_PROFILE_KERNEL)
22103         {
22104           /* Don't do anything, done in output_profile_hook ().  */
22105         }
22106       else
22107         {
22108           gcc_assert (!TARGET_32BIT);
22109
22110           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
22111           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
22112
22113           if (cfun->static_chain_decl != NULL)
22114             {
22115               asm_fprintf (file, "\tstd %s,24(%s)\n",
22116                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22117               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22118               asm_fprintf (file, "\tld %s,24(%s)\n",
22119                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22120             }
22121           else
22122             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22123         }
22124       break;
22125     }
22126 }
22127
22128 \f
22129
22130 /* The following variable value is the last issued insn.  */
22131
22132 static rtx last_scheduled_insn;
22133
22134 /* The following variable helps to balance issuing of load and
22135    store instructions */
22136
22137 static int load_store_pendulum;
22138
22139 /* Power4 load update and store update instructions are cracked into a
22140    load or store and an integer insn which are executed in the same cycle.
22141    Branches have their own dispatch slot which does not count against the
22142    GCC issue rate, but it changes the program flow so there are no other
22143    instructions to issue in this cycle.  */
22144
22145 static int
22146 rs6000_variable_issue_1 (rtx insn, int more)
22147 {
22148   last_scheduled_insn = insn;
22149   if (GET_CODE (PATTERN (insn)) == USE
22150       || GET_CODE (PATTERN (insn)) == CLOBBER)
22151     {
22152       cached_can_issue_more = more;
22153       return cached_can_issue_more;
22154     }
22155
22156   if (insn_terminates_group_p (insn, current_group))
22157     {
22158       cached_can_issue_more = 0;
22159       return cached_can_issue_more;
22160     }
22161
22162   /* If no reservation, but reach here */
22163   if (recog_memoized (insn) < 0)
22164     return more;
22165
22166   if (rs6000_sched_groups)
22167     {
22168       if (is_microcoded_insn (insn))
22169         cached_can_issue_more = 0;
22170       else if (is_cracked_insn (insn))
22171         cached_can_issue_more = more > 2 ? more - 2 : 0;
22172       else
22173         cached_can_issue_more = more - 1;
22174
22175       return cached_can_issue_more;
22176     }
22177
22178   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
22179     return 0;
22180
22181   cached_can_issue_more = more - 1;
22182   return cached_can_issue_more;
22183 }
22184
22185 static int
22186 rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
22187 {
22188   int r = rs6000_variable_issue_1 (insn, more);
22189   if (verbose)
22190     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
22191   return r;
22192 }
22193
22194 /* Adjust the cost of a scheduling dependency.  Return the new cost of
22195    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
22196
22197 static int
22198 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22199 {
22200   enum attr_type attr_type;
22201
22202   if (! recog_memoized (insn))
22203     return 0;
22204
22205   switch (REG_NOTE_KIND (link))
22206     {
22207     case REG_DEP_TRUE:
22208       {
22209         /* Data dependency; DEP_INSN writes a register that INSN reads
22210            some cycles later.  */
22211
22212         /* Separate a load from a narrower, dependent store.  */
22213         if (rs6000_sched_groups
22214             && GET_CODE (PATTERN (insn)) == SET
22215             && GET_CODE (PATTERN (dep_insn)) == SET
22216             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
22217             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
22218             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
22219                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
22220           return cost + 14;
22221
22222         attr_type = get_attr_type (insn);
22223
22224         switch (attr_type)
22225           {
22226           case TYPE_JMPREG:
22227             /* Tell the first scheduling pass about the latency between
22228                a mtctr and bctr (and mtlr and br/blr).  The first
22229                scheduling pass will not know about this latency since
22230                the mtctr instruction, which has the latency associated
22231                to it, will be generated by reload.  */
22232             return TARGET_POWER ? 5 : 4;
22233           case TYPE_BRANCH:
22234             /* Leave some extra cycles between a compare and its
22235                dependent branch, to inhibit expensive mispredicts.  */
22236             if ((rs6000_cpu_attr == CPU_PPC603
22237                  || rs6000_cpu_attr == CPU_PPC604
22238                  || rs6000_cpu_attr == CPU_PPC604E
22239                  || rs6000_cpu_attr == CPU_PPC620
22240                  || rs6000_cpu_attr == CPU_PPC630
22241                  || rs6000_cpu_attr == CPU_PPC750
22242                  || rs6000_cpu_attr == CPU_PPC7400
22243                  || rs6000_cpu_attr == CPU_PPC7450
22244                  || rs6000_cpu_attr == CPU_POWER4
22245                  || rs6000_cpu_attr == CPU_POWER5
22246                  || rs6000_cpu_attr == CPU_POWER7
22247                  || rs6000_cpu_attr == CPU_CELL)
22248                 && recog_memoized (dep_insn)
22249                 && (INSN_CODE (dep_insn) >= 0))
22250
22251               switch (get_attr_type (dep_insn))
22252                 {
22253                 case TYPE_CMP:
22254                 case TYPE_COMPARE:
22255                 case TYPE_DELAYED_COMPARE:
22256                 case TYPE_IMUL_COMPARE:
22257                 case TYPE_LMUL_COMPARE:
22258                 case TYPE_FPCOMPARE:
22259                 case TYPE_CR_LOGICAL:
22260                 case TYPE_DELAYED_CR:
22261                   return cost + 2;
22262                 default:
22263                   break;
22264                 }
22265             break;
22266
22267           case TYPE_STORE:
22268           case TYPE_STORE_U:
22269           case TYPE_STORE_UX:
22270           case TYPE_FPSTORE:
22271           case TYPE_FPSTORE_U:
22272           case TYPE_FPSTORE_UX:
22273             if ((rs6000_cpu == PROCESSOR_POWER6)
22274                 && recog_memoized (dep_insn)
22275                 && (INSN_CODE (dep_insn) >= 0))
22276               {
22277
22278                 if (GET_CODE (PATTERN (insn)) != SET)
22279                   /* If this happens, we have to extend this to schedule
22280                      optimally.  Return default for now.  */
22281                   return cost;
22282
22283                 /* Adjust the cost for the case where the value written
22284                    by a fixed point operation is used as the address
22285                    gen value on a store. */
22286                 switch (get_attr_type (dep_insn))
22287                   {
22288                   case TYPE_LOAD:
22289                   case TYPE_LOAD_U:
22290                   case TYPE_LOAD_UX:
22291                   case TYPE_CNTLZ:
22292                     {
22293                       if (! store_data_bypass_p (dep_insn, insn))
22294                         return 4;
22295                       break;
22296                     }
22297                   case TYPE_LOAD_EXT:
22298                   case TYPE_LOAD_EXT_U:
22299                   case TYPE_LOAD_EXT_UX:
22300                   case TYPE_VAR_SHIFT_ROTATE:
22301                   case TYPE_VAR_DELAYED_COMPARE:
22302                     {
22303                       if (! store_data_bypass_p (dep_insn, insn))
22304                         return 6;
22305                       break;
22306                     }
22307                   case TYPE_INTEGER:
22308                   case TYPE_COMPARE:
22309                   case TYPE_FAST_COMPARE:
22310                   case TYPE_EXTS:
22311                   case TYPE_SHIFT:
22312                   case TYPE_INSERT_WORD:
22313                   case TYPE_INSERT_DWORD:
22314                   case TYPE_FPLOAD_U:
22315                   case TYPE_FPLOAD_UX:
22316                   case TYPE_STORE_U:
22317                   case TYPE_STORE_UX:
22318                   case TYPE_FPSTORE_U:
22319                   case TYPE_FPSTORE_UX:
22320                     {
22321                       if (! store_data_bypass_p (dep_insn, insn))
22322                         return 3;
22323                       break;
22324                     }
22325                   case TYPE_IMUL:
22326                   case TYPE_IMUL2:
22327                   case TYPE_IMUL3:
22328                   case TYPE_LMUL:
22329                   case TYPE_IMUL_COMPARE:
22330                   case TYPE_LMUL_COMPARE:
22331                     {
22332                       if (! store_data_bypass_p (dep_insn, insn))
22333                         return 17;
22334                       break;
22335                     }
22336                   case TYPE_IDIV:
22337                     {
22338                       if (! store_data_bypass_p (dep_insn, insn))
22339                         return 45;
22340                       break;
22341                     }
22342                   case TYPE_LDIV:
22343                     {
22344                       if (! store_data_bypass_p (dep_insn, insn))
22345                         return 57;
22346                       break;
22347                     }
22348                   default:
22349                     break;
22350                   }
22351               }
22352             break;
22353
22354           case TYPE_LOAD:
22355           case TYPE_LOAD_U:
22356           case TYPE_LOAD_UX:
22357           case TYPE_LOAD_EXT:
22358           case TYPE_LOAD_EXT_U:
22359           case TYPE_LOAD_EXT_UX:
22360             if ((rs6000_cpu == PROCESSOR_POWER6)
22361                 && recog_memoized (dep_insn)
22362                 && (INSN_CODE (dep_insn) >= 0))
22363               {
22364
22365                 /* Adjust the cost for the case where the value written
22366                    by a fixed point instruction is used within the address
22367                    gen portion of a subsequent load(u)(x) */
22368                 switch (get_attr_type (dep_insn))
22369                   {
22370                   case TYPE_LOAD:
22371                   case TYPE_LOAD_U:
22372                   case TYPE_LOAD_UX:
22373                   case TYPE_CNTLZ:
22374                     {
22375                       if (set_to_load_agen (dep_insn, insn))
22376                         return 4;
22377                       break;
22378                     }
22379                   case TYPE_LOAD_EXT:
22380                   case TYPE_LOAD_EXT_U:
22381                   case TYPE_LOAD_EXT_UX:
22382                   case TYPE_VAR_SHIFT_ROTATE:
22383                   case TYPE_VAR_DELAYED_COMPARE:
22384                     {
22385                       if (set_to_load_agen (dep_insn, insn))
22386                         return 6;
22387                       break;
22388                     }
22389                   case TYPE_INTEGER:
22390                   case TYPE_COMPARE:
22391                   case TYPE_FAST_COMPARE:
22392                   case TYPE_EXTS:
22393                   case TYPE_SHIFT:
22394                   case TYPE_INSERT_WORD:
22395                   case TYPE_INSERT_DWORD:
22396                   case TYPE_FPLOAD_U:
22397                   case TYPE_FPLOAD_UX:
22398                   case TYPE_STORE_U:
22399                   case TYPE_STORE_UX:
22400                   case TYPE_FPSTORE_U:
22401                   case TYPE_FPSTORE_UX:
22402                     {
22403                       if (set_to_load_agen (dep_insn, insn))
22404                         return 3;
22405                       break;
22406                     }
22407                   case TYPE_IMUL:
22408                   case TYPE_IMUL2:
22409                   case TYPE_IMUL3:
22410                   case TYPE_LMUL:
22411                   case TYPE_IMUL_COMPARE:
22412                   case TYPE_LMUL_COMPARE:
22413                     {
22414                       if (set_to_load_agen (dep_insn, insn))
22415                         return 17;
22416                       break;
22417                     }
22418                   case TYPE_IDIV:
22419                     {
22420                       if (set_to_load_agen (dep_insn, insn))
22421                         return 45;
22422                       break;
22423                     }
22424                   case TYPE_LDIV:
22425                     {
22426                       if (set_to_load_agen (dep_insn, insn))
22427                         return 57;
22428                       break;
22429                     }
22430                   default:
22431                     break;
22432                   }
22433               }
22434             break;
22435
22436           case TYPE_FPLOAD:
22437             if ((rs6000_cpu == PROCESSOR_POWER6)
22438                 && recog_memoized (dep_insn)
22439                 && (INSN_CODE (dep_insn) >= 0)
22440                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
22441               return 2;
22442
22443           default:
22444             break;
22445           }
22446
22447         /* Fall out to return default cost.  */
22448       }
22449       break;
22450
22451     case REG_DEP_OUTPUT:
22452       /* Output dependency; DEP_INSN writes a register that INSN writes some
22453          cycles later.  */
22454       if ((rs6000_cpu == PROCESSOR_POWER6)
22455           && recog_memoized (dep_insn)
22456           && (INSN_CODE (dep_insn) >= 0))
22457         {
22458           attr_type = get_attr_type (insn);
22459
22460           switch (attr_type)
22461             {
22462             case TYPE_FP:
22463               if (get_attr_type (dep_insn) == TYPE_FP)
22464                 return 1;
22465               break;
22466             case TYPE_FPLOAD:
22467               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
22468                 return 2;
22469               break;
22470             default:
22471               break;
22472             }
22473         }
22474     case REG_DEP_ANTI:
22475       /* Anti dependency; DEP_INSN reads a register that INSN writes some
22476          cycles later.  */
22477       return 0;
22478
22479     default:
22480       gcc_unreachable ();
22481     }
22482
22483   return cost;
22484 }
22485
22486 /* Debug version of rs6000_adjust_cost.  */
22487
22488 static int
22489 rs6000_debug_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22490 {
22491   int ret = rs6000_adjust_cost (insn, link, dep_insn, cost);
22492
22493   if (ret != cost)
22494     {
22495       const char *dep;
22496
22497       switch (REG_NOTE_KIND (link))
22498         {
22499         default:             dep = "unknown depencency"; break;
22500         case REG_DEP_TRUE:   dep = "data dependency";    break;
22501         case REG_DEP_OUTPUT: dep = "output dependency";  break;
22502         case REG_DEP_ANTI:   dep = "anti depencency";    break;
22503         }
22504
22505       fprintf (stderr,
22506                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
22507                "%s, insn:\n", ret, cost, dep);
22508
22509       debug_rtx (insn);
22510     }
22511
22512   return ret;
22513 }
22514
22515 /* The function returns a true if INSN is microcoded.
22516    Return false otherwise.  */
22517
22518 static bool
22519 is_microcoded_insn (rtx insn)
22520 {
22521   if (!insn || !NONDEBUG_INSN_P (insn)
22522       || GET_CODE (PATTERN (insn)) == USE
22523       || GET_CODE (PATTERN (insn)) == CLOBBER)
22524     return false;
22525
22526   if (rs6000_cpu_attr == CPU_CELL)
22527     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
22528
22529   if (rs6000_sched_groups)
22530     {
22531       enum attr_type type = get_attr_type (insn);
22532       if (type == TYPE_LOAD_EXT_U
22533           || type == TYPE_LOAD_EXT_UX
22534           || type == TYPE_LOAD_UX
22535           || type == TYPE_STORE_UX
22536           || type == TYPE_MFCR)
22537         return true;
22538     }
22539
22540   return false;
22541 }
22542
22543 /* The function returns true if INSN is cracked into 2 instructions
22544    by the processor (and therefore occupies 2 issue slots).  */
22545
22546 static bool
22547 is_cracked_insn (rtx insn)
22548 {
22549   if (!insn || !NONDEBUG_INSN_P (insn)
22550       || GET_CODE (PATTERN (insn)) == USE
22551       || GET_CODE (PATTERN (insn)) == CLOBBER)
22552     return false;
22553
22554   if (rs6000_sched_groups)
22555     {
22556       enum attr_type type = get_attr_type (insn);
22557       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
22558           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
22559           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
22560           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
22561           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
22562           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
22563           || type == TYPE_IDIV || type == TYPE_LDIV
22564           || type == TYPE_INSERT_WORD)
22565         return true;
22566     }
22567
22568   return false;
22569 }
22570
22571 /* The function returns true if INSN can be issued only from
22572    the branch slot.  */
22573
22574 static bool
22575 is_branch_slot_insn (rtx insn)
22576 {
22577   if (!insn || !NONDEBUG_INSN_P (insn)
22578       || GET_CODE (PATTERN (insn)) == USE
22579       || GET_CODE (PATTERN (insn)) == CLOBBER)
22580     return false;
22581
22582   if (rs6000_sched_groups)
22583     {
22584       enum attr_type type = get_attr_type (insn);
22585       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
22586         return true;
22587       return false;
22588     }
22589
22590   return false;
22591 }
22592
22593 /* The function returns true if out_inst sets a value that is
22594    used in the address generation computation of in_insn */
22595 static bool
22596 set_to_load_agen (rtx out_insn, rtx in_insn)
22597 {
22598   rtx out_set, in_set;
22599
22600   /* For performance reasons, only handle the simple case where
22601      both loads are a single_set. */
22602   out_set = single_set (out_insn);
22603   if (out_set)
22604     {
22605       in_set = single_set (in_insn);
22606       if (in_set)
22607         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
22608     }
22609
22610   return false;
22611 }
22612
22613 /* The function returns true if the target storage location of
22614    out_insn is adjacent to the target storage location of in_insn */
22615 /* Return 1 if memory locations are adjacent.  */
22616
22617 static bool
22618 adjacent_mem_locations (rtx insn1, rtx insn2)
22619 {
22620
22621   rtx a = get_store_dest (PATTERN (insn1));
22622   rtx b = get_store_dest (PATTERN (insn2));
22623
22624   if ((GET_CODE (XEXP (a, 0)) == REG
22625        || (GET_CODE (XEXP (a, 0)) == PLUS
22626            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
22627       && (GET_CODE (XEXP (b, 0)) == REG
22628           || (GET_CODE (XEXP (b, 0)) == PLUS
22629               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
22630     {
22631       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
22632       rtx reg0, reg1;
22633
22634       if (GET_CODE (XEXP (a, 0)) == PLUS)
22635         {
22636           reg0 = XEXP (XEXP (a, 0), 0);
22637           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
22638         }
22639       else
22640         reg0 = XEXP (a, 0);
22641
22642       if (GET_CODE (XEXP (b, 0)) == PLUS)
22643         {
22644           reg1 = XEXP (XEXP (b, 0), 0);
22645           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
22646         }
22647       else
22648         reg1 = XEXP (b, 0);
22649
22650       val_diff = val1 - val0;
22651
22652       return ((REGNO (reg0) == REGNO (reg1))
22653               && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
22654                   || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
22655     }
22656
22657   return false;
22658 }
22659
22660 /* A C statement (sans semicolon) to update the integer scheduling
22661    priority INSN_PRIORITY (INSN). Increase the priority to execute the
22662    INSN earlier, reduce the priority to execute INSN later.  Do not
22663    define this macro if you do not need to adjust the scheduling
22664    priorities of insns.  */
22665
22666 static int
22667 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
22668 {
22669   /* On machines (like the 750) which have asymmetric integer units,
22670      where one integer unit can do multiply and divides and the other
22671      can't, reduce the priority of multiply/divide so it is scheduled
22672      before other integer operations.  */
22673
22674 #if 0
22675   if (! INSN_P (insn))
22676     return priority;
22677
22678   if (GET_CODE (PATTERN (insn)) == USE)
22679     return priority;
22680
22681   switch (rs6000_cpu_attr) {
22682   case CPU_PPC750:
22683     switch (get_attr_type (insn))
22684       {
22685       default:
22686         break;
22687
22688       case TYPE_IMUL:
22689       case TYPE_IDIV:
22690         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
22691                  priority, priority);
22692         if (priority >= 0 && priority < 0x01000000)
22693           priority >>= 3;
22694         break;
22695       }
22696   }
22697 #endif
22698
22699   if (insn_must_be_first_in_group (insn)
22700       && reload_completed
22701       && current_sched_info->sched_max_insns_priority
22702       && rs6000_sched_restricted_insns_priority)
22703     {
22704
22705       /* Prioritize insns that can be dispatched only in the first
22706          dispatch slot.  */
22707       if (rs6000_sched_restricted_insns_priority == 1)
22708         /* Attach highest priority to insn. This means that in
22709            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
22710            precede 'priority' (critical path) considerations.  */
22711         return current_sched_info->sched_max_insns_priority;
22712       else if (rs6000_sched_restricted_insns_priority == 2)
22713         /* Increase priority of insn by a minimal amount. This means that in
22714            haifa-sched.c:ready_sort(), only 'priority' (critical path)
22715            considerations precede dispatch-slot restriction considerations.  */
22716         return (priority + 1);
22717     }
22718
22719   if (rs6000_cpu == PROCESSOR_POWER6
22720       && ((load_store_pendulum == -2 && is_load_insn (insn))
22721           || (load_store_pendulum == 2 && is_store_insn (insn))))
22722     /* Attach highest priority to insn if the scheduler has just issued two
22723        stores and this instruction is a load, or two loads and this instruction
22724        is a store. Power6 wants loads and stores scheduled alternately
22725        when possible */
22726     return current_sched_info->sched_max_insns_priority;
22727
22728   return priority;
22729 }
22730
22731 /* Return true if the instruction is nonpipelined on the Cell. */
22732 static bool
22733 is_nonpipeline_insn (rtx insn)
22734 {
22735   enum attr_type type;
22736   if (!insn || !NONDEBUG_INSN_P (insn)
22737       || GET_CODE (PATTERN (insn)) == USE
22738       || GET_CODE (PATTERN (insn)) == CLOBBER)
22739     return false;
22740
22741   type = get_attr_type (insn);
22742   if (type == TYPE_IMUL
22743       || type == TYPE_IMUL2
22744       || type == TYPE_IMUL3
22745       || type == TYPE_LMUL
22746       || type == TYPE_IDIV
22747       || type == TYPE_LDIV
22748       || type == TYPE_SDIV
22749       || type == TYPE_DDIV
22750       || type == TYPE_SSQRT
22751       || type == TYPE_DSQRT
22752       || type == TYPE_MFCR
22753       || type == TYPE_MFCRF
22754       || type == TYPE_MFJMPR)
22755     {
22756       return true;
22757     }
22758   return false;
22759 }
22760
22761
22762 /* Return how many instructions the machine can issue per cycle.  */
22763
22764 static int
22765 rs6000_issue_rate (void)
22766 {
22767   /* Unless scheduling for register pressure, use issue rate of 1 for
22768      first scheduling pass to decrease degradation.  */
22769   if (!reload_completed && !flag_sched_pressure)
22770     return 1;
22771
22772   switch (rs6000_cpu_attr) {
22773   case CPU_RIOS1:  /* ? */
22774   case CPU_RS64A:
22775   case CPU_PPC601: /* ? */
22776   case CPU_PPC7450:
22777     return 3;
22778   case CPU_PPC440:
22779   case CPU_PPC603:
22780   case CPU_PPC750:
22781   case CPU_PPC7400:
22782   case CPU_PPC8540:
22783   case CPU_CELL:
22784   case CPU_PPCE300C2:
22785   case CPU_PPCE300C3:
22786   case CPU_PPCE500MC:
22787   case CPU_PPCE500MC64:
22788   case CPU_TITAN:
22789     return 2;
22790   case CPU_RIOS2:
22791   case CPU_PPC476:
22792   case CPU_PPC604:
22793   case CPU_PPC604E:
22794   case CPU_PPC620:
22795   case CPU_PPC630:
22796     return 4;
22797   case CPU_POWER4:
22798   case CPU_POWER5:
22799   case CPU_POWER6:
22800   case CPU_POWER7:
22801     return 5;
22802   default:
22803     return 1;
22804   }
22805 }
22806
22807 /* Return how many instructions to look ahead for better insn
22808    scheduling.  */
22809
22810 static int
22811 rs6000_use_sched_lookahead (void)
22812 {
22813   if (rs6000_cpu_attr == CPU_PPC8540)
22814     return 4;
22815   if (rs6000_cpu_attr == CPU_CELL)
22816     return (reload_completed ? 8 : 0);
22817   return 0;
22818 }
22819
22820 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
22821 static int
22822 rs6000_use_sched_lookahead_guard (rtx insn)
22823 {
22824   if (rs6000_cpu_attr != CPU_CELL)
22825     return 1;
22826
22827    if (insn == NULL_RTX || !INSN_P (insn))
22828      abort ();
22829
22830   if (!reload_completed
22831       || is_nonpipeline_insn (insn)
22832       || is_microcoded_insn (insn))
22833     return 0;
22834
22835   return 1;
22836 }
22837
22838 /* Determine is PAT refers to memory.  */
22839
22840 static bool
22841 is_mem_ref (rtx pat)
22842 {
22843   const char * fmt;
22844   int i, j;
22845   bool ret = false;
22846
22847   /* stack_tie does not produce any real memory traffic.  */
22848   if (GET_CODE (pat) == UNSPEC
22849       && XINT (pat, 1) == UNSPEC_TIE)
22850     return false;
22851
22852   if (GET_CODE (pat) == MEM)
22853     return true;
22854
22855   /* Recursively process the pattern.  */
22856   fmt = GET_RTX_FORMAT (GET_CODE (pat));
22857
22858   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
22859     {
22860       if (fmt[i] == 'e')
22861         ret |= is_mem_ref (XEXP (pat, i));
22862       else if (fmt[i] == 'E')
22863         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
22864           ret |= is_mem_ref (XVECEXP (pat, i, j));
22865     }
22866
22867   return ret;
22868 }
22869
22870 /* Determine if PAT is a PATTERN of a load insn.  */
22871
22872 static bool
22873 is_load_insn1 (rtx pat)
22874 {
22875   if (!pat || pat == NULL_RTX)
22876     return false;
22877
22878   if (GET_CODE (pat) == SET)
22879     return is_mem_ref (SET_SRC (pat));
22880
22881   if (GET_CODE (pat) == PARALLEL)
22882     {
22883       int i;
22884
22885       for (i = 0; i < XVECLEN (pat, 0); i++)
22886         if (is_load_insn1 (XVECEXP (pat, 0, i)))
22887           return true;
22888     }
22889
22890   return false;
22891 }
22892
22893 /* Determine if INSN loads from memory.  */
22894
22895 static bool
22896 is_load_insn (rtx insn)
22897 {
22898   if (!insn || !INSN_P (insn))
22899     return false;
22900
22901   if (GET_CODE (insn) == CALL_INSN)
22902     return false;
22903
22904   return is_load_insn1 (PATTERN (insn));
22905 }
22906
22907 /* Determine if PAT is a PATTERN of a store insn.  */
22908
22909 static bool
22910 is_store_insn1 (rtx pat)
22911 {
22912   if (!pat || pat == NULL_RTX)
22913     return false;
22914
22915   if (GET_CODE (pat) == SET)
22916     return is_mem_ref (SET_DEST (pat));
22917
22918   if (GET_CODE (pat) == PARALLEL)
22919     {
22920       int i;
22921
22922       for (i = 0; i < XVECLEN (pat, 0); i++)
22923         if (is_store_insn1 (XVECEXP (pat, 0, i)))
22924           return true;
22925     }
22926
22927   return false;
22928 }
22929
22930 /* Determine if INSN stores to memory.  */
22931
22932 static bool
22933 is_store_insn (rtx insn)
22934 {
22935   if (!insn || !INSN_P (insn))
22936     return false;
22937
22938   return is_store_insn1 (PATTERN (insn));
22939 }
22940
22941 /* Return the dest of a store insn.  */
22942
22943 static rtx
22944 get_store_dest (rtx pat)
22945 {
22946   gcc_assert (is_store_insn1 (pat));
22947
22948   if (GET_CODE (pat) == SET)
22949     return SET_DEST (pat);
22950   else if (GET_CODE (pat) == PARALLEL)
22951     {
22952       int i;
22953
22954       for (i = 0; i < XVECLEN (pat, 0); i++)
22955         {
22956           rtx inner_pat = XVECEXP (pat, 0, i);
22957           if (GET_CODE (inner_pat) == SET
22958               && is_mem_ref (SET_DEST (inner_pat)))
22959             return inner_pat;
22960         }
22961     }
22962   /* We shouldn't get here, because we should have either a simple
22963      store insn or a store with update which are covered above.  */
22964   gcc_unreachable();
22965 }
22966
22967 /* Returns whether the dependence between INSN and NEXT is considered
22968    costly by the given target.  */
22969
22970 static bool
22971 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
22972 {
22973   rtx insn;
22974   rtx next;
22975
22976   /* If the flag is not enabled - no dependence is considered costly;
22977      allow all dependent insns in the same group.
22978      This is the most aggressive option.  */
22979   if (rs6000_sched_costly_dep == no_dep_costly)
22980     return false;
22981
22982   /* If the flag is set to 1 - a dependence is always considered costly;
22983      do not allow dependent instructions in the same group.
22984      This is the most conservative option.  */
22985   if (rs6000_sched_costly_dep == all_deps_costly)
22986     return true;
22987
22988   insn = DEP_PRO (dep);
22989   next = DEP_CON (dep);
22990
22991   if (rs6000_sched_costly_dep == store_to_load_dep_costly
22992       && is_load_insn (next)
22993       && is_store_insn (insn))
22994     /* Prevent load after store in the same group.  */
22995     return true;
22996
22997   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
22998       && is_load_insn (next)
22999       && is_store_insn (insn)
23000       && DEP_TYPE (dep) == REG_DEP_TRUE)
23001      /* Prevent load after store in the same group if it is a true
23002         dependence.  */
23003      return true;
23004
23005   /* The flag is set to X; dependences with latency >= X are considered costly,
23006      and will not be scheduled in the same group.  */
23007   if (rs6000_sched_costly_dep <= max_dep_latency
23008       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
23009     return true;
23010
23011   return false;
23012 }
23013
23014 /* Return the next insn after INSN that is found before TAIL is reached,
23015    skipping any "non-active" insns - insns that will not actually occupy
23016    an issue slot.  Return NULL_RTX if such an insn is not found.  */
23017
23018 static rtx
23019 get_next_active_insn (rtx insn, rtx tail)
23020 {
23021   if (insn == NULL_RTX || insn == tail)
23022     return NULL_RTX;
23023
23024   while (1)
23025     {
23026       insn = NEXT_INSN (insn);
23027       if (insn == NULL_RTX || insn == tail)
23028         return NULL_RTX;
23029
23030       if (CALL_P (insn)
23031           || JUMP_P (insn)
23032           || (NONJUMP_INSN_P (insn)
23033               && GET_CODE (PATTERN (insn)) != USE
23034               && GET_CODE (PATTERN (insn)) != CLOBBER
23035               && INSN_CODE (insn) != CODE_FOR_stack_tie))
23036         break;
23037     }
23038   return insn;
23039 }
23040
23041 /* We are about to begin issuing insns for this clock cycle. */
23042
23043 static int
23044 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
23045                         rtx *ready ATTRIBUTE_UNUSED,
23046                         int *pn_ready ATTRIBUTE_UNUSED,
23047                         int clock_var ATTRIBUTE_UNUSED)
23048 {
23049   int n_ready = *pn_ready;
23050
23051   if (sched_verbose)
23052     fprintf (dump, "// rs6000_sched_reorder :\n");
23053
23054   /* Reorder the ready list, if the second to last ready insn
23055      is a nonepipeline insn.  */
23056   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
23057   {
23058     if (is_nonpipeline_insn (ready[n_ready - 1])
23059         && (recog_memoized (ready[n_ready - 2]) > 0))
23060       /* Simply swap first two insns.  */
23061       {
23062         rtx tmp = ready[n_ready - 1];
23063         ready[n_ready - 1] = ready[n_ready - 2];
23064         ready[n_ready - 2] = tmp;
23065       }
23066   }
23067
23068   if (rs6000_cpu == PROCESSOR_POWER6)
23069     load_store_pendulum = 0;
23070
23071   return rs6000_issue_rate ();
23072 }
23073
23074 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
23075
23076 static int
23077 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
23078                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
23079 {
23080   if (sched_verbose)
23081     fprintf (dump, "// rs6000_sched_reorder2 :\n");
23082
23083   /* For Power6, we need to handle some special cases to try and keep the
23084      store queue from overflowing and triggering expensive flushes.
23085
23086      This code monitors how load and store instructions are being issued
23087      and skews the ready list one way or the other to increase the likelihood
23088      that a desired instruction is issued at the proper time.
23089
23090      A couple of things are done.  First, we maintain a "load_store_pendulum"
23091      to track the current state of load/store issue.
23092
23093        - If the pendulum is at zero, then no loads or stores have been
23094          issued in the current cycle so we do nothing.
23095
23096        - If the pendulum is 1, then a single load has been issued in this
23097          cycle and we attempt to locate another load in the ready list to
23098          issue with it.
23099
23100        - If the pendulum is -2, then two stores have already been
23101          issued in this cycle, so we increase the priority of the first load
23102          in the ready list to increase it's likelihood of being chosen first
23103          in the next cycle.
23104
23105        - If the pendulum is -1, then a single store has been issued in this
23106          cycle and we attempt to locate another store in the ready list to
23107          issue with it, preferring a store to an adjacent memory location to
23108          facilitate store pairing in the store queue.
23109
23110        - If the pendulum is 2, then two loads have already been
23111          issued in this cycle, so we increase the priority of the first store
23112          in the ready list to increase it's likelihood of being chosen first
23113          in the next cycle.
23114
23115        - If the pendulum < -2 or > 2, then do nothing.
23116
23117        Note: This code covers the most common scenarios.  There exist non
23118              load/store instructions which make use of the LSU and which
23119              would need to be accounted for to strictly model the behavior
23120              of the machine.  Those instructions are currently unaccounted
23121              for to help minimize compile time overhead of this code.
23122    */
23123   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
23124     {
23125       int pos;
23126       int i;
23127       rtx tmp;
23128
23129       if (is_store_insn (last_scheduled_insn))
23130         /* Issuing a store, swing the load_store_pendulum to the left */
23131         load_store_pendulum--;
23132       else if (is_load_insn (last_scheduled_insn))
23133         /* Issuing a load, swing the load_store_pendulum to the right */
23134         load_store_pendulum++;
23135       else
23136         return cached_can_issue_more;
23137
23138       /* If the pendulum is balanced, or there is only one instruction on
23139          the ready list, then all is well, so return. */
23140       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
23141         return cached_can_issue_more;
23142
23143       if (load_store_pendulum == 1)
23144         {
23145           /* A load has been issued in this cycle.  Scan the ready list
23146              for another load to issue with it */
23147           pos = *pn_ready-1;
23148
23149           while (pos >= 0)
23150             {
23151               if (is_load_insn (ready[pos]))
23152                 {
23153                   /* Found a load.  Move it to the head of the ready list,
23154                      and adjust it's priority so that it is more likely to
23155                      stay there */
23156                   tmp = ready[pos];
23157                   for (i=pos; i<*pn_ready-1; i++)
23158                     ready[i] = ready[i + 1];
23159                   ready[*pn_ready-1] = tmp;
23160
23161                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23162                     INSN_PRIORITY (tmp)++;
23163                   break;
23164                 }
23165               pos--;
23166             }
23167         }
23168       else if (load_store_pendulum == -2)
23169         {
23170           /* Two stores have been issued in this cycle.  Increase the
23171              priority of the first load in the ready list to favor it for
23172              issuing in the next cycle. */
23173           pos = *pn_ready-1;
23174
23175           while (pos >= 0)
23176             {
23177               if (is_load_insn (ready[pos])
23178                   && !sel_sched_p ()
23179                   && INSN_PRIORITY_KNOWN (ready[pos]))
23180                 {
23181                   INSN_PRIORITY (ready[pos])++;
23182
23183                   /* Adjust the pendulum to account for the fact that a load
23184                      was found and increased in priority.  This is to prevent
23185                      increasing the priority of multiple loads */
23186                   load_store_pendulum--;
23187
23188                   break;
23189                 }
23190               pos--;
23191             }
23192         }
23193       else if (load_store_pendulum == -1)
23194         {
23195           /* A store has been issued in this cycle.  Scan the ready list for
23196              another store to issue with it, preferring a store to an adjacent
23197              memory location */
23198           int first_store_pos = -1;
23199
23200           pos = *pn_ready-1;
23201
23202           while (pos >= 0)
23203             {
23204               if (is_store_insn (ready[pos]))
23205                 {
23206                   /* Maintain the index of the first store found on the
23207                      list */
23208                   if (first_store_pos == -1)
23209                     first_store_pos = pos;
23210
23211                   if (is_store_insn (last_scheduled_insn)
23212                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
23213                     {
23214                       /* Found an adjacent store.  Move it to the head of the
23215                          ready list, and adjust it's priority so that it is
23216                          more likely to stay there */
23217                       tmp = ready[pos];
23218                       for (i=pos; i<*pn_ready-1; i++)
23219                         ready[i] = ready[i + 1];
23220                       ready[*pn_ready-1] = tmp;
23221
23222                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23223                         INSN_PRIORITY (tmp)++;
23224
23225                       first_store_pos = -1;
23226
23227                       break;
23228                     };
23229                 }
23230               pos--;
23231             }
23232
23233           if (first_store_pos >= 0)
23234             {
23235               /* An adjacent store wasn't found, but a non-adjacent store was,
23236                  so move the non-adjacent store to the front of the ready
23237                  list, and adjust its priority so that it is more likely to
23238                  stay there. */
23239               tmp = ready[first_store_pos];
23240               for (i=first_store_pos; i<*pn_ready-1; i++)
23241                 ready[i] = ready[i + 1];
23242               ready[*pn_ready-1] = tmp;
23243               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23244                 INSN_PRIORITY (tmp)++;
23245             }
23246         }
23247       else if (load_store_pendulum == 2)
23248        {
23249            /* Two loads have been issued in this cycle.  Increase the priority
23250               of the first store in the ready list to favor it for issuing in
23251               the next cycle. */
23252           pos = *pn_ready-1;
23253
23254           while (pos >= 0)
23255             {
23256               if (is_store_insn (ready[pos])
23257                   && !sel_sched_p ()
23258                   && INSN_PRIORITY_KNOWN (ready[pos]))
23259                 {
23260                   INSN_PRIORITY (ready[pos])++;
23261
23262                   /* Adjust the pendulum to account for the fact that a store
23263                      was found and increased in priority.  This is to prevent
23264                      increasing the priority of multiple stores */
23265                   load_store_pendulum++;
23266
23267                   break;
23268                 }
23269               pos--;
23270             }
23271         }
23272     }
23273
23274   return cached_can_issue_more;
23275 }
23276
23277 /* Return whether the presence of INSN causes a dispatch group termination
23278    of group WHICH_GROUP.
23279
23280    If WHICH_GROUP == current_group, this function will return true if INSN
23281    causes the termination of the current group (i.e, the dispatch group to
23282    which INSN belongs). This means that INSN will be the last insn in the
23283    group it belongs to.
23284
23285    If WHICH_GROUP == previous_group, this function will return true if INSN
23286    causes the termination of the previous group (i.e, the dispatch group that
23287    precedes the group to which INSN belongs).  This means that INSN will be
23288    the first insn in the group it belongs to).  */
23289
23290 static bool
23291 insn_terminates_group_p (rtx insn, enum group_termination which_group)
23292 {
23293   bool first, last;
23294
23295   if (! insn)
23296     return false;
23297
23298   first = insn_must_be_first_in_group (insn);
23299   last = insn_must_be_last_in_group (insn);
23300
23301   if (first && last)
23302     return true;
23303
23304   if (which_group == current_group)
23305     return last;
23306   else if (which_group == previous_group)
23307     return first;
23308
23309   return false;
23310 }
23311
23312
23313 static bool
23314 insn_must_be_first_in_group (rtx insn)
23315 {
23316   enum attr_type type;
23317
23318   if (!insn
23319       || GET_CODE (insn) == NOTE
23320       || DEBUG_INSN_P (insn)
23321       || GET_CODE (PATTERN (insn)) == USE
23322       || GET_CODE (PATTERN (insn)) == CLOBBER)
23323     return false;
23324
23325   switch (rs6000_cpu)
23326     {
23327     case PROCESSOR_POWER5:
23328       if (is_cracked_insn (insn))
23329         return true;
23330     case PROCESSOR_POWER4:
23331       if (is_microcoded_insn (insn))
23332         return true;
23333
23334       if (!rs6000_sched_groups)
23335         return false;
23336
23337       type = get_attr_type (insn);
23338
23339       switch (type)
23340         {
23341         case TYPE_MFCR:
23342         case TYPE_MFCRF:
23343         case TYPE_MTCR:
23344         case TYPE_DELAYED_CR:
23345         case TYPE_CR_LOGICAL:
23346         case TYPE_MTJMPR:
23347         case TYPE_MFJMPR:
23348         case TYPE_IDIV:
23349         case TYPE_LDIV:
23350         case TYPE_LOAD_L:
23351         case TYPE_STORE_C:
23352         case TYPE_ISYNC:
23353         case TYPE_SYNC:
23354           return true;
23355         default:
23356           break;
23357         }
23358       break;
23359     case PROCESSOR_POWER6:
23360       type = get_attr_type (insn);
23361
23362       switch (type)
23363         {
23364         case TYPE_INSERT_DWORD:
23365         case TYPE_EXTS:
23366         case TYPE_CNTLZ:
23367         case TYPE_SHIFT:
23368         case TYPE_VAR_SHIFT_ROTATE:
23369         case TYPE_TRAP:
23370         case TYPE_IMUL:
23371         case TYPE_IMUL2:
23372         case TYPE_IMUL3:
23373         case TYPE_LMUL:
23374         case TYPE_IDIV:
23375         case TYPE_INSERT_WORD:
23376         case TYPE_DELAYED_COMPARE:
23377         case TYPE_IMUL_COMPARE:
23378         case TYPE_LMUL_COMPARE:
23379         case TYPE_FPCOMPARE:
23380         case TYPE_MFCR:
23381         case TYPE_MTCR:
23382         case TYPE_MFJMPR:
23383         case TYPE_MTJMPR:
23384         case TYPE_ISYNC:
23385         case TYPE_SYNC:
23386         case TYPE_LOAD_L:
23387         case TYPE_STORE_C:
23388         case TYPE_LOAD_U:
23389         case TYPE_LOAD_UX:
23390         case TYPE_LOAD_EXT_UX:
23391         case TYPE_STORE_U:
23392         case TYPE_STORE_UX:
23393         case TYPE_FPLOAD_U:
23394         case TYPE_FPLOAD_UX:
23395         case TYPE_FPSTORE_U:
23396         case TYPE_FPSTORE_UX:
23397           return true;
23398         default:
23399           break;
23400         }
23401       break;
23402     case PROCESSOR_POWER7:
23403       type = get_attr_type (insn);
23404
23405       switch (type)
23406         {
23407         case TYPE_CR_LOGICAL:
23408         case TYPE_MFCR:
23409         case TYPE_MFCRF:
23410         case TYPE_MTCR:
23411         case TYPE_IDIV:
23412         case TYPE_LDIV:
23413         case TYPE_COMPARE:
23414         case TYPE_DELAYED_COMPARE:
23415         case TYPE_VAR_DELAYED_COMPARE:
23416         case TYPE_ISYNC:
23417         case TYPE_LOAD_L:
23418         case TYPE_STORE_C:
23419         case TYPE_LOAD_U:
23420         case TYPE_LOAD_UX:
23421         case TYPE_LOAD_EXT:
23422         case TYPE_LOAD_EXT_U:
23423         case TYPE_LOAD_EXT_UX:
23424         case TYPE_STORE_U:
23425         case TYPE_STORE_UX:
23426         case TYPE_FPLOAD_U:
23427         case TYPE_FPLOAD_UX:
23428         case TYPE_FPSTORE_U:
23429         case TYPE_FPSTORE_UX:
23430         case TYPE_MFJMPR:
23431         case TYPE_MTJMPR:
23432           return true;
23433         default:
23434           break;
23435         }
23436       break;
23437     default:
23438       break;
23439     }
23440
23441   return false;
23442 }
23443
23444 static bool
23445 insn_must_be_last_in_group (rtx insn)
23446 {
23447   enum attr_type type;
23448
23449   if (!insn
23450       || GET_CODE (insn) == NOTE
23451       || DEBUG_INSN_P (insn)
23452       || GET_CODE (PATTERN (insn)) == USE
23453       || GET_CODE (PATTERN (insn)) == CLOBBER)
23454     return false;
23455
23456   switch (rs6000_cpu) {
23457   case PROCESSOR_POWER4:
23458   case PROCESSOR_POWER5:
23459     if (is_microcoded_insn (insn))
23460       return true;
23461
23462     if (is_branch_slot_insn (insn))
23463       return true;
23464
23465     break;
23466   case PROCESSOR_POWER6:
23467     type = get_attr_type (insn);
23468
23469     switch (type)
23470       {
23471       case TYPE_EXTS:
23472       case TYPE_CNTLZ:
23473       case TYPE_SHIFT:
23474       case TYPE_VAR_SHIFT_ROTATE:
23475       case TYPE_TRAP:
23476       case TYPE_IMUL:
23477       case TYPE_IMUL2:
23478       case TYPE_IMUL3:
23479       case TYPE_LMUL:
23480       case TYPE_IDIV:
23481       case TYPE_DELAYED_COMPARE:
23482       case TYPE_IMUL_COMPARE:
23483       case TYPE_LMUL_COMPARE:
23484       case TYPE_FPCOMPARE:
23485       case TYPE_MFCR:
23486       case TYPE_MTCR:
23487       case TYPE_MFJMPR:
23488       case TYPE_MTJMPR:
23489       case TYPE_ISYNC:
23490       case TYPE_SYNC:
23491       case TYPE_LOAD_L:
23492       case TYPE_STORE_C:
23493         return true;
23494       default:
23495         break;
23496     }
23497     break;
23498   case PROCESSOR_POWER7:
23499     type = get_attr_type (insn);
23500
23501     switch (type)
23502       {
23503       case TYPE_ISYNC:
23504       case TYPE_SYNC:
23505       case TYPE_LOAD_L:
23506       case TYPE_STORE_C:
23507       case TYPE_LOAD_EXT_U:
23508       case TYPE_LOAD_EXT_UX:
23509       case TYPE_STORE_UX:
23510         return true;
23511       default:
23512         break;
23513     }
23514     break;
23515   default:
23516     break;
23517   }
23518
23519   return false;
23520 }
23521
23522 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
23523    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
23524
23525 static bool
23526 is_costly_group (rtx *group_insns, rtx next_insn)
23527 {
23528   int i;
23529   int issue_rate = rs6000_issue_rate ();
23530
23531   for (i = 0; i < issue_rate; i++)
23532     {
23533       sd_iterator_def sd_it;
23534       dep_t dep;
23535       rtx insn = group_insns[i];
23536
23537       if (!insn)
23538         continue;
23539
23540       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
23541         {
23542           rtx next = DEP_CON (dep);
23543
23544           if (next == next_insn
23545               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
23546             return true;
23547         }
23548     }
23549
23550   return false;
23551 }
23552
23553 /* Utility of the function redefine_groups.
23554    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
23555    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
23556    to keep it "far" (in a separate group) from GROUP_INSNS, following
23557    one of the following schemes, depending on the value of the flag
23558    -minsert_sched_nops = X:
23559    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
23560        in order to force NEXT_INSN into a separate group.
23561    (2) X < sched_finish_regroup_exact: insert exactly X nops.
23562    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
23563    insertion (has a group just ended, how many vacant issue slots remain in the
23564    last group, and how many dispatch groups were encountered so far).  */
23565
23566 static int
23567 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
23568                  rtx next_insn, bool *group_end, int can_issue_more,
23569                  int *group_count)
23570 {
23571   rtx nop;
23572   bool force;
23573   int issue_rate = rs6000_issue_rate ();
23574   bool end = *group_end;
23575   int i;
23576
23577   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
23578     return can_issue_more;
23579
23580   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
23581     return can_issue_more;
23582
23583   force = is_costly_group (group_insns, next_insn);
23584   if (!force)
23585     return can_issue_more;
23586
23587   if (sched_verbose > 6)
23588     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
23589              *group_count ,can_issue_more);
23590
23591   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
23592     {
23593       if (*group_end)
23594         can_issue_more = 0;
23595
23596       /* Since only a branch can be issued in the last issue_slot, it is
23597          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
23598          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
23599          in this case the last nop will start a new group and the branch
23600          will be forced to the new group.  */
23601       if (can_issue_more && !is_branch_slot_insn (next_insn))
23602         can_issue_more--;
23603
23604       while (can_issue_more > 0)
23605         {
23606           nop = gen_nop ();
23607           emit_insn_before (nop, next_insn);
23608           can_issue_more--;
23609         }
23610
23611       *group_end = true;
23612       return 0;
23613     }
23614
23615   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
23616     {
23617       int n_nops = rs6000_sched_insert_nops;
23618
23619       /* Nops can't be issued from the branch slot, so the effective
23620          issue_rate for nops is 'issue_rate - 1'.  */
23621       if (can_issue_more == 0)
23622         can_issue_more = issue_rate;
23623       can_issue_more--;
23624       if (can_issue_more == 0)
23625         {
23626           can_issue_more = issue_rate - 1;
23627           (*group_count)++;
23628           end = true;
23629           for (i = 0; i < issue_rate; i++)
23630             {
23631               group_insns[i] = 0;
23632             }
23633         }
23634
23635       while (n_nops > 0)
23636         {
23637           nop = gen_nop ();
23638           emit_insn_before (nop, next_insn);
23639           if (can_issue_more == issue_rate - 1) /* new group begins */
23640             end = false;
23641           can_issue_more--;
23642           if (can_issue_more == 0)
23643             {
23644               can_issue_more = issue_rate - 1;
23645               (*group_count)++;
23646               end = true;
23647               for (i = 0; i < issue_rate; i++)
23648                 {
23649                   group_insns[i] = 0;
23650                 }
23651             }
23652           n_nops--;
23653         }
23654
23655       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
23656       can_issue_more++;
23657
23658       /* Is next_insn going to start a new group?  */
23659       *group_end
23660         = (end
23661            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
23662            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
23663            || (can_issue_more < issue_rate &&
23664                insn_terminates_group_p (next_insn, previous_group)));
23665       if (*group_end && end)
23666         (*group_count)--;
23667
23668       if (sched_verbose > 6)
23669         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
23670                  *group_count, can_issue_more);
23671       return can_issue_more;
23672     }
23673
23674   return can_issue_more;
23675 }
23676
23677 /* This function tries to synch the dispatch groups that the compiler "sees"
23678    with the dispatch groups that the processor dispatcher is expected to
23679    form in practice.  It tries to achieve this synchronization by forcing the
23680    estimated processor grouping on the compiler (as opposed to the function
23681    'pad_goups' which tries to force the scheduler's grouping on the processor).
23682
23683    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
23684    examines the (estimated) dispatch groups that will be formed by the processor
23685    dispatcher.  It marks these group boundaries to reflect the estimated
23686    processor grouping, overriding the grouping that the scheduler had marked.
23687    Depending on the value of the flag '-minsert-sched-nops' this function can
23688    force certain insns into separate groups or force a certain distance between
23689    them by inserting nops, for example, if there exists a "costly dependence"
23690    between the insns.
23691
23692    The function estimates the group boundaries that the processor will form as
23693    follows:  It keeps track of how many vacant issue slots are available after
23694    each insn.  A subsequent insn will start a new group if one of the following
23695    4 cases applies:
23696    - no more vacant issue slots remain in the current dispatch group.
23697    - only the last issue slot, which is the branch slot, is vacant, but the next
23698      insn is not a branch.
23699    - only the last 2 or less issue slots, including the branch slot, are vacant,
23700      which means that a cracked insn (which occupies two issue slots) can't be
23701      issued in this group.
23702    - less than 'issue_rate' slots are vacant, and the next insn always needs to
23703      start a new group.  */
23704
23705 static int
23706 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
23707 {
23708   rtx insn, next_insn;
23709   int issue_rate;
23710   int can_issue_more;
23711   int slot, i;
23712   bool group_end;
23713   int group_count = 0;
23714   rtx *group_insns;
23715
23716   /* Initialize.  */
23717   issue_rate = rs6000_issue_rate ();
23718   group_insns = XALLOCAVEC (rtx, issue_rate);
23719   for (i = 0; i < issue_rate; i++)
23720     {
23721       group_insns[i] = 0;
23722     }
23723   can_issue_more = issue_rate;
23724   slot = 0;
23725   insn = get_next_active_insn (prev_head_insn, tail);
23726   group_end = false;
23727
23728   while (insn != NULL_RTX)
23729     {
23730       slot = (issue_rate - can_issue_more);
23731       group_insns[slot] = insn;
23732       can_issue_more =
23733         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
23734       if (insn_terminates_group_p (insn, current_group))
23735         can_issue_more = 0;
23736
23737       next_insn = get_next_active_insn (insn, tail);
23738       if (next_insn == NULL_RTX)
23739         return group_count + 1;
23740
23741       /* Is next_insn going to start a new group?  */
23742       group_end
23743         = (can_issue_more == 0
23744            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
23745            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
23746            || (can_issue_more < issue_rate &&
23747                insn_terminates_group_p (next_insn, previous_group)));
23748
23749       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
23750                                         next_insn, &group_end, can_issue_more,
23751                                         &group_count);
23752
23753       if (group_end)
23754         {
23755           group_count++;
23756           can_issue_more = 0;
23757           for (i = 0; i < issue_rate; i++)
23758             {
23759               group_insns[i] = 0;
23760             }
23761         }
23762
23763       if (GET_MODE (next_insn) == TImode && can_issue_more)
23764         PUT_MODE (next_insn, VOIDmode);
23765       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
23766         PUT_MODE (next_insn, TImode);
23767
23768       insn = next_insn;
23769       if (can_issue_more == 0)
23770         can_issue_more = issue_rate;
23771     } /* while */
23772
23773   return group_count;
23774 }
23775
23776 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
23777    dispatch group boundaries that the scheduler had marked.  Pad with nops
23778    any dispatch groups which have vacant issue slots, in order to force the
23779    scheduler's grouping on the processor dispatcher.  The function
23780    returns the number of dispatch groups found.  */
23781
23782 static int
23783 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
23784 {
23785   rtx insn, next_insn;
23786   rtx nop;
23787   int issue_rate;
23788   int can_issue_more;
23789   int group_end;
23790   int group_count = 0;
23791
23792   /* Initialize issue_rate.  */
23793   issue_rate = rs6000_issue_rate ();
23794   can_issue_more = issue_rate;
23795
23796   insn = get_next_active_insn (prev_head_insn, tail);
23797   next_insn = get_next_active_insn (insn, tail);
23798
23799   while (insn != NULL_RTX)
23800     {
23801       can_issue_more =
23802         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
23803
23804       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
23805
23806       if (next_insn == NULL_RTX)
23807         break;
23808
23809       if (group_end)
23810         {
23811           /* If the scheduler had marked group termination at this location
23812              (between insn and next_insn), and neither insn nor next_insn will
23813              force group termination, pad the group with nops to force group
23814              termination.  */
23815           if (can_issue_more
23816               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
23817               && !insn_terminates_group_p (insn, current_group)
23818               && !insn_terminates_group_p (next_insn, previous_group))
23819             {
23820               if (!is_branch_slot_insn (next_insn))
23821                 can_issue_more--;
23822
23823               while (can_issue_more)
23824                 {
23825                   nop = gen_nop ();
23826                   emit_insn_before (nop, next_insn);
23827                   can_issue_more--;
23828                 }
23829             }
23830
23831           can_issue_more = issue_rate;
23832           group_count++;
23833         }
23834
23835       insn = next_insn;
23836       next_insn = get_next_active_insn (insn, tail);
23837     }
23838
23839   return group_count;
23840 }
23841
23842 /* We're beginning a new block.  Initialize data structures as necessary.  */
23843
23844 static void
23845 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
23846                      int sched_verbose ATTRIBUTE_UNUSED,
23847                      int max_ready ATTRIBUTE_UNUSED)
23848 {
23849   last_scheduled_insn = NULL_RTX;
23850   load_store_pendulum = 0;
23851 }
23852
23853 /* The following function is called at the end of scheduling BB.
23854    After reload, it inserts nops at insn group bundling.  */
23855
23856 static void
23857 rs6000_sched_finish (FILE *dump, int sched_verbose)
23858 {
23859   int n_groups;
23860
23861   if (sched_verbose)
23862     fprintf (dump, "=== Finishing schedule.\n");
23863
23864   if (reload_completed && rs6000_sched_groups)
23865     {
23866       /* Do not run sched_finish hook when selective scheduling enabled.  */
23867       if (sel_sched_p ())
23868         return;
23869
23870       if (rs6000_sched_insert_nops == sched_finish_none)
23871         return;
23872
23873       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
23874         n_groups = pad_groups (dump, sched_verbose,
23875                                current_sched_info->prev_head,
23876                                current_sched_info->next_tail);
23877       else
23878         n_groups = redefine_groups (dump, sched_verbose,
23879                                     current_sched_info->prev_head,
23880                                     current_sched_info->next_tail);
23881
23882       if (sched_verbose >= 6)
23883         {
23884           fprintf (dump, "ngroups = %d\n", n_groups);
23885           print_rtl (dump, current_sched_info->prev_head);
23886           fprintf (dump, "Done finish_sched\n");
23887         }
23888     }
23889 }
23890
23891 struct _rs6000_sched_context
23892 {
23893   short cached_can_issue_more;
23894   rtx last_scheduled_insn;
23895   int load_store_pendulum;
23896 };
23897
23898 typedef struct _rs6000_sched_context rs6000_sched_context_def;
23899 typedef rs6000_sched_context_def *rs6000_sched_context_t;
23900
23901 /* Allocate store for new scheduling context.  */
23902 static void *
23903 rs6000_alloc_sched_context (void)
23904 {
23905   return xmalloc (sizeof (rs6000_sched_context_def));
23906 }
23907
23908 /* If CLEAN_P is true then initializes _SC with clean data,
23909    and from the global context otherwise.  */
23910 static void
23911 rs6000_init_sched_context (void *_sc, bool clean_p)
23912 {
23913   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
23914
23915   if (clean_p)
23916     {
23917       sc->cached_can_issue_more = 0;
23918       sc->last_scheduled_insn = NULL_RTX;
23919       sc->load_store_pendulum = 0;
23920     }
23921   else
23922     {
23923       sc->cached_can_issue_more = cached_can_issue_more;
23924       sc->last_scheduled_insn = last_scheduled_insn;
23925       sc->load_store_pendulum = load_store_pendulum;
23926     }
23927 }
23928
23929 /* Sets the global scheduling context to the one pointed to by _SC.  */
23930 static void
23931 rs6000_set_sched_context (void *_sc)
23932 {
23933   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
23934
23935   gcc_assert (sc != NULL);
23936
23937   cached_can_issue_more = sc->cached_can_issue_more;
23938   last_scheduled_insn = sc->last_scheduled_insn;
23939   load_store_pendulum = sc->load_store_pendulum;
23940 }
23941
23942 /* Free _SC.  */
23943 static void
23944 rs6000_free_sched_context (void *_sc)
23945 {
23946   gcc_assert (_sc != NULL);
23947
23948   free (_sc);
23949 }
23950
23951 \f
23952 /* Length in units of the trampoline for entering a nested function.  */
23953
23954 int
23955 rs6000_trampoline_size (void)
23956 {
23957   int ret = 0;
23958
23959   switch (DEFAULT_ABI)
23960     {
23961     default:
23962       gcc_unreachable ();
23963
23964     case ABI_AIX:
23965       ret = (TARGET_32BIT) ? 12 : 24;
23966       break;
23967
23968     case ABI_DARWIN:
23969     case ABI_V4:
23970       ret = (TARGET_32BIT) ? 40 : 48;
23971       break;
23972     }
23973
23974   return ret;
23975 }
23976
23977 /* Emit RTL insns to initialize the variable parts of a trampoline.
23978    FNADDR is an RTX for the address of the function's pure code.
23979    CXT is an RTX for the static chain value for the function.  */
23980
23981 static void
23982 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
23983 {
23984   int regsize = (TARGET_32BIT) ? 4 : 8;
23985   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
23986   rtx ctx_reg = force_reg (Pmode, cxt);
23987   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
23988
23989   switch (DEFAULT_ABI)
23990     {
23991     default:
23992       gcc_unreachable ();
23993
23994     /* Under AIX, just build the 3 word function descriptor */
23995     case ABI_AIX:
23996       {
23997         rtx fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
23998         rtx fn_reg = gen_reg_rtx (Pmode);
23999         rtx toc_reg = gen_reg_rtx (Pmode);
24000
24001   /* Macro to shorten the code expansions below.  */
24002 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
24003
24004         m_tramp = replace_equiv_address (m_tramp, addr);
24005
24006         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
24007         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
24008         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
24009         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
24010         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
24011
24012 # undef MEM_PLUS
24013       }
24014       break;
24015
24016     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
24017     case ABI_DARWIN:
24018     case ABI_V4:
24019       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
24020                          LCT_NORMAL, VOIDmode, 4,
24021                          addr, Pmode,
24022                          GEN_INT (rs6000_trampoline_size ()), SImode,
24023                          fnaddr, Pmode,
24024                          ctx_reg, Pmode);
24025       break;
24026     }
24027 }
24028
24029 \f
24030 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
24031    identifier as an argument, so the front end shouldn't look it up.  */
24032
24033 static bool
24034 rs6000_attribute_takes_identifier_p (const_tree attr_id)
24035 {
24036   return is_attribute_p ("altivec", attr_id);
24037 }
24038
24039 /* Handle the "altivec" attribute.  The attribute may have
24040    arguments as follows:
24041
24042         __attribute__((altivec(vector__)))
24043         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
24044         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
24045
24046   and may appear more than once (e.g., 'vector bool char') in a
24047   given declaration.  */
24048
24049 static tree
24050 rs6000_handle_altivec_attribute (tree *node,
24051                                  tree name ATTRIBUTE_UNUSED,
24052                                  tree args,
24053                                  int flags ATTRIBUTE_UNUSED,
24054                                  bool *no_add_attrs)
24055 {
24056   tree type = *node, result = NULL_TREE;
24057   enum machine_mode mode;
24058   int unsigned_p;
24059   char altivec_type
24060     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
24061         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
24062        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
24063        : '?');
24064
24065   while (POINTER_TYPE_P (type)
24066          || TREE_CODE (type) == FUNCTION_TYPE
24067          || TREE_CODE (type) == METHOD_TYPE
24068          || TREE_CODE (type) == ARRAY_TYPE)
24069     type = TREE_TYPE (type);
24070
24071   mode = TYPE_MODE (type);
24072
24073   /* Check for invalid AltiVec type qualifiers.  */
24074   if (type == long_double_type_node)
24075     error ("use of %<long double%> in AltiVec types is invalid");
24076   else if (type == boolean_type_node)
24077     error ("use of boolean types in AltiVec types is invalid");
24078   else if (TREE_CODE (type) == COMPLEX_TYPE)
24079     error ("use of %<complex%> in AltiVec types is invalid");
24080   else if (DECIMAL_FLOAT_MODE_P (mode))
24081     error ("use of decimal floating point types in AltiVec types is invalid");
24082   else if (!TARGET_VSX)
24083     {
24084       if (type == long_unsigned_type_node || type == long_integer_type_node)
24085         {
24086           if (TARGET_64BIT)
24087             error ("use of %<long%> in AltiVec types is invalid for "
24088                    "64-bit code without -mvsx");
24089           else if (rs6000_warn_altivec_long)
24090             warning (0, "use of %<long%> in AltiVec types is deprecated; "
24091                      "use %<int%>");
24092         }
24093       else if (type == long_long_unsigned_type_node
24094                || type == long_long_integer_type_node)
24095         error ("use of %<long long%> in AltiVec types is invalid without "
24096                "-mvsx");
24097       else if (type == double_type_node)
24098         error ("use of %<double%> in AltiVec types is invalid without -mvsx");
24099     }
24100
24101   switch (altivec_type)
24102     {
24103     case 'v':
24104       unsigned_p = TYPE_UNSIGNED (type);
24105       switch (mode)
24106         {
24107         case DImode:
24108           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
24109           break;
24110         case SImode:
24111           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
24112           break;
24113         case HImode:
24114           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
24115           break;
24116         case QImode:
24117           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
24118           break;
24119         case SFmode: result = V4SF_type_node; break;
24120         case DFmode: result = V2DF_type_node; break;
24121           /* If the user says 'vector int bool', we may be handed the 'bool'
24122              attribute _before_ the 'vector' attribute, and so select the
24123              proper type in the 'b' case below.  */
24124         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
24125         case V2DImode: case V2DFmode:
24126           result = type;
24127         default: break;
24128         }
24129       break;
24130     case 'b':
24131       switch (mode)
24132         {
24133         case DImode: case V2DImode: result = bool_V2DI_type_node; break;
24134         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
24135         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
24136         case QImode: case V16QImode: result = bool_V16QI_type_node;
24137         default: break;
24138         }
24139       break;
24140     case 'p':
24141       switch (mode)
24142         {
24143         case V8HImode: result = pixel_V8HI_type_node;
24144         default: break;
24145         }
24146     default: break;
24147     }
24148
24149   /* Propagate qualifiers attached to the element type
24150      onto the vector type.  */
24151   if (result && result != type && TYPE_QUALS (type))
24152     result = build_qualified_type (result, TYPE_QUALS (type));
24153
24154   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
24155
24156   if (result)
24157     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
24158
24159   return NULL_TREE;
24160 }
24161
24162 /* AltiVec defines four built-in scalar types that serve as vector
24163    elements; we must teach the compiler how to mangle them.  */
24164
24165 static const char *
24166 rs6000_mangle_type (const_tree type)
24167 {
24168   type = TYPE_MAIN_VARIANT (type);
24169
24170   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
24171       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
24172     return NULL;
24173
24174   if (type == bool_char_type_node) return "U6__boolc";
24175   if (type == bool_short_type_node) return "U6__bools";
24176   if (type == pixel_type_node) return "u7__pixel";
24177   if (type == bool_int_type_node) return "U6__booli";
24178   if (type == bool_long_type_node) return "U6__booll";
24179
24180   /* Mangle IBM extended float long double as `g' (__float128) on
24181      powerpc*-linux where long-double-64 previously was the default.  */
24182   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
24183       && TARGET_ELF
24184       && TARGET_LONG_DOUBLE_128
24185       && !TARGET_IEEEQUAD)
24186     return "g";
24187
24188   /* For all other types, use normal C++ mangling.  */
24189   return NULL;
24190 }
24191
24192 /* Handle a "longcall" or "shortcall" attribute; arguments as in
24193    struct attribute_spec.handler.  */
24194
24195 static tree
24196 rs6000_handle_longcall_attribute (tree *node, tree name,
24197                                   tree args ATTRIBUTE_UNUSED,
24198                                   int flags ATTRIBUTE_UNUSED,
24199                                   bool *no_add_attrs)
24200 {
24201   if (TREE_CODE (*node) != FUNCTION_TYPE
24202       && TREE_CODE (*node) != FIELD_DECL
24203       && TREE_CODE (*node) != TYPE_DECL)
24204     {
24205       warning (OPT_Wattributes, "%qE attribute only applies to functions",
24206                name);
24207       *no_add_attrs = true;
24208     }
24209
24210   return NULL_TREE;
24211 }
24212
24213 /* Set longcall attributes on all functions declared when
24214    rs6000_default_long_calls is true.  */
24215 static void
24216 rs6000_set_default_type_attributes (tree type)
24217 {
24218   if (rs6000_default_long_calls
24219       && (TREE_CODE (type) == FUNCTION_TYPE
24220           || TREE_CODE (type) == METHOD_TYPE))
24221     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
24222                                         NULL_TREE,
24223                                         TYPE_ATTRIBUTES (type));
24224
24225 #if TARGET_MACHO
24226   darwin_set_default_type_attributes (type);
24227 #endif
24228 }
24229
24230 /* Return a reference suitable for calling a function with the
24231    longcall attribute.  */
24232
24233 rtx
24234 rs6000_longcall_ref (rtx call_ref)
24235 {
24236   const char *call_name;
24237   tree node;
24238
24239   if (GET_CODE (call_ref) != SYMBOL_REF)
24240     return call_ref;
24241
24242   /* System V adds '.' to the internal name, so skip them.  */
24243   call_name = XSTR (call_ref, 0);
24244   if (*call_name == '.')
24245     {
24246       while (*call_name == '.')
24247         call_name++;
24248
24249       node = get_identifier (call_name);
24250       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
24251     }
24252
24253   return force_reg (Pmode, call_ref);
24254 }
24255 \f
24256 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
24257 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
24258 #endif
24259
24260 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
24261    struct attribute_spec.handler.  */
24262 static tree
24263 rs6000_handle_struct_attribute (tree *node, tree name,
24264                                 tree args ATTRIBUTE_UNUSED,
24265                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
24266 {
24267   tree *type = NULL;
24268   if (DECL_P (*node))
24269     {
24270       if (TREE_CODE (*node) == TYPE_DECL)
24271         type = &TREE_TYPE (*node);
24272     }
24273   else
24274     type = node;
24275
24276   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
24277                  || TREE_CODE (*type) == UNION_TYPE)))
24278     {
24279       warning (OPT_Wattributes, "%qE attribute ignored", name);
24280       *no_add_attrs = true;
24281     }
24282
24283   else if ((is_attribute_p ("ms_struct", name)
24284             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
24285            || ((is_attribute_p ("gcc_struct", name)
24286                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
24287     {
24288       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
24289                name);
24290       *no_add_attrs = true;
24291     }
24292
24293   return NULL_TREE;
24294 }
24295
24296 static bool
24297 rs6000_ms_bitfield_layout_p (const_tree record_type)
24298 {
24299   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
24300           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
24301     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
24302 }
24303 \f
24304 #ifdef USING_ELFOS_H
24305
24306 /* A get_unnamed_section callback, used for switching to toc_section.  */
24307
24308 static void
24309 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
24310 {
24311   if (DEFAULT_ABI == ABI_AIX
24312       && TARGET_MINIMAL_TOC
24313       && !TARGET_RELOCATABLE)
24314     {
24315       if (!toc_initialized)
24316         {
24317           toc_initialized = 1;
24318           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24319           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
24320           fprintf (asm_out_file, "\t.tc ");
24321           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
24322           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24323           fprintf (asm_out_file, "\n");
24324
24325           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24326           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24327           fprintf (asm_out_file, " = .+32768\n");
24328         }
24329       else
24330         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24331     }
24332   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
24333     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24334   else
24335     {
24336       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24337       if (!toc_initialized)
24338         {
24339           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24340           fprintf (asm_out_file, " = .+32768\n");
24341           toc_initialized = 1;
24342         }
24343     }
24344 }
24345
24346 /* Implement TARGET_ASM_INIT_SECTIONS.  */
24347
24348 static void
24349 rs6000_elf_asm_init_sections (void)
24350 {
24351   toc_section
24352     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
24353
24354   sdata2_section
24355     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
24356                            SDATA2_SECTION_ASM_OP);
24357 }
24358
24359 /* Implement TARGET_SELECT_RTX_SECTION.  */
24360
24361 static section *
24362 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
24363                                unsigned HOST_WIDE_INT align)
24364 {
24365   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
24366     return toc_section;
24367   else
24368     return default_elf_select_rtx_section (mode, x, align);
24369 }
24370 \f
24371 /* For a SYMBOL_REF, set generic flags and then perform some
24372    target-specific processing.
24373
24374    When the AIX ABI is requested on a non-AIX system, replace the
24375    function name with the real name (with a leading .) rather than the
24376    function descriptor name.  This saves a lot of overriding code to
24377    read the prefixes.  */
24378
24379 static void
24380 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
24381 {
24382   default_encode_section_info (decl, rtl, first);
24383
24384   if (first
24385       && TREE_CODE (decl) == FUNCTION_DECL
24386       && !TARGET_AIX
24387       && DEFAULT_ABI == ABI_AIX)
24388     {
24389       rtx sym_ref = XEXP (rtl, 0);
24390       size_t len = strlen (XSTR (sym_ref, 0));
24391       char *str = XALLOCAVEC (char, len + 2);
24392       str[0] = '.';
24393       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
24394       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
24395     }
24396 }
24397
24398 static inline bool
24399 compare_section_name (const char *section, const char *templ)
24400 {
24401   int len;
24402
24403   len = strlen (templ);
24404   return (strncmp (section, templ, len) == 0
24405           && (section[len] == 0 || section[len] == '.'));
24406 }
24407
24408 bool
24409 rs6000_elf_in_small_data_p (const_tree decl)
24410 {
24411   if (rs6000_sdata == SDATA_NONE)
24412     return false;
24413
24414   /* We want to merge strings, so we never consider them small data.  */
24415   if (TREE_CODE (decl) == STRING_CST)
24416     return false;
24417
24418   /* Functions are never in the small data area.  */
24419   if (TREE_CODE (decl) == FUNCTION_DECL)
24420     return false;
24421
24422   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
24423     {
24424       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
24425       if (compare_section_name (section, ".sdata")
24426           || compare_section_name (section, ".sdata2")
24427           || compare_section_name (section, ".gnu.linkonce.s")
24428           || compare_section_name (section, ".sbss")
24429           || compare_section_name (section, ".sbss2")
24430           || compare_section_name (section, ".gnu.linkonce.sb")
24431           || strcmp (section, ".PPC.EMB.sdata0") == 0
24432           || strcmp (section, ".PPC.EMB.sbss0") == 0)
24433         return true;
24434     }
24435   else
24436     {
24437       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
24438
24439       if (size > 0
24440           && (unsigned HOST_WIDE_INT) size <= g_switch_value
24441           /* If it's not public, and we're not going to reference it there,
24442              there's no need to put it in the small data section.  */
24443           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
24444         return true;
24445     }
24446
24447   return false;
24448 }
24449
24450 #endif /* USING_ELFOS_H */
24451 \f
24452 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
24453
24454 static bool
24455 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
24456 {
24457   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
24458 }
24459 \f
24460 /* Return a REG that occurs in ADDR with coefficient 1.
24461    ADDR can be effectively incremented by incrementing REG.
24462
24463    r0 is special and we must not select it as an address
24464    register by this routine since our caller will try to
24465    increment the returned register via an "la" instruction.  */
24466
24467 rtx
24468 find_addr_reg (rtx addr)
24469 {
24470   while (GET_CODE (addr) == PLUS)
24471     {
24472       if (GET_CODE (XEXP (addr, 0)) == REG
24473           && REGNO (XEXP (addr, 0)) != 0)
24474         addr = XEXP (addr, 0);
24475       else if (GET_CODE (XEXP (addr, 1)) == REG
24476                && REGNO (XEXP (addr, 1)) != 0)
24477         addr = XEXP (addr, 1);
24478       else if (CONSTANT_P (XEXP (addr, 0)))
24479         addr = XEXP (addr, 1);
24480       else if (CONSTANT_P (XEXP (addr, 1)))
24481         addr = XEXP (addr, 0);
24482       else
24483         gcc_unreachable ();
24484     }
24485   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
24486   return addr;
24487 }
24488
24489 void
24490 rs6000_fatal_bad_address (rtx op)
24491 {
24492   fatal_insn ("bad address", op);
24493 }
24494
24495 #if TARGET_MACHO
24496
24497 static tree branch_island_list = 0;
24498
24499 /* Remember to generate a branch island for far calls to the given
24500    function.  */
24501
24502 static void
24503 add_compiler_branch_island (tree label_name, tree function_name,
24504                             int line_number)
24505 {
24506   tree branch_island = build_tree_list (function_name, label_name);
24507   TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
24508   TREE_CHAIN (branch_island) = branch_island_list;
24509   branch_island_list = branch_island;
24510 }
24511
24512 #define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND)     TREE_VALUE (BRANCH_ISLAND)
24513 #define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND)  TREE_PURPOSE (BRANCH_ISLAND)
24514 #define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND)    \
24515                 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
24516
24517 /* Generate far-jump branch islands for everything on the
24518    branch_island_list.  Invoked immediately after the last instruction
24519    of the epilogue has been emitted; the branch-islands must be
24520    appended to, and contiguous with, the function body.  Mach-O stubs
24521    are generated in machopic_output_stub().  */
24522
24523 static void
24524 macho_branch_islands (void)
24525 {
24526   char tmp_buf[512];
24527   tree branch_island;
24528
24529   for (branch_island = branch_island_list;
24530        branch_island;
24531        branch_island = TREE_CHAIN (branch_island))
24532     {
24533       const char *label =
24534         IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
24535       const char *name  =
24536         IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
24537       char name_buf[512];
24538       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
24539       if (name[0] == '*' || name[0] == '&')
24540         strcpy (name_buf, name+1);
24541       else
24542         {
24543           name_buf[0] = '_';
24544           strcpy (name_buf+1, name);
24545         }
24546       strcpy (tmp_buf, "\n");
24547       strcat (tmp_buf, label);
24548 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
24549       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
24550         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
24551 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
24552       if (flag_pic)
24553         {
24554           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
24555           strcat (tmp_buf, label);
24556           strcat (tmp_buf, "_pic\n");
24557           strcat (tmp_buf, label);
24558           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
24559
24560           strcat (tmp_buf, "\taddis r11,r11,ha16(");
24561           strcat (tmp_buf, name_buf);
24562           strcat (tmp_buf, " - ");
24563           strcat (tmp_buf, label);
24564           strcat (tmp_buf, "_pic)\n");
24565
24566           strcat (tmp_buf, "\tmtlr r0\n");
24567
24568           strcat (tmp_buf, "\taddi r12,r11,lo16(");
24569           strcat (tmp_buf, name_buf);
24570           strcat (tmp_buf, " - ");
24571           strcat (tmp_buf, label);
24572           strcat (tmp_buf, "_pic)\n");
24573
24574           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
24575         }
24576       else
24577         {
24578           strcat (tmp_buf, ":\nlis r12,hi16(");
24579           strcat (tmp_buf, name_buf);
24580           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
24581           strcat (tmp_buf, name_buf);
24582           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
24583         }
24584       output_asm_insn (tmp_buf, 0);
24585 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
24586       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
24587         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
24588 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
24589     }
24590
24591   branch_island_list = 0;
24592 }
24593
24594 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
24595    already there or not.  */
24596
24597 static int
24598 no_previous_def (tree function_name)
24599 {
24600   tree branch_island;
24601   for (branch_island = branch_island_list;
24602        branch_island;
24603        branch_island = TREE_CHAIN (branch_island))
24604     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
24605       return 0;
24606   return 1;
24607 }
24608
24609 /* GET_PREV_LABEL gets the label name from the previous definition of
24610    the function.  */
24611
24612 static tree
24613 get_prev_label (tree function_name)
24614 {
24615   tree branch_island;
24616   for (branch_island = branch_island_list;
24617        branch_island;
24618        branch_island = TREE_CHAIN (branch_island))
24619     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
24620       return BRANCH_ISLAND_LABEL_NAME (branch_island);
24621   return 0;
24622 }
24623
24624 /* INSN is either a function call or a millicode call.  It may have an
24625    unconditional jump in its delay slot.
24626
24627    CALL_DEST is the routine we are calling.  */
24628
24629 char *
24630 output_call (rtx insn, rtx *operands, int dest_operand_number,
24631              int cookie_operand_number)
24632 {
24633   static char buf[256];
24634   if (darwin_emit_branch_islands
24635       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
24636       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
24637     {
24638       tree labelname;
24639       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
24640
24641       if (no_previous_def (funname))
24642         {
24643           rtx label_rtx = gen_label_rtx ();
24644           char *label_buf, temp_buf[256];
24645           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
24646                                        CODE_LABEL_NUMBER (label_rtx));
24647           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
24648           labelname = get_identifier (label_buf);
24649           add_compiler_branch_island (labelname, funname, insn_line (insn));
24650         }
24651       else
24652         labelname = get_prev_label (funname);
24653
24654       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
24655          instruction will reach 'foo', otherwise link as 'bl L42'".
24656          "L42" should be a 'branch island', that will do a far jump to
24657          'foo'.  Branch islands are generated in
24658          macho_branch_islands().  */
24659       sprintf (buf, "jbsr %%z%d,%.246s",
24660                dest_operand_number, IDENTIFIER_POINTER (labelname));
24661     }
24662   else
24663     sprintf (buf, "bl %%z%d", dest_operand_number);
24664   return buf;
24665 }
24666
24667 /* Generate PIC and indirect symbol stubs.  */
24668
24669 void
24670 machopic_output_stub (FILE *file, const char *symb, const char *stub)
24671 {
24672   unsigned int length;
24673   char *symbol_name, *lazy_ptr_name;
24674   char *local_label_0;
24675   static int label = 0;
24676
24677   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
24678   symb = (*targetm.strip_name_encoding) (symb);
24679
24680
24681   length = strlen (symb);
24682   symbol_name = XALLOCAVEC (char, length + 32);
24683   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
24684
24685   lazy_ptr_name = XALLOCAVEC (char, length + 32);
24686   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
24687
24688   if (flag_pic == 2)
24689     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
24690   else
24691     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
24692
24693   if (flag_pic == 2)
24694     {
24695       fprintf (file, "\t.align 5\n");
24696
24697       fprintf (file, "%s:\n", stub);
24698       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
24699
24700       label++;
24701       local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
24702       sprintf (local_label_0, "\"L%011d$spb\"", label);
24703
24704       fprintf (file, "\tmflr r0\n");
24705       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
24706       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
24707       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
24708                lazy_ptr_name, local_label_0);
24709       fprintf (file, "\tmtlr r0\n");
24710       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
24711                (TARGET_64BIT ? "ldu" : "lwzu"),
24712                lazy_ptr_name, local_label_0);
24713       fprintf (file, "\tmtctr r12\n");
24714       fprintf (file, "\tbctr\n");
24715     }
24716   else
24717     {
24718       fprintf (file, "\t.align 4\n");
24719
24720       fprintf (file, "%s:\n", stub);
24721       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
24722
24723       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
24724       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
24725                (TARGET_64BIT ? "ldu" : "lwzu"),
24726                lazy_ptr_name);
24727       fprintf (file, "\tmtctr r12\n");
24728       fprintf (file, "\tbctr\n");
24729     }
24730
24731   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
24732   fprintf (file, "%s:\n", lazy_ptr_name);
24733   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
24734   fprintf (file, "%sdyld_stub_binding_helper\n",
24735            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
24736 }
24737
24738 /* Legitimize PIC addresses.  If the address is already
24739    position-independent, we return ORIG.  Newly generated
24740    position-independent addresses go into a reg.  This is REG if non
24741    zero, otherwise we allocate register(s) as necessary.  */
24742
24743 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
24744
24745 rtx
24746 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
24747                                         rtx reg)
24748 {
24749   rtx base, offset;
24750
24751   if (reg == NULL && ! reload_in_progress && ! reload_completed)
24752     reg = gen_reg_rtx (Pmode);
24753
24754   if (GET_CODE (orig) == CONST)
24755     {
24756       rtx reg_temp;
24757
24758       if (GET_CODE (XEXP (orig, 0)) == PLUS
24759           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
24760         return orig;
24761
24762       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
24763
24764       /* Use a different reg for the intermediate value, as
24765          it will be marked UNCHANGING.  */
24766       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
24767       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
24768                                                      Pmode, reg_temp);
24769       offset =
24770         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
24771                                                 Pmode, reg);
24772
24773       if (GET_CODE (offset) == CONST_INT)
24774         {
24775           if (SMALL_INT (offset))
24776             return plus_constant (base, INTVAL (offset));
24777           else if (! reload_in_progress && ! reload_completed)
24778             offset = force_reg (Pmode, offset);
24779           else
24780             {
24781               rtx mem = force_const_mem (Pmode, orig);
24782               return machopic_legitimize_pic_address (mem, Pmode, reg);
24783             }
24784         }
24785       return gen_rtx_PLUS (Pmode, base, offset);
24786     }
24787
24788   /* Fall back on generic machopic code.  */
24789   return machopic_legitimize_pic_address (orig, mode, reg);
24790 }
24791
24792 /* Output a .machine directive for the Darwin assembler, and call
24793    the generic start_file routine.  */
24794
24795 static void
24796 rs6000_darwin_file_start (void)
24797 {
24798   static const struct
24799   {
24800     const char *arg;
24801     const char *name;
24802     int if_set;
24803   } mapping[] = {
24804     { "ppc64", "ppc64", MASK_64BIT },
24805     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
24806     { "power4", "ppc970", 0 },
24807     { "G5", "ppc970", 0 },
24808     { "7450", "ppc7450", 0 },
24809     { "7400", "ppc7400", MASK_ALTIVEC },
24810     { "G4", "ppc7400", 0 },
24811     { "750", "ppc750", 0 },
24812     { "740", "ppc750", 0 },
24813     { "G3", "ppc750", 0 },
24814     { "604e", "ppc604e", 0 },
24815     { "604", "ppc604", 0 },
24816     { "603e", "ppc603", 0 },
24817     { "603", "ppc603", 0 },
24818     { "601", "ppc601", 0 },
24819     { NULL, "ppc", 0 } };
24820   const char *cpu_id = "";
24821   size_t i;
24822
24823   rs6000_file_start ();
24824   darwin_file_start ();
24825
24826   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
24827   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
24828     if (rs6000_select[i].set_arch_p && rs6000_select[i].string
24829         && rs6000_select[i].string[0] != '\0')
24830       cpu_id = rs6000_select[i].string;
24831
24832   /* Look through the mapping array.  Pick the first name that either
24833      matches the argument, has a bit set in IF_SET that is also set
24834      in the target flags, or has a NULL name.  */
24835
24836   i = 0;
24837   while (mapping[i].arg != NULL
24838          && strcmp (mapping[i].arg, cpu_id) != 0
24839          && (mapping[i].if_set & target_flags) == 0)
24840     i++;
24841
24842   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
24843 }
24844
24845 #endif /* TARGET_MACHO */
24846
24847 #if TARGET_ELF
24848 static int
24849 rs6000_elf_reloc_rw_mask (void)
24850 {
24851   if (flag_pic)
24852     return 3;
24853   else if (DEFAULT_ABI == ABI_AIX)
24854     return 2;
24855   else
24856     return 0;
24857 }
24858
24859 /* Record an element in the table of global constructors.  SYMBOL is
24860    a SYMBOL_REF of the function to be called; PRIORITY is a number
24861    between 0 and MAX_INIT_PRIORITY.
24862
24863    This differs from default_named_section_asm_out_constructor in
24864    that we have special handling for -mrelocatable.  */
24865
24866 static void
24867 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
24868 {
24869   const char *section = ".ctors";
24870   char buf[16];
24871
24872   if (priority != DEFAULT_INIT_PRIORITY)
24873     {
24874       sprintf (buf, ".ctors.%.5u",
24875                /* Invert the numbering so the linker puts us in the proper
24876                   order; constructors are run from right to left, and the
24877                   linker sorts in increasing order.  */
24878                MAX_INIT_PRIORITY - priority);
24879       section = buf;
24880     }
24881
24882   switch_to_section (get_section (section, SECTION_WRITE, NULL));
24883   assemble_align (POINTER_SIZE);
24884
24885   if (TARGET_RELOCATABLE)
24886     {
24887       fputs ("\t.long (", asm_out_file);
24888       output_addr_const (asm_out_file, symbol);
24889       fputs (")@fixup\n", asm_out_file);
24890     }
24891   else
24892     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
24893 }
24894
24895 static void
24896 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
24897 {
24898   const char *section = ".dtors";
24899   char buf[16];
24900
24901   if (priority != DEFAULT_INIT_PRIORITY)
24902     {
24903       sprintf (buf, ".dtors.%.5u",
24904                /* Invert the numbering so the linker puts us in the proper
24905                   order; constructors are run from right to left, and the
24906                   linker sorts in increasing order.  */
24907                MAX_INIT_PRIORITY - priority);
24908       section = buf;
24909     }
24910
24911   switch_to_section (get_section (section, SECTION_WRITE, NULL));
24912   assemble_align (POINTER_SIZE);
24913
24914   if (TARGET_RELOCATABLE)
24915     {
24916       fputs ("\t.long (", asm_out_file);
24917       output_addr_const (asm_out_file, symbol);
24918       fputs (")@fixup\n", asm_out_file);
24919     }
24920   else
24921     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
24922 }
24923
24924 void
24925 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
24926 {
24927   if (TARGET_64BIT)
24928     {
24929       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
24930       ASM_OUTPUT_LABEL (file, name);
24931       fputs (DOUBLE_INT_ASM_OP, file);
24932       rs6000_output_function_entry (file, name);
24933       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
24934       if (DOT_SYMBOLS)
24935         {
24936           fputs ("\t.size\t", file);
24937           assemble_name (file, name);
24938           fputs (",24\n\t.type\t.", file);
24939           assemble_name (file, name);
24940           fputs (",@function\n", file);
24941           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
24942             {
24943               fputs ("\t.globl\t.", file);
24944               assemble_name (file, name);
24945               putc ('\n', file);
24946             }
24947         }
24948       else
24949         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
24950       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
24951       rs6000_output_function_entry (file, name);
24952       fputs (":\n", file);
24953       return;
24954     }
24955
24956   if (TARGET_RELOCATABLE
24957       && !TARGET_SECURE_PLT
24958       && (get_pool_size () != 0 || crtl->profile)
24959       && uses_TOC ())
24960     {
24961       char buf[256];
24962
24963       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
24964
24965       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
24966       fprintf (file, "\t.long ");
24967       assemble_name (file, buf);
24968       putc ('-', file);
24969       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
24970       assemble_name (file, buf);
24971       putc ('\n', file);
24972     }
24973
24974   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
24975   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
24976
24977   if (DEFAULT_ABI == ABI_AIX)
24978     {
24979       const char *desc_name, *orig_name;
24980
24981       orig_name = (*targetm.strip_name_encoding) (name);
24982       desc_name = orig_name;
24983       while (*desc_name == '.')
24984         desc_name++;
24985
24986       if (TREE_PUBLIC (decl))
24987         fprintf (file, "\t.globl %s\n", desc_name);
24988
24989       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24990       fprintf (file, "%s:\n", desc_name);
24991       fprintf (file, "\t.long %s\n", orig_name);
24992       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
24993       if (DEFAULT_ABI == ABI_AIX)
24994         fputs ("\t.long 0\n", file);
24995       fprintf (file, "\t.previous\n");
24996     }
24997   ASM_OUTPUT_LABEL (file, name);
24998 }
24999
25000 static void
25001 rs6000_elf_end_indicate_exec_stack (void)
25002 {
25003   if (TARGET_32BIT)
25004     file_end_indicate_exec_stack ();
25005 }
25006 #endif
25007
25008 #if TARGET_XCOFF
25009 static void
25010 rs6000_xcoff_asm_output_anchor (rtx symbol)
25011 {
25012   char buffer[100];
25013
25014   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
25015            SYMBOL_REF_BLOCK_OFFSET (symbol));
25016   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
25017 }
25018
25019 static void
25020 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
25021 {
25022   fputs (GLOBAL_ASM_OP, stream);
25023   RS6000_OUTPUT_BASENAME (stream, name);
25024   putc ('\n', stream);
25025 }
25026
25027 /* A get_unnamed_decl callback, used for read-only sections.  PTR
25028    points to the section string variable.  */
25029
25030 static void
25031 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
25032 {
25033   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
25034            *(const char *const *) directive,
25035            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25036 }
25037
25038 /* Likewise for read-write sections.  */
25039
25040 static void
25041 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
25042 {
25043   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
25044            *(const char *const *) directive,
25045            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25046 }
25047
25048 /* A get_unnamed_section callback, used for switching to toc_section.  */
25049
25050 static void
25051 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
25052 {
25053   if (TARGET_MINIMAL_TOC)
25054     {
25055       /* toc_section is always selected at least once from
25056          rs6000_xcoff_file_start, so this is guaranteed to
25057          always be defined once and only once in each file.  */
25058       if (!toc_initialized)
25059         {
25060           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
25061           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
25062           toc_initialized = 1;
25063         }
25064       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
25065                (TARGET_32BIT ? "" : ",3"));
25066     }
25067   else
25068     fputs ("\t.toc\n", asm_out_file);
25069 }
25070
25071 /* Implement TARGET_ASM_INIT_SECTIONS.  */
25072
25073 static void
25074 rs6000_xcoff_asm_init_sections (void)
25075 {
25076   read_only_data_section
25077     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25078                            &xcoff_read_only_section_name);
25079
25080   private_data_section
25081     = get_unnamed_section (SECTION_WRITE,
25082                            rs6000_xcoff_output_readwrite_section_asm_op,
25083                            &xcoff_private_data_section_name);
25084
25085   read_only_private_data_section
25086     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25087                            &xcoff_private_data_section_name);
25088
25089   toc_section
25090     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
25091
25092   readonly_data_section = read_only_data_section;
25093   exception_section = data_section;
25094 }
25095
25096 static int
25097 rs6000_xcoff_reloc_rw_mask (void)
25098 {
25099   return 3;
25100 }
25101
25102 static void
25103 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
25104                                 tree decl ATTRIBUTE_UNUSED)
25105 {
25106   int smclass;
25107   static const char * const suffix[3] = { "PR", "RO", "RW" };
25108
25109   if (flags & SECTION_CODE)
25110     smclass = 0;
25111   else if (flags & SECTION_WRITE)
25112     smclass = 2;
25113   else
25114     smclass = 1;
25115
25116   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
25117            (flags & SECTION_CODE) ? "." : "",
25118            name, suffix[smclass], flags & SECTION_ENTSIZE);
25119 }
25120
25121 static section *
25122 rs6000_xcoff_select_section (tree decl, int reloc,
25123                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25124 {
25125   if (decl_readonly_section (decl, reloc))
25126     {
25127       if (TREE_PUBLIC (decl))
25128         return read_only_data_section;
25129       else
25130         return read_only_private_data_section;
25131     }
25132   else
25133     {
25134       if (TREE_PUBLIC (decl))
25135         return data_section;
25136       else
25137         return private_data_section;
25138     }
25139 }
25140
25141 static void
25142 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
25143 {
25144   const char *name;
25145
25146   /* Use select_section for private and uninitialized data.  */
25147   if (!TREE_PUBLIC (decl)
25148       || DECL_COMMON (decl)
25149       || DECL_INITIAL (decl) == NULL_TREE
25150       || DECL_INITIAL (decl) == error_mark_node
25151       || (flag_zero_initialized_in_bss
25152           && initializer_zerop (DECL_INITIAL (decl))))
25153     return;
25154
25155   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
25156   name = (*targetm.strip_name_encoding) (name);
25157   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
25158 }
25159
25160 /* Select section for constant in constant pool.
25161
25162    On RS/6000, all constants are in the private read-only data area.
25163    However, if this is being placed in the TOC it must be output as a
25164    toc entry.  */
25165
25166 static section *
25167 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
25168                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25169 {
25170   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
25171     return toc_section;
25172   else
25173     return read_only_private_data_section;
25174 }
25175
25176 /* Remove any trailing [DS] or the like from the symbol name.  */
25177
25178 static const char *
25179 rs6000_xcoff_strip_name_encoding (const char *name)
25180 {
25181   size_t len;
25182   if (*name == '*')
25183     name++;
25184   len = strlen (name);
25185   if (name[len - 1] == ']')
25186     return ggc_alloc_string (name, len - 4);
25187   else
25188     return name;
25189 }
25190
25191 /* Section attributes.  AIX is always PIC.  */
25192
25193 static unsigned int
25194 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
25195 {
25196   unsigned int align;
25197   unsigned int flags = default_section_type_flags (decl, name, reloc);
25198
25199   /* Align to at least UNIT size.  */
25200   if (flags & SECTION_CODE)
25201     align = MIN_UNITS_PER_WORD;
25202   else
25203     /* Increase alignment of large objects if not already stricter.  */
25204     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
25205                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
25206                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
25207
25208   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
25209 }
25210
25211 /* Output at beginning of assembler file.
25212
25213    Initialize the section names for the RS/6000 at this point.
25214
25215    Specify filename, including full path, to assembler.
25216
25217    We want to go into the TOC section so at least one .toc will be emitted.
25218    Also, in order to output proper .bs/.es pairs, we need at least one static
25219    [RW] section emitted.
25220
25221    Finally, declare mcount when profiling to make the assembler happy.  */
25222
25223 static void
25224 rs6000_xcoff_file_start (void)
25225 {
25226   rs6000_gen_section_name (&xcoff_bss_section_name,
25227                            main_input_filename, ".bss_");
25228   rs6000_gen_section_name (&xcoff_private_data_section_name,
25229                            main_input_filename, ".rw_");
25230   rs6000_gen_section_name (&xcoff_read_only_section_name,
25231                            main_input_filename, ".ro_");
25232
25233   fputs ("\t.file\t", asm_out_file);
25234   output_quoted_string (asm_out_file, main_input_filename);
25235   fputc ('\n', asm_out_file);
25236   if (write_symbols != NO_DEBUG)
25237     switch_to_section (private_data_section);
25238   switch_to_section (text_section);
25239   if (profile_flag)
25240     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
25241   rs6000_file_start ();
25242 }
25243
25244 /* Output at end of assembler file.
25245    On the RS/6000, referencing data should automatically pull in text.  */
25246
25247 static void
25248 rs6000_xcoff_file_end (void)
25249 {
25250   switch_to_section (text_section);
25251   fputs ("_section_.text:\n", asm_out_file);
25252   switch_to_section (data_section);
25253   fputs (TARGET_32BIT
25254          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
25255          asm_out_file);
25256 }
25257 #endif /* TARGET_XCOFF */
25258
25259 /* Compute a (partial) cost for rtx X.  Return true if the complete
25260    cost has been computed, and false if subexpressions should be
25261    scanned.  In either case, *TOTAL contains the cost result.  */
25262
25263 static bool
25264 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
25265                   bool speed)
25266 {
25267   enum machine_mode mode = GET_MODE (x);
25268
25269   switch (code)
25270     {
25271       /* On the RS/6000, if it is valid in the insn, it is free.  */
25272     case CONST_INT:
25273       if (((outer_code == SET
25274             || outer_code == PLUS
25275             || outer_code == MINUS)
25276            && (satisfies_constraint_I (x)
25277                || satisfies_constraint_L (x)))
25278           || (outer_code == AND
25279               && (satisfies_constraint_K (x)
25280                   || (mode == SImode
25281                       ? satisfies_constraint_L (x)
25282                       : satisfies_constraint_J (x))
25283                   || mask_operand (x, mode)
25284                   || (mode == DImode
25285                       && mask64_operand (x, DImode))))
25286           || ((outer_code == IOR || outer_code == XOR)
25287               && (satisfies_constraint_K (x)
25288                   || (mode == SImode
25289                       ? satisfies_constraint_L (x)
25290                       : satisfies_constraint_J (x))))
25291           || outer_code == ASHIFT
25292           || outer_code == ASHIFTRT
25293           || outer_code == LSHIFTRT
25294           || outer_code == ROTATE
25295           || outer_code == ROTATERT
25296           || outer_code == ZERO_EXTRACT
25297           || (outer_code == MULT
25298               && satisfies_constraint_I (x))
25299           || ((outer_code == DIV || outer_code == UDIV
25300                || outer_code == MOD || outer_code == UMOD)
25301               && exact_log2 (INTVAL (x)) >= 0)
25302           || (outer_code == COMPARE
25303               && (satisfies_constraint_I (x)
25304                   || satisfies_constraint_K (x)))
25305           || (outer_code == EQ
25306               && (satisfies_constraint_I (x)
25307                   || satisfies_constraint_K (x)
25308                   || (mode == SImode
25309                       ? satisfies_constraint_L (x)
25310                       : satisfies_constraint_J (x))))
25311           || (outer_code == GTU
25312               && satisfies_constraint_I (x))
25313           || (outer_code == LTU
25314               && satisfies_constraint_P (x)))
25315         {
25316           *total = 0;
25317           return true;
25318         }
25319       else if ((outer_code == PLUS
25320                 && reg_or_add_cint_operand (x, VOIDmode))
25321                || (outer_code == MINUS
25322                    && reg_or_sub_cint_operand (x, VOIDmode))
25323                || ((outer_code == SET
25324                     || outer_code == IOR
25325                     || outer_code == XOR)
25326                    && (INTVAL (x)
25327                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
25328         {
25329           *total = COSTS_N_INSNS (1);
25330           return true;
25331         }
25332       /* FALLTHRU */
25333
25334     case CONST_DOUBLE:
25335       if (mode == DImode && code == CONST_DOUBLE)
25336         {
25337           if ((outer_code == IOR || outer_code == XOR)
25338               && CONST_DOUBLE_HIGH (x) == 0
25339               && (CONST_DOUBLE_LOW (x)
25340                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
25341             {
25342               *total = 0;
25343               return true;
25344             }
25345           else if ((outer_code == AND && and64_2_operand (x, DImode))
25346                    || ((outer_code == SET
25347                         || outer_code == IOR
25348                         || outer_code == XOR)
25349                        && CONST_DOUBLE_HIGH (x) == 0))
25350             {
25351               *total = COSTS_N_INSNS (1);
25352               return true;
25353             }
25354         }
25355       /* FALLTHRU */
25356
25357     case CONST:
25358     case HIGH:
25359     case SYMBOL_REF:
25360     case MEM:
25361       /* When optimizing for size, MEM should be slightly more expensive
25362          than generating address, e.g., (plus (reg) (const)).
25363          L1 cache latency is about two instructions.  */
25364       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
25365       return true;
25366
25367     case LABEL_REF:
25368       *total = 0;
25369       return true;
25370
25371     case PLUS:
25372       if (mode == DFmode)
25373         {
25374           if (GET_CODE (XEXP (x, 0)) == MULT)
25375             {
25376               /* FNMA accounted in outer NEG.  */
25377               if (outer_code == NEG)
25378                 *total = rs6000_cost->dmul - rs6000_cost->fp;
25379               else
25380                 *total = rs6000_cost->dmul;
25381             }
25382           else
25383             *total = rs6000_cost->fp;
25384         }
25385       else if (mode == SFmode)
25386         {
25387           /* FNMA accounted in outer NEG.  */
25388           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
25389             *total = 0;
25390           else
25391             *total = rs6000_cost->fp;
25392         }
25393       else
25394         *total = COSTS_N_INSNS (1);
25395       return false;
25396
25397     case MINUS:
25398       if (mode == DFmode)
25399         {
25400           if (GET_CODE (XEXP (x, 0)) == MULT
25401               || GET_CODE (XEXP (x, 1)) == MULT)
25402             {
25403               /* FNMA accounted in outer NEG.  */
25404               if (outer_code == NEG)
25405                 *total = rs6000_cost->dmul - rs6000_cost->fp;
25406               else
25407                 *total = rs6000_cost->dmul;
25408             }
25409           else
25410             *total = rs6000_cost->fp;
25411         }
25412       else if (mode == SFmode)
25413         {
25414           /* FNMA accounted in outer NEG.  */
25415           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
25416             *total = 0;
25417           else
25418             *total = rs6000_cost->fp;
25419         }
25420       else
25421         *total = COSTS_N_INSNS (1);
25422       return false;
25423
25424     case MULT:
25425       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25426           && satisfies_constraint_I (XEXP (x, 1)))
25427         {
25428           if (INTVAL (XEXP (x, 1)) >= -256
25429               && INTVAL (XEXP (x, 1)) <= 255)
25430             *total = rs6000_cost->mulsi_const9;
25431           else
25432             *total = rs6000_cost->mulsi_const;
25433         }
25434       /* FMA accounted in outer PLUS/MINUS.  */
25435       else if ((mode == DFmode || mode == SFmode)
25436                && (outer_code == PLUS || outer_code == MINUS))
25437         *total = 0;
25438       else if (mode == DFmode)
25439         *total = rs6000_cost->dmul;
25440       else if (mode == SFmode)
25441         *total = rs6000_cost->fp;
25442       else if (mode == DImode)
25443         *total = rs6000_cost->muldi;
25444       else
25445         *total = rs6000_cost->mulsi;
25446       return false;
25447
25448     case DIV:
25449     case MOD:
25450       if (FLOAT_MODE_P (mode))
25451         {
25452           *total = mode == DFmode ? rs6000_cost->ddiv
25453                                   : rs6000_cost->sdiv;
25454           return false;
25455         }
25456       /* FALLTHRU */
25457
25458     case UDIV:
25459     case UMOD:
25460       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25461           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
25462         {
25463           if (code == DIV || code == MOD)
25464             /* Shift, addze */
25465             *total = COSTS_N_INSNS (2);
25466           else
25467             /* Shift */
25468             *total = COSTS_N_INSNS (1);
25469         }
25470       else
25471         {
25472           if (GET_MODE (XEXP (x, 1)) == DImode)
25473             *total = rs6000_cost->divdi;
25474           else
25475             *total = rs6000_cost->divsi;
25476         }
25477       /* Add in shift and subtract for MOD. */
25478       if (code == MOD || code == UMOD)
25479         *total += COSTS_N_INSNS (2);
25480       return false;
25481
25482     case CTZ:
25483     case FFS:
25484       *total = COSTS_N_INSNS (4);
25485       return false;
25486
25487     case POPCOUNT:
25488       *total = COSTS_N_INSNS (6);
25489       return false;
25490
25491     case NOT:
25492       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
25493         {
25494           *total = 0;
25495           return false;
25496         }
25497       /* FALLTHRU */
25498
25499     case AND:
25500     case CLZ:
25501     case IOR:
25502     case XOR:
25503     case ZERO_EXTRACT:
25504       *total = COSTS_N_INSNS (1);
25505       return false;
25506
25507     case ASHIFT:
25508     case ASHIFTRT:
25509     case LSHIFTRT:
25510     case ROTATE:
25511     case ROTATERT:
25512       /* Handle mul_highpart.  */
25513       if (outer_code == TRUNCATE
25514           && GET_CODE (XEXP (x, 0)) == MULT)
25515         {
25516           if (mode == DImode)
25517             *total = rs6000_cost->muldi;
25518           else
25519             *total = rs6000_cost->mulsi;
25520           return true;
25521         }
25522       else if (outer_code == AND)
25523         *total = 0;
25524       else
25525         *total = COSTS_N_INSNS (1);
25526       return false;
25527
25528     case SIGN_EXTEND:
25529     case ZERO_EXTEND:
25530       if (GET_CODE (XEXP (x, 0)) == MEM)
25531         *total = 0;
25532       else
25533         *total = COSTS_N_INSNS (1);
25534       return false;
25535
25536     case COMPARE:
25537     case NEG:
25538     case ABS:
25539       if (!FLOAT_MODE_P (mode))
25540         {
25541           *total = COSTS_N_INSNS (1);
25542           return false;
25543         }
25544       /* FALLTHRU */
25545
25546     case FLOAT:
25547     case UNSIGNED_FLOAT:
25548     case FIX:
25549     case UNSIGNED_FIX:
25550     case FLOAT_TRUNCATE:
25551       *total = rs6000_cost->fp;
25552       return false;
25553
25554     case FLOAT_EXTEND:
25555       if (mode == DFmode)
25556         *total = 0;
25557       else
25558         *total = rs6000_cost->fp;
25559       return false;
25560
25561     case UNSPEC:
25562       switch (XINT (x, 1))
25563         {
25564         case UNSPEC_FRSP:
25565           *total = rs6000_cost->fp;
25566           return true;
25567
25568         default:
25569           break;
25570         }
25571       break;
25572
25573     case CALL:
25574     case IF_THEN_ELSE:
25575       if (!speed)
25576         {
25577           *total = COSTS_N_INSNS (1);
25578           return true;
25579         }
25580       else if (FLOAT_MODE_P (mode)
25581                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
25582         {
25583           *total = rs6000_cost->fp;
25584           return false;
25585         }
25586       break;
25587
25588     case EQ:
25589     case GTU:
25590     case LTU:
25591       /* Carry bit requires mode == Pmode.
25592          NEG or PLUS already counted so only add one.  */
25593       if (mode == Pmode
25594           && (outer_code == NEG || outer_code == PLUS))
25595         {
25596           *total = COSTS_N_INSNS (1);
25597           return true;
25598         }
25599       if (outer_code == SET)
25600         {
25601           if (XEXP (x, 1) == const0_rtx)
25602             {
25603               if (TARGET_ISEL && !TARGET_MFCRF)
25604                 *total = COSTS_N_INSNS (8);
25605               else
25606                 *total = COSTS_N_INSNS (2);
25607               return true;
25608             }
25609           else if (mode == Pmode)
25610             {
25611               *total = COSTS_N_INSNS (3);
25612               return false;
25613             }
25614         }
25615       /* FALLTHRU */
25616
25617     case GT:
25618     case LT:
25619     case UNORDERED:
25620       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
25621         {
25622           if (TARGET_ISEL && !TARGET_MFCRF)
25623             *total = COSTS_N_INSNS (8);
25624           else
25625             *total = COSTS_N_INSNS (2);
25626           return true;
25627         }
25628       /* CC COMPARE.  */
25629       if (outer_code == COMPARE)
25630         {
25631           *total = 0;
25632           return true;
25633         }
25634       break;
25635
25636     default:
25637       break;
25638     }
25639
25640   return false;
25641 }
25642
25643 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
25644
25645 static bool
25646 rs6000_debug_rtx_costs (rtx x, int code, int outer_code, int *total,
25647                         bool speed)
25648 {
25649   bool ret = rs6000_rtx_costs (x, code, outer_code, total, speed);
25650
25651   fprintf (stderr,
25652            "\nrs6000_rtx_costs, return = %s, code = %s, outer_code = %s, "
25653            "total = %d, speed = %s, x:\n",
25654            ret ? "complete" : "scan inner",
25655            GET_RTX_NAME (code),
25656            GET_RTX_NAME (outer_code),
25657            *total,
25658            speed ? "true" : "false");
25659
25660   debug_rtx (x);
25661
25662   return ret;
25663 }
25664
25665 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
25666
25667 static int
25668 rs6000_debug_address_cost (rtx x, bool speed)
25669 {
25670   int ret = TARGET_ADDRESS_COST (x, speed);
25671
25672   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
25673            ret, speed ? "true" : "false");
25674   debug_rtx (x);
25675
25676   return ret;
25677 }
25678
25679
25680 /* A C expression returning the cost of moving data from a register of class
25681    CLASS1 to one of CLASS2.  */
25682
25683 static int
25684 rs6000_register_move_cost (enum machine_mode mode,
25685                            reg_class_t from, reg_class_t to)
25686 {
25687   int ret;
25688
25689   /*  Moves from/to GENERAL_REGS.  */
25690   if (reg_classes_intersect_p (to, GENERAL_REGS)
25691       || reg_classes_intersect_p (from, GENERAL_REGS))
25692     {
25693       if (! reg_classes_intersect_p (to, GENERAL_REGS))
25694         from = to;
25695
25696       if (from == FLOAT_REGS || from == ALTIVEC_REGS || from == VSX_REGS)
25697         ret = (rs6000_memory_move_cost (mode, from, false)
25698                + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
25699
25700       /* It's more expensive to move CR_REGS than CR0_REGS because of the
25701          shift.  */
25702       else if (from == CR_REGS)
25703         ret = 4;
25704
25705       /* Power6 has slower LR/CTR moves so make them more expensive than
25706          memory in order to bias spills to memory .*/
25707       else if (rs6000_cpu == PROCESSOR_POWER6
25708                && reg_classes_intersect_p (from, LINK_OR_CTR_REGS))
25709         ret = 6 * hard_regno_nregs[0][mode];
25710
25711       else
25712         /* A move will cost one instruction per GPR moved.  */
25713         ret = 2 * hard_regno_nregs[0][mode];
25714     }
25715
25716   /* If we have VSX, we can easily move between FPR or Altivec registers.  */
25717   else if (VECTOR_UNIT_VSX_P (mode)
25718            && reg_classes_intersect_p (to, VSX_REGS)
25719            && reg_classes_intersect_p (from, VSX_REGS))
25720     ret = 2 * hard_regno_nregs[32][mode];
25721
25722   /* Moving between two similar registers is just one instruction.  */
25723   else if (reg_classes_intersect_p (to, from))
25724     ret = (mode == TFmode || mode == TDmode) ? 4 : 2;
25725
25726   /* Everything else has to go through GENERAL_REGS.  */
25727   else
25728     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
25729            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
25730
25731   if (TARGET_DEBUG_COST)
25732     fprintf (stderr,
25733              "rs6000_register_move_cost:, ret=%d, mode=%s, from=%s, to=%s\n",
25734              ret, GET_MODE_NAME (mode), reg_class_names[from],
25735              reg_class_names[to]);
25736
25737   return ret;
25738 }
25739
25740 /* A C expressions returning the cost of moving data of MODE from a register to
25741    or from memory.  */
25742
25743 static int
25744 rs6000_memory_move_cost (enum machine_mode mode, reg_class_t rclass,
25745                          bool in ATTRIBUTE_UNUSED)
25746 {
25747   int ret;
25748
25749   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
25750     ret = 4 * hard_regno_nregs[0][mode];
25751   else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
25752     ret = 4 * hard_regno_nregs[32][mode];
25753   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
25754     ret = 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
25755   else
25756     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
25757
25758   if (TARGET_DEBUG_COST)
25759     fprintf (stderr,
25760              "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
25761              ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
25762
25763   return ret;
25764 }
25765
25766 /* Returns a code for a target-specific builtin that implements
25767    reciprocal of the function, or NULL_TREE if not available.  */
25768
25769 static tree
25770 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
25771                            bool sqrt ATTRIBUTE_UNUSED)
25772 {
25773   if (optimize_insn_for_size_p ())
25774     return NULL_TREE;
25775
25776   if (md_fn)
25777     switch (fn)
25778       {
25779       case VSX_BUILTIN_XVSQRTDP:
25780         if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
25781           return NULL_TREE;
25782
25783         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
25784
25785       case VSX_BUILTIN_XVSQRTSP:
25786         if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
25787           return NULL_TREE;
25788
25789         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V4SF];
25790
25791       default:
25792         return NULL_TREE;
25793       }
25794
25795   else
25796     switch (fn)
25797       {
25798       case BUILT_IN_SQRT:
25799         if (!RS6000_RECIP_AUTO_RSQRTE_P (DFmode))
25800           return NULL_TREE;
25801
25802         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRT];
25803
25804       case BUILT_IN_SQRTF:
25805         if (!RS6000_RECIP_AUTO_RSQRTE_P (SFmode))
25806           return NULL_TREE;
25807
25808         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
25809
25810       default:
25811         return NULL_TREE;
25812       }
25813 }
25814
25815 /* Load up a constant.  If the mode is a vector mode, splat the value across
25816    all of the vector elements.  */
25817
25818 static rtx
25819 rs6000_load_constant_and_splat (enum machine_mode mode, REAL_VALUE_TYPE dconst)
25820 {
25821   rtx reg;
25822
25823   if (mode == SFmode || mode == DFmode)
25824     {
25825       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, mode);
25826       reg = force_reg (mode, d);
25827     }
25828   else if (mode == V4SFmode)
25829     {
25830       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, SFmode);
25831       rtvec v = gen_rtvec (4, d, d, d, d);
25832       reg = gen_reg_rtx (mode);
25833       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
25834     }
25835   else if (mode == V2DFmode)
25836     {
25837       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, DFmode);
25838       rtvec v = gen_rtvec (2, d, d);
25839       reg = gen_reg_rtx (mode);
25840       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
25841     }
25842   else
25843     gcc_unreachable ();
25844
25845   return reg;
25846 }
25847
25848 /* Generate a FMADD instruction:
25849         dst = (m1 * m2) + a
25850
25851    generating different RTL based on the fused multiply/add switch.  */
25852
25853 static void
25854 rs6000_emit_madd (rtx dst, rtx m1, rtx m2, rtx a)
25855 {
25856   enum machine_mode mode = GET_MODE (dst);
25857
25858   if (!TARGET_FUSED_MADD)
25859     {
25860       /* For the simple ops, use the generator function, rather than assuming
25861          that the RTL is standard.  */
25862       enum insn_code mcode = optab_handler (smul_optab, mode);
25863       enum insn_code acode = optab_handler (add_optab, mode);
25864       gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (mcode);
25865       gen_2arg_fn_t gen_add = (gen_2arg_fn_t) GEN_FCN (acode);
25866       rtx mreg = gen_reg_rtx (mode);
25867
25868       gcc_assert (mcode != CODE_FOR_nothing && acode != CODE_FOR_nothing);
25869       emit_insn (gen_mul (mreg, m1, m2));
25870       emit_insn (gen_add (dst, mreg, a));
25871     }
25872
25873   else
25874     emit_insn (gen_rtx_SET (VOIDmode, dst,
25875                             gen_rtx_PLUS (mode,
25876                                           gen_rtx_MULT (mode, m1, m2),
25877                                           a)));
25878 }
25879
25880 /* Generate a FMSUB instruction:
25881         dst = (m1 * m2) - a
25882
25883    generating different RTL based on the fused multiply/add switch.  */
25884
25885 static void
25886 rs6000_emit_msub (rtx dst, rtx m1, rtx m2, rtx a)
25887 {
25888   enum machine_mode mode = GET_MODE (dst);
25889
25890   if (!TARGET_FUSED_MADD
25891       || (mode == V4SFmode && VECTOR_UNIT_ALTIVEC_P (V4SFmode)))
25892     {
25893       /* For the simple ops, use the generator function, rather than assuming
25894          that the RTL is standard.  */
25895       enum insn_code mcode = optab_handler (smul_optab, mode);
25896       enum insn_code scode = optab_handler (add_optab, mode);
25897       gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (mcode);
25898       gen_2arg_fn_t gen_sub = (gen_2arg_fn_t) GEN_FCN (scode);
25899       rtx mreg = gen_reg_rtx (mode);
25900
25901       gcc_assert (mcode != CODE_FOR_nothing && scode != CODE_FOR_nothing);
25902       emit_insn (gen_mul (mreg, m1, m2));
25903       emit_insn (gen_sub (dst, mreg, a));
25904     }
25905
25906   else
25907     emit_insn (gen_rtx_SET (VOIDmode, dst,
25908                             gen_rtx_MINUS (mode,
25909                                            gen_rtx_MULT (mode, m1, m2),
25910                                            a)));
25911 }
25912
25913 /* Generate a FNMSUB instruction:
25914         dst = - ((m1 * m2) - a)
25915
25916    Which is equivalent to (except in the prescence of -0.0):
25917         dst = a - (m1 * m2)
25918
25919    generating different RTL based on the fast-math and fused multiply/add
25920    switches.  */
25921
25922 static void
25923 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
25924 {
25925   enum machine_mode mode = GET_MODE (dst);
25926
25927   if (!TARGET_FUSED_MADD)
25928     {
25929       /* For the simple ops, use the generator function, rather than assuming
25930          that the RTL is standard.  */
25931       enum insn_code mcode = optab_handler (smul_optab, mode);
25932       enum insn_code scode = optab_handler (sub_optab, mode);
25933       gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (mcode);
25934       gen_2arg_fn_t gen_sub = (gen_2arg_fn_t) GEN_FCN (scode);
25935       rtx mreg = gen_reg_rtx (mode);
25936
25937       gcc_assert (mcode != CODE_FOR_nothing && scode != CODE_FOR_nothing);
25938       emit_insn (gen_mul (mreg, m1, m2));
25939       emit_insn (gen_sub (dst, a, mreg));
25940     }
25941
25942   else
25943     {
25944       rtx m = gen_rtx_MULT (mode, m1, m2);
25945
25946       if (!HONOR_SIGNED_ZEROS (mode))
25947         emit_insn (gen_rtx_SET (VOIDmode, dst, gen_rtx_MINUS (mode, a, m)));
25948
25949       else
25950         emit_insn (gen_rtx_SET (VOIDmode, dst,
25951                                 gen_rtx_NEG (mode,
25952                                              gen_rtx_MINUS (mode, m, a))));
25953     }
25954 }
25955
25956 /* Newton-Raphson approximation of floating point divide with just 2 passes
25957    (either single precision floating point, or newer machines with higher
25958    accuracy estimates).  Support both scalar and vector divide.  Assumes no
25959    trapping math and finite arguments.  */
25960
25961 static void
25962 rs6000_emit_swdiv_high_precision (rtx dst, rtx n, rtx d)
25963 {
25964   enum machine_mode mode = GET_MODE (dst);
25965   rtx x0, e0, e1, y1, u0, v0;
25966   enum insn_code code = optab_handler (smul_optab, mode);
25967   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
25968   rtx one = rs6000_load_constant_and_splat (mode, dconst1);
25969
25970   gcc_assert (code != CODE_FOR_nothing);
25971
25972   /* x0 = 1./d estimate */
25973   x0 = gen_reg_rtx (mode);
25974   emit_insn (gen_rtx_SET (VOIDmode, x0,
25975                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
25976                                           UNSPEC_FRES)));
25977
25978   e0 = gen_reg_rtx (mode);
25979   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - (d * x0) */
25980
25981   e1 = gen_reg_rtx (mode);
25982   rs6000_emit_madd (e1, e0, e0, e0);            /* e1 = (e0 * e0) + e0 */
25983
25984   y1 = gen_reg_rtx (mode);
25985   rs6000_emit_madd (y1, e1, x0, x0);            /* y1 = (e1 * x0) + x0 */
25986
25987   u0 = gen_reg_rtx (mode);
25988   emit_insn (gen_mul (u0, n, y1));              /* u0 = n * y1 */
25989
25990   v0 = gen_reg_rtx (mode);
25991   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - (d * u0) */
25992
25993   rs6000_emit_madd (dst, v0, y1, u0);           /* dst = (v0 * y1) + u0 */
25994 }
25995
25996 /* Newton-Raphson approximation of floating point divide that has a low
25997    precision estimate.  Assumes no trapping math and finite arguments.  */
25998
25999 static void
26000 rs6000_emit_swdiv_low_precision (rtx dst, rtx n, rtx d)
26001 {
26002   enum machine_mode mode = GET_MODE (dst);
26003   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
26004   enum insn_code code = optab_handler (smul_optab, mode);
26005   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26006
26007   gcc_assert (code != CODE_FOR_nothing);
26008
26009   one = rs6000_load_constant_and_splat (mode, dconst1);
26010
26011   /* x0 = 1./d estimate */
26012   x0 = gen_reg_rtx (mode);
26013   emit_insn (gen_rtx_SET (VOIDmode, x0,
26014                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26015                                           UNSPEC_FRES)));
26016
26017   e0 = gen_reg_rtx (mode);
26018   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - d * x0 */
26019
26020   y1 = gen_reg_rtx (mode);
26021   rs6000_emit_madd (y1, e0, x0, x0);            /* y1 = x0 + e0 * x0 */
26022
26023   e1 = gen_reg_rtx (mode);
26024   emit_insn (gen_mul (e1, e0, e0));             /* e1 = e0 * e0 */
26025
26026   y2 = gen_reg_rtx (mode);
26027   rs6000_emit_madd (y2, e1, y1, y1);            /* y2 = y1 + e1 * y1 */
26028
26029   e2 = gen_reg_rtx (mode);
26030   emit_insn (gen_mul (e2, e1, e1));             /* e2 = e1 * e1 */
26031
26032   y3 = gen_reg_rtx (mode);
26033   rs6000_emit_madd (y3, e2, y2, y2);            /* y3 = y2 + e2 * y2 */
26034
26035   u0 = gen_reg_rtx (mode);
26036   emit_insn (gen_mul (u0, n, y3));              /* u0 = n * y3 */
26037
26038   v0 = gen_reg_rtx (mode);
26039   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - d * u0 */
26040
26041   rs6000_emit_madd (dst, v0, y3, u0);           /* dst = u0 + v0 * y3 */
26042 }
26043
26044 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
26045    add a reg_note saying that this was a division.  Support both scalar and
26046    vector divide.  Assumes no trapping math and finite arguments.  */
26047
26048 void
26049 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
26050 {
26051   enum machine_mode mode = GET_MODE (dst);
26052
26053   if (RS6000_RECIP_HIGH_PRECISION_P (mode))
26054     rs6000_emit_swdiv_high_precision (dst, n, d);
26055   else
26056     rs6000_emit_swdiv_low_precision (dst, n, d);
26057
26058   if (note_p)
26059     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
26060 }
26061
26062 /* Newton-Raphson approximation of single/double-precision floating point
26063    rsqrt.  Assumes no trapping math and finite arguments.  */
26064
26065 void
26066 rs6000_emit_swrsqrt (rtx dst, rtx src)
26067 {
26068   enum machine_mode mode = GET_MODE (src);
26069   rtx x0 = gen_reg_rtx (mode);
26070   rtx y = gen_reg_rtx (mode);
26071   int passes = (TARGET_RECIP_PRECISION) ? 2 : 3;
26072   REAL_VALUE_TYPE dconst3_2;
26073   int i;
26074   rtx halfthree;
26075   enum insn_code code = optab_handler (smul_optab, mode);
26076   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26077
26078   gcc_assert (code != CODE_FOR_nothing);
26079
26080   /* Load up the constant 1.5 either as a scalar, or as a vector.  */
26081   real_from_integer (&dconst3_2, VOIDmode, 3, 0, 0);
26082   SET_REAL_EXP (&dconst3_2, REAL_EXP (&dconst3_2) - 1);
26083
26084   halfthree = rs6000_load_constant_and_splat (mode, dconst3_2);
26085
26086   /* x0 = rsqrt estimate */
26087   emit_insn (gen_rtx_SET (VOIDmode, x0,
26088                           gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
26089                                           UNSPEC_RSQRT)));
26090
26091   /* y = 0.5 * src = 1.5 * src - src -> fewer constants */
26092   rs6000_emit_msub (y, src, halfthree, src);
26093
26094   for (i = 0; i < passes; i++)
26095     {
26096       rtx x1 = gen_reg_rtx (mode);
26097       rtx u = gen_reg_rtx (mode);
26098       rtx v = gen_reg_rtx (mode);
26099
26100       /* x1 = x0 * (1.5 - y * (x0 * x0)) */
26101       emit_insn (gen_mul (u, x0, x0));
26102       rs6000_emit_nmsub (v, y, u, halfthree);
26103       emit_insn (gen_mul (x1, x0, v));
26104       x0 = x1;
26105     }
26106
26107   emit_move_insn (dst, x0);
26108   return;
26109 }
26110
26111 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
26112    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
26113
26114 void
26115 rs6000_emit_popcount (rtx dst, rtx src)
26116 {
26117   enum machine_mode mode = GET_MODE (dst);
26118   rtx tmp1, tmp2;
26119
26120   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
26121   if (TARGET_POPCNTD)
26122     {
26123       if (mode == SImode)
26124         emit_insn (gen_popcntwsi2 (dst, src));
26125       else
26126         emit_insn (gen_popcntddi2 (dst, src));
26127       return;
26128     }
26129
26130   tmp1 = gen_reg_rtx (mode);
26131
26132   if (mode == SImode)
26133     {
26134       emit_insn (gen_popcntbsi2 (tmp1, src));
26135       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
26136                            NULL_RTX, 0);
26137       tmp2 = force_reg (SImode, tmp2);
26138       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
26139     }
26140   else
26141     {
26142       emit_insn (gen_popcntbdi2 (tmp1, src));
26143       tmp2 = expand_mult (DImode, tmp1,
26144                           GEN_INT ((HOST_WIDE_INT)
26145                                    0x01010101 << 32 | 0x01010101),
26146                           NULL_RTX, 0);
26147       tmp2 = force_reg (DImode, tmp2);
26148       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
26149     }
26150 }
26151
26152
26153 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
26154    target, and SRC is the argument operand.  */
26155
26156 void
26157 rs6000_emit_parity (rtx dst, rtx src)
26158 {
26159   enum machine_mode mode = GET_MODE (dst);
26160   rtx tmp;
26161
26162   tmp = gen_reg_rtx (mode);
26163   if (mode == SImode)
26164     {
26165       /* Is mult+shift >= shift+xor+shift+xor?  */
26166       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
26167         {
26168           rtx tmp1, tmp2, tmp3, tmp4;
26169
26170           tmp1 = gen_reg_rtx (SImode);
26171           emit_insn (gen_popcntbsi2 (tmp1, src));
26172
26173           tmp2 = gen_reg_rtx (SImode);
26174           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
26175           tmp3 = gen_reg_rtx (SImode);
26176           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
26177
26178           tmp4 = gen_reg_rtx (SImode);
26179           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
26180           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
26181         }
26182       else
26183         rs6000_emit_popcount (tmp, src);
26184       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
26185     }
26186   else
26187     {
26188       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
26189       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
26190         {
26191           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
26192
26193           tmp1 = gen_reg_rtx (DImode);
26194           emit_insn (gen_popcntbdi2 (tmp1, src));
26195
26196           tmp2 = gen_reg_rtx (DImode);
26197           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
26198           tmp3 = gen_reg_rtx (DImode);
26199           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
26200
26201           tmp4 = gen_reg_rtx (DImode);
26202           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
26203           tmp5 = gen_reg_rtx (DImode);
26204           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
26205
26206           tmp6 = gen_reg_rtx (DImode);
26207           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
26208           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
26209         }
26210       else
26211         rs6000_emit_popcount (tmp, src);
26212       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
26213     }
26214 }
26215
26216 /* Return an RTX representing where to find the function value of a
26217    function returning MODE.  */
26218 static rtx
26219 rs6000_complex_function_value (enum machine_mode mode)
26220 {
26221   unsigned int regno;
26222   rtx r1, r2;
26223   enum machine_mode inner = GET_MODE_INNER (mode);
26224   unsigned int inner_bytes = GET_MODE_SIZE (inner);
26225
26226   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26227     regno = FP_ARG_RETURN;
26228   else
26229     {
26230       regno = GP_ARG_RETURN;
26231
26232       /* 32-bit is OK since it'll go in r3/r4.  */
26233       if (TARGET_32BIT && inner_bytes >= 4)
26234         return gen_rtx_REG (mode, regno);
26235     }
26236
26237   if (inner_bytes >= 8)
26238     return gen_rtx_REG (mode, regno);
26239
26240   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
26241                           const0_rtx);
26242   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
26243                           GEN_INT (inner_bytes));
26244   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
26245 }
26246
26247 /* Target hook for TARGET_FUNCTION_VALUE.
26248
26249    On the SPE, both FPs and vectors are returned in r3.
26250
26251    On RS/6000 an integer value is in r3 and a floating-point value is in
26252    fp1, unless -msoft-float.  */
26253
26254 rtx
26255 rs6000_function_value (const_tree valtype,
26256                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
26257                        bool outgoing ATTRIBUTE_UNUSED)
26258 {
26259   enum machine_mode mode;
26260   unsigned int regno;
26261
26262   /* Special handling for structs in darwin64.  */
26263   if (TARGET_MACHO 
26264       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
26265     {
26266       CUMULATIVE_ARGS valcum;
26267       rtx valret;
26268
26269       valcum.words = 0;
26270       valcum.fregno = FP_ARG_MIN_REG;
26271       valcum.vregno = ALTIVEC_ARG_MIN_REG;
26272       /* Do a trial code generation as if this were going to be passed as
26273          an argument; if any part goes in memory, we return NULL.  */
26274       valret = rs6000_darwin64_record_arg (&valcum, valtype, 1, true);
26275       if (valret)
26276         return valret;
26277       /* Otherwise fall through to standard ABI rules.  */
26278     }
26279
26280   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
26281     {
26282       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26283       return gen_rtx_PARALLEL (DImode,
26284         gen_rtvec (2,
26285                    gen_rtx_EXPR_LIST (VOIDmode,
26286                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26287                                       const0_rtx),
26288                    gen_rtx_EXPR_LIST (VOIDmode,
26289                                       gen_rtx_REG (SImode,
26290                                                    GP_ARG_RETURN + 1),
26291                                       GEN_INT (4))));
26292     }
26293   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
26294     {
26295       return gen_rtx_PARALLEL (DCmode,
26296         gen_rtvec (4,
26297                    gen_rtx_EXPR_LIST (VOIDmode,
26298                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26299                                       const0_rtx),
26300                    gen_rtx_EXPR_LIST (VOIDmode,
26301                                       gen_rtx_REG (SImode,
26302                                                    GP_ARG_RETURN + 1),
26303                                       GEN_INT (4)),
26304                    gen_rtx_EXPR_LIST (VOIDmode,
26305                                       gen_rtx_REG (SImode,
26306                                                    GP_ARG_RETURN + 2),
26307                                       GEN_INT (8)),
26308                    gen_rtx_EXPR_LIST (VOIDmode,
26309                                       gen_rtx_REG (SImode,
26310                                                    GP_ARG_RETURN + 3),
26311                                       GEN_INT (12))));
26312     }
26313
26314   mode = TYPE_MODE (valtype);
26315   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
26316       || POINTER_TYPE_P (valtype))
26317     mode = TARGET_32BIT ? SImode : DImode;
26318
26319   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26320     /* _Decimal128 must use an even/odd register pair.  */
26321     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26322   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
26323            && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
26324     regno = FP_ARG_RETURN;
26325   else if (TREE_CODE (valtype) == COMPLEX_TYPE
26326            && targetm.calls.split_complex_arg)
26327     return rs6000_complex_function_value (mode);
26328   else if (TREE_CODE (valtype) == VECTOR_TYPE
26329            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
26330            && ALTIVEC_VECTOR_MODE (mode))
26331     regno = ALTIVEC_ARG_RETURN;
26332   else if (TREE_CODE (valtype) == VECTOR_TYPE
26333            && TARGET_VSX && TARGET_ALTIVEC_ABI
26334            && VSX_VECTOR_MODE (mode))
26335     regno = ALTIVEC_ARG_RETURN;
26336   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26337            && (mode == DFmode || mode == DCmode
26338                || mode == TFmode || mode == TCmode))
26339     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26340   else
26341     regno = GP_ARG_RETURN;
26342
26343   return gen_rtx_REG (mode, regno);
26344 }
26345
26346 /* Define how to find the value returned by a library function
26347    assuming the value has mode MODE.  */
26348 rtx
26349 rs6000_libcall_value (enum machine_mode mode)
26350 {
26351   unsigned int regno;
26352
26353   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
26354     {
26355       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26356       return gen_rtx_PARALLEL (DImode,
26357         gen_rtvec (2,
26358                    gen_rtx_EXPR_LIST (VOIDmode,
26359                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26360                                       const0_rtx),
26361                    gen_rtx_EXPR_LIST (VOIDmode,
26362                                       gen_rtx_REG (SImode,
26363                                                    GP_ARG_RETURN + 1),
26364                                       GEN_INT (4))));
26365     }
26366
26367   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26368     /* _Decimal128 must use an even/odd register pair.  */
26369     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26370   else if (SCALAR_FLOAT_MODE_P (mode)
26371            && TARGET_HARD_FLOAT && TARGET_FPRS
26372            && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
26373     regno = FP_ARG_RETURN;
26374   else if (ALTIVEC_VECTOR_MODE (mode)
26375            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
26376     regno = ALTIVEC_ARG_RETURN;
26377   else if (VSX_VECTOR_MODE (mode)
26378            && TARGET_VSX && TARGET_ALTIVEC_ABI)
26379     regno = ALTIVEC_ARG_RETURN;
26380   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
26381     return rs6000_complex_function_value (mode);
26382   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26383            && (mode == DFmode || mode == DCmode
26384                || mode == TFmode || mode == TCmode))
26385     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26386   else
26387     regno = GP_ARG_RETURN;
26388
26389   return gen_rtx_REG (mode, regno);
26390 }
26391
26392
26393 /* Given FROM and TO register numbers, say whether this elimination is allowed.
26394    Frame pointer elimination is automatically handled.
26395
26396    For the RS/6000, if frame pointer elimination is being done, we would like
26397    to convert ap into fp, not sp.
26398
26399    We need r30 if -mminimal-toc was specified, and there are constant pool
26400    references.  */
26401
26402 bool
26403 rs6000_can_eliminate (const int from, const int to)
26404 {
26405   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
26406           ? ! frame_pointer_needed
26407           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
26408             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0
26409             : true);
26410 }
26411
26412 /* Define the offset between two registers, FROM to be eliminated and its
26413    replacement TO, at the start of a routine.  */
26414 HOST_WIDE_INT
26415 rs6000_initial_elimination_offset (int from, int to)
26416 {
26417   rs6000_stack_t *info = rs6000_stack_info ();
26418   HOST_WIDE_INT offset;
26419
26420   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26421     offset = info->push_p ? 0 : -info->total_size;
26422   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26423     {
26424       offset = info->push_p ? 0 : -info->total_size;
26425       if (FRAME_GROWS_DOWNWARD)
26426         offset += info->fixed_size + info->vars_size + info->parm_size;
26427     }
26428   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26429     offset = FRAME_GROWS_DOWNWARD
26430              ? info->fixed_size + info->vars_size + info->parm_size
26431              : 0;
26432   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26433     offset = info->total_size;
26434   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26435     offset = info->push_p ? info->total_size : 0;
26436   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
26437     offset = 0;
26438   else
26439     gcc_unreachable ();
26440
26441   return offset;
26442 }
26443
26444 static rtx
26445 rs6000_dwarf_register_span (rtx reg)
26446 {
26447   rtx parts[8];
26448   int i, words;
26449   unsigned regno = REGNO (reg);
26450   enum machine_mode mode = GET_MODE (reg);
26451
26452   if (TARGET_SPE
26453       && regno < 32
26454       && (SPE_VECTOR_MODE (GET_MODE (reg))
26455           || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
26456               && mode != SFmode && mode != SDmode && mode != SCmode)))
26457     ;
26458   else
26459     return NULL_RTX;
26460
26461   regno = REGNO (reg);
26462
26463   /* The duality of the SPE register size wreaks all kinds of havoc.
26464      This is a way of distinguishing r0 in 32-bits from r0 in
26465      64-bits.  */
26466   words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
26467   gcc_assert (words <= 4);
26468   for (i = 0; i < words; i++, regno++)
26469     {
26470       if (BYTES_BIG_ENDIAN)
26471         {
26472           parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
26473           parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
26474         }
26475       else
26476         {
26477           parts[2 * i] = gen_rtx_REG (SImode, regno);
26478           parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
26479         }
26480     }
26481
26482   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
26483 }
26484
26485 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
26486
26487 static void
26488 rs6000_init_dwarf_reg_sizes_extra (tree address)
26489 {
26490   if (TARGET_SPE)
26491     {
26492       int i;
26493       enum machine_mode mode = TYPE_MODE (char_type_node);
26494       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
26495       rtx mem = gen_rtx_MEM (BLKmode, addr);
26496       rtx value = gen_int_mode (4, mode);
26497
26498       for (i = 1201; i < 1232; i++)
26499         {
26500           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
26501           HOST_WIDE_INT offset
26502             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
26503
26504           emit_move_insn (adjust_address (mem, mode, offset), value);
26505         }
26506     }
26507 }
26508
26509 /* Map internal gcc register numbers to DWARF2 register numbers.  */
26510
26511 unsigned int
26512 rs6000_dbx_register_number (unsigned int regno)
26513 {
26514   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
26515     return regno;
26516   if (regno == MQ_REGNO)
26517     return 100;
26518   if (regno == LR_REGNO)
26519     return 108;
26520   if (regno == CTR_REGNO)
26521     return 109;
26522   if (CR_REGNO_P (regno))
26523     return regno - CR0_REGNO + 86;
26524   if (regno == CA_REGNO)
26525     return 101;  /* XER */
26526   if (ALTIVEC_REGNO_P (regno))
26527     return regno - FIRST_ALTIVEC_REGNO + 1124;
26528   if (regno == VRSAVE_REGNO)
26529     return 356;
26530   if (regno == VSCR_REGNO)
26531     return 67;
26532   if (regno == SPE_ACC_REGNO)
26533     return 99;
26534   if (regno == SPEFSCR_REGNO)
26535     return 612;
26536   /* SPE high reg number.  We get these values of regno from
26537      rs6000_dwarf_register_span.  */
26538   gcc_assert (regno >= 1200 && regno < 1232);
26539   return regno;
26540 }
26541
26542 /* target hook eh_return_filter_mode */
26543 static enum machine_mode
26544 rs6000_eh_return_filter_mode (void)
26545 {
26546   return TARGET_32BIT ? SImode : word_mode;
26547 }
26548
26549 /* Target hook for scalar_mode_supported_p.  */
26550 static bool
26551 rs6000_scalar_mode_supported_p (enum machine_mode mode)
26552 {
26553   if (DECIMAL_FLOAT_MODE_P (mode))
26554     return default_decimal_float_supported_p ();
26555   else
26556     return default_scalar_mode_supported_p (mode);
26557 }
26558
26559 /* Target hook for vector_mode_supported_p.  */
26560 static bool
26561 rs6000_vector_mode_supported_p (enum machine_mode mode)
26562 {
26563
26564   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
26565     return true;
26566
26567   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
26568     return true;
26569
26570   else if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
26571     return true;
26572
26573   else
26574     return false;
26575 }
26576
26577 /* Target hook for invalid_arg_for_unprototyped_fn. */
26578 static const char *
26579 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
26580 {
26581   return (!rs6000_darwin64_abi
26582           && typelist == 0
26583           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
26584           && (funcdecl == NULL_TREE
26585               || (TREE_CODE (funcdecl) == FUNCTION_DECL
26586                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
26587           ? N_("AltiVec argument passed to unprototyped function")
26588           : NULL;
26589 }
26590
26591 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
26592    setup by using __stack_chk_fail_local hidden function instead of
26593    calling __stack_chk_fail directly.  Otherwise it is better to call
26594    __stack_chk_fail directly.  */
26595
26596 static tree
26597 rs6000_stack_protect_fail (void)
26598 {
26599   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
26600          ? default_hidden_stack_protect_fail ()
26601          : default_external_stack_protect_fail ();
26602 }
26603
26604 void
26605 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
26606                            int num_operands ATTRIBUTE_UNUSED)
26607 {
26608   if (rs6000_warn_cell_microcode)
26609     {
26610       const char *temp;
26611       int insn_code_number = recog_memoized (insn);
26612       location_t location = locator_location (INSN_LOCATOR (insn));
26613
26614       /* Punt on insns we cannot recognize.  */
26615       if (insn_code_number < 0)
26616         return;
26617
26618       temp = get_insn_template (insn_code_number, insn);
26619
26620       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
26621         warning_at (location, OPT_mwarn_cell_microcode,
26622                     "emitting microcode insn %s\t[%s] #%d",
26623                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn)); 
26624       else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
26625         warning_at (location, OPT_mwarn_cell_microcode,
26626                     "emitting conditional microcode insn %s\t[%s] #%d",
26627                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
26628     }
26629 }
26630
26631 #include "gt-rs6000.h"