OSDN Git Service

update darwin x86 output.
[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 reload_completed;         /* stack info won't change from here on */
77   int first_gp_reg_save;        /* first callee saved GP register used */
78   int first_fp_reg_save;        /* first callee saved FP register used */
79   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
80   int lr_save_p;                /* true if the link reg needs to be saved */
81   int cr_save_p;                /* true if the CR reg needs to be saved */
82   unsigned int vrsave_mask;     /* mask of vec registers to save */
83   int push_p;                   /* true if we need to allocate stack space */
84   int calls_p;                  /* true if the function makes any calls */
85   int world_save_p;             /* true if we're saving *everything*:
86                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
87   enum rs6000_abi abi;          /* which ABI to use */
88   int gp_save_offset;           /* offset to save GP regs from initial SP */
89   int fp_save_offset;           /* offset to save FP regs from initial SP */
90   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
91   int lr_save_offset;           /* offset to save LR from initial SP */
92   int cr_save_offset;           /* offset to save CR from initial SP */
93   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
94   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
95   int varargs_save_offset;      /* offset to save the varargs registers */
96   int ehrd_offset;              /* offset to EH return data */
97   int reg_size;                 /* register size (4 or 8) */
98   HOST_WIDE_INT vars_size;      /* variable save area size */
99   int parm_size;                /* outgoing parameter size */
100   int save_size;                /* save area size */
101   int fixed_size;               /* fixed size of stack frame */
102   int gp_size;                  /* size of saved GP registers */
103   int fp_size;                  /* size of saved FP registers */
104   int altivec_size;             /* size of saved AltiVec registers */
105   int cr_size;                  /* size to hold CR if not in save_size */
106   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
107   int altivec_padding_size;     /* size of altivec alignment padding if
108                                    not in save_size */
109   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
110   int spe_padding_size;
111   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
112   int spe_64bit_regs_used;
113   int savres_strategy;
114 } rs6000_stack_t;
115
116 /* A C structure for machine-specific, per-function data.
117    This is added to the cfun structure.  */
118 typedef struct GTY(()) machine_function
119 {
120   /* Some local-dynamic symbol.  */
121   const char *some_ld_name;
122   /* Whether the instruction chain has been scanned already.  */
123   int insn_chain_scanned_p;
124   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
125   int ra_needs_full_frame;
126   /* Flags if __builtin_return_address (0) was used.  */
127   int ra_need_lr;
128   /* Cache lr_save_p after expansion of builtin_eh_return.  */
129   int lr_save_state;
130   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
131      varargs save area.  */
132   HOST_WIDE_INT varargs_save_offset;
133   /* Temporary stack slot to use for SDmode copies.  This slot is
134      64-bits wide and is allocated early enough so that the offset
135      does not overflow the 16-bit load/store offset field.  */
136   rtx sdmode_stack_slot;
137 } machine_function;
138
139 /* Target cpu type */
140
141 enum processor_type rs6000_cpu;
142 struct rs6000_cpu_select rs6000_select[3] =
143 {
144   /* switch             name,                   tune    arch */
145   { (const char *)0,    "--with-cpu=",          1,      1 },
146   { (const char *)0,    "-mcpu=",               1,      1 },
147   { (const char *)0,    "-mtune=",              1,      0 },
148 };
149
150 /* Always emit branch hint bits.  */
151 static GTY(()) bool rs6000_always_hint;
152
153 /* Schedule instructions for group formation.  */
154 static GTY(()) bool rs6000_sched_groups;
155
156 /* Align branch targets.  */
157 static GTY(()) bool rs6000_align_branch_targets;
158
159 /* Support for -msched-costly-dep option.  */
160 const char *rs6000_sched_costly_dep_str;
161 enum rs6000_dependence_cost rs6000_sched_costly_dep;
162
163 /* Support for -minsert-sched-nops option.  */
164 const char *rs6000_sched_insert_nops_str;
165 enum rs6000_nop_insertion rs6000_sched_insert_nops;
166
167 /* Support targetm.vectorize.builtin_mask_for_load.  */
168 static GTY(()) tree altivec_builtin_mask_for_load;
169
170 /* Size of long double.  */
171 int rs6000_long_double_type_size;
172
173 /* IEEE quad extended precision long double. */
174 int rs6000_ieeequad;
175
176 /* Nonzero to use AltiVec ABI.  */
177 int rs6000_altivec_abi;
178
179 /* Nonzero if we want SPE SIMD instructions.  */
180 int rs6000_spe;
181
182 /* Nonzero if we want SPE ABI extensions.  */
183 int rs6000_spe_abi;
184
185 /* Nonzero if floating point operations are done in the GPRs.  */
186 int rs6000_float_gprs = 0;
187
188 /* Nonzero if we want Darwin's struct-by-value-in-regs ABI.  */
189 int rs6000_darwin64_abi;
190
191 /* Set to nonzero once AIX common-mode calls have been defined.  */
192 static GTY(()) int common_mode_defined;
193
194 /* Label number of label created for -mrelocatable, to call to so we can
195    get the address of the GOT section */
196 int rs6000_pic_labelno;
197
198 #ifdef USING_ELFOS_H
199 /* Which abi to adhere to */
200 const char *rs6000_abi_name;
201
202 /* Semantics of the small data area */
203 enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
204
205 /* Which small data model to use */
206 const char *rs6000_sdata_name = (char *)0;
207
208 /* Counter for labels which are to be placed in .fixup.  */
209 int fixuplabelno = 0;
210 #endif
211
212 /* Bit size of immediate TLS offsets and string from which it is decoded.  */
213 int rs6000_tls_size = 32;
214 const char *rs6000_tls_size_string;
215
216 /* ABI enumeration available for subtarget to use.  */
217 enum rs6000_abi rs6000_current_abi;
218
219 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
220 int dot_symbols;
221
222 /* Debug flags */
223 const char *rs6000_debug_name;
224 int rs6000_debug_stack;         /* debug stack applications */
225 int rs6000_debug_arg;           /* debug argument handling */
226 int rs6000_debug_reg;           /* debug register classes */
227 int rs6000_debug_addr;          /* debug memory addressing */
228 int rs6000_debug_cost;          /* debug rtx_costs */
229
230 /* Specify the machine mode that pointers have.  After generation of rtl, the
231    compiler makes no further distinction between pointers and any other objects
232    of this machine mode.  The type is unsigned since not all things that
233    include rs6000.h also include machmode.h.  */
234 unsigned rs6000_pmode;
235
236 /* Width in bits of a pointer.  */
237 unsigned rs6000_pointer_size;
238
239
240 /* Value is TRUE if register/mode pair is acceptable.  */
241 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
242
243 /* Maximum number of registers needed for a given register class and mode.  */
244 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
245
246 /* How many registers are needed for a given register and mode.  */
247 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
248
249 /* Map register number to register class.  */
250 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
251
252 /* Reload functions based on the type and the vector unit.  */
253 static enum insn_code rs6000_vector_reload[NUM_MACHINE_MODES][2];
254
255 /* Built in types.  */
256 tree rs6000_builtin_types[RS6000_BTI_MAX];
257 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
258
259 const char *rs6000_traceback_name;
260 static enum {
261   traceback_default = 0,
262   traceback_none,
263   traceback_part,
264   traceback_full
265 } rs6000_traceback;
266
267 /* Flag to say the TOC is initialized */
268 int toc_initialized;
269 char toc_label_name[10];
270
271 /* Cached value of rs6000_variable_issue. This is cached in
272    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
273 static short cached_can_issue_more;
274
275 static GTY(()) section *read_only_data_section;
276 static GTY(()) section *private_data_section;
277 static GTY(()) section *read_only_private_data_section;
278 static GTY(()) section *sdata2_section;
279 static GTY(()) section *toc_section;
280
281 /* Control alignment for fields within structures.  */
282 /* String from -malign-XXXXX.  */
283 int rs6000_alignment_flags;
284
285 /* Code model for 64-bit linux.  */
286 enum rs6000_cmodel cmodel;
287
288 /* True for any options that were explicitly set.  */
289 static struct {
290   bool aix_struct_ret;          /* True if -maix-struct-ret was used.  */
291   bool alignment;               /* True if -malign- was used.  */
292   bool spe_abi;                 /* True if -mabi=spe/no-spe was used.  */
293   bool altivec_abi;             /* True if -mabi=altivec/no-altivec used.  */
294   bool spe;                     /* True if -mspe= was used.  */
295   bool float_gprs;              /* True if -mfloat-gprs= was used.  */
296   bool long_double;             /* True if -mlong-double- was used.  */
297   bool ieee;                    /* True if -mabi=ieee/ibmlongdouble used.  */
298   bool vrsave;                  /* True if -mvrsave was used.  */
299   bool cmodel;                  /* True if -mcmodel was used.  */
300 } rs6000_explicit_options;
301
302 struct builtin_description
303 {
304   /* mask is not const because we're going to alter it below.  This
305      nonsense will go away when we rewrite the -march infrastructure
306      to give us more target flag bits.  */
307   unsigned int mask;
308   const enum insn_code icode;
309   const char *const name;
310   const enum rs6000_builtins code;
311 };
312
313 /* Describe the vector unit used for modes.  */
314 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
315 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
316
317 /* Register classes for various constraints that are based on the target
318    switches.  */
319 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
320
321 /* Describe the alignment of a vector.  */
322 int rs6000_vector_align[NUM_MACHINE_MODES];
323
324 /* Map selected modes to types for builtins.  */
325 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
326
327 /* What modes to automatically generate reciprocal divide estimate (fre) and
328    reciprocal sqrt (frsqrte) for.  */
329 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
330
331 /* Masks to determine which reciprocal esitmate instructions to generate
332    automatically.  */
333 enum rs6000_recip_mask {
334   RECIP_SF_DIV          = 0x001,        /* Use divide estimate */
335   RECIP_DF_DIV          = 0x002,
336   RECIP_V4SF_DIV        = 0x004,
337   RECIP_V2DF_DIV        = 0x008,
338
339   RECIP_SF_RSQRT        = 0x010,        /* Use reciprocal sqrt estimate.  */
340   RECIP_DF_RSQRT        = 0x020,
341   RECIP_V4SF_RSQRT      = 0x040,
342   RECIP_V2DF_RSQRT      = 0x080,
343
344   /* Various combination of flags for -mrecip=xxx.  */
345   RECIP_NONE            = 0,
346   RECIP_ALL             = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
347                            | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
348                            | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
349
350   RECIP_HIGH_PRECISION  = RECIP_ALL,
351
352   /* On low precision machines like the power5, don't enable double precision
353      reciprocal square root estimate, since it isn't accurate enough.  */
354   RECIP_LOW_PRECISION   = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
355 };
356
357 static unsigned int rs6000_recip_control;
358 static const char *rs6000_recip_name;
359
360 /* -mrecip options.  */
361 static struct
362 {
363   const char *string;           /* option name */
364   unsigned int mask;            /* mask bits to set */
365 } recip_options[] = {
366   { "all",       RECIP_ALL },
367   { "none",      RECIP_NONE },
368   { "div",       (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
369                   | RECIP_V2DF_DIV) },
370   { "divf",      (RECIP_SF_DIV | RECIP_V4SF_DIV) },
371   { "divd",      (RECIP_DF_DIV | RECIP_V2DF_DIV) },
372   { "rsqrt",     (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
373                   | RECIP_V2DF_RSQRT) },
374   { "rsqrtf",    (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
375   { "rsqrtd",    (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
376 };
377
378 /* 2 argument gen function typedef.  */
379 typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
380
381 \f
382 /* Target cpu costs.  */
383
384 struct processor_costs {
385   const int mulsi;        /* cost of SImode multiplication.  */
386   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
387   const int mulsi_const9; /* cost of SImode mult by short constant.  */
388   const int muldi;        /* cost of DImode multiplication.  */
389   const int divsi;        /* cost of SImode division.  */
390   const int divdi;        /* cost of DImode division.  */
391   const int fp;           /* cost of simple SFmode and DFmode insns.  */
392   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
393   const int sdiv;         /* cost of SFmode division (fdivs).  */
394   const int ddiv;         /* cost of DFmode division (fdiv).  */
395   const int cache_line_size;    /* cache line size in bytes. */
396   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
397   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
398   const int simultaneous_prefetches; /* number of parallel prefetch
399                                         operations.  */
400 };
401
402 const struct processor_costs *rs6000_cost;
403
404 /* Processor costs (relative to an add) */
405
406 /* Instruction size costs on 32bit processors.  */
407 static const
408 struct processor_costs size32_cost = {
409   COSTS_N_INSNS (1),    /* mulsi */
410   COSTS_N_INSNS (1),    /* mulsi_const */
411   COSTS_N_INSNS (1),    /* mulsi_const9 */
412   COSTS_N_INSNS (1),    /* muldi */
413   COSTS_N_INSNS (1),    /* divsi */
414   COSTS_N_INSNS (1),    /* divdi */
415   COSTS_N_INSNS (1),    /* fp */
416   COSTS_N_INSNS (1),    /* dmul */
417   COSTS_N_INSNS (1),    /* sdiv */
418   COSTS_N_INSNS (1),    /* ddiv */
419   32,
420   0,
421   0,
422   0,
423 };
424
425 /* Instruction size costs on 64bit processors.  */
426 static const
427 struct processor_costs size64_cost = {
428   COSTS_N_INSNS (1),    /* mulsi */
429   COSTS_N_INSNS (1),    /* mulsi_const */
430   COSTS_N_INSNS (1),    /* mulsi_const9 */
431   COSTS_N_INSNS (1),    /* muldi */
432   COSTS_N_INSNS (1),    /* divsi */
433   COSTS_N_INSNS (1),    /* divdi */
434   COSTS_N_INSNS (1),    /* fp */
435   COSTS_N_INSNS (1),    /* dmul */
436   COSTS_N_INSNS (1),    /* sdiv */
437   COSTS_N_INSNS (1),    /* ddiv */
438   128,
439   0,
440   0,
441   0,
442 };
443
444 /* Instruction costs on RIOS1 processors.  */
445 static const
446 struct processor_costs rios1_cost = {
447   COSTS_N_INSNS (5),    /* mulsi */
448   COSTS_N_INSNS (4),    /* mulsi_const */
449   COSTS_N_INSNS (3),    /* mulsi_const9 */
450   COSTS_N_INSNS (5),    /* muldi */
451   COSTS_N_INSNS (19),   /* divsi */
452   COSTS_N_INSNS (19),   /* divdi */
453   COSTS_N_INSNS (2),    /* fp */
454   COSTS_N_INSNS (2),    /* dmul */
455   COSTS_N_INSNS (19),   /* sdiv */
456   COSTS_N_INSNS (19),   /* ddiv */
457   128,                  /* cache line size */
458   64,                   /* l1 cache */
459   512,                  /* l2 cache */
460   0,                    /* streams */
461 };
462
463 /* Instruction costs on RIOS2 processors.  */
464 static const
465 struct processor_costs rios2_cost = {
466   COSTS_N_INSNS (2),    /* mulsi */
467   COSTS_N_INSNS (2),    /* mulsi_const */
468   COSTS_N_INSNS (2),    /* mulsi_const9 */
469   COSTS_N_INSNS (2),    /* muldi */
470   COSTS_N_INSNS (13),   /* divsi */
471   COSTS_N_INSNS (13),   /* divdi */
472   COSTS_N_INSNS (2),    /* fp */
473   COSTS_N_INSNS (2),    /* dmul */
474   COSTS_N_INSNS (17),   /* sdiv */
475   COSTS_N_INSNS (17),   /* ddiv */
476   256,                  /* cache line size */
477   256,                  /* l1 cache */
478   1024,                 /* l2 cache */
479   0,                    /* streams */
480 };
481
482 /* Instruction costs on RS64A processors.  */
483 static const
484 struct processor_costs rs64a_cost = {
485   COSTS_N_INSNS (20),   /* mulsi */
486   COSTS_N_INSNS (12),   /* mulsi_const */
487   COSTS_N_INSNS (8),    /* mulsi_const9 */
488   COSTS_N_INSNS (34),   /* muldi */
489   COSTS_N_INSNS (65),   /* divsi */
490   COSTS_N_INSNS (67),   /* divdi */
491   COSTS_N_INSNS (4),    /* fp */
492   COSTS_N_INSNS (4),    /* dmul */
493   COSTS_N_INSNS (31),   /* sdiv */
494   COSTS_N_INSNS (31),   /* ddiv */
495   128,                  /* cache line size */
496   128,                  /* l1 cache */
497   2048,                 /* l2 cache */
498   1,                    /* streams */
499 };
500
501 /* Instruction costs on MPCCORE processors.  */
502 static const
503 struct processor_costs mpccore_cost = {
504   COSTS_N_INSNS (2),    /* mulsi */
505   COSTS_N_INSNS (2),    /* mulsi_const */
506   COSTS_N_INSNS (2),    /* mulsi_const9 */
507   COSTS_N_INSNS (2),    /* muldi */
508   COSTS_N_INSNS (6),    /* divsi */
509   COSTS_N_INSNS (6),    /* divdi */
510   COSTS_N_INSNS (4),    /* fp */
511   COSTS_N_INSNS (5),    /* dmul */
512   COSTS_N_INSNS (10),   /* sdiv */
513   COSTS_N_INSNS (17),   /* ddiv */
514   32,                   /* cache line size */
515   4,                    /* l1 cache */
516   16,                   /* l2 cache */
517   1,                    /* streams */
518 };
519
520 /* Instruction costs on PPC403 processors.  */
521 static const
522 struct processor_costs ppc403_cost = {
523   COSTS_N_INSNS (4),    /* mulsi */
524   COSTS_N_INSNS (4),    /* mulsi_const */
525   COSTS_N_INSNS (4),    /* mulsi_const9 */
526   COSTS_N_INSNS (4),    /* muldi */
527   COSTS_N_INSNS (33),   /* divsi */
528   COSTS_N_INSNS (33),   /* divdi */
529   COSTS_N_INSNS (11),   /* fp */
530   COSTS_N_INSNS (11),   /* dmul */
531   COSTS_N_INSNS (11),   /* sdiv */
532   COSTS_N_INSNS (11),   /* ddiv */
533   32,                   /* cache line size */
534   4,                    /* l1 cache */
535   16,                   /* l2 cache */
536   1,                    /* streams */
537 };
538
539 /* Instruction costs on PPC405 processors.  */
540 static const
541 struct processor_costs ppc405_cost = {
542   COSTS_N_INSNS (5),    /* mulsi */
543   COSTS_N_INSNS (4),    /* mulsi_const */
544   COSTS_N_INSNS (3),    /* mulsi_const9 */
545   COSTS_N_INSNS (5),    /* muldi */
546   COSTS_N_INSNS (35),   /* divsi */
547   COSTS_N_INSNS (35),   /* divdi */
548   COSTS_N_INSNS (11),   /* fp */
549   COSTS_N_INSNS (11),   /* dmul */
550   COSTS_N_INSNS (11),   /* sdiv */
551   COSTS_N_INSNS (11),   /* ddiv */
552   32,                   /* cache line size */
553   16,                   /* l1 cache */
554   128,                  /* l2 cache */
555   1,                    /* streams */
556 };
557
558 /* Instruction costs on PPC440 processors.  */
559 static const
560 struct processor_costs ppc440_cost = {
561   COSTS_N_INSNS (3),    /* mulsi */
562   COSTS_N_INSNS (2),    /* mulsi_const */
563   COSTS_N_INSNS (2),    /* mulsi_const9 */
564   COSTS_N_INSNS (3),    /* muldi */
565   COSTS_N_INSNS (34),   /* divsi */
566   COSTS_N_INSNS (34),   /* divdi */
567   COSTS_N_INSNS (5),    /* fp */
568   COSTS_N_INSNS (5),    /* dmul */
569   COSTS_N_INSNS (19),   /* sdiv */
570   COSTS_N_INSNS (33),   /* ddiv */
571   32,                   /* cache line size */
572   32,                   /* l1 cache */
573   256,                  /* l2 cache */
574   1,                    /* streams */
575 };
576
577 /* Instruction costs on PPC476 processors.  */
578 static const
579 struct processor_costs ppc476_cost = {
580   COSTS_N_INSNS (4),    /* mulsi */
581   COSTS_N_INSNS (4),    /* mulsi_const */
582   COSTS_N_INSNS (4),    /* mulsi_const9 */
583   COSTS_N_INSNS (4),    /* muldi */
584   COSTS_N_INSNS (11),   /* divsi */
585   COSTS_N_INSNS (11),   /* divdi */
586   COSTS_N_INSNS (6),    /* fp */
587   COSTS_N_INSNS (6),    /* dmul */
588   COSTS_N_INSNS (19),   /* sdiv */
589   COSTS_N_INSNS (33),   /* ddiv */
590   32,                   /* l1 cache line size */
591   32,                   /* l1 cache */
592   512,                  /* l2 cache */
593   1,                    /* streams */
594 };
595
596 /* Instruction costs on PPC601 processors.  */
597 static const
598 struct processor_costs ppc601_cost = {
599   COSTS_N_INSNS (5),    /* mulsi */
600   COSTS_N_INSNS (5),    /* mulsi_const */
601   COSTS_N_INSNS (5),    /* mulsi_const9 */
602   COSTS_N_INSNS (5),    /* muldi */
603   COSTS_N_INSNS (36),   /* divsi */
604   COSTS_N_INSNS (36),   /* divdi */
605   COSTS_N_INSNS (4),    /* fp */
606   COSTS_N_INSNS (5),    /* dmul */
607   COSTS_N_INSNS (17),   /* sdiv */
608   COSTS_N_INSNS (31),   /* ddiv */
609   32,                   /* cache line size */
610   32,                   /* l1 cache */
611   256,                  /* l2 cache */
612   1,                    /* streams */
613 };
614
615 /* Instruction costs on PPC603 processors.  */
616 static const
617 struct processor_costs ppc603_cost = {
618   COSTS_N_INSNS (5),    /* mulsi */
619   COSTS_N_INSNS (3),    /* mulsi_const */
620   COSTS_N_INSNS (2),    /* mulsi_const9 */
621   COSTS_N_INSNS (5),    /* muldi */
622   COSTS_N_INSNS (37),   /* divsi */
623   COSTS_N_INSNS (37),   /* divdi */
624   COSTS_N_INSNS (3),    /* fp */
625   COSTS_N_INSNS (4),    /* dmul */
626   COSTS_N_INSNS (18),   /* sdiv */
627   COSTS_N_INSNS (33),   /* ddiv */
628   32,                   /* cache line size */
629   8,                    /* l1 cache */
630   64,                   /* l2 cache */
631   1,                    /* streams */
632 };
633
634 /* Instruction costs on PPC604 processors.  */
635 static const
636 struct processor_costs ppc604_cost = {
637   COSTS_N_INSNS (4),    /* mulsi */
638   COSTS_N_INSNS (4),    /* mulsi_const */
639   COSTS_N_INSNS (4),    /* mulsi_const9 */
640   COSTS_N_INSNS (4),    /* muldi */
641   COSTS_N_INSNS (20),   /* divsi */
642   COSTS_N_INSNS (20),   /* divdi */
643   COSTS_N_INSNS (3),    /* fp */
644   COSTS_N_INSNS (3),    /* dmul */
645   COSTS_N_INSNS (18),   /* sdiv */
646   COSTS_N_INSNS (32),   /* ddiv */
647   32,                   /* cache line size */
648   16,                   /* l1 cache */
649   512,                  /* l2 cache */
650   1,                    /* streams */
651 };
652
653 /* Instruction costs on PPC604e processors.  */
654 static const
655 struct processor_costs ppc604e_cost = {
656   COSTS_N_INSNS (2),    /* mulsi */
657   COSTS_N_INSNS (2),    /* mulsi_const */
658   COSTS_N_INSNS (2),    /* mulsi_const9 */
659   COSTS_N_INSNS (2),    /* muldi */
660   COSTS_N_INSNS (20),   /* divsi */
661   COSTS_N_INSNS (20),   /* divdi */
662   COSTS_N_INSNS (3),    /* fp */
663   COSTS_N_INSNS (3),    /* dmul */
664   COSTS_N_INSNS (18),   /* sdiv */
665   COSTS_N_INSNS (32),   /* ddiv */
666   32,                   /* cache line size */
667   32,                   /* l1 cache */
668   1024,                 /* l2 cache */
669   1,                    /* streams */
670 };
671
672 /* Instruction costs on PPC620 processors.  */
673 static const
674 struct processor_costs ppc620_cost = {
675   COSTS_N_INSNS (5),    /* mulsi */
676   COSTS_N_INSNS (4),    /* mulsi_const */
677   COSTS_N_INSNS (3),    /* mulsi_const9 */
678   COSTS_N_INSNS (7),    /* muldi */
679   COSTS_N_INSNS (21),   /* divsi */
680   COSTS_N_INSNS (37),   /* divdi */
681   COSTS_N_INSNS (3),    /* fp */
682   COSTS_N_INSNS (3),    /* dmul */
683   COSTS_N_INSNS (18),   /* sdiv */
684   COSTS_N_INSNS (32),   /* ddiv */
685   128,                  /* cache line size */
686   32,                   /* l1 cache */
687   1024,                 /* l2 cache */
688   1,                    /* streams */
689 };
690
691 /* Instruction costs on PPC630 processors.  */
692 static const
693 struct processor_costs ppc630_cost = {
694   COSTS_N_INSNS (5),    /* mulsi */
695   COSTS_N_INSNS (4),    /* mulsi_const */
696   COSTS_N_INSNS (3),    /* mulsi_const9 */
697   COSTS_N_INSNS (7),    /* muldi */
698   COSTS_N_INSNS (21),   /* divsi */
699   COSTS_N_INSNS (37),   /* divdi */
700   COSTS_N_INSNS (3),    /* fp */
701   COSTS_N_INSNS (3),    /* dmul */
702   COSTS_N_INSNS (17),   /* sdiv */
703   COSTS_N_INSNS (21),   /* ddiv */
704   128,                  /* cache line size */
705   64,                   /* l1 cache */
706   1024,                 /* l2 cache */
707   1,                    /* streams */
708 };
709
710 /* Instruction costs on Cell processor.  */
711 /* COSTS_N_INSNS (1) ~ one add.  */
712 static const
713 struct processor_costs ppccell_cost = {
714   COSTS_N_INSNS (9/2)+2,    /* mulsi */
715   COSTS_N_INSNS (6/2),    /* mulsi_const */
716   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
717   COSTS_N_INSNS (15/2)+2,   /* muldi */
718   COSTS_N_INSNS (38/2),   /* divsi */
719   COSTS_N_INSNS (70/2),   /* divdi */
720   COSTS_N_INSNS (10/2),   /* fp */
721   COSTS_N_INSNS (10/2),   /* dmul */
722   COSTS_N_INSNS (74/2),   /* sdiv */
723   COSTS_N_INSNS (74/2),   /* ddiv */
724   128,                  /* cache line size */
725   32,                   /* l1 cache */
726   512,                  /* l2 cache */
727   6,                    /* streams */
728 };
729
730 /* Instruction costs on PPC750 and PPC7400 processors.  */
731 static const
732 struct processor_costs ppc750_cost = {
733   COSTS_N_INSNS (5),    /* mulsi */
734   COSTS_N_INSNS (3),    /* mulsi_const */
735   COSTS_N_INSNS (2),    /* mulsi_const9 */
736   COSTS_N_INSNS (5),    /* muldi */
737   COSTS_N_INSNS (17),   /* divsi */
738   COSTS_N_INSNS (17),   /* divdi */
739   COSTS_N_INSNS (3),    /* fp */
740   COSTS_N_INSNS (3),    /* dmul */
741   COSTS_N_INSNS (17),   /* sdiv */
742   COSTS_N_INSNS (31),   /* ddiv */
743   32,                   /* cache line size */
744   32,                   /* l1 cache */
745   512,                  /* l2 cache */
746   1,                    /* streams */
747 };
748
749 /* Instruction costs on PPC7450 processors.  */
750 static const
751 struct processor_costs ppc7450_cost = {
752   COSTS_N_INSNS (4),    /* mulsi */
753   COSTS_N_INSNS (3),    /* mulsi_const */
754   COSTS_N_INSNS (3),    /* mulsi_const9 */
755   COSTS_N_INSNS (4),    /* muldi */
756   COSTS_N_INSNS (23),   /* divsi */
757   COSTS_N_INSNS (23),   /* divdi */
758   COSTS_N_INSNS (5),    /* fp */
759   COSTS_N_INSNS (5),    /* dmul */
760   COSTS_N_INSNS (21),   /* sdiv */
761   COSTS_N_INSNS (35),   /* ddiv */
762   32,                   /* cache line size */
763   32,                   /* l1 cache */
764   1024,                 /* l2 cache */
765   1,                    /* streams */
766 };
767
768 /* Instruction costs on PPC8540 processors.  */
769 static const
770 struct processor_costs ppc8540_cost = {
771   COSTS_N_INSNS (4),    /* mulsi */
772   COSTS_N_INSNS (4),    /* mulsi_const */
773   COSTS_N_INSNS (4),    /* mulsi_const9 */
774   COSTS_N_INSNS (4),    /* muldi */
775   COSTS_N_INSNS (19),   /* divsi */
776   COSTS_N_INSNS (19),   /* divdi */
777   COSTS_N_INSNS (4),    /* fp */
778   COSTS_N_INSNS (4),    /* dmul */
779   COSTS_N_INSNS (29),   /* sdiv */
780   COSTS_N_INSNS (29),   /* ddiv */
781   32,                   /* cache line size */
782   32,                   /* l1 cache */
783   256,                  /* l2 cache */
784   1,                    /* prefetch streams /*/
785 };
786
787 /* Instruction costs on E300C2 and E300C3 cores.  */
788 static const
789 struct processor_costs ppce300c2c3_cost = {
790   COSTS_N_INSNS (4),    /* mulsi */
791   COSTS_N_INSNS (4),    /* mulsi_const */
792   COSTS_N_INSNS (4),    /* mulsi_const9 */
793   COSTS_N_INSNS (4),    /* muldi */
794   COSTS_N_INSNS (19),   /* divsi */
795   COSTS_N_INSNS (19),   /* divdi */
796   COSTS_N_INSNS (3),    /* fp */
797   COSTS_N_INSNS (4),    /* dmul */
798   COSTS_N_INSNS (18),   /* sdiv */
799   COSTS_N_INSNS (33),   /* ddiv */
800   32,
801   16,                   /* l1 cache */
802   16,                   /* l2 cache */
803   1,                    /* prefetch streams /*/
804 };
805
806 /* Instruction costs on PPCE500MC processors.  */
807 static const
808 struct processor_costs ppce500mc_cost = {
809   COSTS_N_INSNS (4),    /* mulsi */
810   COSTS_N_INSNS (4),    /* mulsi_const */
811   COSTS_N_INSNS (4),    /* mulsi_const9 */
812   COSTS_N_INSNS (4),    /* muldi */
813   COSTS_N_INSNS (14),   /* divsi */
814   COSTS_N_INSNS (14),   /* divdi */
815   COSTS_N_INSNS (8),    /* fp */
816   COSTS_N_INSNS (10),   /* dmul */
817   COSTS_N_INSNS (36),   /* sdiv */
818   COSTS_N_INSNS (66),   /* ddiv */
819   64,                   /* cache line size */
820   32,                   /* l1 cache */
821   128,                  /* l2 cache */
822   1,                    /* prefetch streams /*/
823 };
824
825 /* Instruction costs on PPCE500MC64 processors.  */
826 static const
827 struct processor_costs ppce500mc64_cost = {
828   COSTS_N_INSNS (4),    /* mulsi */
829   COSTS_N_INSNS (4),    /* mulsi_const */
830   COSTS_N_INSNS (4),    /* mulsi_const9 */
831   COSTS_N_INSNS (4),    /* muldi */
832   COSTS_N_INSNS (14),   /* divsi */
833   COSTS_N_INSNS (14),   /* divdi */
834   COSTS_N_INSNS (4),    /* fp */
835   COSTS_N_INSNS (10),   /* dmul */
836   COSTS_N_INSNS (36),   /* sdiv */
837   COSTS_N_INSNS (66),   /* ddiv */
838   64,                   /* cache line size */
839   32,                   /* l1 cache */
840   128,                  /* l2 cache */
841   1,                    /* prefetch streams /*/
842 };
843
844 /* Instruction costs on AppliedMicro Titan processors.  */
845 static const
846 struct processor_costs titan_cost = {
847   COSTS_N_INSNS (5),    /* mulsi */
848   COSTS_N_INSNS (5),    /* mulsi_const */
849   COSTS_N_INSNS (5),    /* mulsi_const9 */
850   COSTS_N_INSNS (5),    /* muldi */
851   COSTS_N_INSNS (18),   /* divsi */
852   COSTS_N_INSNS (18),   /* divdi */
853   COSTS_N_INSNS (10),   /* fp */
854   COSTS_N_INSNS (10),   /* dmul */
855   COSTS_N_INSNS (46),   /* sdiv */
856   COSTS_N_INSNS (72),   /* ddiv */
857   32,                   /* cache line size */
858   32,                   /* l1 cache */
859   512,                  /* l2 cache */
860   1,                    /* prefetch streams /*/
861 };
862
863 /* Instruction costs on POWER4 and POWER5 processors.  */
864 static const
865 struct processor_costs power4_cost = {
866   COSTS_N_INSNS (3),    /* mulsi */
867   COSTS_N_INSNS (2),    /* mulsi_const */
868   COSTS_N_INSNS (2),    /* mulsi_const9 */
869   COSTS_N_INSNS (4),    /* muldi */
870   COSTS_N_INSNS (18),   /* divsi */
871   COSTS_N_INSNS (34),   /* divdi */
872   COSTS_N_INSNS (3),    /* fp */
873   COSTS_N_INSNS (3),    /* dmul */
874   COSTS_N_INSNS (17),   /* sdiv */
875   COSTS_N_INSNS (17),   /* ddiv */
876   128,                  /* cache line size */
877   32,                   /* l1 cache */
878   1024,                 /* l2 cache */
879   8,                    /* prefetch streams /*/
880 };
881
882 /* Instruction costs on POWER6 processors.  */
883 static const
884 struct processor_costs power6_cost = {
885   COSTS_N_INSNS (8),    /* mulsi */
886   COSTS_N_INSNS (8),    /* mulsi_const */
887   COSTS_N_INSNS (8),    /* mulsi_const9 */
888   COSTS_N_INSNS (8),    /* muldi */
889   COSTS_N_INSNS (22),   /* divsi */
890   COSTS_N_INSNS (28),   /* divdi */
891   COSTS_N_INSNS (3),    /* fp */
892   COSTS_N_INSNS (3),    /* dmul */
893   COSTS_N_INSNS (13),   /* sdiv */
894   COSTS_N_INSNS (16),   /* ddiv */
895   128,                  /* cache line size */
896   64,                   /* l1 cache */
897   2048,                 /* l2 cache */
898   16,                   /* prefetch streams */
899 };
900
901 /* Instruction costs on POWER7 processors.  */
902 static const
903 struct processor_costs power7_cost = {
904   COSTS_N_INSNS (2),    /* mulsi */
905   COSTS_N_INSNS (2),    /* mulsi_const */
906   COSTS_N_INSNS (2),    /* mulsi_const9 */
907   COSTS_N_INSNS (2),    /* muldi */
908   COSTS_N_INSNS (18),   /* divsi */
909   COSTS_N_INSNS (34),   /* divdi */
910   COSTS_N_INSNS (3),    /* fp */
911   COSTS_N_INSNS (3),    /* dmul */
912   COSTS_N_INSNS (13),   /* sdiv */
913   COSTS_N_INSNS (16),   /* ddiv */
914   128,                  /* cache line size */
915   32,                   /* l1 cache */
916   256,                  /* l2 cache */
917   12,                   /* prefetch streams */
918 };
919
920 /* Instruction costs on POWER A2 processors.  */
921 static const
922 struct processor_costs ppca2_cost = {
923   COSTS_N_INSNS (16),    /* mulsi */
924   COSTS_N_INSNS (16),    /* mulsi_const */
925   COSTS_N_INSNS (16),    /* mulsi_const9 */
926   COSTS_N_INSNS (16),   /* muldi */
927   COSTS_N_INSNS (22),   /* divsi */
928   COSTS_N_INSNS (28),   /* divdi */
929   COSTS_N_INSNS (3),    /* fp */
930   COSTS_N_INSNS (3),    /* dmul */
931   COSTS_N_INSNS (59),   /* sdiv */
932   COSTS_N_INSNS (72),   /* ddiv */
933   64,
934   16,                   /* l1 cache */
935   2048,                 /* l2 cache */
936   16,                   /* prefetch streams */
937 };
938
939 \f
940 /* Table that classifies rs6000 builtin functions (pure, const, etc.).  */
941 #undef RS6000_BUILTIN
942 #undef RS6000_BUILTIN_EQUATE
943 #define RS6000_BUILTIN(NAME, TYPE) TYPE,
944 #define RS6000_BUILTIN_EQUATE(NAME, VALUE)
945
946 static const enum rs6000_btc builtin_classify[(int)RS6000_BUILTIN_COUNT] =
947 {
948 #include "rs6000-builtin.def"
949 };
950
951 #undef RS6000_BUILTIN
952 #undef RS6000_BUILTIN_EQUATE
953
954 /* Support for -mveclibabi=<xxx> to control which vector library to use.  */
955 static tree (*rs6000_veclib_handler) (tree, tree, tree);
956
957 \f
958 static bool rs6000_function_ok_for_sibcall (tree, tree);
959 static const char *rs6000_invalid_within_doloop (const_rtx);
960 static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
961 static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
962 static rtx rs6000_generate_compare (rtx, enum machine_mode);
963 static void rs6000_emit_stack_tie (void);
964 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
965 static bool spe_func_has_64bit_regs_p (void);
966 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
967                              int, HOST_WIDE_INT);
968 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
969 static unsigned rs6000_hash_constant (rtx);
970 static unsigned toc_hash_function (const void *);
971 static int toc_hash_eq (const void *, const void *);
972 static bool reg_offset_addressing_ok_p (enum machine_mode);
973 static bool virtual_stack_registers_memory_p (rtx);
974 static bool constant_pool_expr_p (rtx);
975 static bool legitimate_small_data_p (enum machine_mode, rtx);
976 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
977 static struct machine_function * rs6000_init_machine_status (void);
978 static bool rs6000_assemble_integer (rtx, unsigned int, int);
979 static bool no_global_regs_above (int, bool);
980 #ifdef HAVE_GAS_HIDDEN
981 static void rs6000_assemble_visibility (tree, int);
982 #endif
983 static int rs6000_ra_ever_killed (void);
984 static bool rs6000_attribute_takes_identifier_p (const_tree);
985 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
986 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
987 static bool rs6000_ms_bitfield_layout_p (const_tree);
988 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
989 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
990 static const char *rs6000_mangle_type (const_tree);
991 static void rs6000_set_default_type_attributes (tree);
992 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
993 static rtx rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
994 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
995                                    enum machine_mode, bool, bool, bool);
996 static bool rs6000_reg_live_or_pic_offset_p (int);
997 static tree rs6000_builtin_vectorized_libmass (tree, tree, tree);
998 static tree rs6000_builtin_vectorized_function (tree, tree, tree);
999 static void rs6000_restore_saved_cr (rtx, int);
1000 static bool rs6000_output_addr_const_extra (FILE *, rtx);
1001 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
1002 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
1003 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
1004                                     tree);
1005 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
1006 static bool rs6000_return_in_memory (const_tree, const_tree);
1007 static rtx rs6000_function_value (const_tree, const_tree, bool);
1008 static void rs6000_file_start (void);
1009 #if TARGET_ELF
1010 static int rs6000_elf_reloc_rw_mask (void);
1011 static void rs6000_elf_asm_out_constructor (rtx, int);
1012 static void rs6000_elf_asm_out_destructor (rtx, int);
1013 static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
1014 static void rs6000_elf_asm_init_sections (void);
1015 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
1016                                                unsigned HOST_WIDE_INT);
1017 static void rs6000_elf_encode_section_info (tree, rtx, int)
1018      ATTRIBUTE_UNUSED;
1019 #endif
1020 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
1021 static void rs6000_alloc_sdmode_stack_slot (void);
1022 static void rs6000_instantiate_decls (void);
1023 #if TARGET_XCOFF
1024 static void rs6000_xcoff_asm_output_anchor (rtx);
1025 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
1026 static void rs6000_xcoff_asm_init_sections (void);
1027 static int rs6000_xcoff_reloc_rw_mask (void);
1028 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
1029 static section *rs6000_xcoff_select_section (tree, int,
1030                                              unsigned HOST_WIDE_INT);
1031 static void rs6000_xcoff_unique_section (tree, int);
1032 static section *rs6000_xcoff_select_rtx_section
1033   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
1034 static const char * rs6000_xcoff_strip_name_encoding (const char *);
1035 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
1036 static void rs6000_xcoff_file_start (void);
1037 static void rs6000_xcoff_file_end (void);
1038 #endif
1039 static int rs6000_variable_issue (FILE *, int, rtx, int);
1040 static int rs6000_register_move_cost (enum machine_mode,
1041                                       reg_class_t, reg_class_t);
1042 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
1043 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
1044 static bool rs6000_debug_rtx_costs (rtx, int, int, int *, bool);
1045 static int rs6000_debug_address_cost (rtx, bool);
1046 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
1047 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
1048 static void rs6000_sched_init (FILE *, int, int);
1049 static bool is_microcoded_insn (rtx);
1050 static bool is_nonpipeline_insn (rtx);
1051 static bool is_cracked_insn (rtx);
1052 static bool is_branch_slot_insn (rtx);
1053 static bool is_load_insn (rtx);
1054 static rtx get_store_dest (rtx pat);
1055 static bool is_store_insn (rtx);
1056 static bool set_to_load_agen (rtx,rtx);
1057 static bool adjacent_mem_locations (rtx,rtx);
1058 static int rs6000_adjust_priority (rtx, int);
1059 static int rs6000_issue_rate (void);
1060 static bool rs6000_is_costly_dependence (dep_t, int, int);
1061 static rtx get_next_active_insn (rtx, rtx);
1062 static bool insn_terminates_group_p (rtx , enum group_termination);
1063 static bool insn_must_be_first_in_group (rtx);
1064 static bool insn_must_be_last_in_group (rtx);
1065 static bool is_costly_group (rtx *, rtx);
1066 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
1067 static int redefine_groups (FILE *, int, rtx, rtx);
1068 static int pad_groups (FILE *, int, rtx, rtx);
1069 static void rs6000_sched_finish (FILE *, int);
1070 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
1071 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
1072 static int rs6000_use_sched_lookahead (void);
1073 static int rs6000_use_sched_lookahead_guard (rtx);
1074 static void * rs6000_alloc_sched_context (void);
1075 static void rs6000_init_sched_context (void *, bool);
1076 static void rs6000_set_sched_context (void *);
1077 static void rs6000_free_sched_context (void *);
1078 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
1079 static tree rs6000_builtin_mask_for_load (void);
1080 static tree rs6000_builtin_mul_widen_even (tree);
1081 static tree rs6000_builtin_mul_widen_odd (tree);
1082 static tree rs6000_builtin_conversion (unsigned int, tree, tree);
1083 static tree rs6000_builtin_vec_perm (tree, tree *);
1084 static bool rs6000_builtin_support_vector_misalignment (enum
1085                                                         machine_mode,
1086                                                         const_tree,
1087                                                         int, bool);
1088 static int rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt,
1089                                               tree, int);
1090 static enum machine_mode rs6000_preferred_simd_mode (enum machine_mode);
1091
1092 static void def_builtin (int, const char *, tree, int);
1093 static bool rs6000_vector_alignment_reachable (const_tree, bool);
1094 static void rs6000_init_builtins (void);
1095 static tree rs6000_builtin_decl (unsigned, bool);
1096
1097 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
1098 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
1099 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
1100 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1101 static void altivec_init_builtins (void);
1102 static unsigned builtin_hash_function (const void *);
1103 static int builtin_hash_eq (const void *, const void *);
1104 static tree builtin_function_type (enum machine_mode, enum machine_mode,
1105                                    enum machine_mode, enum machine_mode,
1106                                    enum rs6000_builtins, const char *name);
1107 static void rs6000_common_init_builtins (void);
1108 static void rs6000_init_libfuncs (void);
1109
1110 static void paired_init_builtins (void);
1111 static rtx paired_expand_builtin (tree, rtx, bool *);
1112 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
1113 static rtx paired_expand_stv_builtin (enum insn_code, tree);
1114 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
1115
1116 static void enable_mask_for_builtins (struct builtin_description *, int,
1117                                       enum rs6000_builtins,
1118                                       enum rs6000_builtins);
1119 static void spe_init_builtins (void);
1120 static rtx spe_expand_builtin (tree, rtx, bool *);
1121 static rtx spe_expand_stv_builtin (enum insn_code, tree);
1122 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
1123 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
1124 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
1125 static rs6000_stack_t *rs6000_stack_info (void);
1126 static void debug_stack_info (rs6000_stack_t *);
1127
1128 static rtx altivec_expand_builtin (tree, rtx, bool *);
1129 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
1130 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
1131 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
1132 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
1133 static rtx altivec_expand_predicate_builtin (enum insn_code, tree, rtx);
1134 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
1135 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
1136 static rtx altivec_expand_vec_set_builtin (tree);
1137 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
1138 static int get_element_number (tree, tree);
1139 static void rs6000_option_override (void);
1140 static void rs6000_option_init_struct (struct gcc_options *);
1141 static void rs6000_option_default_params (void);
1142 static bool rs6000_handle_option (size_t, const char *, int);
1143 static void rs6000_parse_tls_size_option (void);
1144 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
1145 static int first_altivec_reg_to_save (void);
1146 static unsigned int compute_vrsave_mask (void);
1147 static void compute_save_world_info (rs6000_stack_t *info_ptr);
1148 static void is_altivec_return_reg (rtx, void *);
1149 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
1150 int easy_vector_constant (rtx, enum machine_mode);
1151 static rtx rs6000_dwarf_register_span (rtx);
1152 static void rs6000_init_dwarf_reg_sizes_extra (tree);
1153 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
1154 static rtx rs6000_debug_legitimize_address (rtx, rtx, enum machine_mode);
1155 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1156 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
1157 static rtx rs6000_delegitimize_address (rtx);
1158 static rtx rs6000_tls_get_addr (void);
1159 static rtx rs6000_got_sym (void);
1160 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
1161 static const char *rs6000_get_some_local_dynamic_name (void);
1162 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
1163 static rtx rs6000_complex_function_value (enum machine_mode);
1164 static rtx rs6000_spe_function_arg (const CUMULATIVE_ARGS *,
1165                                     enum machine_mode, const_tree);
1166 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
1167                                                       HOST_WIDE_INT, int);
1168 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
1169                                                         const_tree,
1170                                                         HOST_WIDE_INT);
1171 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
1172                                               HOST_WIDE_INT,
1173                                               rtx[], int *);
1174 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
1175                                                 const_tree, HOST_WIDE_INT,
1176                                                 rtx[], int *);
1177 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, bool, bool);
1178 static rtx rs6000_mixed_function_arg (enum machine_mode, const_tree, int);
1179 static void rs6000_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
1180                                          const_tree, bool);
1181 static rtx rs6000_function_arg (CUMULATIVE_ARGS *, enum machine_mode,
1182                                 const_tree, bool);
1183 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
1184 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
1185                                     enum machine_mode, tree,
1186                                     int *, int);
1187 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
1188                                       const_tree, bool);
1189 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
1190                                      tree, bool);
1191 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
1192 #if TARGET_MACHO
1193 static void macho_branch_islands (void);
1194 static int no_previous_def (tree function_name);
1195 static tree get_prev_label (tree function_name);
1196 static void rs6000_darwin_file_start (void);
1197 #endif
1198
1199 static tree rs6000_build_builtin_va_list (void);
1200 static void rs6000_va_start (tree, rtx);
1201 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
1202 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
1203 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
1204 static bool rs6000_vector_mode_supported_p (enum machine_mode);
1205 static rtx rs6000_emit_vector_compare_inner (enum rtx_code, rtx, rtx);
1206 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
1207                                        enum machine_mode);
1208 static tree rs6000_stack_protect_fail (void);
1209
1210 static rtx rs6000_legitimize_reload_address (rtx, enum machine_mode, int, int,
1211                                              int, int *);
1212
1213 static rtx rs6000_debug_legitimize_reload_address (rtx, enum machine_mode, int,
1214                                                    int, int, int *);
1215
1216 rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode, int, int,
1217                                              int, int *)
1218   = rs6000_legitimize_reload_address;
1219
1220 static bool rs6000_mode_dependent_address_p (const_rtx);
1221 static bool rs6000_mode_dependent_address (const_rtx);
1222 static bool rs6000_debug_mode_dependent_address (const_rtx);
1223 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1224   = rs6000_mode_dependent_address;
1225
1226 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1227                                                      enum machine_mode, rtx);
1228 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1229                                                            enum machine_mode,
1230                                                            rtx);
1231 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1232                                                      enum machine_mode, rtx)
1233   = rs6000_secondary_reload_class;
1234
1235 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1236 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1237                                                            enum reg_class);
1238 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1239   = rs6000_preferred_reload_class;
1240
1241 static bool rs6000_secondary_memory_needed (enum reg_class, enum reg_class,
1242                                             enum machine_mode);
1243
1244 static bool rs6000_debug_secondary_memory_needed (enum reg_class,
1245                                                   enum reg_class,
1246                                                   enum machine_mode);
1247
1248 bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class, enum reg_class,
1249                                             enum machine_mode)
1250   = rs6000_secondary_memory_needed;
1251
1252 static bool rs6000_cannot_change_mode_class (enum machine_mode,
1253                                              enum machine_mode,
1254                                              enum reg_class);
1255 static bool rs6000_debug_cannot_change_mode_class (enum machine_mode,
1256                                                    enum machine_mode,
1257                                                    enum reg_class);
1258
1259 bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
1260                                              enum machine_mode,
1261                                              enum reg_class)
1262   = rs6000_cannot_change_mode_class;
1263
1264 static reg_class_t rs6000_secondary_reload (bool, rtx, reg_class_t,
1265                                             enum machine_mode,
1266                                             struct secondary_reload_info *);
1267
1268 static const reg_class_t *rs6000_ira_cover_classes (void);
1269
1270 const int INSN_NOT_AVAILABLE = -1;
1271 static enum machine_mode rs6000_eh_return_filter_mode (void);
1272 static bool rs6000_can_eliminate (const int, const int);
1273 static void rs6000_trampoline_init (rtx, tree, rtx);
1274
1275 /* Hash table stuff for keeping track of TOC entries.  */
1276
1277 struct GTY(()) toc_hash_struct
1278 {
1279   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1280      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
1281   rtx key;
1282   enum machine_mode key_mode;
1283   int labelno;
1284 };
1285
1286 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
1287
1288 /* Hash table to keep track of the argument types for builtin functions.  */
1289
1290 struct GTY(()) builtin_hash_struct
1291 {
1292   tree type;
1293   enum machine_mode mode[4];    /* return value + 3 arguments.  */
1294   unsigned char uns_p[4];       /* and whether the types are unsigned.  */
1295 };
1296
1297 static GTY ((param_is (struct builtin_hash_struct))) htab_t builtin_hash_table;
1298 \f
1299 /* Default register names.  */
1300 char rs6000_reg_names[][8] =
1301 {
1302       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1303       "8",  "9", "10", "11", "12", "13", "14", "15",
1304      "16", "17", "18", "19", "20", "21", "22", "23",
1305      "24", "25", "26", "27", "28", "29", "30", "31",
1306       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1307       "8",  "9", "10", "11", "12", "13", "14", "15",
1308      "16", "17", "18", "19", "20", "21", "22", "23",
1309      "24", "25", "26", "27", "28", "29", "30", "31",
1310      "mq", "lr", "ctr","ap",
1311       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1312       "ca",
1313       /* AltiVec registers.  */
1314       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
1315       "8",  "9",  "10", "11", "12", "13", "14", "15",
1316       "16", "17", "18", "19", "20", "21", "22", "23",
1317       "24", "25", "26", "27", "28", "29", "30", "31",
1318       "vrsave", "vscr",
1319       /* SPE registers.  */
1320       "spe_acc", "spefscr",
1321       /* Soft frame pointer.  */
1322       "sfp"
1323 };
1324
1325 #ifdef TARGET_REGNAMES
1326 static const char alt_reg_names[][8] =
1327 {
1328    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1329    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1330   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1331   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1332    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1333    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1334   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1335   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1336     "mq",    "lr",  "ctr",   "ap",
1337   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1338    "ca",
1339   /* AltiVec registers.  */
1340    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1341    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1342   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1343   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1344   "vrsave", "vscr",
1345   /* SPE registers.  */
1346   "spe_acc", "spefscr",
1347   /* Soft frame pointer.  */
1348   "sfp"
1349 };
1350 #endif
1351
1352 /* Table of valid machine attributes.  */
1353
1354 static const struct attribute_spec rs6000_attribute_table[] =
1355 {
1356   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
1357   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute },
1358   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
1359   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
1360   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
1361   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
1362 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1363   SUBTARGET_ATTRIBUTE_TABLE,
1364 #endif
1365   { NULL,        0, 0, false, false, false, NULL }
1366 };
1367
1368 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
1369 static const struct default_options rs6000_option_optimization_table[] =
1370   {
1371     { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
1372     { OPT_LEVELS_NONE, 0, NULL, 0 }
1373   };
1374 \f
1375 #ifndef MASK_STRICT_ALIGN
1376 #define MASK_STRICT_ALIGN 0
1377 #endif
1378 #ifndef TARGET_PROFILE_KERNEL
1379 #define TARGET_PROFILE_KERNEL 0
1380 #endif
1381
1382 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1383 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1384 \f
1385 /* Initialize the GCC target structure.  */
1386 #undef TARGET_ATTRIBUTE_TABLE
1387 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1388 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1389 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1390 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1391 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1392
1393 #undef TARGET_ASM_ALIGNED_DI_OP
1394 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1395
1396 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1397    for non-ELF systems.  */
1398 #ifndef OBJECT_FORMAT_ELF
1399 #if TARGET_XCOFF
1400 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1401    64-bit targets.  */
1402 #undef TARGET_ASM_UNALIGNED_HI_OP
1403 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1404 #undef TARGET_ASM_UNALIGNED_SI_OP
1405 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1406 #undef TARGET_ASM_UNALIGNED_DI_OP
1407 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1408 #else
1409 /* For Darwin.  */
1410 #undef TARGET_ASM_UNALIGNED_HI_OP
1411 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1412 #undef TARGET_ASM_UNALIGNED_SI_OP
1413 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1414 #undef TARGET_ASM_UNALIGNED_DI_OP
1415 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1416 #undef TARGET_ASM_ALIGNED_DI_OP
1417 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1418 #endif
1419 #endif
1420
1421 /* This hook deals with fixups for relocatable code and DI-mode objects
1422    in 64-bit code.  */
1423 #undef TARGET_ASM_INTEGER
1424 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1425
1426 #ifdef HAVE_GAS_HIDDEN
1427 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1428 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1429 #endif
1430
1431 #undef TARGET_HAVE_TLS
1432 #define TARGET_HAVE_TLS HAVE_AS_TLS
1433
1434 #undef TARGET_CANNOT_FORCE_CONST_MEM
1435 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
1436
1437 #undef TARGET_DELEGITIMIZE_ADDRESS
1438 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1439
1440 #undef TARGET_ASM_FUNCTION_PROLOGUE
1441 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1442 #undef TARGET_ASM_FUNCTION_EPILOGUE
1443 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1444
1445 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
1446 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA rs6000_output_addr_const_extra
1447
1448 #undef TARGET_LEGITIMIZE_ADDRESS
1449 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1450
1451 #undef  TARGET_SCHED_VARIABLE_ISSUE
1452 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1453
1454 #undef TARGET_SCHED_ISSUE_RATE
1455 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1456 #undef TARGET_SCHED_ADJUST_COST
1457 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1458 #undef TARGET_SCHED_ADJUST_PRIORITY
1459 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1460 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1461 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1462 #undef TARGET_SCHED_INIT
1463 #define TARGET_SCHED_INIT rs6000_sched_init
1464 #undef TARGET_SCHED_FINISH
1465 #define TARGET_SCHED_FINISH rs6000_sched_finish
1466 #undef TARGET_SCHED_REORDER
1467 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1468 #undef TARGET_SCHED_REORDER2
1469 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1470
1471 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1472 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1473
1474 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1475 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1476
1477 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1478 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1479 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1480 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1481 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1482 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1483 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1484 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1485
1486 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1487 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1488 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1489 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1490 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1491 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1492 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1493 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1494 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1495 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1496 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1497 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT            \
1498   rs6000_builtin_support_vector_misalignment
1499 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1500 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1501 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1502 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1503   rs6000_builtin_vectorization_cost
1504 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
1505 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
1506   rs6000_preferred_simd_mode
1507
1508 #undef TARGET_INIT_BUILTINS
1509 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1510 #undef TARGET_BUILTIN_DECL
1511 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1512
1513 #undef TARGET_EXPAND_BUILTIN
1514 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1515
1516 #undef TARGET_MANGLE_TYPE
1517 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1518
1519 #undef TARGET_INIT_LIBFUNCS
1520 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1521
1522 #if TARGET_MACHO
1523 #undef TARGET_BINDS_LOCAL_P
1524 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1525 #endif
1526
1527 #undef TARGET_MS_BITFIELD_LAYOUT_P
1528 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1529
1530 #undef TARGET_ASM_OUTPUT_MI_THUNK
1531 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1532
1533 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1534 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1535
1536 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1537 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1538
1539 #undef TARGET_INVALID_WITHIN_DOLOOP
1540 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1541
1542 #undef TARGET_REGISTER_MOVE_COST
1543 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1544 #undef TARGET_MEMORY_MOVE_COST
1545 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1546 #undef TARGET_RTX_COSTS
1547 #define TARGET_RTX_COSTS rs6000_rtx_costs
1548 #undef TARGET_ADDRESS_COST
1549 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1550
1551 #undef TARGET_DWARF_REGISTER_SPAN
1552 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1553
1554 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1555 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1556
1557 /* On rs6000, function arguments are promoted, as are function return
1558    values.  */
1559 #undef TARGET_PROMOTE_FUNCTION_MODE
1560 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
1561
1562 #undef TARGET_RETURN_IN_MEMORY
1563 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1564
1565 #undef TARGET_SETUP_INCOMING_VARARGS
1566 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1567
1568 /* Always strict argument naming on rs6000.  */
1569 #undef TARGET_STRICT_ARGUMENT_NAMING
1570 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1571 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1572 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1573 #undef TARGET_SPLIT_COMPLEX_ARG
1574 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1575 #undef TARGET_MUST_PASS_IN_STACK
1576 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1577 #undef TARGET_PASS_BY_REFERENCE
1578 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1579 #undef TARGET_ARG_PARTIAL_BYTES
1580 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1581 #undef TARGET_FUNCTION_ARG_ADVANCE
1582 #define TARGET_FUNCTION_ARG_ADVANCE rs6000_function_arg_advance
1583 #undef TARGET_FUNCTION_ARG
1584 #define TARGET_FUNCTION_ARG rs6000_function_arg
1585
1586 #undef TARGET_BUILD_BUILTIN_VA_LIST
1587 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1588
1589 #undef TARGET_EXPAND_BUILTIN_VA_START
1590 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1591
1592 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1593 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1594
1595 #undef TARGET_EH_RETURN_FILTER_MODE
1596 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1597
1598 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1599 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1600
1601 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1602 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1603
1604 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1605 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1606
1607 #undef TARGET_HANDLE_OPTION
1608 #define TARGET_HANDLE_OPTION rs6000_handle_option
1609
1610 #undef TARGET_OPTION_OVERRIDE
1611 #define TARGET_OPTION_OVERRIDE rs6000_option_override
1612
1613 #undef TARGET_OPTION_INIT_STRUCT
1614 #define TARGET_OPTION_INIT_STRUCT rs6000_option_init_struct
1615
1616 #undef TARGET_OPTION_DEFAULT_PARAMS
1617 #define TARGET_OPTION_DEFAULT_PARAMS rs6000_option_default_params
1618
1619 #undef TARGET_OPTION_OPTIMIZATION_TABLE
1620 #define TARGET_OPTION_OPTIMIZATION_TABLE rs6000_option_optimization_table
1621
1622 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1623 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1624   rs6000_builtin_vectorized_function
1625
1626 #undef TARGET_DEFAULT_TARGET_FLAGS
1627 #define TARGET_DEFAULT_TARGET_FLAGS \
1628   (TARGET_DEFAULT)
1629
1630 #undef TARGET_STACK_PROTECT_FAIL
1631 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1632
1633 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1634    The PowerPC architecture requires only weak consistency among
1635    processors--that is, memory accesses between processors need not be
1636    sequentially consistent and memory accesses among processors can occur
1637    in any order. The ability to order memory accesses weakly provides
1638    opportunities for more efficient use of the system bus. Unless a
1639    dependency exists, the 604e allows read operations to precede store
1640    operations.  */
1641 #undef TARGET_RELAXED_ORDERING
1642 #define TARGET_RELAXED_ORDERING true
1643
1644 #ifdef HAVE_AS_TLS
1645 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1646 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1647 #endif
1648
1649 /* Use a 32-bit anchor range.  This leads to sequences like:
1650
1651         addis   tmp,anchor,high
1652         add     dest,tmp,low
1653
1654    where tmp itself acts as an anchor, and can be shared between
1655    accesses to the same 64k page.  */
1656 #undef TARGET_MIN_ANCHOR_OFFSET
1657 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1658 #undef TARGET_MAX_ANCHOR_OFFSET
1659 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1660 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1661 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1662
1663 #undef TARGET_BUILTIN_RECIPROCAL
1664 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1665
1666 #undef TARGET_EXPAND_TO_RTL_HOOK
1667 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1668
1669 #undef TARGET_INSTANTIATE_DECLS
1670 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1671
1672 #undef TARGET_SECONDARY_RELOAD
1673 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1674
1675 #undef TARGET_IRA_COVER_CLASSES
1676 #define TARGET_IRA_COVER_CLASSES rs6000_ira_cover_classes
1677
1678 #undef TARGET_LEGITIMATE_ADDRESS_P
1679 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1680
1681 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1682 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1683
1684 #undef TARGET_CAN_ELIMINATE
1685 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1686
1687 #undef TARGET_TRAMPOLINE_INIT
1688 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1689
1690 #undef TARGET_FUNCTION_VALUE
1691 #define TARGET_FUNCTION_VALUE rs6000_function_value
1692
1693 struct gcc_target targetm = TARGET_INITIALIZER;
1694 \f
1695 /* Return number of consecutive hard regs needed starting at reg REGNO
1696    to hold something of mode MODE.
1697    This is ordinarily the length in words of a value of mode MODE
1698    but can be less for certain modes in special long registers.
1699
1700    For the SPE, GPRs are 64 bits but only 32 bits are visible in
1701    scalar instructions.  The upper 32 bits are only available to the
1702    SIMD instructions.
1703
1704    POWER and PowerPC GPRs hold 32 bits worth;
1705    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
1706
1707 static int
1708 rs6000_hard_regno_nregs_internal (int regno, enum machine_mode mode)
1709 {
1710   unsigned HOST_WIDE_INT reg_size;
1711
1712   if (FP_REGNO_P (regno))
1713     reg_size = (VECTOR_MEM_VSX_P (mode)
1714                 ? UNITS_PER_VSX_WORD
1715                 : UNITS_PER_FP_WORD);
1716
1717   else if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1718     reg_size = UNITS_PER_SPE_WORD;
1719
1720   else if (ALTIVEC_REGNO_P (regno))
1721     reg_size = UNITS_PER_ALTIVEC_WORD;
1722
1723   /* The value returned for SCmode in the E500 double case is 2 for
1724      ABI compatibility; storing an SCmode value in a single register
1725      would require function_arg and rs6000_spe_function_arg to handle
1726      SCmode so as to pass the value correctly in a pair of
1727      registers.  */
1728   else if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
1729            && !DECIMAL_FLOAT_MODE_P (mode))
1730     reg_size = UNITS_PER_FP_WORD;
1731
1732   else
1733     reg_size = UNITS_PER_WORD;
1734
1735   return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
1736 }
1737
1738 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1739    MODE.  */
1740 static int
1741 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1742 {
1743   int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
1744
1745   /* VSX registers that overlap the FPR registers are larger than for non-VSX
1746      implementations.  Don't allow an item to be split between a FP register
1747      and an Altivec register.  */
1748   if (VECTOR_MEM_VSX_P (mode))
1749     {
1750       if (FP_REGNO_P (regno))
1751         return FP_REGNO_P (last_regno);
1752
1753       if (ALTIVEC_REGNO_P (regno))
1754         return ALTIVEC_REGNO_P (last_regno);
1755     }
1756
1757   /* The GPRs can hold any mode, but values bigger than one register
1758      cannot go past R31.  */
1759   if (INT_REGNO_P (regno))
1760     return INT_REGNO_P (last_regno);
1761
1762   /* The float registers (except for VSX vector modes) can only hold floating
1763      modes and DImode.  This excludes the 32-bit decimal float mode for
1764      now.  */
1765   if (FP_REGNO_P (regno))
1766     {
1767       if (SCALAR_FLOAT_MODE_P (mode)
1768           && (mode != TDmode || (regno % 2) == 0)
1769           && FP_REGNO_P (last_regno))
1770         return 1;
1771
1772       if (GET_MODE_CLASS (mode) == MODE_INT
1773           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1774         return 1;
1775
1776       if (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1777           && PAIRED_VECTOR_MODE (mode))
1778         return 1;
1779
1780       return 0;
1781     }
1782
1783   /* The CR register can only hold CC modes.  */
1784   if (CR_REGNO_P (regno))
1785     return GET_MODE_CLASS (mode) == MODE_CC;
1786
1787   if (CA_REGNO_P (regno))
1788     return mode == BImode;
1789
1790   /* AltiVec only in AldyVec registers.  */
1791   if (ALTIVEC_REGNO_P (regno))
1792     return VECTOR_MEM_ALTIVEC_OR_VSX_P (mode);
1793
1794   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1795   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1796     return 1;
1797
1798   /* We cannot put TImode anywhere except general register and it must be able
1799      to fit within the register set.  In the future, allow TImode in the
1800      Altivec or VSX registers.  */
1801
1802   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1803 }
1804
1805 /* Print interesting facts about registers.  */
1806 static void
1807 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
1808 {
1809   int r, m;
1810
1811   for (r = first_regno; r <= last_regno; ++r)
1812     {
1813       const char *comma = "";
1814       int len;
1815
1816       if (first_regno == last_regno)
1817         fprintf (stderr, "%s:\t", reg_name);
1818       else
1819         fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
1820
1821       len = 8;
1822       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1823         if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
1824           {
1825             if (len > 70)
1826               {
1827                 fprintf (stderr, ",\n\t");
1828                 len = 8;
1829                 comma = "";
1830               }
1831
1832             if (rs6000_hard_regno_nregs[m][r] > 1)
1833               len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
1834                              rs6000_hard_regno_nregs[m][r]);
1835             else
1836               len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
1837
1838             comma = ", ";
1839           }
1840
1841       if (call_used_regs[r])
1842         {
1843           if (len > 70)
1844             {
1845               fprintf (stderr, ",\n\t");
1846               len = 8;
1847               comma = "";
1848             }
1849
1850           len += fprintf (stderr, "%s%s", comma, "call-used");
1851           comma = ", ";
1852         }
1853
1854       if (fixed_regs[r])
1855         {
1856           if (len > 70)
1857             {
1858               fprintf (stderr, ",\n\t");
1859               len = 8;
1860               comma = "";
1861             }
1862
1863           len += fprintf (stderr, "%s%s", comma, "fixed");
1864           comma = ", ";
1865         }
1866
1867       if (len > 70)
1868         {
1869           fprintf (stderr, ",\n\t");
1870           comma = "";
1871         }
1872
1873       fprintf (stderr, "%sregno = %d\n", comma, r);
1874     }
1875 }
1876
1877 /* Print various interesting information with -mdebug=reg.  */
1878 static void
1879 rs6000_debug_reg_global (void)
1880 {
1881   const char *nl = (const char *)0;
1882   int m;
1883   char costly_num[20];
1884   char nop_num[20];
1885   const char *costly_str;
1886   const char *nop_str;
1887
1888   /* Map enum rs6000_vector to string.  */
1889   static const char *rs6000_debug_vector_unit[] = {
1890     "none",
1891     "altivec",
1892     "vsx",
1893     "paired",
1894     "spe",
1895     "other"
1896   };
1897
1898   fprintf (stderr, "Register information: (last virtual reg = %d)\n",
1899            LAST_VIRTUAL_REGISTER);
1900   rs6000_debug_reg_print (0, 31, "gr");
1901   rs6000_debug_reg_print (32, 63, "fp");
1902   rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
1903                           LAST_ALTIVEC_REGNO,
1904                           "vs");
1905   rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
1906   rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
1907   rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
1908   rs6000_debug_reg_print (MQ_REGNO, MQ_REGNO, "mq");
1909   rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
1910   rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
1911   rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
1912   rs6000_debug_reg_print (SPE_ACC_REGNO, SPE_ACC_REGNO, "spe_a");
1913   rs6000_debug_reg_print (SPEFSCR_REGNO, SPEFSCR_REGNO, "spe_f");
1914
1915   fprintf (stderr,
1916            "\n"
1917            "d  reg_class = %s\n"
1918            "f  reg_class = %s\n"
1919            "v  reg_class = %s\n"
1920            "wa reg_class = %s\n"
1921            "wd reg_class = %s\n"
1922            "wf reg_class = %s\n"
1923            "ws reg_class = %s\n\n",
1924            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
1925            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
1926            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
1927            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
1928            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
1929            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
1930            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]]);
1931
1932   for (m = 0; m < NUM_MACHINE_MODES; ++m)
1933     if (rs6000_vector_unit[m] || rs6000_vector_mem[m])
1934       {
1935         nl = "\n";
1936         fprintf (stderr, "Vector mode: %-5s arithmetic: %-8s move: %-8s\n",
1937                  GET_MODE_NAME (m),
1938                  rs6000_debug_vector_unit[ rs6000_vector_unit[m] ],
1939                  rs6000_debug_vector_unit[ rs6000_vector_mem[m] ]);
1940       }
1941
1942   if (nl)
1943     fputs (nl, stderr);
1944
1945   if (rs6000_recip_control)
1946     {
1947       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
1948
1949       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1950         if (rs6000_recip_bits[m])
1951           {
1952             fprintf (stderr,
1953                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
1954                      GET_MODE_NAME (m),
1955                      (RS6000_RECIP_AUTO_RE_P (m)
1956                       ? "auto"
1957                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
1958                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
1959                       ? "auto"
1960                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
1961           }
1962
1963       fputs ("\n", stderr);
1964     }
1965
1966   switch (rs6000_sched_costly_dep)
1967     {
1968     case max_dep_latency:
1969       costly_str = "max_dep_latency";
1970       break;
1971
1972     case no_dep_costly:
1973       costly_str = "no_dep_costly";
1974       break;
1975
1976     case all_deps_costly:
1977       costly_str = "all_deps_costly";
1978       break;
1979
1980     case true_store_to_load_dep_costly:
1981       costly_str = "true_store_to_load_dep_costly";
1982       break;
1983
1984     case store_to_load_dep_costly:
1985       costly_str = "store_to_load_dep_costly";
1986       break;
1987
1988     default:
1989       costly_str = costly_num;
1990       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
1991       break;
1992     }
1993
1994   switch (rs6000_sched_insert_nops)
1995     {
1996     case sched_finish_regroup_exact:
1997       nop_str = "sched_finish_regroup_exact";
1998       break;
1999
2000     case sched_finish_pad_groups:
2001       nop_str = "sched_finish_pad_groups";
2002       break;
2003
2004     case sched_finish_none:
2005       nop_str = "sched_finish_none";
2006       break;
2007
2008     default:
2009       nop_str = nop_num;
2010       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2011       break;
2012     }
2013
2014   fprintf (stderr,
2015            "always_hint                     = %s\n"
2016            "align_branch_targets            = %s\n"
2017            "sched_restricted_insns_priority = %d\n"
2018            "sched_costly_dep                = %s\n"
2019            "sched_insert_nops               = %s\n\n",
2020            rs6000_always_hint ? "true" : "false",
2021            rs6000_align_branch_targets ? "true" : "false",
2022            (int)rs6000_sched_restricted_insns_priority,
2023            costly_str, nop_str);
2024 }
2025
2026 /* Initialize the various global tables that are based on register size.  */
2027 static void
2028 rs6000_init_hard_regno_mode_ok (void)
2029 {
2030   int r, m, c;
2031   int align64;
2032   int align32;
2033
2034   /* Precalculate REGNO_REG_CLASS.  */
2035   rs6000_regno_regclass[0] = GENERAL_REGS;
2036   for (r = 1; r < 32; ++r)
2037     rs6000_regno_regclass[r] = BASE_REGS;
2038
2039   for (r = 32; r < 64; ++r)
2040     rs6000_regno_regclass[r] = FLOAT_REGS;
2041
2042   for (r = 64; r < FIRST_PSEUDO_REGISTER; ++r)
2043     rs6000_regno_regclass[r] = NO_REGS;
2044
2045   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2046     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2047
2048   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2049   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2050     rs6000_regno_regclass[r] = CR_REGS;
2051
2052   rs6000_regno_regclass[MQ_REGNO] = MQ_REGS;
2053   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2054   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2055   rs6000_regno_regclass[CA_REGNO] = CA_REGS;
2056   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2057   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2058   rs6000_regno_regclass[SPE_ACC_REGNO] = SPE_ACC_REGS;
2059   rs6000_regno_regclass[SPEFSCR_REGNO] = SPEFSCR_REGS;
2060   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2061   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2062
2063   /* Precalculate vector information, this must be set up before the
2064      rs6000_hard_regno_nregs_internal below.  */
2065   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2066     {
2067       rs6000_vector_unit[m] = rs6000_vector_mem[m] = VECTOR_NONE;
2068       rs6000_vector_reload[m][0] = CODE_FOR_nothing;
2069       rs6000_vector_reload[m][1] = CODE_FOR_nothing;
2070     }
2071
2072   for (c = 0; c < (int)(int)RS6000_CONSTRAINT_MAX; c++)
2073     rs6000_constraints[c] = NO_REGS;
2074
2075   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
2076      believes it can use native alignment or still uses 128-bit alignment.  */
2077   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
2078     {
2079       align64 = 64;
2080       align32 = 32;
2081     }
2082   else
2083     {
2084       align64 = 128;
2085       align32 = 128;
2086     }
2087
2088   /* V2DF mode, VSX only.  */
2089   if (TARGET_VSX)
2090     {
2091       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
2092       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
2093       rs6000_vector_align[V2DFmode] = align64;
2094     }
2095
2096   /* V4SF mode, either VSX or Altivec.  */
2097   if (TARGET_VSX)
2098     {
2099       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
2100       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
2101       rs6000_vector_align[V4SFmode] = align32;
2102     }
2103   else if (TARGET_ALTIVEC)
2104     {
2105       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
2106       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
2107       rs6000_vector_align[V4SFmode] = align32;
2108     }
2109
2110   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
2111      and stores. */
2112   if (TARGET_ALTIVEC)
2113     {
2114       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
2115       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
2116       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
2117       rs6000_vector_align[V4SImode] = align32;
2118       rs6000_vector_align[V8HImode] = align32;
2119       rs6000_vector_align[V16QImode] = align32;
2120
2121       if (TARGET_VSX)
2122         {
2123           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
2124           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
2125           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
2126         }
2127       else
2128         {
2129           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
2130           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
2131           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
2132         }
2133     }
2134
2135   /* V2DImode, only allow under VSX, which can do V2DI insert/splat/extract.
2136      Altivec doesn't have 64-bit support.  */
2137   if (TARGET_VSX)
2138     {
2139       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
2140       rs6000_vector_unit[V2DImode] = VECTOR_NONE;
2141       rs6000_vector_align[V2DImode] = align64;
2142     }
2143
2144   /* DFmode, see if we want to use the VSX unit.  */
2145   if (TARGET_VSX && TARGET_VSX_SCALAR_DOUBLE)
2146     {
2147       rs6000_vector_unit[DFmode] = VECTOR_VSX;
2148       rs6000_vector_mem[DFmode]
2149         = (TARGET_VSX_SCALAR_MEMORY ? VECTOR_VSX : VECTOR_NONE);
2150       rs6000_vector_align[DFmode] = align64;
2151     }
2152
2153   /* TODO add SPE and paired floating point vector support.  */
2154
2155   /* Register class constaints for the constraints that depend on compile
2156      switches.  */
2157   if (TARGET_HARD_FLOAT && TARGET_FPRS)
2158     rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
2159
2160   if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
2161     rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
2162
2163   if (TARGET_VSX)
2164     {
2165       /* At present, we just use VSX_REGS, but we have different constraints
2166          based on the use, in case we want to fine tune the default register
2167          class used.  wa = any VSX register, wf = register class to use for
2168          V4SF, wd = register class to use for V2DF, and ws = register classs to
2169          use for DF scalars.  */
2170       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
2171       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
2172       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
2173       rs6000_constraints[RS6000_CONSTRAINT_ws] = (TARGET_VSX_SCALAR_MEMORY
2174                                                   ? VSX_REGS
2175                                                   : FLOAT_REGS);
2176     }
2177
2178   if (TARGET_ALTIVEC)
2179     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
2180
2181   /* Set up the reload helper functions.  */
2182   if (TARGET_VSX || TARGET_ALTIVEC)
2183     {
2184       if (TARGET_64BIT)
2185         {
2186           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_di_store;
2187           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_di_load;
2188           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_di_store;
2189           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_di_load;
2190           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_di_store;
2191           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_di_load;
2192           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_di_store;
2193           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_di_load;
2194           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_di_store;
2195           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_di_load;
2196           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_di_store;
2197           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_di_load;
2198         }
2199       else
2200         {
2201           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_si_store;
2202           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_si_load;
2203           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_si_store;
2204           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_si_load;
2205           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_si_store;
2206           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_si_load;
2207           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_si_store;
2208           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_si_load;
2209           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_si_store;
2210           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_si_load;
2211           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_si_store;
2212           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_si_load;
2213         }
2214     }
2215
2216   /* Precalculate HARD_REGNO_NREGS.  */
2217   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2218     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2219       rs6000_hard_regno_nregs[m][r]
2220         = rs6000_hard_regno_nregs_internal (r, (enum machine_mode)m);
2221
2222   /* Precalculate HARD_REGNO_MODE_OK.  */
2223   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2224     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2225       if (rs6000_hard_regno_mode_ok (r, (enum machine_mode)m))
2226         rs6000_hard_regno_mode_ok_p[m][r] = true;
2227
2228   /* Precalculate CLASS_MAX_NREGS sizes.  */
2229   for (c = 0; c < LIM_REG_CLASSES; ++c)
2230     {
2231       int reg_size;
2232
2233       if (TARGET_VSX && VSX_REG_CLASS_P (c))
2234         reg_size = UNITS_PER_VSX_WORD;
2235
2236       else if (c == ALTIVEC_REGS)
2237         reg_size = UNITS_PER_ALTIVEC_WORD;
2238
2239       else if (c == FLOAT_REGS)
2240         reg_size = UNITS_PER_FP_WORD;
2241
2242       else
2243         reg_size = UNITS_PER_WORD;
2244
2245       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2246         rs6000_class_max_nregs[m][c]
2247           = (GET_MODE_SIZE (m) + reg_size - 1) / reg_size;
2248     }
2249
2250   if (TARGET_E500_DOUBLE)
2251     rs6000_class_max_nregs[DFmode][GENERAL_REGS] = 1;
2252
2253   /* Calculate which modes to automatically generate code to use a the
2254      reciprocal divide and square root instructions.  In the future, possibly
2255      automatically generate the instructions even if the user did not specify
2256      -mrecip.  The older machines double precision reciprocal sqrt estimate is
2257      not accurate enough.  */
2258   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
2259   if (TARGET_FRES)
2260     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2261   if (TARGET_FRE)
2262     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2263   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2264     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2265   if (VECTOR_UNIT_VSX_P (V2DFmode))
2266     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2267
2268   if (TARGET_FRSQRTES)
2269     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2270   if (TARGET_FRSQRTE)
2271     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2272   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2273     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2274   if (VECTOR_UNIT_VSX_P (V2DFmode))
2275     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2276
2277   if (rs6000_recip_control)
2278     {
2279       if (!TARGET_FUSED_MADD)
2280         warning (0, "-mrecip requires -mfused-madd");
2281       if (!flag_finite_math_only)
2282         warning (0, "-mrecip requires -ffinite-math or -ffast-math");
2283       if (flag_trapping_math)
2284         warning (0, "-mrecip requires -fno-trapping-math or -ffast-math");
2285       if (!flag_reciprocal_math)
2286         warning (0, "-mrecip requires -freciprocal-math or -ffast-math");
2287       if (TARGET_FUSED_MADD && flag_finite_math_only && !flag_trapping_math
2288           && flag_reciprocal_math)
2289         {
2290           if (RS6000_RECIP_HAVE_RE_P (SFmode)
2291               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
2292             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2293
2294           if (RS6000_RECIP_HAVE_RE_P (DFmode)
2295               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
2296             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2297
2298           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
2299               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
2300             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2301
2302           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
2303               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
2304             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2305
2306           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
2307               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
2308             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2309
2310           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
2311               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
2312             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2313
2314           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
2315               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
2316             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2317
2318           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
2319               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
2320             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2321         }
2322     }
2323
2324   if (TARGET_DEBUG_REG)
2325     rs6000_debug_reg_global ();
2326
2327   if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
2328     fprintf (stderr,
2329              "SImode variable mult cost       = %d\n"
2330              "SImode constant mult cost       = %d\n"
2331              "SImode short constant mult cost = %d\n"
2332              "DImode multipliciation cost     = %d\n"
2333              "SImode division cost            = %d\n"
2334              "DImode division cost            = %d\n"
2335              "Simple fp operation cost        = %d\n"
2336              "DFmode multiplication cost      = %d\n"
2337              "SFmode division cost            = %d\n"
2338              "DFmode division cost            = %d\n"
2339              "cache line size                 = %d\n"
2340              "l1 cache size                   = %d\n"
2341              "l2 cache size                   = %d\n"
2342              "simultaneous prefetches         = %d\n"
2343              "\n",
2344              rs6000_cost->mulsi,
2345              rs6000_cost->mulsi_const,
2346              rs6000_cost->mulsi_const9,
2347              rs6000_cost->muldi,
2348              rs6000_cost->divsi,
2349              rs6000_cost->divdi,
2350              rs6000_cost->fp,
2351              rs6000_cost->dmul,
2352              rs6000_cost->sdiv,
2353              rs6000_cost->ddiv,
2354              rs6000_cost->cache_line_size,
2355              rs6000_cost->l1_cache_size,
2356              rs6000_cost->l2_cache_size,
2357              rs6000_cost->simultaneous_prefetches);
2358 }
2359
2360 #if TARGET_MACHO
2361 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
2362
2363 static void
2364 darwin_rs6000_override_options (void)
2365 {
2366   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
2367      off.  */
2368   rs6000_altivec_abi = 1;
2369   TARGET_ALTIVEC_VRSAVE = 1;
2370
2371   if (DEFAULT_ABI == ABI_DARWIN
2372       && TARGET_64BIT)
2373       darwin_one_byte_bool = 1;
2374
2375   if (TARGET_64BIT && ! TARGET_POWERPC64)
2376     {
2377       target_flags |= MASK_POWERPC64;
2378       warning (0, "-m64 requires PowerPC64 architecture, enabling");
2379     }
2380   if (flag_mkernel)
2381     {
2382       rs6000_default_long_calls = 1;
2383       target_flags |= MASK_SOFT_FLOAT;
2384     }
2385
2386   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
2387      Altivec.  */
2388   if (!flag_mkernel && !flag_apple_kext
2389       && TARGET_64BIT
2390       && ! (target_flags_explicit & MASK_ALTIVEC))
2391     target_flags |= MASK_ALTIVEC;
2392
2393   /* Unless the user (not the configurer) has explicitly overridden
2394      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
2395      G4 unless targetting the kernel.  */
2396   if (!flag_mkernel
2397       && !flag_apple_kext
2398       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
2399       && ! (target_flags_explicit & MASK_ALTIVEC)
2400       && ! rs6000_select[1].string)
2401     {
2402       target_flags |= MASK_ALTIVEC;
2403     }
2404 }
2405 #endif
2406
2407 /* If not otherwise specified by a target, make 'long double' equivalent to
2408    'double'.  */
2409
2410 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
2411 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
2412 #endif
2413
2414 /* Override command line options.  Mostly we process the processor
2415    type and sometimes adjust other TARGET_ options.  */
2416
2417 static void
2418 rs6000_option_override_internal (const char *default_cpu)
2419 {
2420   size_t i, j;
2421   struct rs6000_cpu_select *ptr;
2422   int set_masks;
2423
2424   /* Simplifications for entries below.  */
2425
2426   enum {
2427     POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
2428     POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
2429   };
2430
2431   /* This table occasionally claims that a processor does not support
2432      a particular feature even though it does, but the feature is slower
2433      than the alternative.  Thus, it shouldn't be relied on as a
2434      complete description of the processor's support.
2435
2436      Please keep this list in order, and don't forget to update the
2437      documentation in invoke.texi when adding a new processor or
2438      flag.  */
2439   static struct ptt
2440     {
2441       const char *const name;           /* Canonical processor name.  */
2442       const enum processor_type processor; /* Processor type enum value.  */
2443       const int target_enable;  /* Target flags to enable.  */
2444     } const processor_target_table[]
2445       = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2446          {"403", PROCESSOR_PPC403,
2447           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
2448          {"405", PROCESSOR_PPC405,
2449           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
2450          {"405fp", PROCESSOR_PPC405,
2451           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2452          {"440", PROCESSOR_PPC440,
2453           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
2454          {"440fp", PROCESSOR_PPC440,
2455           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2456          {"464", PROCESSOR_PPC440,
2457           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
2458          {"464fp", PROCESSOR_PPC440,
2459           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2460          {"476", PROCESSOR_PPC476,
2461           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_PPC_GFXOPT | MASK_MFCRF
2462           | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
2463          {"476fp", PROCESSOR_PPC476,
2464           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB
2465           | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
2466          {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
2467          {"601", PROCESSOR_PPC601,
2468           MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
2469          {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2470          {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2471          {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2472          {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2473          {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2474          {"620", PROCESSOR_PPC620,
2475           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2476          {"630", PROCESSOR_PPC630,
2477           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2478          {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2479          {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
2480          {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
2481          {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2482          {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2483          {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2484          {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2485          {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
2486           | MASK_ISEL},
2487          /* 8548 has a dummy entry for now.  */
2488          {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
2489           | MASK_ISEL},
2490          {"a2", PROCESSOR_PPCA2,
2491           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_POPCNTB
2492           | MASK_CMPB | MASK_NO_UPDATE },
2493          {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2494          {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK},
2495          {"e500mc", PROCESSOR_PPCE500MC, POWERPC_BASE_MASK | MASK_PPC_GFXOPT
2496           | MASK_ISEL},
2497          {"e500mc64", PROCESSOR_PPCE500MC64, POWERPC_BASE_MASK | MASK_POWERPC64
2498           | MASK_PPC_GFXOPT | MASK_ISEL},
2499          {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2500          {"970", PROCESSOR_POWER4,
2501           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
2502          {"cell", PROCESSOR_CELL,
2503           POWERPC_7400_MASK  | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
2504          {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
2505          {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
2506          {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
2507          {"G4",  PROCESSOR_PPC7450, POWERPC_7400_MASK},
2508          {"G5", PROCESSOR_POWER4,
2509           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
2510          {"titan", PROCESSOR_TITAN,
2511           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
2512          {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2513          {"power2", PROCESSOR_POWER,
2514           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
2515          {"power3", PROCESSOR_PPC630,
2516           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2517          {"power4", PROCESSOR_POWER4,
2518           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2519           | MASK_MFCRF},
2520          {"power5", PROCESSOR_POWER5,
2521           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2522           | MASK_MFCRF | MASK_POPCNTB},
2523          {"power5+", PROCESSOR_POWER5,
2524           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2525           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
2526          {"power6", PROCESSOR_POWER6,
2527           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2528           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
2529           | MASK_RECIP_PRECISION},
2530          {"power6x", PROCESSOR_POWER6,
2531           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
2532           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
2533           | MASK_MFPGPR | MASK_RECIP_PRECISION},
2534          {"power7", PROCESSOR_POWER7,   /* Don't add MASK_ISEL by default */
2535           POWERPC_7400_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_MFCRF
2536           | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP | MASK_POPCNTD
2537           | MASK_VSX | MASK_RECIP_PRECISION},
2538          {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
2539          {"powerpc64", PROCESSOR_POWERPC64,
2540           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
2541          {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2542          {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2543          {"rios2", PROCESSOR_RIOS2,
2544           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
2545          {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2546          {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
2547          {"rs64", PROCESSOR_RS64A,
2548           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
2549       };
2550
2551   const size_t ptt_size = ARRAY_SIZE (processor_target_table);
2552
2553   /* Some OSs don't support saving the high part of 64-bit registers on
2554      context switch.  Other OSs don't support saving Altivec registers.
2555      On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
2556      settings; if the user wants either, the user must explicitly specify
2557      them and we won't interfere with the user's specification.  */
2558
2559   enum {
2560     POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
2561     POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
2562                      | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
2563                      | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
2564                      | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP
2565                      | MASK_POPCNTD | MASK_VSX | MASK_ISEL | MASK_NO_UPDATE
2566                      | MASK_RECIP_PRECISION)
2567   };
2568
2569   /* Masks for instructions set at various powerpc ISAs.  */
2570   enum {
2571     ISA_2_1_MASKS = MASK_MFCRF,
2572     ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB | MASK_FPRND),
2573
2574     /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and don't
2575        add ALTIVEC, since in general it isn't a win on power6.  In ISA 2.04,
2576        fsel, fre, fsqrt, etc. were no longer documented as optional.  Group
2577        masks by server and embedded. */
2578     ISA_2_5_MASKS_EMBEDDED = (ISA_2_2_MASKS | MASK_CMPB | MASK_RECIP_PRECISION
2579                               | MASK_PPC_GFXOPT | MASK_PPC_GPOPT),
2580     ISA_2_5_MASKS_SERVER = (ISA_2_5_MASKS_EMBEDDED | MASK_DFP),
2581
2582     /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but
2583        altivec is a win so enable it.  */
2584     ISA_2_6_MASKS_EMBEDDED = (ISA_2_5_MASKS_EMBEDDED | MASK_POPCNTD),
2585     ISA_2_6_MASKS_SERVER = (ISA_2_5_MASKS_SERVER | MASK_POPCNTD | MASK_ALTIVEC
2586                             | MASK_VSX)
2587   };
2588
2589   /* Numerous experiment shows that IRA based loop pressure
2590      calculation works better for RTL loop invariant motion on targets
2591      with enough (>= 32) registers.  It is an expensive optimization.
2592      So it is on only for peak performance.  */
2593   if (optimize >= 3)
2594     flag_ira_loop_pressure = 1;
2595
2596   /* Set the pointer size.  */
2597   if (TARGET_64BIT)
2598     {
2599       rs6000_pmode = (int)DImode;
2600       rs6000_pointer_size = 64;
2601     }
2602   else
2603     {
2604       rs6000_pmode = (int)SImode;
2605       rs6000_pointer_size = 32;
2606     }
2607
2608   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
2609 #ifdef OS_MISSING_POWERPC64
2610   if (OS_MISSING_POWERPC64)
2611     set_masks &= ~MASK_POWERPC64;
2612 #endif
2613 #ifdef OS_MISSING_ALTIVEC
2614   if (OS_MISSING_ALTIVEC)
2615     set_masks &= ~MASK_ALTIVEC;
2616 #endif
2617
2618   /* Don't override by the processor default if given explicitly.  */
2619   set_masks &= ~target_flags_explicit;
2620
2621   /* Identify the processor type.  */
2622   rs6000_select[0].string = default_cpu;
2623   rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
2624
2625   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
2626     {
2627       ptr = &rs6000_select[i];
2628       if (ptr->string != (char *)0 && ptr->string[0] != '\0')
2629         {
2630           for (j = 0; j < ptt_size; j++)
2631             if (! strcmp (ptr->string, processor_target_table[j].name))
2632               {
2633                 if (ptr->set_tune_p)
2634                   rs6000_cpu = processor_target_table[j].processor;
2635
2636                 if (ptr->set_arch_p)
2637                   {
2638                     target_flags &= ~set_masks;
2639                     target_flags |= (processor_target_table[j].target_enable
2640                                      & set_masks);
2641                   }
2642                 break;
2643               }
2644
2645           if (j == ptt_size)
2646             error ("bad value (%s) for %s switch", ptr->string, ptr->name);
2647         }
2648     }
2649
2650   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
2651       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64)
2652     {
2653       if (TARGET_ALTIVEC)
2654         error ("AltiVec not supported in this target");
2655       if (TARGET_SPE)
2656         error ("Spe not supported in this target");
2657     }
2658
2659   /* Disable Cell microcode if we are optimizing for the Cell
2660      and not optimizing for size.  */
2661   if (rs6000_gen_cell_microcode == -1)
2662     rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
2663                                   && !optimize_size);
2664
2665   /* If we are optimizing big endian systems for space and it's OK to
2666      use instructions that would be microcoded on the Cell, use the
2667      load/store multiple and string instructions.  */
2668   if (BYTES_BIG_ENDIAN && optimize_size && rs6000_gen_cell_microcode)
2669     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
2670
2671   /* Don't allow -mmultiple or -mstring on little endian systems
2672      unless the cpu is a 750, because the hardware doesn't support the
2673      instructions used in little endian mode, and causes an alignment
2674      trap.  The 750 does not cause an alignment trap (except when the
2675      target is unaligned).  */
2676
2677   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
2678     {
2679       if (TARGET_MULTIPLE)
2680         {
2681           target_flags &= ~MASK_MULTIPLE;
2682           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
2683             warning (0, "-mmultiple is not supported on little endian systems");
2684         }
2685
2686       if (TARGET_STRING)
2687         {
2688           target_flags &= ~MASK_STRING;
2689           if ((target_flags_explicit & MASK_STRING) != 0)
2690             warning (0, "-mstring is not supported on little endian systems");
2691         }
2692     }
2693
2694   /* Add some warnings for VSX.  */
2695   if (TARGET_VSX)
2696     {
2697       const char *msg = NULL;
2698       if (!TARGET_HARD_FLOAT || !TARGET_FPRS
2699           || !TARGET_SINGLE_FLOAT || !TARGET_DOUBLE_FLOAT)
2700         {
2701           if (target_flags_explicit & MASK_VSX)
2702             msg = N_("-mvsx requires hardware floating point");
2703           else
2704             target_flags &= ~ MASK_VSX;
2705         }
2706       else if (TARGET_PAIRED_FLOAT)
2707         msg = N_("-mvsx and -mpaired are incompatible");
2708       /* The hardware will allow VSX and little endian, but until we make sure
2709          things like vector select, etc. work don't allow VSX on little endian
2710          systems at this point.  */
2711       else if (!BYTES_BIG_ENDIAN)
2712         msg = N_("-mvsx used with little endian code");
2713       else if (TARGET_AVOID_XFORM > 0)
2714         msg = N_("-mvsx needs indexed addressing");
2715       else if (!TARGET_ALTIVEC && (target_flags_explicit & MASK_ALTIVEC))
2716         {
2717           if (target_flags_explicit & MASK_VSX)
2718             msg = N_("-mvsx and -mno-altivec are incompatible");
2719           else
2720             msg = N_("-mno-altivec disables vsx");
2721         }
2722
2723       if (msg)
2724         {
2725           warning (0, msg);
2726           target_flags &= ~ MASK_VSX;
2727           target_flags_explicit |= MASK_VSX;
2728         }
2729     }
2730
2731   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
2732      unless the user explicitly used the -mno-<option> to disable the code.  */
2733   if (TARGET_VSX)
2734     target_flags |= (ISA_2_6_MASKS_SERVER & ~target_flags_explicit);
2735   else if (TARGET_POPCNTD)
2736     target_flags |= (ISA_2_6_MASKS_EMBEDDED & ~target_flags_explicit);
2737   else if (TARGET_DFP)
2738     target_flags |= (ISA_2_5_MASKS_SERVER & ~target_flags_explicit);
2739   else if (TARGET_CMPB)
2740     target_flags |= (ISA_2_5_MASKS_EMBEDDED & ~target_flags_explicit);
2741   else if (TARGET_POPCNTB || TARGET_FPRND)
2742     target_flags |= (ISA_2_2_MASKS & ~target_flags_explicit);
2743   else if (TARGET_ALTIVEC)
2744     target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
2745
2746   /* E500mc does "better" if we inline more aggressively.  Respect the
2747      user's opinion, though.  */
2748   if (rs6000_block_move_inline_limit == 0
2749       && (rs6000_cpu == PROCESSOR_PPCE500MC
2750           || rs6000_cpu == PROCESSOR_PPCE500MC64))
2751     rs6000_block_move_inline_limit = 128;
2752
2753   /* store_one_arg depends on expand_block_move to handle at least the
2754      size of reg_parm_stack_space.  */
2755   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
2756     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
2757
2758   /* Set debug flags */
2759   if (rs6000_debug_name)
2760     {
2761       if (! strcmp (rs6000_debug_name, "all"))
2762         rs6000_debug_stack = rs6000_debug_arg = rs6000_debug_reg
2763           = rs6000_debug_addr = rs6000_debug_cost = 1;
2764       else if (! strcmp (rs6000_debug_name, "stack"))
2765         rs6000_debug_stack = 1;
2766       else if (! strcmp (rs6000_debug_name, "arg"))
2767         rs6000_debug_arg = 1;
2768       else if (! strcmp (rs6000_debug_name, "reg"))
2769         rs6000_debug_reg = 1;
2770       else if (! strcmp (rs6000_debug_name, "addr"))
2771         rs6000_debug_addr = 1;
2772       else if (! strcmp (rs6000_debug_name, "cost"))
2773         rs6000_debug_cost = 1;
2774       else
2775         error ("unknown -mdebug-%s switch", rs6000_debug_name);
2776
2777       /* If the appropriate debug option is enabled, replace the target hooks
2778          with debug versions that call the real version and then prints
2779          debugging information.  */
2780       if (TARGET_DEBUG_COST)
2781         {
2782           targetm.rtx_costs = rs6000_debug_rtx_costs;
2783           targetm.address_cost = rs6000_debug_address_cost;
2784           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
2785         }
2786
2787       if (TARGET_DEBUG_ADDR)
2788         {
2789           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
2790           targetm.legitimize_address = rs6000_debug_legitimize_address;
2791           rs6000_secondary_reload_class_ptr
2792             = rs6000_debug_secondary_reload_class;
2793           rs6000_secondary_memory_needed_ptr
2794             = rs6000_debug_secondary_memory_needed;
2795           rs6000_cannot_change_mode_class_ptr
2796             = rs6000_debug_cannot_change_mode_class;
2797           rs6000_preferred_reload_class_ptr
2798             = rs6000_debug_preferred_reload_class;
2799           rs6000_legitimize_reload_address_ptr
2800             = rs6000_debug_legitimize_reload_address;
2801           rs6000_mode_dependent_address_ptr
2802             = rs6000_debug_mode_dependent_address;
2803         }
2804     }
2805
2806   if (rs6000_traceback_name)
2807     {
2808       if (! strncmp (rs6000_traceback_name, "full", 4))
2809         rs6000_traceback = traceback_full;
2810       else if (! strncmp (rs6000_traceback_name, "part", 4))
2811         rs6000_traceback = traceback_part;
2812       else if (! strncmp (rs6000_traceback_name, "no", 2))
2813         rs6000_traceback = traceback_none;
2814       else
2815         error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
2816                rs6000_traceback_name);
2817     }
2818
2819   if (rs6000_veclibabi_name)
2820     {
2821       if (strcmp (rs6000_veclibabi_name, "mass") == 0)
2822         rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
2823       else
2824         error ("unknown vectorization library ABI type (%s) for "
2825                "-mveclibabi= switch", rs6000_veclibabi_name);
2826     }
2827
2828   if (!rs6000_explicit_options.long_double)
2829     rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2830
2831 #ifndef POWERPC_LINUX
2832   if (!rs6000_explicit_options.ieee)
2833     rs6000_ieeequad = 1;
2834 #endif
2835
2836   /* Enable Altivec ABI for AIX -maltivec.  */
2837   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
2838     rs6000_altivec_abi = 1;
2839
2840   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
2841      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
2842      be explicitly overridden in either case.  */
2843   if (TARGET_ELF)
2844     {
2845       if (!rs6000_explicit_options.altivec_abi
2846           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
2847         rs6000_altivec_abi = 1;
2848
2849       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
2850       if (!rs6000_explicit_options.vrsave)
2851         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
2852     }
2853
2854   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
2855      So far, the only darwin64 targets are also MACH-O.  */
2856   if (TARGET_MACHO
2857       && DEFAULT_ABI == ABI_DARWIN 
2858       && TARGET_64BIT)
2859     {
2860       rs6000_darwin64_abi = 1;
2861       /* Default to natural alignment, for better performance.  */
2862       rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2863     }
2864
2865   /* Place FP constants in the constant pool instead of TOC
2866      if section anchors enabled.  */
2867   if (flag_section_anchors)
2868     TARGET_NO_FP_IN_TOC = 1;
2869
2870   /* Handle -mtls-size option.  */
2871   rs6000_parse_tls_size_option ();
2872
2873 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2874   SUBTARGET_OVERRIDE_OPTIONS;
2875 #endif
2876 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2877   SUBSUBTARGET_OVERRIDE_OPTIONS;
2878 #endif
2879 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
2880   SUB3TARGET_OVERRIDE_OPTIONS;
2881 #endif
2882
2883   if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC
2884       || rs6000_cpu == PROCESSOR_PPCE500MC64)
2885     {
2886       /* The e500 and e500mc do not have string instructions, and we set
2887          MASK_STRING above when optimizing for size.  */
2888       if ((target_flags & MASK_STRING) != 0)
2889         target_flags = target_flags & ~MASK_STRING;
2890     }
2891   else if (rs6000_select[1].string != NULL)
2892     {
2893       /* For the powerpc-eabispe configuration, we set all these by
2894          default, so let's unset them if we manually set another
2895          CPU that is not the E500.  */
2896       if (!rs6000_explicit_options.spe_abi)
2897         rs6000_spe_abi = 0;
2898       if (!rs6000_explicit_options.spe)
2899         rs6000_spe = 0;
2900       if (!rs6000_explicit_options.float_gprs)
2901         rs6000_float_gprs = 0;
2902       if (!(target_flags_explicit & MASK_ISEL))
2903         target_flags &= ~MASK_ISEL;
2904     }
2905
2906   /* Detect invalid option combinations with E500.  */
2907   CHECK_E500_OPTIONS;
2908
2909   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
2910                         && rs6000_cpu != PROCESSOR_POWER5
2911                         && rs6000_cpu != PROCESSOR_POWER6
2912                         && rs6000_cpu != PROCESSOR_POWER7
2913                         && rs6000_cpu != PROCESSOR_PPCA2
2914                         && rs6000_cpu != PROCESSOR_CELL);
2915   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
2916                          || rs6000_cpu == PROCESSOR_POWER5
2917                          || rs6000_cpu == PROCESSOR_POWER7);
2918   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
2919                                  || rs6000_cpu == PROCESSOR_POWER5
2920                                  || rs6000_cpu == PROCESSOR_POWER6
2921                                  || rs6000_cpu == PROCESSOR_POWER7
2922                                  || rs6000_cpu == PROCESSOR_PPCE500MC
2923                                  || rs6000_cpu == PROCESSOR_PPCE500MC64);
2924
2925   /* Allow debug switches to override the above settings.  */
2926   if (TARGET_ALWAYS_HINT > 0)
2927     rs6000_always_hint = TARGET_ALWAYS_HINT;
2928
2929   if (TARGET_SCHED_GROUPS > 0)
2930     rs6000_sched_groups = TARGET_SCHED_GROUPS;
2931
2932   if (TARGET_ALIGN_BRANCH_TARGETS > 0)
2933     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
2934
2935   rs6000_sched_restricted_insns_priority
2936     = (rs6000_sched_groups ? 1 : 0);
2937
2938   /* Handle -msched-costly-dep option.  */
2939   rs6000_sched_costly_dep
2940     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
2941
2942   if (rs6000_sched_costly_dep_str)
2943     {
2944       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
2945         rs6000_sched_costly_dep = no_dep_costly;
2946       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
2947         rs6000_sched_costly_dep = all_deps_costly;
2948       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
2949         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
2950       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
2951         rs6000_sched_costly_dep = store_to_load_dep_costly;
2952       else
2953         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
2954                                    atoi (rs6000_sched_costly_dep_str));
2955     }
2956
2957   /* Handle -minsert-sched-nops option.  */
2958   rs6000_sched_insert_nops
2959     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
2960
2961   if (rs6000_sched_insert_nops_str)
2962     {
2963       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
2964         rs6000_sched_insert_nops = sched_finish_none;
2965       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
2966         rs6000_sched_insert_nops = sched_finish_pad_groups;
2967       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
2968         rs6000_sched_insert_nops = sched_finish_regroup_exact;
2969       else
2970         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
2971                                     atoi (rs6000_sched_insert_nops_str));
2972     }
2973
2974 #ifdef TARGET_REGNAMES
2975   /* If the user desires alternate register names, copy in the
2976      alternate names now.  */
2977   if (TARGET_REGNAMES)
2978     memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
2979 #endif
2980
2981   /* Set aix_struct_return last, after the ABI is determined.
2982      If -maix-struct-return or -msvr4-struct-return was explicitly
2983      used, don't override with the ABI default.  */
2984   if (!rs6000_explicit_options.aix_struct_ret)
2985     aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
2986
2987 #if 0
2988   /* IBM XL compiler defaults to unsigned bitfields.  */
2989   if (TARGET_XL_COMPAT)
2990     flag_signed_bitfields = 0;
2991 #endif
2992
2993   if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
2994     REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
2995
2996   if (TARGET_TOC)
2997     ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
2998
2999   /* We can only guarantee the availability of DI pseudo-ops when
3000      assembling for 64-bit targets.  */
3001   if (!TARGET_64BIT)
3002     {
3003       targetm.asm_out.aligned_op.di = NULL;
3004       targetm.asm_out.unaligned_op.di = NULL;
3005     }
3006
3007   /* Set branch target alignment, if not optimizing for size.  */
3008   if (!optimize_size)
3009     {
3010       /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
3011          aligned 8byte to avoid misprediction by the branch predictor.  */
3012       if (rs6000_cpu == PROCESSOR_TITAN
3013           || rs6000_cpu == PROCESSOR_CELL)
3014         {
3015           if (align_functions <= 0)
3016             align_functions = 8;
3017           if (align_jumps <= 0)
3018             align_jumps = 8;
3019           if (align_loops <= 0)
3020             align_loops = 8;
3021         }
3022       if (rs6000_align_branch_targets)
3023         {
3024           if (align_functions <= 0)
3025             align_functions = 16;
3026           if (align_jumps <= 0)
3027             align_jumps = 16;
3028           if (align_loops <= 0)
3029             align_loops = 16;
3030         }
3031       if (align_jumps_max_skip <= 0)
3032         align_jumps_max_skip = 15;
3033       if (align_loops_max_skip <= 0)
3034         align_loops_max_skip = 15;
3035     }
3036
3037   /* Arrange to save and restore machine status around nested functions.  */
3038   init_machine_status = rs6000_init_machine_status;
3039
3040   /* We should always be splitting complex arguments, but we can't break
3041      Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
3042   if (DEFAULT_ABI != ABI_AIX)
3043     targetm.calls.split_complex_arg = NULL;
3044
3045   /* Initialize rs6000_cost with the appropriate target costs.  */
3046   if (optimize_size)
3047     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
3048   else
3049     switch (rs6000_cpu)
3050       {
3051       case PROCESSOR_RIOS1:
3052         rs6000_cost = &rios1_cost;
3053         break;
3054
3055       case PROCESSOR_RIOS2:
3056         rs6000_cost = &rios2_cost;
3057         break;
3058
3059       case PROCESSOR_RS64A:
3060         rs6000_cost = &rs64a_cost;
3061         break;
3062
3063       case PROCESSOR_MPCCORE:
3064         rs6000_cost = &mpccore_cost;
3065         break;
3066
3067       case PROCESSOR_PPC403:
3068         rs6000_cost = &ppc403_cost;
3069         break;
3070
3071       case PROCESSOR_PPC405:
3072         rs6000_cost = &ppc405_cost;
3073         break;
3074
3075       case PROCESSOR_PPC440:
3076         rs6000_cost = &ppc440_cost;
3077         break;
3078
3079       case PROCESSOR_PPC476:
3080         rs6000_cost = &ppc476_cost;
3081         break;
3082
3083       case PROCESSOR_PPC601:
3084         rs6000_cost = &ppc601_cost;
3085         break;
3086
3087       case PROCESSOR_PPC603:
3088         rs6000_cost = &ppc603_cost;
3089         break;
3090
3091       case PROCESSOR_PPC604:
3092         rs6000_cost = &ppc604_cost;
3093         break;
3094
3095       case PROCESSOR_PPC604e:
3096         rs6000_cost = &ppc604e_cost;
3097         break;
3098
3099       case PROCESSOR_PPC620:
3100         rs6000_cost = &ppc620_cost;
3101         break;
3102
3103       case PROCESSOR_PPC630:
3104         rs6000_cost = &ppc630_cost;
3105         break;
3106
3107       case PROCESSOR_CELL:
3108         rs6000_cost = &ppccell_cost;
3109         break;
3110
3111       case PROCESSOR_PPC750:
3112       case PROCESSOR_PPC7400:
3113         rs6000_cost = &ppc750_cost;
3114         break;
3115
3116       case PROCESSOR_PPC7450:
3117         rs6000_cost = &ppc7450_cost;
3118         break;
3119
3120       case PROCESSOR_PPC8540:
3121         rs6000_cost = &ppc8540_cost;
3122         break;
3123
3124       case PROCESSOR_PPCE300C2:
3125       case PROCESSOR_PPCE300C3:
3126         rs6000_cost = &ppce300c2c3_cost;
3127         break;
3128
3129       case PROCESSOR_PPCE500MC:
3130         rs6000_cost = &ppce500mc_cost;
3131         break;
3132
3133       case PROCESSOR_PPCE500MC64:
3134         rs6000_cost = &ppce500mc64_cost;
3135         break;
3136
3137       case PROCESSOR_TITAN:
3138         rs6000_cost = &titan_cost;
3139         break;
3140
3141       case PROCESSOR_POWER4:
3142       case PROCESSOR_POWER5:
3143         rs6000_cost = &power4_cost;
3144         break;
3145
3146       case PROCESSOR_POWER6:
3147         rs6000_cost = &power6_cost;
3148         break;
3149
3150       case PROCESSOR_POWER7:
3151         rs6000_cost = &power7_cost;
3152         break;
3153
3154       case PROCESSOR_PPCA2:
3155         rs6000_cost = &ppca2_cost;
3156         break;
3157
3158       default:
3159         gcc_unreachable ();
3160       }
3161
3162   maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
3163                          rs6000_cost->simultaneous_prefetches,
3164                          global_options.x_param_values,
3165                          global_options_set.x_param_values);
3166   maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
3167                          global_options.x_param_values,
3168                          global_options_set.x_param_values);
3169   maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
3170                          rs6000_cost->cache_line_size,
3171                          global_options.x_param_values,
3172                          global_options_set.x_param_values);
3173   maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
3174                          global_options.x_param_values,
3175                          global_options_set.x_param_values);
3176
3177   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3178      can be optimized to ap = __builtin_next_arg (0).  */
3179   if (DEFAULT_ABI != ABI_V4)
3180     targetm.expand_builtin_va_start = NULL;
3181
3182   /* Set up single/double float flags.  
3183      If TARGET_HARD_FLOAT is set, but neither single or double is set, 
3184      then set both flags. */
3185   if (TARGET_HARD_FLOAT && TARGET_FPRS 
3186       && rs6000_single_float == 0 && rs6000_double_float == 0)
3187     rs6000_single_float = rs6000_double_float = 1;
3188
3189   /* Reset single and double FP flags if target is E500. */
3190   if (TARGET_E500) 
3191   {
3192     rs6000_single_float = rs6000_double_float = 0;
3193     if (TARGET_E500_SINGLE)
3194       rs6000_single_float = 1; 
3195     if (TARGET_E500_DOUBLE)
3196       rs6000_single_float = rs6000_double_float = 1;
3197   }
3198
3199   /* If not explicitly specified via option, decide whether to generate indexed
3200      load/store instructions.  */
3201   if (TARGET_AVOID_XFORM == -1)
3202     /* Avoid indexed addressing when targeting Power6 in order to avoid
3203      the DERAT mispredict penalty.  */
3204     TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB);
3205
3206   /* Set the -mrecip options.  */
3207   if (rs6000_recip_name)
3208     {
3209       char *p = ASTRDUP (rs6000_recip_name);
3210       char *q;
3211       unsigned int mask, i;
3212       bool invert;
3213
3214       while ((q = strtok (p, ",")) != NULL)
3215         {
3216           p = NULL;
3217           if (*q == '!')
3218             {
3219               invert = true;
3220               q++;
3221             }
3222           else
3223             invert = false;
3224
3225           if (!strcmp (q, "default"))
3226             mask = ((TARGET_RECIP_PRECISION)
3227                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
3228           else
3229             {
3230               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
3231                 if (!strcmp (q, recip_options[i].string))
3232                   {
3233                     mask = recip_options[i].mask;
3234                     break;
3235                   }
3236
3237               if (i == ARRAY_SIZE (recip_options))
3238                 {
3239                   error ("Unknown option for -mrecip=%s", q);
3240                   invert = false;
3241                   mask = 0;
3242                 }
3243             }
3244
3245           if (invert)
3246             rs6000_recip_control &= ~mask;
3247           else
3248             rs6000_recip_control |= mask;
3249         }
3250     }
3251
3252   rs6000_init_hard_regno_mode_ok ();
3253 }
3254
3255 /* Implement TARGET_OPTION_OVERRIDE.  On the RS/6000 this is used to
3256    define the target cpu type.  */
3257
3258 static void
3259 rs6000_option_override (void)
3260 {
3261   rs6000_option_override_internal (OPTION_TARGET_CPU_DEFAULT);
3262 }
3263
3264 /* Implement targetm.vectorize.builtin_mask_for_load.  */
3265 static tree
3266 rs6000_builtin_mask_for_load (void)
3267 {
3268   if (TARGET_ALTIVEC || TARGET_VSX)
3269     return altivec_builtin_mask_for_load;
3270   else
3271     return 0;
3272 }
3273
3274 /* Implement targetm.vectorize.builtin_conversion.
3275    Returns a decl of a function that implements conversion of an integer vector
3276    into a floating-point vector, or vice-versa.  DEST_TYPE is the
3277    destination type and SRC_TYPE the source type of the conversion.
3278    Return NULL_TREE if it is not available.  */
3279 static tree
3280 rs6000_builtin_conversion (unsigned int tcode, tree dest_type, tree src_type)
3281 {
3282   enum tree_code code = (enum tree_code) tcode;
3283
3284   switch (code)
3285     {
3286     case FIX_TRUNC_EXPR:
3287       switch (TYPE_MODE (dest_type))
3288         {
3289         case V2DImode:
3290           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3291             return NULL_TREE;
3292
3293           return TYPE_UNSIGNED (dest_type)
3294             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVDPUXDS_UNS]
3295             : rs6000_builtin_decls[VSX_BUILTIN_XVCVDPSXDS];
3296
3297         case V4SImode:
3298           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3299             return NULL_TREE;
3300
3301           return TYPE_UNSIGNED (dest_type)
3302             ? rs6000_builtin_decls[VECTOR_BUILTIN_FIXUNS_V4SF_V4SI]
3303             : rs6000_builtin_decls[VECTOR_BUILTIN_FIX_V4SF_V4SI];
3304
3305         default:
3306           return NULL_TREE;
3307         }
3308
3309     case FLOAT_EXPR:
3310       switch (TYPE_MODE (src_type))
3311         {
3312         case V2DImode:
3313           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3314             return NULL_TREE;
3315
3316           return TYPE_UNSIGNED (src_type)
3317             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVUXDDP]
3318             : rs6000_builtin_decls[VSX_BUILTIN_XVCVSXDDP];
3319
3320         case V4SImode:
3321           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3322             return NULL_TREE;
3323
3324           return TYPE_UNSIGNED (src_type)
3325             ? rs6000_builtin_decls[VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF]
3326             : rs6000_builtin_decls[VECTOR_BUILTIN_FLOAT_V4SI_V4SF];
3327
3328         default:
3329           return NULL_TREE;
3330         }
3331
3332     default:
3333       return NULL_TREE;
3334     }
3335 }
3336
3337 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
3338 static tree
3339 rs6000_builtin_mul_widen_even (tree type)
3340 {
3341   if (!TARGET_ALTIVEC)
3342     return NULL_TREE;
3343
3344   switch (TYPE_MODE (type))
3345     {
3346     case V8HImode:
3347       return TYPE_UNSIGNED (type)
3348             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH_UNS]
3349             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
3350
3351     case V16QImode:
3352       return TYPE_UNSIGNED (type)
3353             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB_UNS]
3354             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
3355     default:
3356       return NULL_TREE;
3357     }
3358 }
3359
3360 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
3361 static tree
3362 rs6000_builtin_mul_widen_odd (tree type)
3363 {
3364   if (!TARGET_ALTIVEC)
3365     return NULL_TREE;
3366
3367   switch (TYPE_MODE (type))
3368     {
3369     case V8HImode:
3370       return TYPE_UNSIGNED (type)
3371             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH_UNS]
3372             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
3373
3374     case V16QImode:
3375       return TYPE_UNSIGNED (type)
3376             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB_UNS]
3377             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
3378     default:
3379       return NULL_TREE;
3380     }
3381 }
3382
3383
3384 /* Return true iff, data reference of TYPE can reach vector alignment (16)
3385    after applying N number of iterations.  This routine does not determine
3386    how may iterations are required to reach desired alignment.  */
3387
3388 static bool
3389 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
3390 {
3391   if (is_packed)
3392     return false;
3393
3394   if (TARGET_32BIT)
3395     {
3396       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
3397         return true;
3398
3399       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
3400         return true;
3401
3402       return false;
3403     }
3404   else
3405     {
3406       if (TARGET_MACHO)
3407         return false;
3408
3409       /* Assuming that all other types are naturally aligned. CHECKME!  */
3410       return true;
3411     }
3412 }
3413
3414 /* Return true if the vector misalignment factor is supported by the
3415    target.  */ 
3416 bool
3417 rs6000_builtin_support_vector_misalignment (enum machine_mode mode,
3418                                             const_tree type,
3419                                             int misalignment,
3420                                             bool is_packed)
3421 {
3422   if (TARGET_VSX)
3423     {
3424       /* Return if movmisalign pattern is not supported for this mode.  */
3425       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
3426         return false;
3427
3428       if (misalignment == -1)
3429         {
3430           /* Misalignment factor is unknown at compile time but we know
3431              it's word aligned.  */
3432           if (rs6000_vector_alignment_reachable (type, is_packed))
3433             {
3434               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
3435
3436               if (element_size == 64 || element_size == 32)
3437                return true;
3438             }
3439
3440           return false;
3441         }
3442
3443       /* VSX supports word-aligned vector.  */
3444       if (misalignment % 4 == 0)
3445         return true;
3446     }
3447   return false;
3448 }
3449
3450 /* Implement targetm.vectorize.builtin_vec_perm.  */
3451 tree
3452 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
3453 {
3454   tree inner_type = TREE_TYPE (type);
3455   bool uns_p = TYPE_UNSIGNED (inner_type);
3456   tree d;
3457
3458   *mask_element_type = unsigned_char_type_node;
3459
3460   switch (TYPE_MODE (type))
3461     {
3462     case V16QImode:
3463       d = (uns_p
3464            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI_UNS]
3465            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI]);
3466       break;
3467
3468     case V8HImode:
3469       d = (uns_p
3470            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI_UNS]
3471            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI]);
3472       break;
3473
3474     case V4SImode:
3475       d = (uns_p
3476            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI_UNS]
3477            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI]);
3478       break;
3479
3480     case V4SFmode:
3481       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
3482       break;
3483
3484     case V2DFmode:
3485       if (!TARGET_ALLOW_DF_PERMUTE)
3486         return NULL_TREE;
3487
3488       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DF];
3489       break;
3490
3491     case V2DImode:
3492       if (!TARGET_ALLOW_DF_PERMUTE)
3493         return NULL_TREE;
3494
3495       d = (uns_p
3496            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI_UNS]
3497            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI]);
3498       break;
3499
3500     default:
3501       return NULL_TREE;
3502     }
3503
3504   gcc_assert (d);
3505   return d;
3506 }
3507
3508
3509 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
3510 static int
3511 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
3512                                    tree vectype, int misalign)
3513 {
3514   unsigned elements;
3515
3516   switch (type_of_cost)
3517     {
3518       case scalar_stmt:
3519       case scalar_load:
3520       case scalar_store:
3521       case vector_stmt:
3522       case vector_load:
3523       case vector_store:
3524       case vec_to_scalar:
3525       case scalar_to_vec:
3526       case cond_branch_not_taken:
3527       case vec_perm:
3528         return 1;
3529
3530       case cond_branch_taken:
3531         return 3;
3532
3533       case unaligned_load:
3534         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3535           {
3536             elements = TYPE_VECTOR_SUBPARTS (vectype);
3537             if (elements == 2)
3538               /* Double word aligned.  */
3539               return 2;
3540
3541             if (elements == 4)
3542               {
3543                 switch (misalign)
3544                   {
3545                     case 8:
3546                       /* Double word aligned.  */
3547                       return 2;
3548
3549                     case -1:
3550                       /* Unknown misalignment.  */
3551                     case 4:
3552                     case 12:
3553                       /* Word aligned.  */
3554                       return 22;
3555
3556                     default:
3557                       gcc_unreachable ();
3558                   }
3559               }
3560           }
3561
3562         if (TARGET_ALTIVEC)
3563           /* Misaligned loads are not supported.  */
3564           gcc_unreachable ();
3565
3566         return 2;
3567
3568       case unaligned_store:
3569         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3570           {
3571             elements = TYPE_VECTOR_SUBPARTS (vectype);
3572             if (elements == 2)
3573               /* Double word aligned.  */
3574               return 2;
3575
3576             if (elements == 4)
3577               {
3578                 switch (misalign)
3579                   {
3580                     case 8:
3581                       /* Double word aligned.  */
3582                       return 2;
3583
3584                     case -1:
3585                       /* Unknown misalignment.  */
3586                     case 4:
3587                     case 12:
3588                       /* Word aligned.  */
3589                       return 23;
3590
3591                     default:
3592                       gcc_unreachable ();
3593                   }
3594               }
3595           }
3596
3597         if (TARGET_ALTIVEC)
3598           /* Misaligned stores are not supported.  */
3599           gcc_unreachable ();
3600
3601         return 2;
3602
3603       default:
3604         gcc_unreachable ();
3605     }
3606 }
3607
3608 /* Implement targetm.vectorize.preferred_simd_mode.  */
3609
3610 static enum machine_mode
3611 rs6000_preferred_simd_mode (enum machine_mode mode)
3612 {
3613   if (TARGET_VSX)
3614     switch (mode)
3615       {
3616       case DFmode:
3617         return V2DFmode;
3618       default:;
3619       }
3620   if (TARGET_ALTIVEC || TARGET_VSX)
3621     switch (mode)
3622       {
3623       case SFmode:
3624         return V4SFmode;
3625       case DImode:
3626         return V2DImode;
3627       case SImode:
3628         return V4SImode;
3629       case HImode:
3630         return V8HImode;
3631       case QImode:
3632         return V16QImode;
3633       default:;
3634       }
3635   if (TARGET_SPE)
3636     switch (mode)
3637       {
3638       case SFmode:
3639         return V2SFmode;
3640       case SImode:
3641         return V2SImode;
3642       default:;
3643       }
3644   if (TARGET_PAIRED_FLOAT
3645       && mode == SFmode)
3646     return V2SFmode;
3647   return word_mode;
3648 }
3649
3650 /* Handle generic options of the form -mfoo=yes/no.
3651    NAME is the option name.
3652    VALUE is the option value.
3653    FLAG is the pointer to the flag where to store a 1 or 0, depending on
3654    whether the option value is 'yes' or 'no' respectively.  */
3655 static void
3656 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
3657 {
3658   if (value == 0)
3659     return;
3660   else if (!strcmp (value, "yes"))
3661     *flag = 1;
3662   else if (!strcmp (value, "no"))
3663     *flag = 0;
3664   else
3665     error ("unknown -m%s= option specified: '%s'", name, value);
3666 }
3667
3668 /* Validate and record the size specified with the -mtls-size option.  */
3669
3670 static void
3671 rs6000_parse_tls_size_option (void)
3672 {
3673   if (rs6000_tls_size_string == 0)
3674     return;
3675   else if (strcmp (rs6000_tls_size_string, "16") == 0)
3676     rs6000_tls_size = 16;
3677   else if (strcmp (rs6000_tls_size_string, "32") == 0)
3678     rs6000_tls_size = 32;
3679   else if (strcmp (rs6000_tls_size_string, "64") == 0)
3680     rs6000_tls_size = 64;
3681   else
3682     error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
3683 }
3684
3685 /* Implement TARGET_OPTION_INIT_STRUCT.  */
3686
3687 static void
3688 rs6000_option_init_struct (struct gcc_options *opts)
3689 {
3690   if (DEFAULT_ABI == ABI_DARWIN)
3691     /* The Darwin libraries never set errno, so we might as well
3692        avoid calling them when that's the only reason we would.  */
3693     opts->x_flag_errno_math = 0;
3694
3695   /* Enable section anchors by default.  */
3696   if (!TARGET_MACHO)
3697     opts->x_flag_section_anchors = 1;
3698 }
3699
3700 /* Implement TARGET_OPTION_DEFAULT_PARAMS.  */
3701
3702 static void
3703 rs6000_option_default_params (void)
3704 {
3705   /* Double growth factor to counter reduced min jump length.  */
3706   set_default_param_value (PARAM_MAX_GROW_COPY_BB_INSNS, 16);
3707 }
3708
3709 static enum fpu_type_t
3710 rs6000_parse_fpu_option (const char *option)
3711 {
3712   if (!strcmp("none", option)) return FPU_NONE;
3713   if (!strcmp("sp_lite", option)) return FPU_SF_LITE;
3714   if (!strcmp("dp_lite", option)) return FPU_DF_LITE;
3715   if (!strcmp("sp_full", option)) return FPU_SF_FULL;
3716   if (!strcmp("dp_full", option)) return FPU_DF_FULL;
3717   error("unknown value %s for -mfpu", option);
3718   return FPU_NONE;
3719 }
3720
3721
3722 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
3723    library with vectorized intrinsics.  */
3724
3725 static tree
3726 rs6000_builtin_vectorized_libmass (tree fndecl, tree type_out, tree type_in)
3727 {
3728   char name[32];
3729   const char *suffix = NULL;
3730   tree fntype, new_fndecl, bdecl = NULL_TREE;
3731   int n_args = 1;
3732   const char *bname;
3733   enum machine_mode el_mode, in_mode;
3734   int n, in_n;
3735
3736   /* Libmass is suitable for unsafe math only as it does not correctly support
3737      parts of IEEE with the required precision such as denormals.  Only support
3738      it if we have VSX to use the simd d2 or f4 functions.
3739      XXX: Add variable length support.  */
3740   if (!flag_unsafe_math_optimizations || !TARGET_VSX)
3741     return NULL_TREE;
3742
3743   el_mode = TYPE_MODE (TREE_TYPE (type_out));
3744   n = TYPE_VECTOR_SUBPARTS (type_out);
3745   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3746   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3747   if (el_mode != in_mode
3748       || n != in_n)
3749     return NULL_TREE;
3750
3751   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3752     {
3753       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3754       switch (fn)
3755         {
3756         case BUILT_IN_ATAN2:
3757         case BUILT_IN_HYPOT:
3758         case BUILT_IN_POW:
3759           n_args = 2;
3760           /* fall through */
3761
3762         case BUILT_IN_ACOS:
3763         case BUILT_IN_ACOSH:
3764         case BUILT_IN_ASIN:
3765         case BUILT_IN_ASINH:
3766         case BUILT_IN_ATAN:
3767         case BUILT_IN_ATANH:
3768         case BUILT_IN_CBRT:
3769         case BUILT_IN_COS:
3770         case BUILT_IN_COSH:
3771         case BUILT_IN_ERF:
3772         case BUILT_IN_ERFC:
3773         case BUILT_IN_EXP2:
3774         case BUILT_IN_EXP:
3775         case BUILT_IN_EXPM1:
3776         case BUILT_IN_LGAMMA:
3777         case BUILT_IN_LOG10:
3778         case BUILT_IN_LOG1P:
3779         case BUILT_IN_LOG2:
3780         case BUILT_IN_LOG:
3781         case BUILT_IN_SIN:
3782         case BUILT_IN_SINH:
3783         case BUILT_IN_SQRT:
3784         case BUILT_IN_TAN:
3785         case BUILT_IN_TANH:
3786           bdecl = implicit_built_in_decls[fn];
3787           suffix = "d2";                                /* pow -> powd2 */
3788           if (el_mode != DFmode
3789               || n != 2)
3790             return NULL_TREE;
3791           break;
3792
3793         case BUILT_IN_ATAN2F:
3794         case BUILT_IN_HYPOTF:
3795         case BUILT_IN_POWF:
3796           n_args = 2;
3797           /* fall through */
3798
3799         case BUILT_IN_ACOSF:
3800         case BUILT_IN_ACOSHF:
3801         case BUILT_IN_ASINF:
3802         case BUILT_IN_ASINHF:
3803         case BUILT_IN_ATANF:
3804         case BUILT_IN_ATANHF:
3805         case BUILT_IN_CBRTF:
3806         case BUILT_IN_COSF:
3807         case BUILT_IN_COSHF:
3808         case BUILT_IN_ERFF:
3809         case BUILT_IN_ERFCF:
3810         case BUILT_IN_EXP2F:
3811         case BUILT_IN_EXPF:
3812         case BUILT_IN_EXPM1F:
3813         case BUILT_IN_LGAMMAF:
3814         case BUILT_IN_LOG10F:
3815         case BUILT_IN_LOG1PF:
3816         case BUILT_IN_LOG2F:
3817         case BUILT_IN_LOGF:
3818         case BUILT_IN_SINF:
3819         case BUILT_IN_SINHF:
3820         case BUILT_IN_SQRTF:
3821         case BUILT_IN_TANF:
3822         case BUILT_IN_TANHF:
3823           bdecl = implicit_built_in_decls[fn];
3824           suffix = "4";                                 /* powf -> powf4 */
3825           if (el_mode != SFmode
3826               || n != 4)
3827             return NULL_TREE;
3828           break;
3829
3830         default:
3831           return NULL_TREE;
3832         }
3833     }
3834   else
3835     return NULL_TREE;
3836
3837   gcc_assert (suffix != NULL);
3838   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
3839   strcpy (name, bname + sizeof ("__builtin_") - 1);
3840   strcat (name, suffix);
3841
3842   if (n_args == 1)
3843     fntype = build_function_type_list (type_out, type_in, NULL);
3844   else if (n_args == 2)
3845     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
3846   else
3847     gcc_unreachable ();
3848
3849   /* Build a function declaration for the vectorized function.  */
3850   new_fndecl = build_decl (BUILTINS_LOCATION,
3851                            FUNCTION_DECL, get_identifier (name), fntype);
3852   TREE_PUBLIC (new_fndecl) = 1;
3853   DECL_EXTERNAL (new_fndecl) = 1;
3854   DECL_IS_NOVOPS (new_fndecl) = 1;
3855   TREE_READONLY (new_fndecl) = 1;
3856
3857   return new_fndecl;
3858 }
3859
3860 /* Returns a function decl for a vectorized version of the builtin function
3861    with builtin function code FN and the result vector type TYPE, or NULL_TREE
3862    if it is not available.  */
3863
3864 static tree
3865 rs6000_builtin_vectorized_function (tree fndecl, tree type_out,
3866                                     tree type_in)
3867 {
3868   enum machine_mode in_mode, out_mode;
3869   int in_n, out_n;
3870
3871   if (TREE_CODE (type_out) != VECTOR_TYPE
3872       || TREE_CODE (type_in) != VECTOR_TYPE
3873       || !TARGET_VECTORIZE_BUILTINS)
3874     return NULL_TREE;
3875
3876   out_mode = TYPE_MODE (TREE_TYPE (type_out));
3877   out_n = TYPE_VECTOR_SUBPARTS (type_out);
3878   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3879   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3880
3881   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3882     {
3883       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3884       switch (fn)
3885         {
3886         case BUILT_IN_COPYSIGN:
3887           if (VECTOR_UNIT_VSX_P (V2DFmode)
3888               && out_mode == DFmode && out_n == 2
3889               && in_mode == DFmode && in_n == 2)
3890             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
3891           break;
3892         case BUILT_IN_COPYSIGNF:
3893           if (out_mode != SFmode || out_n != 4
3894               || in_mode != SFmode || in_n != 4)
3895             break;
3896           if (VECTOR_UNIT_VSX_P (V4SFmode))
3897             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
3898           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3899             return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
3900           break;
3901         case BUILT_IN_SQRT:
3902           if (VECTOR_UNIT_VSX_P (V2DFmode)
3903               && out_mode == DFmode && out_n == 2
3904               && in_mode == DFmode && in_n == 2)
3905             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTDP];
3906           break;
3907         case BUILT_IN_SQRTF:
3908           if (VECTOR_UNIT_VSX_P (V4SFmode)
3909               && out_mode == SFmode && out_n == 4
3910               && in_mode == SFmode && in_n == 4)
3911             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTSP];
3912           break;
3913         case BUILT_IN_CEIL:
3914           if (VECTOR_UNIT_VSX_P (V2DFmode)
3915               && out_mode == DFmode && out_n == 2
3916               && in_mode == DFmode && in_n == 2)
3917             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
3918           break;
3919         case BUILT_IN_CEILF:
3920           if (out_mode != SFmode || out_n != 4
3921               || in_mode != SFmode || in_n != 4)
3922             break;
3923           if (VECTOR_UNIT_VSX_P (V4SFmode))
3924             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
3925           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3926             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
3927           break;
3928         case BUILT_IN_FLOOR:
3929           if (VECTOR_UNIT_VSX_P (V2DFmode)
3930               && out_mode == DFmode && out_n == 2
3931               && in_mode == DFmode && in_n == 2)
3932             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
3933           break;
3934         case BUILT_IN_FLOORF:
3935           if (out_mode != SFmode || out_n != 4
3936               || in_mode != SFmode || in_n != 4)
3937             break;
3938           if (VECTOR_UNIT_VSX_P (V4SFmode))
3939             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
3940           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3941             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
3942           break;
3943         case BUILT_IN_FMA:
3944           if (VECTOR_UNIT_VSX_P (V2DFmode)
3945               && out_mode == DFmode && out_n == 2
3946               && in_mode == DFmode && in_n == 2)
3947             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
3948           break;
3949         case BUILT_IN_FMAF:
3950           if (VECTOR_UNIT_VSX_P (V4SFmode)
3951               && out_mode == SFmode && out_n == 4
3952               && in_mode == SFmode && in_n == 4)
3953             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
3954           else if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
3955               && out_mode == SFmode && out_n == 4
3956               && in_mode == SFmode && in_n == 4)
3957             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
3958           break;
3959         case BUILT_IN_TRUNC:
3960           if (VECTOR_UNIT_VSX_P (V2DFmode)
3961               && out_mode == DFmode && out_n == 2
3962               && in_mode == DFmode && in_n == 2)
3963             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
3964           break;
3965         case BUILT_IN_TRUNCF:
3966           if (out_mode != SFmode || out_n != 4
3967               || in_mode != SFmode || in_n != 4)
3968             break;
3969           if (VECTOR_UNIT_VSX_P (V4SFmode))
3970             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
3971           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3972             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
3973           break;
3974         case BUILT_IN_NEARBYINT:
3975           if (VECTOR_UNIT_VSX_P (V2DFmode)
3976               && flag_unsafe_math_optimizations
3977               && out_mode == DFmode && out_n == 2
3978               && in_mode == DFmode && in_n == 2)
3979             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
3980           break;
3981         case BUILT_IN_NEARBYINTF:
3982           if (VECTOR_UNIT_VSX_P (V4SFmode)
3983               && flag_unsafe_math_optimizations
3984               && out_mode == SFmode && out_n == 4
3985               && in_mode == SFmode && in_n == 4)
3986             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
3987           break;
3988         case BUILT_IN_RINT:
3989           if (VECTOR_UNIT_VSX_P (V2DFmode)
3990               && !flag_trapping_math
3991               && out_mode == DFmode && out_n == 2
3992               && in_mode == DFmode && in_n == 2)
3993             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
3994           break;
3995         case BUILT_IN_RINTF:
3996           if (VECTOR_UNIT_VSX_P (V4SFmode)
3997               && !flag_trapping_math
3998               && out_mode == SFmode && out_n == 4
3999               && in_mode == SFmode && in_n == 4)
4000             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
4001           break;
4002         default:
4003           break;
4004         }
4005     }
4006
4007   else if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
4008     {
4009       enum rs6000_builtins fn
4010         = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
4011       switch (fn)
4012         {
4013         case RS6000_BUILTIN_RSQRTF:
4014           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
4015               && out_mode == SFmode && out_n == 4
4016               && in_mode == SFmode && in_n == 4)
4017             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
4018           break;
4019         case RS6000_BUILTIN_RSQRT:
4020           if (VECTOR_UNIT_VSX_P (V2DFmode)
4021               && out_mode == DFmode && out_n == 2
4022               && in_mode == DFmode && in_n == 2)
4023             return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
4024           break;
4025         case RS6000_BUILTIN_RECIPF:
4026           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
4027               && out_mode == SFmode && out_n == 4
4028               && in_mode == SFmode && in_n == 4)
4029             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
4030           break;
4031         case RS6000_BUILTIN_RECIP:
4032           if (VECTOR_UNIT_VSX_P (V2DFmode)
4033               && out_mode == DFmode && out_n == 2
4034               && in_mode == DFmode && in_n == 2)
4035             return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
4036           break;
4037         default:
4038           break;
4039         }
4040     }
4041
4042   /* Generate calls to libmass if appropriate.  */
4043   if (rs6000_veclib_handler)
4044     return rs6000_veclib_handler (fndecl, type_out, type_in);
4045
4046   return NULL_TREE;
4047 }
4048
4049
4050 /* Implement TARGET_HANDLE_OPTION.  */
4051
4052 static bool
4053 rs6000_handle_option (size_t code, const char *arg, int value)
4054 {
4055   enum fpu_type_t fpu_type = FPU_NONE;
4056   int isel;
4057
4058   switch (code)
4059     {
4060     case OPT_mno_power:
4061       target_flags &= ~(MASK_POWER | MASK_POWER2
4062                         | MASK_MULTIPLE | MASK_STRING);
4063       target_flags_explicit |= (MASK_POWER | MASK_POWER2
4064                                 | MASK_MULTIPLE | MASK_STRING);
4065       break;
4066     case OPT_mno_powerpc:
4067       target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
4068                         | MASK_PPC_GFXOPT | MASK_POWERPC64);
4069       target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
4070                                 | MASK_PPC_GFXOPT | MASK_POWERPC64);
4071       break;
4072     case OPT_mfull_toc:
4073       target_flags &= ~MASK_MINIMAL_TOC;
4074       TARGET_NO_FP_IN_TOC = 0;
4075       TARGET_NO_SUM_IN_TOC = 0;
4076       target_flags_explicit |= MASK_MINIMAL_TOC;
4077 #ifdef TARGET_USES_SYSV4_OPT
4078       /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
4079          just the same as -mminimal-toc.  */
4080       target_flags |= MASK_MINIMAL_TOC;
4081       target_flags_explicit |= MASK_MINIMAL_TOC;
4082 #endif
4083       break;
4084
4085 #ifdef TARGET_USES_SYSV4_OPT
4086     case OPT_mtoc:
4087       /* Make -mtoc behave like -mminimal-toc.  */
4088       target_flags |= MASK_MINIMAL_TOC;
4089       target_flags_explicit |= MASK_MINIMAL_TOC;
4090       break;
4091 #endif
4092
4093 #if defined (HAVE_LD_LARGE_TOC) && defined (TARGET_USES_LINUX64_OPT)
4094     case OPT_mcmodel_:
4095       if (strcmp (arg, "small") == 0)
4096         cmodel = CMODEL_SMALL;
4097       else if (strcmp (arg, "medium") == 0)
4098         cmodel = CMODEL_MEDIUM;
4099       else if (strcmp (arg, "large") == 0)
4100         cmodel = CMODEL_LARGE;
4101       else
4102         {
4103           error ("invalid option for -mcmodel: '%s'", arg);
4104           return false;
4105         }
4106       rs6000_explicit_options.cmodel = true;
4107 #endif
4108
4109 #ifdef TARGET_USES_AIX64_OPT
4110     case OPT_maix64:
4111 #else
4112     case OPT_m64:
4113 #endif
4114       target_flags |= MASK_POWERPC64 | MASK_POWERPC;
4115       target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
4116       target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
4117       break;
4118
4119 #ifdef TARGET_USES_AIX64_OPT
4120     case OPT_maix32:
4121 #else
4122     case OPT_m32:
4123 #endif
4124       target_flags &= ~MASK_POWERPC64;
4125       target_flags_explicit |= MASK_POWERPC64;
4126       break;
4127
4128     case OPT_minsert_sched_nops_:
4129       rs6000_sched_insert_nops_str = arg;
4130       break;
4131
4132     case OPT_mminimal_toc:
4133       if (value == 1)
4134         {
4135           TARGET_NO_FP_IN_TOC = 0;
4136           TARGET_NO_SUM_IN_TOC = 0;
4137         }
4138       break;
4139
4140     case OPT_mpower:
4141       if (value == 1)
4142         {
4143           target_flags |= (MASK_MULTIPLE | MASK_STRING);
4144           target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
4145         }
4146       break;
4147
4148     case OPT_mpower2:
4149       if (value == 1)
4150         {
4151           target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
4152           target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
4153         }
4154       break;
4155
4156     case OPT_mpowerpc_gpopt:
4157     case OPT_mpowerpc_gfxopt:
4158       if (value == 1)
4159         {
4160           target_flags |= MASK_POWERPC;
4161           target_flags_explicit |= MASK_POWERPC;
4162         }
4163       break;
4164
4165     case OPT_maix_struct_return:
4166     case OPT_msvr4_struct_return:
4167       rs6000_explicit_options.aix_struct_ret = true;
4168       break;
4169
4170     case OPT_mvrsave:
4171       rs6000_explicit_options.vrsave = true;
4172       TARGET_ALTIVEC_VRSAVE = value;
4173       break;
4174
4175     case OPT_mvrsave_:
4176       rs6000_explicit_options.vrsave = true;
4177       rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
4178       break;
4179
4180     case OPT_misel_:
4181       target_flags_explicit |= MASK_ISEL;
4182       isel = 0;
4183       rs6000_parse_yes_no_option ("isel", arg, &isel);
4184       if (isel)
4185         target_flags |= MASK_ISEL;
4186       else
4187         target_flags &= ~MASK_ISEL;
4188       break;
4189
4190     case OPT_mspe:
4191       rs6000_explicit_options.spe = true;
4192       rs6000_spe = value;
4193       break;
4194
4195     case OPT_mspe_:
4196       rs6000_explicit_options.spe = true;
4197       rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
4198       break;
4199
4200     case OPT_mdebug_:
4201       rs6000_debug_name = arg;
4202       break;
4203
4204 #ifdef TARGET_USES_SYSV4_OPT
4205     case OPT_mcall_:
4206       rs6000_abi_name = arg;
4207       break;
4208
4209     case OPT_msdata_:
4210       rs6000_sdata_name = arg;
4211       break;
4212
4213     case OPT_mtls_size_:
4214       rs6000_tls_size_string = arg;
4215       break;
4216
4217     case OPT_mrelocatable:
4218       if (value == 1)
4219         {
4220           target_flags |= MASK_MINIMAL_TOC;
4221           target_flags_explicit |= MASK_MINIMAL_TOC;
4222           TARGET_NO_FP_IN_TOC = 1;
4223         }
4224       break;
4225
4226     case OPT_mrelocatable_lib:
4227       if (value == 1)
4228         {
4229           target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
4230           target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
4231           TARGET_NO_FP_IN_TOC = 1;
4232         }
4233       else
4234         {
4235           target_flags &= ~MASK_RELOCATABLE;
4236           target_flags_explicit |= MASK_RELOCATABLE;
4237         }
4238       break;
4239 #endif
4240
4241     case OPT_mabi_:
4242       if (!strcmp (arg, "altivec"))
4243         {
4244           rs6000_explicit_options.altivec_abi = true;
4245           rs6000_altivec_abi = 1;
4246
4247           /* Enabling the AltiVec ABI turns off the SPE ABI.  */
4248           rs6000_spe_abi = 0;
4249         }
4250       else if (! strcmp (arg, "no-altivec"))
4251         {
4252           rs6000_explicit_options.altivec_abi = true;
4253           rs6000_altivec_abi = 0;
4254         }
4255       else if (! strcmp (arg, "spe"))
4256         {
4257           rs6000_explicit_options.spe_abi = true;
4258           rs6000_spe_abi = 1;
4259           rs6000_altivec_abi = 0;
4260           if (!TARGET_SPE_ABI)
4261             error ("not configured for ABI: '%s'", arg);
4262         }
4263       else if (! strcmp (arg, "no-spe"))
4264         {
4265           rs6000_explicit_options.spe_abi = true;
4266           rs6000_spe_abi = 0;
4267         }
4268
4269       /* These are here for testing during development only, do not
4270          document in the manual please.  */
4271       else if (! strcmp (arg, "d64"))
4272         {
4273           rs6000_darwin64_abi = 1;
4274           warning (0, "Using darwin64 ABI");
4275         }
4276       else if (! strcmp (arg, "d32"))
4277         {
4278           rs6000_darwin64_abi = 0;
4279           warning (0, "Using old darwin ABI");
4280         }
4281
4282       else if (! strcmp (arg, "ibmlongdouble"))
4283         {
4284           rs6000_explicit_options.ieee = true;
4285           rs6000_ieeequad = 0;
4286           warning (0, "Using IBM extended precision long double");
4287         }
4288       else if (! strcmp (arg, "ieeelongdouble"))
4289         {
4290           rs6000_explicit_options.ieee = true;
4291           rs6000_ieeequad = 1;
4292           warning (0, "Using IEEE extended precision long double");
4293         }
4294
4295       else
4296         {
4297           error ("unknown ABI specified: '%s'", arg);
4298           return false;
4299         }
4300       break;
4301
4302     case OPT_mcpu_:
4303       rs6000_select[1].string = arg;
4304       break;
4305
4306     case OPT_mtune_:
4307       rs6000_select[2].string = arg;
4308       break;
4309
4310     case OPT_mtraceback_:
4311       rs6000_traceback_name = arg;
4312       break;
4313
4314     case OPT_mfloat_gprs_:
4315       rs6000_explicit_options.float_gprs = true;
4316       if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
4317         rs6000_float_gprs = 1;
4318       else if (! strcmp (arg, "double"))
4319         rs6000_float_gprs = 2;
4320       else if (! strcmp (arg, "no"))
4321         rs6000_float_gprs = 0;
4322       else
4323         {
4324           error ("invalid option for -mfloat-gprs: '%s'", arg);
4325           return false;
4326         }
4327       break;
4328
4329     case OPT_mlong_double_:
4330       rs6000_explicit_options.long_double = true;
4331       rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4332       if (value != 64 && value != 128)
4333         {
4334           error ("Unknown switch -mlong-double-%s", arg);
4335           rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4336           return false;
4337         }
4338       else
4339         rs6000_long_double_type_size = value;
4340       break;
4341
4342     case OPT_msched_costly_dep_:
4343       rs6000_sched_costly_dep_str = arg;
4344       break;
4345
4346     case OPT_malign_:
4347       rs6000_explicit_options.alignment = true;
4348       if (! strcmp (arg, "power"))
4349         {
4350           /* On 64-bit Darwin, power alignment is ABI-incompatible with
4351              some C library functions, so warn about it. The flag may be
4352              useful for performance studies from time to time though, so
4353              don't disable it entirely.  */
4354           if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
4355             warning (0, "-malign-power is not supported for 64-bit Darwin;"
4356                      " it is incompatible with the installed C and C++ libraries");
4357           rs6000_alignment_flags = MASK_ALIGN_POWER;
4358         }
4359       else if (! strcmp (arg, "natural"))
4360         rs6000_alignment_flags = MASK_ALIGN_NATURAL;
4361       else
4362         {
4363           error ("unknown -malign-XXXXX option specified: '%s'", arg);
4364           return false;
4365         }
4366       break;
4367
4368     case OPT_msingle_float:
4369       if (!TARGET_SINGLE_FPU) 
4370         warning (0, "-msingle-float option equivalent to -mhard-float");
4371       /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
4372       rs6000_double_float = 0;
4373       target_flags &= ~MASK_SOFT_FLOAT;
4374       target_flags_explicit |= MASK_SOFT_FLOAT;
4375       break;
4376
4377     case OPT_mdouble_float:
4378       /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
4379       rs6000_single_float = 1;
4380       target_flags &= ~MASK_SOFT_FLOAT;
4381       target_flags_explicit |= MASK_SOFT_FLOAT;
4382       break;
4383
4384     case OPT_msimple_fpu:
4385       if (!TARGET_SINGLE_FPU) 
4386         warning (0, "-msimple-fpu option ignored");
4387       break;
4388
4389     case OPT_mhard_float:
4390       /* -mhard_float implies -msingle-float and -mdouble-float. */
4391       rs6000_single_float = rs6000_double_float = 1;
4392       break;
4393
4394     case OPT_msoft_float:
4395       /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
4396       rs6000_single_float = rs6000_double_float = 0;
4397       break;
4398
4399     case OPT_mfpu_:
4400       fpu_type = rs6000_parse_fpu_option(arg);
4401       if (fpu_type != FPU_NONE) 
4402       /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on HARD_FLOAT. */
4403       {
4404         target_flags &= ~MASK_SOFT_FLOAT;
4405         target_flags_explicit |= MASK_SOFT_FLOAT;
4406         rs6000_xilinx_fpu = 1;
4407         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_SF_FULL) 
4408         rs6000_single_float = 1;
4409         if (fpu_type == FPU_DF_LITE || fpu_type == FPU_DF_FULL) 
4410           rs6000_single_float = rs6000_double_float = 1;
4411         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_DF_LITE) 
4412           rs6000_simple_fpu = 1;
4413       }
4414       else
4415       {
4416         /* -mfpu=none is equivalent to -msoft-float */
4417         target_flags |= MASK_SOFT_FLOAT;
4418         target_flags_explicit |= MASK_SOFT_FLOAT;
4419         rs6000_single_float = rs6000_double_float = 0;
4420       }
4421
4422     case OPT_mrecip:
4423       rs6000_recip_name = (value) ? "default" : "none";
4424       break;
4425
4426     case OPT_mrecip_:
4427       rs6000_recip_name = arg;
4428       break;
4429     }
4430   return true;
4431 }
4432 \f
4433 /* Do anything needed at the start of the asm file.  */
4434
4435 static void
4436 rs6000_file_start (void)
4437 {
4438   size_t i;
4439   char buffer[80];
4440   const char *start = buffer;
4441   struct rs6000_cpu_select *ptr;
4442   const char *default_cpu = TARGET_CPU_DEFAULT;
4443   FILE *file = asm_out_file;
4444
4445   default_file_start ();
4446
4447 #ifdef TARGET_BI_ARCH
4448   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
4449     default_cpu = 0;
4450 #endif
4451
4452   if (flag_verbose_asm)
4453     {
4454       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
4455       rs6000_select[0].string = default_cpu;
4456
4457       for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
4458         {
4459           ptr = &rs6000_select[i];
4460           if (ptr->string != (char *)0 && ptr->string[0] != '\0')
4461             {
4462               fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
4463               start = "";
4464             }
4465         }
4466
4467       if (PPC405_ERRATUM77)
4468         {
4469           fprintf (file, "%s PPC405CR_ERRATUM77", start);
4470           start = "";
4471         }
4472
4473 #ifdef USING_ELFOS_H
4474       switch (rs6000_sdata)
4475         {
4476         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
4477         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
4478         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
4479         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
4480         }
4481
4482       if (rs6000_sdata && g_switch_value)
4483         {
4484           fprintf (file, "%s -G %d", start,
4485                    g_switch_value);
4486           start = "";
4487         }
4488 #endif
4489
4490       if (*start == '\0')
4491         putc ('\n', file);
4492     }
4493
4494 #ifdef HAVE_AS_GNU_ATTRIBUTE
4495   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
4496     {
4497       fprintf (file, "\t.gnu_attribute 4, %d\n",
4498                ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1 
4499                 : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3 
4500                 : 2));
4501       fprintf (file, "\t.gnu_attribute 8, %d\n",
4502                (TARGET_ALTIVEC_ABI ? 2
4503                 : TARGET_SPE_ABI ? 3
4504                 : 1));
4505       fprintf (file, "\t.gnu_attribute 12, %d\n",
4506                aix_struct_return ? 2 : 1);
4507
4508     }
4509 #endif
4510
4511   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
4512     {
4513       switch_to_section (toc_section);
4514       switch_to_section (text_section);
4515     }
4516 }
4517
4518 \f
4519 /* Return nonzero if this function is known to have a null epilogue.  */
4520
4521 int
4522 direct_return (void)
4523 {
4524   if (reload_completed)
4525     {
4526       rs6000_stack_t *info = rs6000_stack_info ();
4527
4528       if (info->first_gp_reg_save == 32
4529           && info->first_fp_reg_save == 64
4530           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
4531           && ! info->lr_save_p
4532           && ! info->cr_save_p
4533           && info->vrsave_mask == 0
4534           && ! info->push_p)
4535         return 1;
4536     }
4537
4538   return 0;
4539 }
4540
4541 /* Return the number of instructions it takes to form a constant in an
4542    integer register.  */
4543
4544 int
4545 num_insns_constant_wide (HOST_WIDE_INT value)
4546 {
4547   /* signed constant loadable with {cal|addi} */
4548   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
4549     return 1;
4550
4551   /* constant loadable with {cau|addis} */
4552   else if ((value & 0xffff) == 0
4553            && (value >> 31 == -1 || value >> 31 == 0))
4554     return 1;
4555
4556 #if HOST_BITS_PER_WIDE_INT == 64
4557   else if (TARGET_POWERPC64)
4558     {
4559       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
4560       HOST_WIDE_INT high = value >> 31;
4561
4562       if (high == 0 || high == -1)
4563         return 2;
4564
4565       high >>= 1;
4566
4567       if (low == 0)
4568         return num_insns_constant_wide (high) + 1;
4569       else if (high == 0)
4570         return num_insns_constant_wide (low) + 1;
4571       else
4572         return (num_insns_constant_wide (high)
4573                 + num_insns_constant_wide (low) + 1);
4574     }
4575 #endif
4576
4577   else
4578     return 2;
4579 }
4580
4581 int
4582 num_insns_constant (rtx op, enum machine_mode mode)
4583 {
4584   HOST_WIDE_INT low, high;
4585
4586   switch (GET_CODE (op))
4587     {
4588     case CONST_INT:
4589 #if HOST_BITS_PER_WIDE_INT == 64
4590       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4591           && mask64_operand (op, mode))
4592         return 2;
4593       else
4594 #endif
4595         return num_insns_constant_wide (INTVAL (op));
4596
4597       case CONST_DOUBLE:
4598         if (mode == SFmode || mode == SDmode)
4599           {
4600             long l;
4601             REAL_VALUE_TYPE rv;
4602
4603             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4604             if (DECIMAL_FLOAT_MODE_P (mode))
4605               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
4606             else
4607               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4608             return num_insns_constant_wide ((HOST_WIDE_INT) l);
4609           }
4610
4611         if (mode == VOIDmode || mode == DImode)
4612           {
4613             high = CONST_DOUBLE_HIGH (op);
4614             low  = CONST_DOUBLE_LOW (op);
4615           }
4616         else
4617           {
4618             long l[2];
4619             REAL_VALUE_TYPE rv;
4620
4621             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4622             if (DECIMAL_FLOAT_MODE_P (mode))
4623               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
4624             else
4625               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
4626             high = l[WORDS_BIG_ENDIAN == 0];
4627             low  = l[WORDS_BIG_ENDIAN != 0];
4628           }
4629
4630         if (TARGET_32BIT)
4631           return (num_insns_constant_wide (low)
4632                   + num_insns_constant_wide (high));
4633         else
4634           {
4635             if ((high == 0 && low >= 0)
4636                 || (high == -1 && low < 0))
4637               return num_insns_constant_wide (low);
4638
4639             else if (mask64_operand (op, mode))
4640               return 2;
4641
4642             else if (low == 0)
4643               return num_insns_constant_wide (high) + 1;
4644
4645             else
4646               return (num_insns_constant_wide (high)
4647                       + num_insns_constant_wide (low) + 1);
4648           }
4649
4650     default:
4651       gcc_unreachable ();
4652     }
4653 }
4654
4655 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
4656    If the mode of OP is MODE_VECTOR_INT, this simply returns the
4657    corresponding element of the vector, but for V4SFmode and V2SFmode,
4658    the corresponding "float" is interpreted as an SImode integer.  */
4659
4660 HOST_WIDE_INT
4661 const_vector_elt_as_int (rtx op, unsigned int elt)
4662 {
4663   rtx tmp = CONST_VECTOR_ELT (op, elt);
4664   if (GET_MODE (op) == V4SFmode
4665       || GET_MODE (op) == V2SFmode)
4666     tmp = gen_lowpart (SImode, tmp);
4667   return INTVAL (tmp);
4668 }
4669
4670 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
4671    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
4672    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
4673    all items are set to the same value and contain COPIES replicas of the
4674    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
4675    operand and the others are set to the value of the operand's msb.  */
4676
4677 static bool
4678 vspltis_constant (rtx op, unsigned step, unsigned copies)
4679 {
4680   enum machine_mode mode = GET_MODE (op);
4681   enum machine_mode inner = GET_MODE_INNER (mode);
4682
4683   unsigned i;
4684   unsigned nunits = GET_MODE_NUNITS (mode);
4685   unsigned bitsize = GET_MODE_BITSIZE (inner);
4686   unsigned mask = GET_MODE_MASK (inner);
4687
4688   HOST_WIDE_INT val = const_vector_elt_as_int (op, nunits - 1);
4689   HOST_WIDE_INT splat_val = val;
4690   HOST_WIDE_INT msb_val = val > 0 ? 0 : -1;
4691
4692   /* Construct the value to be splatted, if possible.  If not, return 0.  */
4693   for (i = 2; i <= copies; i *= 2)
4694     {
4695       HOST_WIDE_INT small_val;
4696       bitsize /= 2;
4697       small_val = splat_val >> bitsize;
4698       mask >>= bitsize;
4699       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
4700         return false;
4701       splat_val = small_val;
4702     }
4703
4704   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
4705   if (EASY_VECTOR_15 (splat_val))
4706     ;
4707
4708   /* Also check if we can splat, and then add the result to itself.  Do so if
4709      the value is positive, of if the splat instruction is using OP's mode;
4710      for splat_val < 0, the splat and the add should use the same mode.  */
4711   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
4712            && (splat_val >= 0 || (step == 1 && copies == 1)))
4713     ;
4714
4715   /* Also check if are loading up the most significant bit which can be done by
4716      loading up -1 and shifting the value left by -1.  */
4717   else if (EASY_VECTOR_MSB (splat_val, inner))
4718     ;
4719
4720   else
4721     return false;
4722
4723   /* Check if VAL is present in every STEP-th element, and the
4724      other elements are filled with its most significant bit.  */
4725   for (i = 0; i < nunits - 1; ++i)
4726     {
4727       HOST_WIDE_INT desired_val;
4728       if (((i + 1) & (step - 1)) == 0)
4729         desired_val = val;
4730       else
4731         desired_val = msb_val;
4732
4733       if (desired_val != const_vector_elt_as_int (op, i))
4734         return false;
4735     }
4736
4737   return true;
4738 }
4739
4740
4741 /* Return true if OP is of the given MODE and can be synthesized
4742    with a vspltisb, vspltish or vspltisw.  */
4743
4744 bool
4745 easy_altivec_constant (rtx op, enum machine_mode mode)
4746 {
4747   unsigned step, copies;
4748
4749   if (mode == VOIDmode)
4750     mode = GET_MODE (op);
4751   else if (mode != GET_MODE (op))
4752     return false;
4753
4754   /* Start with a vspltisw.  */
4755   step = GET_MODE_NUNITS (mode) / 4;
4756   copies = 1;
4757
4758   if (vspltis_constant (op, step, copies))
4759     return true;
4760
4761   /* Then try with a vspltish.  */
4762   if (step == 1)
4763     copies <<= 1;
4764   else
4765     step >>= 1;
4766
4767   if (vspltis_constant (op, step, copies))
4768     return true;
4769
4770   /* And finally a vspltisb.  */
4771   if (step == 1)
4772     copies <<= 1;
4773   else
4774     step >>= 1;
4775
4776   if (vspltis_constant (op, step, copies))
4777     return true;
4778
4779   return false;
4780 }
4781
4782 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
4783    result is OP.  Abort if it is not possible.  */
4784
4785 rtx
4786 gen_easy_altivec_constant (rtx op)
4787 {
4788   enum machine_mode mode = GET_MODE (op);
4789   int nunits = GET_MODE_NUNITS (mode);
4790   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
4791   unsigned step = nunits / 4;
4792   unsigned copies = 1;
4793
4794   /* Start with a vspltisw.  */
4795   if (vspltis_constant (op, step, copies))
4796     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
4797
4798   /* Then try with a vspltish.  */
4799   if (step == 1)
4800     copies <<= 1;
4801   else
4802     step >>= 1;
4803
4804   if (vspltis_constant (op, step, copies))
4805     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
4806
4807   /* And finally a vspltisb.  */
4808   if (step == 1)
4809     copies <<= 1;
4810   else
4811     step >>= 1;
4812
4813   if (vspltis_constant (op, step, copies))
4814     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
4815
4816   gcc_unreachable ();
4817 }
4818
4819 const char *
4820 output_vec_const_move (rtx *operands)
4821 {
4822   int cst, cst2;
4823   enum machine_mode mode;
4824   rtx dest, vec;
4825
4826   dest = operands[0];
4827   vec = operands[1];
4828   mode = GET_MODE (dest);
4829
4830   if (TARGET_VSX && zero_constant (vec, mode))
4831     return "xxlxor %x0,%x0,%x0";
4832
4833   if (TARGET_ALTIVEC)
4834     {
4835       rtx splat_vec;
4836       if (zero_constant (vec, mode))
4837         return "vxor %0,%0,%0";
4838
4839       splat_vec = gen_easy_altivec_constant (vec);
4840       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
4841       operands[1] = XEXP (splat_vec, 0);
4842       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
4843         return "#";
4844
4845       switch (GET_MODE (splat_vec))
4846         {
4847         case V4SImode:
4848           return "vspltisw %0,%1";
4849
4850         case V8HImode:
4851           return "vspltish %0,%1";
4852
4853         case V16QImode:
4854           return "vspltisb %0,%1";
4855
4856         default:
4857           gcc_unreachable ();
4858         }
4859     }
4860
4861   gcc_assert (TARGET_SPE);
4862
4863   /* Vector constant 0 is handled as a splitter of V2SI, and in the
4864      pattern of V1DI, V4HI, and V2SF.
4865
4866      FIXME: We should probably return # and add post reload
4867      splitters for these, but this way is so easy ;-).  */
4868   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
4869   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
4870   operands[1] = CONST_VECTOR_ELT (vec, 0);
4871   operands[2] = CONST_VECTOR_ELT (vec, 1);
4872   if (cst == cst2)
4873     return "li %0,%1\n\tevmergelo %0,%0,%0";
4874   else
4875     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
4876 }
4877
4878 /* Initialize TARGET of vector PAIRED to VALS.  */
4879
4880 void
4881 paired_expand_vector_init (rtx target, rtx vals)
4882 {
4883   enum machine_mode mode = GET_MODE (target);
4884   int n_elts = GET_MODE_NUNITS (mode);
4885   int n_var = 0;
4886   rtx x, new_rtx, tmp, constant_op, op1, op2;
4887   int i;
4888
4889   for (i = 0; i < n_elts; ++i)
4890     {
4891       x = XVECEXP (vals, 0, i);
4892       if (!CONSTANT_P (x))
4893         ++n_var;
4894     }
4895   if (n_var == 0)
4896     {
4897       /* Load from constant pool.  */
4898       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
4899       return;
4900     }
4901
4902   if (n_var == 2)
4903     {
4904       /* The vector is initialized only with non-constants.  */
4905       new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
4906                                 XVECEXP (vals, 0, 1));
4907
4908       emit_move_insn (target, new_rtx);
4909       return;
4910     }
4911   
4912   /* One field is non-constant and the other one is a constant.  Load the
4913      constant from the constant pool and use ps_merge instruction to
4914      construct the whole vector.  */
4915   op1 = XVECEXP (vals, 0, 0);
4916   op2 = XVECEXP (vals, 0, 1);
4917
4918   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
4919
4920   tmp = gen_reg_rtx (GET_MODE (constant_op));
4921   emit_move_insn (tmp, constant_op);
4922
4923   if (CONSTANT_P (op1))
4924     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
4925   else
4926     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
4927
4928   emit_move_insn (target, new_rtx);
4929 }
4930
4931 void
4932 paired_expand_vector_move (rtx operands[])
4933 {
4934   rtx op0 = operands[0], op1 = operands[1];
4935
4936   emit_move_insn (op0, op1);
4937 }
4938
4939 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
4940    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
4941    operands for the relation operation COND.  This is a recursive
4942    function.  */
4943
4944 static void
4945 paired_emit_vector_compare (enum rtx_code rcode,
4946                             rtx dest, rtx op0, rtx op1,
4947                             rtx cc_op0, rtx cc_op1)
4948 {
4949   rtx tmp = gen_reg_rtx (V2SFmode);
4950   rtx tmp1, max, min;
4951
4952   gcc_assert (TARGET_PAIRED_FLOAT);
4953   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
4954
4955   switch (rcode)
4956     {
4957     case LT:
4958     case LTU:
4959       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4960       return;
4961     case GE:
4962     case GEU:
4963       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4964       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
4965       return;
4966     case LE:
4967     case LEU:
4968       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
4969       return;
4970     case GT:
4971       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4972       return;
4973     case EQ:
4974       tmp1 = gen_reg_rtx (V2SFmode);
4975       max = gen_reg_rtx (V2SFmode);
4976       min = gen_reg_rtx (V2SFmode);
4977       gen_reg_rtx (V2SFmode);
4978       
4979       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4980       emit_insn (gen_selv2sf4
4981                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4982       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
4983       emit_insn (gen_selv2sf4
4984                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4985       emit_insn (gen_subv2sf3 (tmp1, min, max));
4986       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
4987       return;
4988     case NE:
4989       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
4990       return;
4991     case UNLE:
4992       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4993       return;
4994     case UNLT:
4995       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
4996       return;
4997     case UNGE:
4998       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4999       return;
5000     case UNGT:
5001       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
5002       return;
5003     default:
5004       gcc_unreachable ();
5005     }
5006
5007   return;
5008 }
5009
5010 /* Emit vector conditional expression.
5011    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
5012    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
5013
5014 int
5015 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
5016                               rtx cond, rtx cc_op0, rtx cc_op1)
5017 {
5018   enum rtx_code rcode = GET_CODE (cond);
5019
5020   if (!TARGET_PAIRED_FLOAT)
5021     return 0;
5022
5023   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
5024
5025   return 1;
5026 }
5027
5028 /* Initialize vector TARGET to VALS.  */
5029
5030 void
5031 rs6000_expand_vector_init (rtx target, rtx vals)
5032 {
5033   enum machine_mode mode = GET_MODE (target);
5034   enum machine_mode inner_mode = GET_MODE_INNER (mode);
5035   int n_elts = GET_MODE_NUNITS (mode);
5036   int n_var = 0, one_var = -1;
5037   bool all_same = true, all_const_zero = true;
5038   rtx x, mem;
5039   int i;
5040
5041   for (i = 0; i < n_elts; ++i)
5042     {
5043       x = XVECEXP (vals, 0, i);
5044       if (!CONSTANT_P (x))
5045         ++n_var, one_var = i;
5046       else if (x != CONST0_RTX (inner_mode))
5047         all_const_zero = false;
5048
5049       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
5050         all_same = false;
5051     }
5052
5053   if (n_var == 0)
5054     {
5055       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
5056       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
5057       if ((int_vector_p || TARGET_VSX) && all_const_zero)
5058         {
5059           /* Zero register.  */
5060           emit_insn (gen_rtx_SET (VOIDmode, target,
5061                                   gen_rtx_XOR (mode, target, target)));
5062           return;
5063         }
5064       else if (int_vector_p && easy_vector_constant (const_vec, mode))
5065         {
5066           /* Splat immediate.  */
5067           emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
5068           return;
5069         }
5070       else
5071         {
5072           /* Load from constant pool.  */
5073           emit_move_insn (target, const_vec);
5074           return;
5075         }
5076     }
5077
5078   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
5079   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5080     {
5081       if (all_same)
5082         {
5083           rtx element = XVECEXP (vals, 0, 0);
5084           if (mode == V2DFmode)
5085             emit_insn (gen_vsx_splat_v2df (target, element));
5086           else
5087             emit_insn (gen_vsx_splat_v2di (target, element));
5088         }
5089       else
5090         {
5091           rtx op0 = copy_to_reg (XVECEXP (vals, 0, 0));
5092           rtx op1 = copy_to_reg (XVECEXP (vals, 0, 1));
5093           if (mode == V2DFmode)
5094             emit_insn (gen_vsx_concat_v2df (target, op0, op1));
5095           else
5096             emit_insn (gen_vsx_concat_v2di (target, op0, op1));
5097         }
5098       return;
5099     }
5100
5101   /* With single precision floating point on VSX, know that internally single
5102      precision is actually represented as a double, and either make 2 V2DF
5103      vectors, and convert these vectors to single precision, or do one
5104      conversion, and splat the result to the other elements.  */
5105   if (mode == V4SFmode && VECTOR_MEM_VSX_P (mode))
5106     {
5107       if (all_same)
5108         {
5109           rtx freg = gen_reg_rtx (V4SFmode);
5110           rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
5111
5112           emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
5113           emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
5114         }
5115       else
5116         {
5117           rtx dbl_even = gen_reg_rtx (V2DFmode);
5118           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
5119           rtx flt_even = gen_reg_rtx (V4SFmode);
5120           rtx flt_odd  = gen_reg_rtx (V4SFmode);
5121
5122           emit_insn (gen_vsx_concat_v2sf (dbl_even,
5123                                           copy_to_reg (XVECEXP (vals, 0, 0)),
5124                                           copy_to_reg (XVECEXP (vals, 0, 1))));
5125           emit_insn (gen_vsx_concat_v2sf (dbl_odd,
5126                                           copy_to_reg (XVECEXP (vals, 0, 2)),
5127                                           copy_to_reg (XVECEXP (vals, 0, 3))));
5128           emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
5129           emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
5130           emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
5131         }
5132       return;
5133     }
5134
5135   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
5136      of 64-bit items is not supported on Altivec.  */
5137   if (all_same && GET_MODE_SIZE (mode) <= 4)
5138     {
5139       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
5140       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
5141                       XVECEXP (vals, 0, 0));
5142       x = gen_rtx_UNSPEC (VOIDmode,
5143                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
5144       emit_insn (gen_rtx_PARALLEL (VOIDmode,
5145                                    gen_rtvec (2,
5146                                               gen_rtx_SET (VOIDmode,
5147                                                            target, mem),
5148                                               x)));
5149       x = gen_rtx_VEC_SELECT (inner_mode, target,
5150                               gen_rtx_PARALLEL (VOIDmode,
5151                                                 gen_rtvec (1, const0_rtx)));
5152       emit_insn (gen_rtx_SET (VOIDmode, target,
5153                               gen_rtx_VEC_DUPLICATE (mode, x)));
5154       return;
5155     }
5156
5157   /* One field is non-constant.  Load constant then overwrite
5158      varying field.  */
5159   if (n_var == 1)
5160     {
5161       rtx copy = copy_rtx (vals);
5162
5163       /* Load constant part of vector, substitute neighboring value for
5164          varying element.  */
5165       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
5166       rs6000_expand_vector_init (target, copy);
5167
5168       /* Insert variable.  */
5169       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
5170       return;
5171     }
5172
5173   /* Construct the vector in memory one field at a time
5174      and load the whole vector.  */
5175   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
5176   for (i = 0; i < n_elts; i++)
5177     emit_move_insn (adjust_address_nv (mem, inner_mode,
5178                                     i * GET_MODE_SIZE (inner_mode)),
5179                     XVECEXP (vals, 0, i));
5180   emit_move_insn (target, mem);
5181 }
5182
5183 /* Set field ELT of TARGET to VAL.  */
5184
5185 void
5186 rs6000_expand_vector_set (rtx target, rtx val, int elt)
5187 {
5188   enum machine_mode mode = GET_MODE (target);
5189   enum machine_mode inner_mode = GET_MODE_INNER (mode);
5190   rtx reg = gen_reg_rtx (mode);
5191   rtx mask, mem, x;
5192   int width = GET_MODE_SIZE (inner_mode);
5193   int i;
5194
5195   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5196     {
5197       rtx (*set_func) (rtx, rtx, rtx, rtx)
5198         = ((mode == V2DFmode) ? gen_vsx_set_v2df : gen_vsx_set_v2di);
5199       emit_insn (set_func (target, target, val, GEN_INT (elt)));
5200       return;
5201     }
5202
5203   /* Load single variable value.  */
5204   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
5205   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
5206   x = gen_rtx_UNSPEC (VOIDmode,
5207                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
5208   emit_insn (gen_rtx_PARALLEL (VOIDmode,
5209                                gen_rtvec (2,
5210                                           gen_rtx_SET (VOIDmode,
5211                                                        reg, mem),
5212                                           x)));
5213
5214   /* Linear sequence.  */
5215   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
5216   for (i = 0; i < 16; ++i)
5217     XVECEXP (mask, 0, i) = GEN_INT (i);
5218
5219   /* Set permute mask to insert element into target.  */
5220   for (i = 0; i < width; ++i)
5221     XVECEXP (mask, 0, elt*width + i)
5222       = GEN_INT (i + 0x10);
5223   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
5224   x = gen_rtx_UNSPEC (mode,
5225                       gen_rtvec (3, target, reg,
5226                                  force_reg (V16QImode, x)),
5227                       UNSPEC_VPERM);
5228   emit_insn (gen_rtx_SET (VOIDmode, target, x));
5229 }
5230
5231 /* Extract field ELT from VEC into TARGET.  */
5232
5233 void
5234 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
5235 {
5236   enum machine_mode mode = GET_MODE (vec);
5237   enum machine_mode inner_mode = GET_MODE_INNER (mode);
5238   rtx mem, x;
5239
5240   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5241     {
5242       rtx (*extract_func) (rtx, rtx, rtx)
5243         = ((mode == V2DFmode) ? gen_vsx_extract_v2df : gen_vsx_extract_v2di);
5244       emit_insn (extract_func (target, vec, GEN_INT (elt)));
5245       return;
5246     }
5247
5248   /* Allocate mode-sized buffer.  */
5249   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
5250
5251   /* Add offset to field within buffer matching vector element.  */
5252   mem = adjust_address_nv (mem, mode, elt * GET_MODE_SIZE (inner_mode));
5253
5254   /* Store single field into mode-sized buffer.  */
5255   x = gen_rtx_UNSPEC (VOIDmode,
5256                       gen_rtvec (1, const0_rtx), UNSPEC_STVE);
5257   emit_insn (gen_rtx_PARALLEL (VOIDmode,
5258                                gen_rtvec (2,
5259                                           gen_rtx_SET (VOIDmode,
5260                                                        mem, vec),
5261                                           x)));
5262   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
5263 }
5264
5265 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
5266    implement ANDing by the mask IN.  */
5267 void
5268 build_mask64_2_operands (rtx in, rtx *out)
5269 {
5270 #if HOST_BITS_PER_WIDE_INT >= 64
5271   unsigned HOST_WIDE_INT c, lsb, m1, m2;
5272   int shift;
5273
5274   gcc_assert (GET_CODE (in) == CONST_INT);
5275
5276   c = INTVAL (in);
5277   if (c & 1)
5278     {
5279       /* Assume c initially something like 0x00fff000000fffff.  The idea
5280          is to rotate the word so that the middle ^^^^^^ group of zeros
5281          is at the MS end and can be cleared with an rldicl mask.  We then
5282          rotate back and clear off the MS    ^^ group of zeros with a
5283          second rldicl.  */
5284       c = ~c;                   /*   c == 0xff000ffffff00000 */
5285       lsb = c & -c;             /* lsb == 0x0000000000100000 */
5286       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
5287       c = ~c;                   /*   c == 0x00fff000000fffff */
5288       c &= -lsb;                /*   c == 0x00fff00000000000 */
5289       lsb = c & -c;             /* lsb == 0x0000100000000000 */
5290       c = ~c;                   /*   c == 0xff000fffffffffff */
5291       c &= -lsb;                /*   c == 0xff00000000000000 */
5292       shift = 0;
5293       while ((lsb >>= 1) != 0)
5294         shift++;                /* shift == 44 on exit from loop */
5295       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
5296       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
5297       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
5298     }
5299   else
5300     {
5301       /* Assume c initially something like 0xff000f0000000000.  The idea
5302          is to rotate the word so that the     ^^^  middle group of zeros
5303          is at the LS end and can be cleared with an rldicr mask.  We then
5304          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
5305          a second rldicr.  */
5306       lsb = c & -c;             /* lsb == 0x0000010000000000 */
5307       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
5308       c = ~c;                   /*   c == 0x00fff0ffffffffff */
5309       c &= -lsb;                /*   c == 0x00fff00000000000 */
5310       lsb = c & -c;             /* lsb == 0x0000100000000000 */
5311       c = ~c;                   /*   c == 0xff000fffffffffff */
5312       c &= -lsb;                /*   c == 0xff00000000000000 */
5313       shift = 0;
5314       while ((lsb >>= 1) != 0)
5315         shift++;                /* shift == 44 on exit from loop */
5316       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
5317       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
5318       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
5319     }
5320
5321   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
5322      masks will be all 1's.  We are guaranteed more than one transition.  */
5323   out[0] = GEN_INT (64 - shift);
5324   out[1] = GEN_INT (m1);
5325   out[2] = GEN_INT (shift);
5326   out[3] = GEN_INT (m2);
5327 #else
5328   (void)in;
5329   (void)out;
5330   gcc_unreachable ();
5331 #endif
5332 }
5333
5334 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
5335
5336 bool
5337 invalid_e500_subreg (rtx op, enum machine_mode mode)
5338 {
5339   if (TARGET_E500_DOUBLE)
5340     {
5341       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
5342          subreg:TI and reg:TF.  Decimal float modes are like integer
5343          modes (only low part of each register used) for this
5344          purpose.  */
5345       if (GET_CODE (op) == SUBREG
5346           && (mode == SImode || mode == DImode || mode == TImode
5347               || mode == DDmode || mode == TDmode)
5348           && REG_P (SUBREG_REG (op))
5349           && (GET_MODE (SUBREG_REG (op)) == DFmode
5350               || GET_MODE (SUBREG_REG (op)) == TFmode))
5351         return true;
5352
5353       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
5354          reg:TI.  */
5355       if (GET_CODE (op) == SUBREG
5356           && (mode == DFmode || mode == TFmode)
5357           && REG_P (SUBREG_REG (op))
5358           && (GET_MODE (SUBREG_REG (op)) == DImode
5359               || GET_MODE (SUBREG_REG (op)) == TImode
5360               || GET_MODE (SUBREG_REG (op)) == DDmode
5361               || GET_MODE (SUBREG_REG (op)) == TDmode))
5362         return true;
5363     }
5364
5365   if (TARGET_SPE
5366       && GET_CODE (op) == SUBREG
5367       && mode == SImode
5368       && REG_P (SUBREG_REG (op))
5369       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
5370     return true;
5371
5372   return false;
5373 }
5374
5375 /* AIX increases natural record alignment to doubleword if the first
5376    field is an FP double while the FP fields remain word aligned.  */
5377
5378 unsigned int
5379 rs6000_special_round_type_align (tree type, unsigned int computed,
5380                                  unsigned int specified)
5381 {
5382   unsigned int align = MAX (computed, specified);
5383   tree field = TYPE_FIELDS (type);
5384
5385   /* Skip all non field decls */
5386   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5387     field = DECL_CHAIN (field);
5388
5389   if (field != NULL && field != type)
5390     {
5391       type = TREE_TYPE (field);
5392       while (TREE_CODE (type) == ARRAY_TYPE)
5393         type = TREE_TYPE (type);
5394
5395       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
5396         align = MAX (align, 64);
5397     }
5398
5399   return align;
5400 }
5401
5402 /* Darwin increases record alignment to the natural alignment of
5403    the first field.  */
5404
5405 unsigned int
5406 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
5407                                         unsigned int specified)
5408 {
5409   unsigned int align = MAX (computed, specified);
5410
5411   if (TYPE_PACKED (type))
5412     return align;
5413
5414   /* Find the first field, looking down into aggregates.  */
5415   do {
5416     tree field = TYPE_FIELDS (type);
5417     /* Skip all non field decls */
5418     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5419       field = DECL_CHAIN (field);
5420     if (! field)
5421       break;
5422     /* A packed field does not contribute any extra alignment.  */
5423     if (DECL_PACKED (field))
5424       return align;
5425     type = TREE_TYPE (field);
5426     while (TREE_CODE (type) == ARRAY_TYPE)
5427       type = TREE_TYPE (type);
5428   } while (AGGREGATE_TYPE_P (type));
5429
5430   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
5431     align = MAX (align, TYPE_ALIGN (type));
5432
5433   return align;
5434 }
5435
5436 /* Return 1 for an operand in small memory on V.4/eabi.  */
5437
5438 int
5439 small_data_operand (rtx op ATTRIBUTE_UNUSED,
5440                     enum machine_mode mode ATTRIBUTE_UNUSED)
5441 {
5442 #if TARGET_ELF
5443   rtx sym_ref;
5444
5445   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
5446     return 0;
5447
5448   if (DEFAULT_ABI != ABI_V4)
5449     return 0;
5450
5451   /* Vector and float memory instructions have a limited offset on the
5452      SPE, so using a vector or float variable directly as an operand is
5453      not useful.  */
5454   if (TARGET_SPE
5455       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
5456     return 0;
5457
5458   if (GET_CODE (op) == SYMBOL_REF)
5459     sym_ref = op;
5460
5461   else if (GET_CODE (op) != CONST
5462            || GET_CODE (XEXP (op, 0)) != PLUS
5463            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
5464            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
5465     return 0;
5466
5467   else
5468     {
5469       rtx sum = XEXP (op, 0);
5470       HOST_WIDE_INT summand;
5471
5472       /* We have to be careful here, because it is the referenced address
5473          that must be 32k from _SDA_BASE_, not just the symbol.  */
5474       summand = INTVAL (XEXP (sum, 1));
5475       if (summand < 0 || summand > g_switch_value)
5476         return 0;
5477
5478       sym_ref = XEXP (sum, 0);
5479     }
5480
5481   return SYMBOL_REF_SMALL_P (sym_ref);
5482 #else
5483   return 0;
5484 #endif
5485 }
5486
5487 /* Return true if either operand is a general purpose register.  */
5488
5489 bool
5490 gpr_or_gpr_p (rtx op0, rtx op1)
5491 {
5492   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
5493           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
5494 }
5495
5496 \f
5497 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
5498
5499 static bool
5500 reg_offset_addressing_ok_p (enum machine_mode mode)
5501 {
5502   switch (mode)
5503     {
5504     case V16QImode:
5505     case V8HImode:
5506     case V4SFmode:
5507     case V4SImode:
5508     case V2DFmode:
5509     case V2DImode:
5510       /* AltiVec/VSX vector modes.  Only reg+reg addressing is valid.  */
5511       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
5512         return false;
5513       break;
5514
5515     case V4HImode:
5516     case V2SImode:
5517     case V1DImode:
5518     case V2SFmode:
5519        /* Paired vector modes.  Only reg+reg addressing is valid.  */
5520       if (TARGET_PAIRED_FLOAT)
5521         return false;
5522       break;
5523
5524     default:
5525       break;
5526     }
5527
5528   return true;
5529 }
5530
5531 static bool
5532 virtual_stack_registers_memory_p (rtx op)
5533 {
5534   int regnum;
5535
5536   if (GET_CODE (op) == REG)
5537     regnum = REGNO (op);
5538
5539   else if (GET_CODE (op) == PLUS
5540            && GET_CODE (XEXP (op, 0)) == REG
5541            && GET_CODE (XEXP (op, 1)) == CONST_INT)
5542     regnum = REGNO (XEXP (op, 0));
5543
5544   else
5545     return false;
5546
5547   return (regnum >= FIRST_VIRTUAL_REGISTER
5548           && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
5549 }
5550
5551 static bool
5552 constant_pool_expr_p (rtx op)
5553 {
5554   rtx base, offset;
5555
5556   split_const (op, &base, &offset);
5557   return (GET_CODE (base) == SYMBOL_REF
5558           && CONSTANT_POOL_ADDRESS_P (base)
5559           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
5560 }
5561
5562 static rtx tocrel_base, tocrel_offset;
5563
5564 bool
5565 toc_relative_expr_p (rtx op)
5566 {
5567   if (GET_CODE (op) != CONST)
5568     return false;
5569
5570   split_const (op, &tocrel_base, &tocrel_offset);
5571   return (GET_CODE (tocrel_base) == UNSPEC
5572           && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
5573 }
5574
5575 bool
5576 legitimate_constant_pool_address_p (const_rtx x, bool strict)
5577 {
5578   return (TARGET_TOC
5579           && (GET_CODE (x) == PLUS || GET_CODE (x) == LO_SUM)
5580           && GET_CODE (XEXP (x, 0)) == REG
5581           && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5582               || ((TARGET_MINIMAL_TOC
5583                    || TARGET_CMODEL != CMODEL_SMALL)
5584                   && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict)))
5585           && toc_relative_expr_p (XEXP (x, 1)));
5586 }
5587
5588 static bool
5589 legitimate_small_data_p (enum machine_mode mode, rtx x)
5590 {
5591   return (DEFAULT_ABI == ABI_V4
5592           && !flag_pic && !TARGET_TOC
5593           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
5594           && small_data_operand (x, mode));
5595 }
5596
5597 /* SPE offset addressing is limited to 5-bits worth of double words.  */
5598 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
5599
5600 bool
5601 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
5602 {
5603   unsigned HOST_WIDE_INT offset, extra;
5604
5605   if (GET_CODE (x) != PLUS)
5606     return false;
5607   if (GET_CODE (XEXP (x, 0)) != REG)
5608     return false;
5609   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5610     return false;
5611   if (!reg_offset_addressing_ok_p (mode))
5612     return virtual_stack_registers_memory_p (x);
5613   if (legitimate_constant_pool_address_p (x, strict))
5614     return true;
5615   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5616     return false;
5617
5618   offset = INTVAL (XEXP (x, 1));
5619   extra = 0;
5620   switch (mode)
5621     {
5622     case V4HImode:
5623     case V2SImode:
5624     case V1DImode:
5625     case V2SFmode:
5626       /* SPE vector modes.  */
5627       return SPE_CONST_OFFSET_OK (offset);
5628
5629     case DFmode:
5630       if (TARGET_E500_DOUBLE)
5631         return SPE_CONST_OFFSET_OK (offset);
5632
5633       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
5634          addressing.  */
5635       if (VECTOR_MEM_VSX_P (DFmode))
5636         return false;
5637
5638     case DDmode:
5639     case DImode:
5640       /* On e500v2, we may have:
5641
5642            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
5643
5644          Which gets addressed with evldd instructions.  */
5645       if (TARGET_E500_DOUBLE)
5646         return SPE_CONST_OFFSET_OK (offset);
5647
5648       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
5649         extra = 4;
5650       else if (offset & 3)
5651         return false;
5652       break;
5653
5654     case TFmode:
5655       if (TARGET_E500_DOUBLE)
5656         return (SPE_CONST_OFFSET_OK (offset)
5657                 && SPE_CONST_OFFSET_OK (offset + 8));
5658
5659     case TDmode:
5660     case TImode:
5661       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
5662         extra = 12;
5663       else if (offset & 3)
5664         return false;
5665       else
5666         extra = 8;
5667       break;
5668
5669     default:
5670       break;
5671     }
5672
5673   offset += 0x8000;
5674   return (offset < 0x10000) && (offset + extra < 0x10000);
5675 }
5676
5677 bool
5678 legitimate_indexed_address_p (rtx x, int strict)
5679 {
5680   rtx op0, op1;
5681
5682   if (GET_CODE (x) != PLUS)
5683     return false;
5684
5685   op0 = XEXP (x, 0);
5686   op1 = XEXP (x, 1);
5687
5688   /* Recognize the rtl generated by reload which we know will later be
5689      replaced with proper base and index regs.  */
5690   if (!strict
5691       && reload_in_progress
5692       && (REG_P (op0) || GET_CODE (op0) == PLUS)
5693       && REG_P (op1))
5694     return true;
5695
5696   return (REG_P (op0) && REG_P (op1)
5697           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
5698                && INT_REG_OK_FOR_INDEX_P (op1, strict))
5699               || (INT_REG_OK_FOR_BASE_P (op1, strict)
5700                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
5701 }
5702
5703 bool
5704 avoiding_indexed_address_p (enum machine_mode mode)
5705 {
5706   /* Avoid indexed addressing for modes that have non-indexed
5707      load/store instruction forms.  */
5708   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
5709 }
5710
5711 inline bool
5712 legitimate_indirect_address_p (rtx x, int strict)
5713 {
5714   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
5715 }
5716
5717 bool
5718 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
5719 {
5720   if (!TARGET_MACHO || !flag_pic
5721       || mode != SImode || GET_CODE (x) != MEM)
5722     return false;
5723   x = XEXP (x, 0);
5724
5725   if (GET_CODE (x) != LO_SUM)
5726     return false;
5727   if (GET_CODE (XEXP (x, 0)) != REG)
5728     return false;
5729   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
5730     return false;
5731   x = XEXP (x, 1);
5732
5733   return CONSTANT_P (x);
5734 }
5735
5736 static bool
5737 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
5738 {
5739   if (GET_CODE (x) != LO_SUM)
5740     return false;
5741   if (GET_CODE (XEXP (x, 0)) != REG)
5742     return false;
5743   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5744     return false;
5745   /* Restrict addressing for DI because of our SUBREG hackery.  */
5746   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5747                              || mode == DDmode || mode == TDmode
5748                              || mode == DImode))
5749     return false;
5750   x = XEXP (x, 1);
5751
5752   if (TARGET_ELF || TARGET_MACHO)
5753     {
5754       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
5755         return false;
5756       if (TARGET_TOC)
5757         return false;
5758       if (GET_MODE_NUNITS (mode) != 1)
5759         return false;
5760       if (GET_MODE_BITSIZE (mode) > 64
5761           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
5762               && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
5763                    && (mode == DFmode || mode == DDmode))))
5764         return false;
5765
5766       return CONSTANT_P (x);
5767     }
5768
5769   return false;
5770 }
5771
5772
5773 /* Try machine-dependent ways of modifying an illegitimate address
5774    to be legitimate.  If we find one, return the new, valid address.
5775    This is used from only one place: `memory_address' in explow.c.
5776
5777    OLDX is the address as it was before break_out_memory_refs was
5778    called.  In some cases it is useful to look at this to decide what
5779    needs to be done.
5780
5781    It is always safe for this function to do nothing.  It exists to
5782    recognize opportunities to optimize the output.
5783
5784    On RS/6000, first check for the sum of a register with a constant
5785    integer that is out of range.  If so, generate code to add the
5786    constant with the low-order 16 bits masked to the register and force
5787    this result into another register (this can be done with `cau').
5788    Then generate an address of REG+(CONST&0xffff), allowing for the
5789    possibility of bit 16 being a one.
5790
5791    Then check for the sum of a register and something not constant, try to
5792    load the other things into a register and return the sum.  */
5793
5794 static rtx
5795 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
5796                            enum machine_mode mode)
5797 {
5798   unsigned int extra = 0;
5799
5800   if (!reg_offset_addressing_ok_p (mode))
5801     {
5802       if (virtual_stack_registers_memory_p (x))
5803         return x;
5804
5805       /* In theory we should not be seeing addresses of the form reg+0,
5806          but just in case it is generated, optimize it away.  */
5807       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
5808         return force_reg (Pmode, XEXP (x, 0));
5809
5810       /* Make sure both operands are registers.  */
5811       else if (GET_CODE (x) == PLUS)
5812         return gen_rtx_PLUS (Pmode,
5813                              force_reg (Pmode, XEXP (x, 0)),
5814                              force_reg (Pmode, XEXP (x, 1)));
5815       else
5816         return force_reg (Pmode, x);
5817     }
5818   if (GET_CODE (x) == SYMBOL_REF)
5819     {
5820       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
5821       if (model != 0)
5822         return rs6000_legitimize_tls_address (x, model);
5823     }
5824
5825   switch (mode)
5826     {
5827     case DFmode:
5828     case DDmode:
5829       extra = 4;
5830       break;
5831     case DImode:
5832       if (!TARGET_POWERPC64)
5833         extra = 4;
5834       break;
5835     case TFmode:
5836     case TDmode:
5837       extra = 12;
5838       break;
5839     case TImode:
5840       extra = TARGET_POWERPC64 ? 8 : 12;
5841       break;
5842     default:
5843       break;
5844     }
5845
5846   if (GET_CODE (x) == PLUS
5847       && GET_CODE (XEXP (x, 0)) == REG
5848       && GET_CODE (XEXP (x, 1)) == CONST_INT
5849       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
5850           >= 0x10000 - extra)
5851       && !((TARGET_POWERPC64
5852             && (mode == DImode || mode == TImode)
5853             && (INTVAL (XEXP (x, 1)) & 3) != 0)
5854            || SPE_VECTOR_MODE (mode)
5855            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5856                                       || mode == DImode || mode == DDmode
5857                                       || mode == TDmode))))
5858     {
5859       HOST_WIDE_INT high_int, low_int;
5860       rtx sum;
5861       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
5862       if (low_int >= 0x8000 - extra)
5863         low_int = 0;
5864       high_int = INTVAL (XEXP (x, 1)) - low_int;
5865       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
5866                                          GEN_INT (high_int)), 0);
5867       return plus_constant (sum, low_int);
5868     }
5869   else if (GET_CODE (x) == PLUS
5870            && GET_CODE (XEXP (x, 0)) == REG
5871            && GET_CODE (XEXP (x, 1)) != CONST_INT
5872            && GET_MODE_NUNITS (mode) == 1
5873            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5874                || TARGET_POWERPC64
5875                || ((mode != DImode && mode != DFmode && mode != DDmode)
5876                    || (TARGET_E500_DOUBLE && mode != DDmode)))
5877            && (TARGET_POWERPC64 || mode != DImode)
5878            && !avoiding_indexed_address_p (mode)
5879            && mode != TImode
5880            && mode != TFmode
5881            && mode != TDmode)
5882     {
5883       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
5884                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
5885     }
5886   else if (SPE_VECTOR_MODE (mode)
5887            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5888                                       || mode == DDmode || mode == TDmode
5889                                       || mode == DImode)))
5890     {
5891       if (mode == DImode)
5892         return x;
5893       /* We accept [reg + reg] and [reg + OFFSET].  */
5894
5895       if (GET_CODE (x) == PLUS)
5896        {
5897          rtx op1 = XEXP (x, 0);
5898          rtx op2 = XEXP (x, 1);
5899          rtx y;
5900
5901          op1 = force_reg (Pmode, op1);
5902
5903          if (GET_CODE (op2) != REG
5904              && (GET_CODE (op2) != CONST_INT
5905                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
5906                  || (GET_MODE_SIZE (mode) > 8
5907                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
5908            op2 = force_reg (Pmode, op2);
5909
5910          /* We can't always do [reg + reg] for these, because [reg +
5911             reg + offset] is not a legitimate addressing mode.  */
5912          y = gen_rtx_PLUS (Pmode, op1, op2);
5913
5914          if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
5915            return force_reg (Pmode, y);
5916          else
5917            return y;
5918        }
5919
5920       return force_reg (Pmode, x);
5921     }
5922   else if (TARGET_ELF
5923            && TARGET_32BIT
5924            && TARGET_NO_TOC
5925            && ! flag_pic
5926            && GET_CODE (x) != CONST_INT
5927            && GET_CODE (x) != CONST_DOUBLE
5928            && CONSTANT_P (x)
5929            && GET_MODE_NUNITS (mode) == 1
5930            && (GET_MODE_BITSIZE (mode) <= 32
5931                || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5932                    && (mode == DFmode || mode == DDmode))))
5933     {
5934       rtx reg = gen_reg_rtx (Pmode);
5935       emit_insn (gen_elf_high (reg, x));
5936       return gen_rtx_LO_SUM (Pmode, reg, x);
5937     }
5938   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
5939            && ! flag_pic
5940 #if TARGET_MACHO
5941            && ! MACHO_DYNAMIC_NO_PIC_P
5942 #endif
5943            && GET_CODE (x) != CONST_INT
5944            && GET_CODE (x) != CONST_DOUBLE
5945            && CONSTANT_P (x)
5946            && GET_MODE_NUNITS (mode) == 1
5947            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5948                || (mode != DFmode && mode != DDmode))
5949            && mode != DImode
5950            && mode != TImode)
5951     {
5952       rtx reg = gen_reg_rtx (Pmode);
5953       emit_insn (gen_macho_high (reg, x));
5954       return gen_rtx_LO_SUM (Pmode, reg, x);
5955     }
5956   else if (TARGET_TOC
5957            && GET_CODE (x) == SYMBOL_REF
5958            && constant_pool_expr_p (x)
5959            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
5960     {
5961       rtx reg = TARGET_CMODEL != CMODEL_SMALL ? gen_reg_rtx (Pmode) : NULL_RTX;
5962       return create_TOC_reference (x, reg);
5963     }
5964   else
5965     return x;
5966 }
5967
5968 /* Debug version of rs6000_legitimize_address.  */
5969 static rtx
5970 rs6000_debug_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
5971 {
5972   rtx ret;
5973   rtx insns;
5974
5975   start_sequence ();
5976   ret = rs6000_legitimize_address (x, oldx, mode);
5977   insns = get_insns ();
5978   end_sequence ();
5979
5980   if (ret != x)
5981     {
5982       fprintf (stderr,
5983                "\nrs6000_legitimize_address: mode %s, old code %s, "
5984                "new code %s, modified\n",
5985                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
5986                GET_RTX_NAME (GET_CODE (ret)));
5987
5988       fprintf (stderr, "Original address:\n");
5989       debug_rtx (x);
5990
5991       fprintf (stderr, "oldx:\n");
5992       debug_rtx (oldx);
5993
5994       fprintf (stderr, "New address:\n");
5995       debug_rtx (ret);
5996
5997       if (insns)
5998         {
5999           fprintf (stderr, "Insns added:\n");
6000           debug_rtx_list (insns, 20);
6001         }
6002     }
6003   else
6004     {
6005       fprintf (stderr,
6006                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
6007                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
6008
6009       debug_rtx (x);
6010     }
6011
6012   if (insns)
6013     emit_insn (insns);
6014
6015   return ret;
6016 }
6017
6018 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
6019    We need to emit DTP-relative relocations.  */
6020
6021 static void
6022 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
6023 {
6024   switch (size)
6025     {
6026     case 4:
6027       fputs ("\t.long\t", file);
6028       break;
6029     case 8:
6030       fputs (DOUBLE_INT_ASM_OP, file);
6031       break;
6032     default:
6033       gcc_unreachable ();
6034     }
6035   output_addr_const (file, x);
6036   fputs ("@dtprel+0x8000", file);
6037 }
6038
6039 /* In the name of slightly smaller debug output, and to cater to
6040    general assembler lossage, recognize various UNSPEC sequences
6041    and turn them back into a direct symbol reference.  */
6042
6043 static rtx
6044 rs6000_delegitimize_address (rtx orig_x)
6045 {
6046   rtx x, y;
6047
6048   orig_x = delegitimize_mem_from_attrs (orig_x);
6049   x = orig_x;
6050   if (MEM_P (x))
6051     x = XEXP (x, 0);
6052
6053   if ((GET_CODE (x) == PLUS
6054        || GET_CODE (x) == LO_SUM)
6055       && GET_CODE (XEXP (x, 0)) == REG
6056       && (REGNO (XEXP (x, 0)) == TOC_REGISTER
6057           || TARGET_MINIMAL_TOC
6058           || TARGET_CMODEL != CMODEL_SMALL)
6059       && GET_CODE (XEXP (x, 1)) == CONST)
6060     {
6061       y = XEXP (XEXP (x, 1), 0);
6062       if (GET_CODE (y) == UNSPEC
6063           && XINT (y, 1) == UNSPEC_TOCREL)
6064         {
6065           y = XVECEXP (y, 0, 0);
6066           if (!MEM_P (orig_x))
6067             return y;
6068           else
6069             return replace_equiv_address_nv (orig_x, y);
6070         }
6071     }
6072
6073   if (TARGET_MACHO
6074       && GET_CODE (orig_x) == LO_SUM
6075       && GET_CODE (XEXP (x, 1)) == CONST)
6076     {
6077       y = XEXP (XEXP (x, 1), 0);
6078       if (GET_CODE (y) == UNSPEC
6079           && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
6080         return XVECEXP (y, 0, 0);
6081     }
6082
6083   return orig_x;
6084 }
6085
6086 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
6087
6088 static GTY(()) rtx rs6000_tls_symbol;
6089 static rtx
6090 rs6000_tls_get_addr (void)
6091 {
6092   if (!rs6000_tls_symbol)
6093     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
6094
6095   return rs6000_tls_symbol;
6096 }
6097
6098 /* Construct the SYMBOL_REF for TLS GOT references.  */
6099
6100 static GTY(()) rtx rs6000_got_symbol;
6101 static rtx
6102 rs6000_got_sym (void)
6103 {
6104   if (!rs6000_got_symbol)
6105     {
6106       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
6107       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
6108       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
6109     }
6110
6111   return rs6000_got_symbol;
6112 }
6113
6114 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
6115    this (thread-local) address.  */
6116
6117 static rtx
6118 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
6119 {
6120   rtx dest, insn;
6121
6122   dest = gen_reg_rtx (Pmode);
6123   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
6124     {
6125       rtx tlsreg;
6126
6127       if (TARGET_64BIT)
6128         {
6129           tlsreg = gen_rtx_REG (Pmode, 13);
6130           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
6131         }
6132       else
6133         {
6134           tlsreg = gen_rtx_REG (Pmode, 2);
6135           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
6136         }
6137       emit_insn (insn);
6138     }
6139   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
6140     {
6141       rtx tlsreg, tmp;
6142
6143       tmp = gen_reg_rtx (Pmode);
6144       if (TARGET_64BIT)
6145         {
6146           tlsreg = gen_rtx_REG (Pmode, 13);
6147           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
6148         }
6149       else
6150         {
6151           tlsreg = gen_rtx_REG (Pmode, 2);
6152           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
6153         }
6154       emit_insn (insn);
6155       if (TARGET_64BIT)
6156         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
6157       else
6158         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
6159       emit_insn (insn);
6160     }
6161   else
6162     {
6163       rtx r3, got, tga, tmp1, tmp2, call_insn;
6164
6165       /* We currently use relocations like @got@tlsgd for tls, which
6166          means the linker will handle allocation of tls entries, placing
6167          them in the .got section.  So use a pointer to the .got section,
6168          not one to secondary TOC sections used by 64-bit -mminimal-toc,
6169          or to secondary GOT sections used by 32-bit -fPIC.  */
6170       if (TARGET_64BIT)
6171         got = gen_rtx_REG (Pmode, 2);
6172       else
6173         {
6174           if (flag_pic == 1)
6175             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
6176           else
6177             {
6178               rtx gsym = rs6000_got_sym ();
6179               got = gen_reg_rtx (Pmode);
6180               if (flag_pic == 0)
6181                 rs6000_emit_move (got, gsym, Pmode);
6182               else
6183                 {
6184                   rtx mem, lab, last;
6185
6186                   tmp1 = gen_reg_rtx (Pmode);
6187                   tmp2 = gen_reg_rtx (Pmode);
6188                   mem = gen_const_mem (Pmode, tmp1);
6189                   lab = gen_label_rtx ();
6190                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
6191                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
6192                   emit_move_insn (tmp2, mem);
6193                   last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
6194                   set_unique_reg_note (last, REG_EQUAL, gsym);
6195                 }
6196             }
6197         }
6198
6199       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
6200         {
6201           r3 = gen_rtx_REG (Pmode, 3);
6202           tga = rs6000_tls_get_addr ();
6203           emit_library_call_value (tga, dest, LCT_CONST, Pmode, 1, r3, Pmode);
6204
6205           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
6206             insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
6207           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
6208             insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
6209           else if (DEFAULT_ABI == ABI_V4)
6210             insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
6211           else
6212             gcc_unreachable ();
6213           call_insn = last_call_insn ();
6214           PATTERN (call_insn) = insn;
6215           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
6216             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
6217                      pic_offset_table_rtx);
6218         }
6219       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
6220         {
6221           r3 = gen_rtx_REG (Pmode, 3);
6222           tga = rs6000_tls_get_addr ();
6223           tmp1 = gen_reg_rtx (Pmode);
6224           emit_library_call_value (tga, tmp1, LCT_CONST, Pmode, 1, r3, Pmode);
6225
6226           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
6227             insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
6228           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
6229             insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
6230           else if (DEFAULT_ABI == ABI_V4)
6231             insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
6232           else
6233             gcc_unreachable ();
6234           call_insn = last_call_insn ();
6235           PATTERN (call_insn) = insn;
6236           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
6237             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
6238                      pic_offset_table_rtx);
6239
6240           if (rs6000_tls_size == 16)
6241             {
6242               if (TARGET_64BIT)
6243                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
6244               else
6245                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
6246             }
6247           else if (rs6000_tls_size == 32)
6248             {
6249               tmp2 = gen_reg_rtx (Pmode);
6250               if (TARGET_64BIT)
6251                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
6252               else
6253                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
6254               emit_insn (insn);
6255               if (TARGET_64BIT)
6256                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
6257               else
6258                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
6259             }
6260           else
6261             {
6262               tmp2 = gen_reg_rtx (Pmode);
6263               if (TARGET_64BIT)
6264                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
6265               else
6266                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
6267               emit_insn (insn);
6268               insn = gen_rtx_SET (Pmode, dest,
6269                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
6270             }
6271           emit_insn (insn);
6272         }
6273       else
6274         {
6275           /* IE, or 64-bit offset LE.  */
6276           tmp2 = gen_reg_rtx (Pmode);
6277           if (TARGET_64BIT)
6278             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
6279           else
6280             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
6281           emit_insn (insn);
6282           if (TARGET_64BIT)
6283             insn = gen_tls_tls_64 (dest, tmp2, addr);
6284           else
6285             insn = gen_tls_tls_32 (dest, tmp2, addr);
6286           emit_insn (insn);
6287         }
6288     }
6289
6290   return dest;
6291 }
6292
6293 /* Return 1 if X contains a thread-local symbol.  */
6294
6295 bool
6296 rs6000_tls_referenced_p (rtx x)
6297 {
6298   if (! TARGET_HAVE_TLS)
6299     return false;
6300
6301   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
6302 }
6303
6304 /* Return 1 if *X is a thread-local symbol.  This is the same as
6305    rs6000_tls_symbol_ref except for the type of the unused argument.  */
6306
6307 static int
6308 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
6309 {
6310   return RS6000_SYMBOL_REF_TLS_P (*x);
6311 }
6312
6313 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
6314    replace the input X, or the original X if no replacement is called for.
6315    The output parameter *WIN is 1 if the calling macro should goto WIN,
6316    0 if it should not.
6317
6318    For RS/6000, we wish to handle large displacements off a base
6319    register by splitting the addend across an addiu/addis and the mem insn.
6320    This cuts number of extra insns needed from 3 to 1.
6321
6322    On Darwin, we use this to generate code for floating point constants.
6323    A movsf_low is generated so we wind up with 2 instructions rather than 3.
6324    The Darwin code is inside #if TARGET_MACHO because only then are the
6325    machopic_* functions defined.  */
6326 static rtx
6327 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
6328                                   int opnum, int type,
6329                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
6330 {
6331   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6332
6333   /* We must recognize output that we have already generated ourselves.  */
6334   if (GET_CODE (x) == PLUS
6335       && GET_CODE (XEXP (x, 0)) == PLUS
6336       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6337       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6338       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6339     {
6340       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6341                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6342                    opnum, (enum reload_type)type);
6343       *win = 1;
6344       return x;
6345     }
6346
6347   /* Likewise for (lo_sum (high ...) ...) output we have generated.  */
6348   if (GET_CODE (x) == LO_SUM
6349       && GET_CODE (XEXP (x, 0)) == HIGH)
6350     {
6351       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6352                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6353                    opnum, (enum reload_type)type);
6354       *win = 1;
6355       return x;
6356     }
6357
6358 #if TARGET_MACHO
6359   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
6360       && GET_CODE (x) == LO_SUM
6361       && GET_CODE (XEXP (x, 0)) == PLUS
6362       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
6363       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6364       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
6365       && machopic_operand_p (XEXP (x, 1)))
6366     {
6367       /* Result of previous invocation of this function on Darwin
6368          floating point constant.  */
6369       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6370                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6371                    opnum, (enum reload_type)type);
6372       *win = 1;
6373       return x;
6374     }
6375 #endif
6376
6377   if (TARGET_CMODEL != CMODEL_SMALL
6378       && GET_CODE (x) == LO_SUM
6379       && GET_CODE (XEXP (x, 0)) == PLUS
6380       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6381       && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6382       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6383       && GET_CODE (XEXP (x, 1)) == CONST
6384       && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
6385       && XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_TOCREL
6386       && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 1), 0), XEXP (x, 1)))
6387     {
6388       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6389                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6390                    opnum, (enum reload_type) type);
6391       *win = 1;
6392       return x;
6393     }
6394
6395   /* Force ld/std non-word aligned offset into base register by wrapping
6396      in offset 0.  */
6397   if (GET_CODE (x) == PLUS
6398       && GET_CODE (XEXP (x, 0)) == REG
6399       && REGNO (XEXP (x, 0)) < 32
6400       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6401       && GET_CODE (XEXP (x, 1)) == CONST_INT
6402       && reg_offset_p
6403       && (INTVAL (XEXP (x, 1)) & 3) != 0
6404       && VECTOR_MEM_NONE_P (mode)
6405       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
6406       && TARGET_POWERPC64)
6407     {
6408       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
6409       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6410                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6411                    opnum, (enum reload_type) type);
6412       *win = 1;
6413       return x;
6414     }
6415
6416   if (GET_CODE (x) == PLUS
6417       && GET_CODE (XEXP (x, 0)) == REG
6418       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
6419       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6420       && GET_CODE (XEXP (x, 1)) == CONST_INT
6421       && reg_offset_p
6422       && !SPE_VECTOR_MODE (mode)
6423       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6424                                   || mode == DDmode || mode == TDmode
6425                                   || mode == DImode))
6426       && VECTOR_MEM_NONE_P (mode))
6427     {
6428       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
6429       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
6430       HOST_WIDE_INT high
6431         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
6432
6433       /* Check for 32-bit overflow.  */
6434       if (high + low != val)
6435         {
6436           *win = 0;
6437           return x;
6438         }
6439
6440       /* Reload the high part into a base reg; leave the low part
6441          in the mem directly.  */
6442
6443       x = gen_rtx_PLUS (GET_MODE (x),
6444                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6445                                       GEN_INT (high)),
6446                         GEN_INT (low));
6447
6448       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6449                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6450                    opnum, (enum reload_type)type);
6451       *win = 1;
6452       return x;
6453     }
6454
6455   if (GET_CODE (x) == SYMBOL_REF
6456       && reg_offset_p
6457       && VECTOR_MEM_NONE_P (mode)
6458       && !SPE_VECTOR_MODE (mode)
6459 #if TARGET_MACHO
6460       && DEFAULT_ABI == ABI_DARWIN
6461       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
6462 #else
6463       && DEFAULT_ABI == ABI_V4
6464       && !flag_pic
6465 #endif
6466       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
6467          The same goes for DImode without 64-bit gprs and DFmode and DDmode
6468          without fprs.  */
6469       && mode != TFmode
6470       && mode != TDmode
6471       && (mode != DImode || TARGET_POWERPC64)
6472       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
6473           || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
6474     {
6475 #if TARGET_MACHO
6476       if (flag_pic)
6477         {
6478           rtx offset = machopic_gen_offset (x);
6479           x = gen_rtx_LO_SUM (GET_MODE (x),
6480                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
6481                   gen_rtx_HIGH (Pmode, offset)), offset);
6482         }
6483       else
6484 #endif
6485         x = gen_rtx_LO_SUM (GET_MODE (x),
6486               gen_rtx_HIGH (Pmode, x), x);
6487
6488       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6489                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6490                    opnum, (enum reload_type)type);
6491       *win = 1;
6492       return x;
6493     }
6494
6495   /* Reload an offset address wrapped by an AND that represents the
6496      masking of the lower bits.  Strip the outer AND and let reload
6497      convert the offset address into an indirect address.  For VSX,
6498      force reload to create the address with an AND in a separate
6499      register, because we can't guarantee an altivec register will
6500      be used.  */
6501   if (VECTOR_MEM_ALTIVEC_P (mode)
6502       && GET_CODE (x) == AND
6503       && GET_CODE (XEXP (x, 0)) == PLUS
6504       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6505       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6506       && GET_CODE (XEXP (x, 1)) == CONST_INT
6507       && INTVAL (XEXP (x, 1)) == -16)
6508     {
6509       x = XEXP (x, 0);
6510       *win = 1;
6511       return x;
6512     }
6513
6514   if (TARGET_TOC
6515       && reg_offset_p
6516       && GET_CODE (x) == SYMBOL_REF
6517       && constant_pool_expr_p (x)
6518       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
6519     {
6520       x = create_TOC_reference (x, NULL_RTX);
6521       if (TARGET_CMODEL != CMODEL_SMALL)
6522         push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6523                      BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6524                      opnum, (enum reload_type) type);
6525       *win = 1;
6526       return x;
6527     }
6528   *win = 0;
6529   return x;
6530 }
6531
6532 /* Debug version of rs6000_legitimize_reload_address.  */
6533 static rtx
6534 rs6000_debug_legitimize_reload_address (rtx x, enum machine_mode mode,
6535                                         int opnum, int type,
6536                                         int ind_levels, int *win)
6537 {
6538   rtx ret = rs6000_legitimize_reload_address (x, mode, opnum, type,
6539                                               ind_levels, win);
6540   fprintf (stderr,
6541            "\nrs6000_legitimize_reload_address: mode = %s, opnum = %d, "
6542            "type = %d, ind_levels = %d, win = %d, original addr:\n",
6543            GET_MODE_NAME (mode), opnum, type, ind_levels, *win);
6544   debug_rtx (x);
6545
6546   if (x == ret)
6547     fprintf (stderr, "Same address returned\n");
6548   else if (!ret)
6549     fprintf (stderr, "NULL returned\n");
6550   else
6551     {
6552       fprintf (stderr, "New address:\n");
6553       debug_rtx (ret);
6554     }
6555
6556   return ret;
6557 }
6558
6559 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
6560    that is a valid memory address for an instruction.
6561    The MODE argument is the machine mode for the MEM expression
6562    that wants to use this address.
6563
6564    On the RS/6000, there are four valid address: a SYMBOL_REF that
6565    refers to a constant pool entry of an address (or the sum of it
6566    plus a constant), a short (16-bit signed) constant plus a register,
6567    the sum of two registers, or a register indirect, possibly with an
6568    auto-increment.  For DFmode, DDmode and DImode with a constant plus
6569    register, we must ensure that both words are addressable or PowerPC64
6570    with offset word aligned.
6571
6572    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
6573    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
6574    because adjacent memory cells are accessed by adding word-sized offsets
6575    during assembly output.  */
6576 bool
6577 rs6000_legitimate_address_p (enum machine_mode mode, rtx x, bool reg_ok_strict)
6578 {
6579   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6580
6581   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
6582   if (VECTOR_MEM_ALTIVEC_P (mode)
6583       && GET_CODE (x) == AND
6584       && GET_CODE (XEXP (x, 1)) == CONST_INT
6585       && INTVAL (XEXP (x, 1)) == -16)
6586     x = XEXP (x, 0);
6587
6588   if (RS6000_SYMBOL_REF_TLS_P (x))
6589     return 0;
6590   if (legitimate_indirect_address_p (x, reg_ok_strict))
6591     return 1;
6592   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
6593       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6594       && !SPE_VECTOR_MODE (mode)
6595       && mode != TFmode
6596       && mode != TDmode
6597       /* Restrict addressing for DI because of our SUBREG hackery.  */
6598       && !(TARGET_E500_DOUBLE
6599            && (mode == DFmode || mode == DDmode || mode == DImode))
6600       && TARGET_UPDATE
6601       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
6602     return 1;
6603   if (virtual_stack_registers_memory_p (x))
6604     return 1;
6605   if (reg_offset_p && legitimate_small_data_p (mode, x))
6606     return 1;
6607   if (reg_offset_p && legitimate_constant_pool_address_p (x, reg_ok_strict))
6608     return 1;
6609   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
6610   if (! reg_ok_strict
6611       && reg_offset_p
6612       && GET_CODE (x) == PLUS
6613       && GET_CODE (XEXP (x, 0)) == REG
6614       && (XEXP (x, 0) == virtual_stack_vars_rtx
6615           || XEXP (x, 0) == arg_pointer_rtx)
6616       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6617     return 1;
6618   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
6619     return 1;
6620   if (mode != TImode
6621       && mode != TFmode
6622       && mode != TDmode
6623       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6624           || TARGET_POWERPC64
6625           || (mode != DFmode && mode != DDmode)
6626           || (TARGET_E500_DOUBLE && mode != DDmode))
6627       && (TARGET_POWERPC64 || mode != DImode)
6628       && !avoiding_indexed_address_p (mode)
6629       && legitimate_indexed_address_p (x, reg_ok_strict))
6630     return 1;
6631   if (GET_CODE (x) == PRE_MODIFY
6632       && mode != TImode
6633       && mode != TFmode
6634       && mode != TDmode
6635       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6636           || TARGET_POWERPC64
6637           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
6638       && (TARGET_POWERPC64 || mode != DImode)
6639       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6640       && !SPE_VECTOR_MODE (mode)
6641       /* Restrict addressing for DI because of our SUBREG hackery.  */
6642       && !(TARGET_E500_DOUBLE
6643            && (mode == DFmode || mode == DDmode || mode == DImode))
6644       && TARGET_UPDATE
6645       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
6646       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
6647           || (!avoiding_indexed_address_p (mode)
6648               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
6649       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6650     return 1;
6651   if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
6652     return 1;
6653   return 0;
6654 }
6655
6656 /* Debug version of rs6000_legitimate_address_p.  */
6657 static bool
6658 rs6000_debug_legitimate_address_p (enum machine_mode mode, rtx x,
6659                                    bool reg_ok_strict)
6660 {
6661   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
6662   fprintf (stderr,
6663            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
6664            "strict = %d, code = %s\n",
6665            ret ? "true" : "false",
6666            GET_MODE_NAME (mode),
6667            reg_ok_strict,
6668            GET_RTX_NAME (GET_CODE (x)));
6669   debug_rtx (x);
6670
6671   return ret;
6672 }
6673
6674 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
6675
6676 static bool
6677 rs6000_mode_dependent_address_p (const_rtx addr)
6678 {
6679   return rs6000_mode_dependent_address_ptr (addr);
6680 }
6681
6682 /* Go to LABEL if ADDR (a legitimate address expression)
6683    has an effect that depends on the machine mode it is used for.
6684
6685    On the RS/6000 this is true of all integral offsets (since AltiVec
6686    and VSX modes don't allow them) or is a pre-increment or decrement.
6687
6688    ??? Except that due to conceptual problems in offsettable_address_p
6689    we can't really report the problems of integral offsets.  So leave
6690    this assuming that the adjustable offset must be valid for the
6691    sub-words of a TFmode operand, which is what we had before.  */
6692
6693 static bool
6694 rs6000_mode_dependent_address (const_rtx addr)
6695 {
6696   switch (GET_CODE (addr))
6697     {
6698     case PLUS:
6699       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
6700          is considered a legitimate address before reload, so there
6701          are no offset restrictions in that case.  Note that this
6702          condition is safe in strict mode because any address involving
6703          virtual_stack_vars_rtx or arg_pointer_rtx would already have
6704          been rejected as illegitimate.  */
6705       if (XEXP (addr, 0) != virtual_stack_vars_rtx
6706           && XEXP (addr, 0) != arg_pointer_rtx
6707           && GET_CODE (XEXP (addr, 1)) == CONST_INT)
6708         {
6709           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
6710           return val + 12 + 0x8000 >= 0x10000;
6711         }
6712       break;
6713
6714     case LO_SUM:
6715       /* Anything in the constant pool is sufficiently aligned that
6716          all bytes have the same high part address.  */
6717       return !legitimate_constant_pool_address_p (addr, false);
6718
6719     /* Auto-increment cases are now treated generically in recog.c.  */
6720     case PRE_MODIFY:
6721       return TARGET_UPDATE;
6722
6723     /* AND is only allowed in Altivec loads.  */
6724     case AND:
6725       return true;
6726
6727     default:
6728       break;
6729     }
6730
6731   return false;
6732 }
6733
6734 /* Debug version of rs6000_mode_dependent_address.  */
6735 static bool
6736 rs6000_debug_mode_dependent_address (const_rtx addr)
6737 {
6738   bool ret = rs6000_mode_dependent_address (addr);
6739
6740   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
6741            ret ? "true" : "false");
6742   debug_rtx (addr);
6743
6744   return ret;
6745 }
6746
6747 /* Implement FIND_BASE_TERM.  */
6748
6749 rtx
6750 rs6000_find_base_term (rtx op)
6751 {
6752   rtx base, offset;
6753
6754   split_const (op, &base, &offset);
6755   if (GET_CODE (base) == UNSPEC)
6756     switch (XINT (base, 1))
6757       {
6758       case UNSPEC_TOCREL:
6759       case UNSPEC_MACHOPIC_OFFSET:
6760         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
6761            for aliasing purposes.  */
6762         return XVECEXP (base, 0, 0);
6763       }
6764
6765   return op;
6766 }
6767
6768 /* More elaborate version of recog's offsettable_memref_p predicate
6769    that works around the ??? note of rs6000_mode_dependent_address.
6770    In particular it accepts
6771
6772      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
6773
6774    in 32-bit mode, that the recog predicate rejects.  */
6775
6776 bool
6777 rs6000_offsettable_memref_p (rtx op)
6778 {
6779   if (!MEM_P (op))
6780     return false;
6781
6782   /* First mimic offsettable_memref_p.  */
6783   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
6784     return true;
6785
6786   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
6787      the latter predicate knows nothing about the mode of the memory
6788      reference and, therefore, assumes that it is the largest supported
6789      mode (TFmode).  As a consequence, legitimate offsettable memory
6790      references are rejected.  rs6000_legitimate_offset_address_p contains
6791      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
6792   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
6793 }
6794
6795 /* Change register usage conditional on target flags.  */
6796 void
6797 rs6000_conditional_register_usage (void)
6798 {
6799   int i;
6800
6801   /* Set MQ register fixed (already call_used) if not POWER
6802      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
6803      be allocated.  */
6804   if (! TARGET_POWER)
6805     fixed_regs[64] = 1;
6806
6807   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
6808   if (TARGET_64BIT)
6809     fixed_regs[13] = call_used_regs[13]
6810       = call_really_used_regs[13] = 1;
6811
6812   /* Conditionally disable FPRs.  */
6813   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
6814     for (i = 32; i < 64; i++)
6815       fixed_regs[i] = call_used_regs[i]
6816         = call_really_used_regs[i] = 1;
6817
6818   /* The TOC register is not killed across calls in a way that is
6819      visible to the compiler.  */
6820   if (DEFAULT_ABI == ABI_AIX)
6821     call_really_used_regs[2] = 0;
6822
6823   if (DEFAULT_ABI == ABI_V4
6824       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6825       && flag_pic == 2)
6826     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6827
6828   if (DEFAULT_ABI == ABI_V4
6829       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6830       && flag_pic == 1)
6831     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6832       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6833       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6834
6835   if (DEFAULT_ABI == ABI_DARWIN
6836       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
6837       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6838       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6839       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6840
6841   if (TARGET_TOC && TARGET_MINIMAL_TOC)
6842     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6843       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6844
6845   if (TARGET_SPE)
6846     {
6847       global_regs[SPEFSCR_REGNO] = 1;
6848       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
6849          registers in prologues and epilogues.  We no longer use r14
6850          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
6851          pool for link-compatibility with older versions of GCC.  Once
6852          "old" code has died out, we can return r14 to the allocation
6853          pool.  */
6854       fixed_regs[14]
6855         = call_used_regs[14]
6856         = call_really_used_regs[14] = 1;
6857     }
6858
6859   if (!TARGET_ALTIVEC && !TARGET_VSX)
6860     {
6861       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
6862         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6863       call_really_used_regs[VRSAVE_REGNO] = 1;
6864     }
6865
6866   if (TARGET_ALTIVEC || TARGET_VSX)
6867     global_regs[VSCR_REGNO] = 1;
6868
6869   if (TARGET_ALTIVEC_ABI)
6870     {
6871       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
6872         call_used_regs[i] = call_really_used_regs[i] = 1;
6873
6874       /* AIX reserves VR20:31 in non-extended ABI mode.  */
6875       if (TARGET_XCOFF)
6876         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
6877           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6878     }
6879 }
6880 \f
6881 /* Try to output insns to set TARGET equal to the constant C if it can
6882    be done in less than N insns.  Do all computations in MODE.
6883    Returns the place where the output has been placed if it can be
6884    done and the insns have been emitted.  If it would take more than N
6885    insns, zero is returned and no insns and emitted.  */
6886
6887 rtx
6888 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
6889                        rtx source, int n ATTRIBUTE_UNUSED)
6890 {
6891   rtx result, insn, set;
6892   HOST_WIDE_INT c0, c1;
6893
6894   switch (mode)
6895     {
6896       case  QImode:
6897     case HImode:
6898       if (dest == NULL)
6899         dest = gen_reg_rtx (mode);
6900       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
6901       return dest;
6902
6903     case SImode:
6904       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
6905
6906       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
6907                               GEN_INT (INTVAL (source)
6908                                        & (~ (HOST_WIDE_INT) 0xffff))));
6909       emit_insn (gen_rtx_SET (VOIDmode, dest,
6910                               gen_rtx_IOR (SImode, copy_rtx (result),
6911                                            GEN_INT (INTVAL (source) & 0xffff))));
6912       result = dest;
6913       break;
6914
6915     case DImode:
6916       switch (GET_CODE (source))
6917         {
6918         case CONST_INT:
6919           c0 = INTVAL (source);
6920           c1 = -(c0 < 0);
6921           break;
6922
6923         case CONST_DOUBLE:
6924 #if HOST_BITS_PER_WIDE_INT >= 64
6925           c0 = CONST_DOUBLE_LOW (source);
6926           c1 = -(c0 < 0);
6927 #else
6928           c0 = CONST_DOUBLE_LOW (source);
6929           c1 = CONST_DOUBLE_HIGH (source);
6930 #endif
6931           break;
6932
6933         default:
6934           gcc_unreachable ();
6935         }
6936
6937       result = rs6000_emit_set_long_const (dest, c0, c1);
6938       break;
6939
6940     default:
6941       gcc_unreachable ();
6942     }
6943
6944   insn = get_last_insn ();
6945   set = single_set (insn);
6946   if (! CONSTANT_P (SET_SRC (set)))
6947     set_unique_reg_note (insn, REG_EQUAL, source);
6948
6949   return result;
6950 }
6951
6952 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
6953    fall back to a straight forward decomposition.  We do this to avoid
6954    exponential run times encountered when looking for longer sequences
6955    with rs6000_emit_set_const.  */
6956 static rtx
6957 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
6958 {
6959   if (!TARGET_POWERPC64)
6960     {
6961       rtx operand1, operand2;
6962
6963       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
6964                                         DImode);
6965       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
6966                                         DImode);
6967       emit_move_insn (operand1, GEN_INT (c1));
6968       emit_move_insn (operand2, GEN_INT (c2));
6969     }
6970   else
6971     {
6972       HOST_WIDE_INT ud1, ud2, ud3, ud4;
6973
6974       ud1 = c1 & 0xffff;
6975       ud2 = (c1 & 0xffff0000) >> 16;
6976 #if HOST_BITS_PER_WIDE_INT >= 64
6977       c2 = c1 >> 32;
6978 #endif
6979       ud3 = c2 & 0xffff;
6980       ud4 = (c2 & 0xffff0000) >> 16;
6981
6982       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
6983           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
6984         {
6985           if (ud1 & 0x8000)
6986             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
6987           else
6988             emit_move_insn (dest, GEN_INT (ud1));
6989         }
6990
6991       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
6992                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
6993         {
6994           if (ud2 & 0x8000)
6995             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6996                                            - 0x80000000));
6997           else
6998             emit_move_insn (dest, GEN_INT (ud2 << 16));
6999           if (ud1 != 0)
7000             emit_move_insn (copy_rtx (dest),
7001                             gen_rtx_IOR (DImode, copy_rtx (dest),
7002                                          GEN_INT (ud1)));
7003         }
7004       else if (ud3 == 0 && ud4 == 0)
7005         {
7006           gcc_assert (ud2 & 0x8000);
7007           emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
7008                                          - 0x80000000));
7009           if (ud1 != 0)
7010             emit_move_insn (copy_rtx (dest),
7011                             gen_rtx_IOR (DImode, copy_rtx (dest),
7012                                          GEN_INT (ud1)));
7013           emit_move_insn (copy_rtx (dest),
7014                           gen_rtx_ZERO_EXTEND (DImode,
7015                                                gen_lowpart (SImode,
7016                                                             copy_rtx (dest))));
7017         }
7018       else if ((ud4 == 0xffff && (ud3 & 0x8000))
7019                || (ud4 == 0 && ! (ud3 & 0x8000)))
7020         {
7021           if (ud3 & 0x8000)
7022             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
7023                                            - 0x80000000));
7024           else
7025             emit_move_insn (dest, GEN_INT (ud3 << 16));
7026
7027           if (ud2 != 0)
7028             emit_move_insn (copy_rtx (dest),
7029                             gen_rtx_IOR (DImode, copy_rtx (dest),
7030                                          GEN_INT (ud2)));
7031           emit_move_insn (copy_rtx (dest),
7032                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
7033                                           GEN_INT (16)));
7034           if (ud1 != 0)
7035             emit_move_insn (copy_rtx (dest),
7036                             gen_rtx_IOR (DImode, copy_rtx (dest),
7037                                          GEN_INT (ud1)));
7038         }
7039       else
7040         {
7041           if (ud4 & 0x8000)
7042             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
7043                                            - 0x80000000));
7044           else
7045             emit_move_insn (dest, GEN_INT (ud4 << 16));
7046
7047           if (ud3 != 0)
7048             emit_move_insn (copy_rtx (dest),
7049                             gen_rtx_IOR (DImode, copy_rtx (dest),
7050                                          GEN_INT (ud3)));
7051
7052           emit_move_insn (copy_rtx (dest),
7053                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
7054                                           GEN_INT (32)));
7055           if (ud2 != 0)
7056             emit_move_insn (copy_rtx (dest),
7057                             gen_rtx_IOR (DImode, copy_rtx (dest),
7058                                          GEN_INT (ud2 << 16)));
7059           if (ud1 != 0)
7060             emit_move_insn (copy_rtx (dest),
7061                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
7062         }
7063     }
7064   return dest;
7065 }
7066
7067 /* Helper for the following.  Get rid of [r+r] memory refs
7068    in cases where it won't work (TImode, TFmode, TDmode).  */
7069
7070 static void
7071 rs6000_eliminate_indexed_memrefs (rtx operands[2])
7072 {
7073   if (reload_in_progress)
7074     return;
7075
7076   if (GET_CODE (operands[0]) == MEM
7077       && GET_CODE (XEXP (operands[0], 0)) != REG
7078       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0), false))
7079     operands[0]
7080       = replace_equiv_address (operands[0],
7081                                copy_addr_to_reg (XEXP (operands[0], 0)));
7082
7083   if (GET_CODE (operands[1]) == MEM
7084       && GET_CODE (XEXP (operands[1], 0)) != REG
7085       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0), false))
7086     operands[1]
7087       = replace_equiv_address (operands[1],
7088                                copy_addr_to_reg (XEXP (operands[1], 0)));
7089 }
7090
7091 /* Return true if memory accesses to DECL are known to never straddle
7092    a 32k boundary.  */
7093
7094 static bool
7095 offsettable_ok_by_alignment (tree decl)
7096 {
7097   unsigned HOST_WIDE_INT dsize, dalign;
7098
7099   /* Presume any compiler generated symbol_ref is suitably aligned.  */
7100   if (!decl)
7101     return true;
7102
7103   if (TREE_CODE (decl) != VAR_DECL
7104       && TREE_CODE (decl) != PARM_DECL
7105       && TREE_CODE (decl) != RESULT_DECL
7106       && TREE_CODE (decl) != FIELD_DECL)
7107     return true;
7108
7109   if (!DECL_SIZE_UNIT (decl))
7110     return false;
7111
7112   if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
7113     return false;
7114
7115   dsize = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
7116   if (dsize <= 1)
7117     return true;
7118   if (dsize > 32768)
7119     return false;
7120
7121   dalign = DECL_ALIGN_UNIT (decl);
7122   return dalign >= dsize;
7123 }
7124
7125 /* Emit a move from SOURCE to DEST in mode MODE.  */
7126 void
7127 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
7128 {
7129   rtx operands[2];
7130   operands[0] = dest;
7131   operands[1] = source;
7132
7133   if (TARGET_DEBUG_ADDR)
7134     {
7135       fprintf (stderr,
7136                "\nrs6000_emit_move: mode = %s, reload_in_progress = %d, "
7137                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
7138                GET_MODE_NAME (mode),
7139                reload_in_progress,
7140                reload_completed,
7141                can_create_pseudo_p ());
7142       debug_rtx (dest);
7143       fprintf (stderr, "source:\n");
7144       debug_rtx (source);
7145     }
7146
7147   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
7148   if (GET_CODE (operands[1]) == CONST_DOUBLE
7149       && ! FLOAT_MODE_P (mode)
7150       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
7151     {
7152       /* FIXME.  This should never happen.  */
7153       /* Since it seems that it does, do the safe thing and convert
7154          to a CONST_INT.  */
7155       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
7156     }
7157   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
7158               || FLOAT_MODE_P (mode)
7159               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
7160                    || CONST_DOUBLE_LOW (operands[1]) < 0)
7161                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
7162                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
7163
7164   /* Check if GCC is setting up a block move that will end up using FP
7165      registers as temporaries.  We must make sure this is acceptable.  */
7166   if (GET_CODE (operands[0]) == MEM
7167       && GET_CODE (operands[1]) == MEM
7168       && mode == DImode
7169       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
7170           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
7171       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
7172                                             ? 32 : MEM_ALIGN (operands[0])))
7173             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
7174                                                ? 32
7175                                                : MEM_ALIGN (operands[1]))))
7176       && ! MEM_VOLATILE_P (operands [0])
7177       && ! MEM_VOLATILE_P (operands [1]))
7178     {
7179       emit_move_insn (adjust_address (operands[0], SImode, 0),
7180                       adjust_address (operands[1], SImode, 0));
7181       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
7182                       adjust_address (copy_rtx (operands[1]), SImode, 4));
7183       return;
7184     }
7185
7186   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
7187       && !gpc_reg_operand (operands[1], mode))
7188     operands[1] = force_reg (mode, operands[1]);
7189
7190   if (mode == SFmode && ! TARGET_POWERPC
7191       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
7192       && GET_CODE (operands[0]) == MEM)
7193     {
7194       int regnum;
7195
7196       if (reload_in_progress || reload_completed)
7197         regnum = true_regnum (operands[1]);
7198       else if (GET_CODE (operands[1]) == REG)
7199         regnum = REGNO (operands[1]);
7200       else
7201         regnum = -1;
7202
7203       /* If operands[1] is a register, on POWER it may have
7204          double-precision data in it, so truncate it to single
7205          precision.  */
7206       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
7207         {
7208           rtx newreg;
7209           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
7210                     : gen_reg_rtx (mode));
7211           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
7212           operands[1] = newreg;
7213         }
7214     }
7215
7216   /* Recognize the case where operand[1] is a reference to thread-local
7217      data and load its address to a register.  */
7218   if (rs6000_tls_referenced_p (operands[1]))
7219     {
7220       enum tls_model model;
7221       rtx tmp = operands[1];
7222       rtx addend = NULL;
7223
7224       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
7225         {
7226           addend = XEXP (XEXP (tmp, 0), 1);
7227           tmp = XEXP (XEXP (tmp, 0), 0);
7228         }
7229
7230       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
7231       model = SYMBOL_REF_TLS_MODEL (tmp);
7232       gcc_assert (model != 0);
7233
7234       tmp = rs6000_legitimize_tls_address (tmp, model);
7235       if (addend)
7236         {
7237           tmp = gen_rtx_PLUS (mode, tmp, addend);
7238           tmp = force_operand (tmp, operands[0]);
7239         }
7240       operands[1] = tmp;
7241     }
7242
7243   /* Handle the case where reload calls us with an invalid address.  */
7244   if (reload_in_progress && mode == Pmode
7245       && (! general_operand (operands[1], mode)
7246           || ! nonimmediate_operand (operands[0], mode)))
7247     goto emit_set;
7248
7249   /* 128-bit constant floating-point values on Darwin should really be
7250      loaded as two parts.  */
7251   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
7252       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
7253     {
7254       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
7255          know how to get a DFmode SUBREG of a TFmode.  */
7256       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
7257       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
7258                         simplify_gen_subreg (imode, operands[1], mode, 0),
7259                         imode);
7260       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
7261                                              GET_MODE_SIZE (imode)),
7262                         simplify_gen_subreg (imode, operands[1], mode,
7263                                              GET_MODE_SIZE (imode)),
7264                         imode);
7265       return;
7266     }
7267
7268   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
7269     cfun->machine->sdmode_stack_slot =
7270       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
7271
7272   if (reload_in_progress
7273       && mode == SDmode
7274       && MEM_P (operands[0])
7275       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
7276       && REG_P (operands[1]))
7277     {
7278       if (FP_REGNO_P (REGNO (operands[1])))
7279         {
7280           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
7281           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7282           emit_insn (gen_movsd_store (mem, operands[1]));
7283         }
7284       else if (INT_REGNO_P (REGNO (operands[1])))
7285         {
7286           rtx mem = adjust_address_nv (operands[0], mode, 4);
7287           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7288           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
7289         }
7290       else
7291         gcc_unreachable();
7292       return;
7293     }
7294   if (reload_in_progress
7295       && mode == SDmode
7296       && REG_P (operands[0])
7297       && MEM_P (operands[1])
7298       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
7299     {
7300       if (FP_REGNO_P (REGNO (operands[0])))
7301         {
7302           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
7303           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7304           emit_insn (gen_movsd_load (operands[0], mem));
7305         }
7306       else if (INT_REGNO_P (REGNO (operands[0])))
7307         {
7308           rtx mem = adjust_address_nv (operands[1], mode, 4);
7309           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7310           emit_insn (gen_movsd_hardfloat (operands[0], mem));
7311         }
7312       else
7313         gcc_unreachable();
7314       return;
7315     }
7316
7317   /* FIXME:  In the long term, this switch statement should go away
7318      and be replaced by a sequence of tests based on things like
7319      mode == Pmode.  */
7320   switch (mode)
7321     {
7322     case HImode:
7323     case QImode:
7324       if (CONSTANT_P (operands[1])
7325           && GET_CODE (operands[1]) != CONST_INT)
7326         operands[1] = force_const_mem (mode, operands[1]);
7327       break;
7328
7329     case TFmode:
7330     case TDmode:
7331       rs6000_eliminate_indexed_memrefs (operands);
7332       /* fall through */
7333
7334     case DFmode:
7335     case DDmode:
7336     case SFmode:
7337     case SDmode:
7338       if (CONSTANT_P (operands[1])
7339           && ! easy_fp_constant (operands[1], mode))
7340         operands[1] = force_const_mem (mode, operands[1]);
7341       break;
7342
7343     case V16QImode:
7344     case V8HImode:
7345     case V4SFmode:
7346     case V4SImode:
7347     case V4HImode:
7348     case V2SFmode:
7349     case V2SImode:
7350     case V1DImode:
7351     case V2DFmode:
7352     case V2DImode:
7353       if (CONSTANT_P (operands[1])
7354           && !easy_vector_constant (operands[1], mode))
7355         operands[1] = force_const_mem (mode, operands[1]);
7356       break;
7357
7358     case SImode:
7359     case DImode:
7360       /* Use default pattern for address of ELF small data */
7361       if (TARGET_ELF
7362           && mode == Pmode
7363           && DEFAULT_ABI == ABI_V4
7364           && (GET_CODE (operands[1]) == SYMBOL_REF
7365               || GET_CODE (operands[1]) == CONST)
7366           && small_data_operand (operands[1], mode))
7367         {
7368           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7369           return;
7370         }
7371
7372       if (DEFAULT_ABI == ABI_V4
7373           && mode == Pmode && mode == SImode
7374           && flag_pic == 1 && got_operand (operands[1], mode))
7375         {
7376           emit_insn (gen_movsi_got (operands[0], operands[1]));
7377           return;
7378         }
7379
7380       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
7381           && TARGET_NO_TOC
7382           && ! flag_pic
7383           && mode == Pmode
7384           && CONSTANT_P (operands[1])
7385           && GET_CODE (operands[1]) != HIGH
7386           && GET_CODE (operands[1]) != CONST_INT)
7387         {
7388           rtx target = (!can_create_pseudo_p ()
7389                         ? operands[0]
7390                         : gen_reg_rtx (mode));
7391
7392           /* If this is a function address on -mcall-aixdesc,
7393              convert it to the address of the descriptor.  */
7394           if (DEFAULT_ABI == ABI_AIX
7395               && GET_CODE (operands[1]) == SYMBOL_REF
7396               && XSTR (operands[1], 0)[0] == '.')
7397             {
7398               const char *name = XSTR (operands[1], 0);
7399               rtx new_ref;
7400               while (*name == '.')
7401                 name++;
7402               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
7403               CONSTANT_POOL_ADDRESS_P (new_ref)
7404                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
7405               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
7406               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
7407               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
7408               operands[1] = new_ref;
7409             }
7410
7411           if (DEFAULT_ABI == ABI_DARWIN)
7412             {
7413 #if TARGET_MACHO
7414               if (MACHO_DYNAMIC_NO_PIC_P)
7415                 {
7416                   /* Take care of any required data indirection.  */
7417                   operands[1] = rs6000_machopic_legitimize_pic_address (
7418                                   operands[1], mode, operands[0]);
7419                   if (operands[0] != operands[1])
7420                     emit_insn (gen_rtx_SET (VOIDmode,
7421                                             operands[0], operands[1]));
7422                   return;
7423                 }
7424 #endif
7425               emit_insn (gen_macho_high (target, operands[1]));
7426               emit_insn (gen_macho_low (operands[0], target, operands[1]));
7427               return;
7428             }
7429
7430           emit_insn (gen_elf_high (target, operands[1]));
7431           emit_insn (gen_elf_low (operands[0], target, operands[1]));
7432           return;
7433         }
7434
7435       /* If this is a SYMBOL_REF that refers to a constant pool entry,
7436          and we have put it in the TOC, we just need to make a TOC-relative
7437          reference to it.  */
7438       if ((TARGET_TOC
7439            && GET_CODE (operands[1]) == SYMBOL_REF
7440            && constant_pool_expr_p (operands[1])
7441            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
7442                                                get_pool_mode (operands[1])))
7443           || (TARGET_CMODEL == CMODEL_MEDIUM
7444               && GET_CODE (operands[1]) == SYMBOL_REF
7445               && !CONSTANT_POOL_ADDRESS_P (operands[1])
7446               && SYMBOL_REF_LOCAL_P (operands[1])
7447               && offsettable_ok_by_alignment (SYMBOL_REF_DECL (operands[1]))))
7448         {
7449           rtx reg = NULL_RTX;
7450           if (TARGET_CMODEL != CMODEL_SMALL)
7451             {
7452               if (can_create_pseudo_p ())
7453                 reg = gen_reg_rtx (Pmode);
7454               else
7455                 reg = operands[0];
7456             }
7457           operands[1] = create_TOC_reference (operands[1], reg);
7458         }
7459       else if (mode == Pmode
7460                && CONSTANT_P (operands[1])
7461                && ((GET_CODE (operands[1]) != CONST_INT
7462                     && ! easy_fp_constant (operands[1], mode))
7463                    || (GET_CODE (operands[1]) == CONST_INT
7464                        && (num_insns_constant (operands[1], mode)
7465                            > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
7466                    || (GET_CODE (operands[0]) == REG
7467                        && FP_REGNO_P (REGNO (operands[0]))))
7468                && GET_CODE (operands[1]) != HIGH
7469                && ! legitimate_constant_pool_address_p (operands[1], false)
7470                && ! toc_relative_expr_p (operands[1])
7471                && (TARGET_CMODEL == CMODEL_SMALL
7472                    || can_create_pseudo_p ()
7473                    || (REG_P (operands[0])
7474                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
7475         {
7476
7477 #if TARGET_MACHO
7478           /* Darwin uses a special PIC legitimizer.  */
7479           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
7480             {
7481               operands[1] =
7482                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
7483                                                         operands[0]);
7484               if (operands[0] != operands[1])
7485                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7486               return;
7487             }
7488 #endif
7489
7490           /* If we are to limit the number of things we put in the TOC and
7491              this is a symbol plus a constant we can add in one insn,
7492              just put the symbol in the TOC and add the constant.  Don't do
7493              this if reload is in progress.  */
7494           if (GET_CODE (operands[1]) == CONST
7495               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
7496               && GET_CODE (XEXP (operands[1], 0)) == PLUS
7497               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
7498               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
7499                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
7500               && ! side_effects_p (operands[0]))
7501             {
7502               rtx sym =
7503                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
7504               rtx other = XEXP (XEXP (operands[1], 0), 1);
7505
7506               sym = force_reg (mode, sym);
7507               emit_insn (gen_add3_insn (operands[0], sym, other));
7508               return;
7509             }
7510
7511           operands[1] = force_const_mem (mode, operands[1]);
7512
7513           if (TARGET_TOC
7514               && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
7515               && constant_pool_expr_p (XEXP (operands[1], 0))
7516               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
7517                         get_pool_constant (XEXP (operands[1], 0)),
7518                         get_pool_mode (XEXP (operands[1], 0))))
7519             {
7520               rtx tocref;
7521               rtx reg = NULL_RTX;
7522               if (TARGET_CMODEL != CMODEL_SMALL)
7523                 {
7524                   if (can_create_pseudo_p ())
7525                     reg = gen_reg_rtx (Pmode);
7526                   else
7527                     reg = operands[0];
7528                 }
7529               tocref = create_TOC_reference (XEXP (operands[1], 0), reg);
7530               operands[1] = gen_const_mem (mode, tocref);
7531               set_mem_alias_set (operands[1], get_TOC_alias_set ());
7532             }
7533         }
7534       break;
7535
7536     case TImode:
7537       rs6000_eliminate_indexed_memrefs (operands);
7538
7539       if (TARGET_POWER)
7540         {
7541           emit_insn (gen_rtx_PARALLEL (VOIDmode,
7542                        gen_rtvec (2,
7543                                   gen_rtx_SET (VOIDmode,
7544                                                operands[0], operands[1]),
7545                                   gen_rtx_CLOBBER (VOIDmode,
7546                                                    gen_rtx_SCRATCH (SImode)))));
7547           return;
7548         }
7549       break;
7550
7551     default:
7552       fatal_insn ("bad move", gen_rtx_SET (VOIDmode, dest, source));
7553     }
7554
7555   /* Above, we may have called force_const_mem which may have returned
7556      an invalid address.  If we can, fix this up; otherwise, reload will
7557      have to deal with it.  */
7558   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
7559     operands[1] = validize_mem (operands[1]);
7560
7561  emit_set:
7562   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7563 }
7564 \f
7565 /* Nonzero if we can use a floating-point register to pass this arg.  */
7566 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
7567   (SCALAR_FLOAT_MODE_P (MODE)                   \
7568    && (CUM)->fregno <= FP_ARG_MAX_REG           \
7569    && TARGET_HARD_FLOAT && TARGET_FPRS)
7570
7571 /* Nonzero if we can use an AltiVec register to pass this arg.  */
7572 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)              \
7573   ((ALTIVEC_VECTOR_MODE (MODE) || VSX_VECTOR_MODE (MODE))       \
7574    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
7575    && TARGET_ALTIVEC_ABI                                        \
7576    && (NAMED))
7577
7578 /* Return a nonzero value to say to return the function value in
7579    memory, just as large structures are always returned.  TYPE will be
7580    the data type of the value, and FNTYPE will be the type of the
7581    function doing the returning, or @code{NULL} for libcalls.
7582
7583    The AIX ABI for the RS/6000 specifies that all structures are
7584    returned in memory.  The Darwin ABI does the same.
7585    
7586    For the Darwin 64 Bit ABI, a function result can be returned in
7587    registers or in memory, depending on the size of the return data
7588    type.  If it is returned in registers, the value occupies the same
7589    registers as it would if it were the first and only function
7590    argument.  Otherwise, the function places its result in memory at
7591    the location pointed to by GPR3.
7592    
7593    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
7594    but a draft put them in memory, and GCC used to implement the draft
7595    instead of the final standard.  Therefore, aix_struct_return
7596    controls this instead of DEFAULT_ABI; V.4 targets needing backward
7597    compatibility can change DRAFT_V4_STRUCT_RET to override the
7598    default, and -m switches get the final word.  See
7599    rs6000_option_override_internal for more details.
7600
7601    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
7602    long double support is enabled.  These values are returned in memory.
7603
7604    int_size_in_bytes returns -1 for variable size objects, which go in
7605    memory always.  The cast to unsigned makes -1 > 8.  */
7606
7607 static bool
7608 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7609 {
7610   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
7611   if (TARGET_MACHO
7612       && rs6000_darwin64_abi
7613       && TREE_CODE (type) == RECORD_TYPE
7614       && int_size_in_bytes (type) > 0)
7615     {
7616       CUMULATIVE_ARGS valcum;
7617       rtx valret;
7618
7619       valcum.words = 0;
7620       valcum.fregno = FP_ARG_MIN_REG;
7621       valcum.vregno = ALTIVEC_ARG_MIN_REG;
7622       /* Do a trial code generation as if this were going to be passed
7623          as an argument; if any part goes in memory, we return NULL.  */
7624       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
7625       if (valret)
7626         return false;
7627       /* Otherwise fall through to more conventional ABI rules.  */
7628     }
7629
7630   if (AGGREGATE_TYPE_P (type)
7631       && (aix_struct_return
7632           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
7633     return true;
7634
7635   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
7636      modes only exist for GCC vector types if -maltivec.  */
7637   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
7638       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7639     return false;
7640
7641   /* Return synthetic vectors in memory.  */
7642   if (TREE_CODE (type) == VECTOR_TYPE
7643       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
7644     {
7645       static bool warned_for_return_big_vectors = false;
7646       if (!warned_for_return_big_vectors)
7647         {
7648           warning (0, "GCC vector returned by reference: "
7649                    "non-standard ABI extension with no compatibility guarantee");
7650           warned_for_return_big_vectors = true;
7651         }
7652       return true;
7653     }
7654
7655   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
7656     return true;
7657
7658   return false;
7659 }
7660
7661 /* Initialize a variable CUM of type CUMULATIVE_ARGS
7662    for a call to a function whose data type is FNTYPE.
7663    For a library call, FNTYPE is 0.
7664
7665    For incoming args we set the number of arguments in the prototype large
7666    so we never return a PARALLEL.  */
7667
7668 void
7669 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
7670                       rtx libname ATTRIBUTE_UNUSED, int incoming,
7671                       int libcall, int n_named_args)
7672 {
7673   static CUMULATIVE_ARGS zero_cumulative;
7674
7675   *cum = zero_cumulative;
7676   cum->words = 0;
7677   cum->fregno = FP_ARG_MIN_REG;
7678   cum->vregno = ALTIVEC_ARG_MIN_REG;
7679   cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
7680   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
7681                       ? CALL_LIBCALL : CALL_NORMAL);
7682   cum->sysv_gregno = GP_ARG_MIN_REG;
7683   cum->stdarg = stdarg_p (fntype);
7684
7685   cum->nargs_prototype = 0;
7686   if (incoming || cum->prototype)
7687     cum->nargs_prototype = n_named_args;
7688
7689   /* Check for a longcall attribute.  */
7690   if ((!fntype && rs6000_default_long_calls)
7691       || (fntype
7692           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
7693           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
7694     cum->call_cookie |= CALL_LONG;
7695
7696   if (TARGET_DEBUG_ARG)
7697     {
7698       fprintf (stderr, "\ninit_cumulative_args:");
7699       if (fntype)
7700         {
7701           tree ret_type = TREE_TYPE (fntype);
7702           fprintf (stderr, " ret code = %s,",
7703                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
7704         }
7705
7706       if (cum->call_cookie & CALL_LONG)
7707         fprintf (stderr, " longcall,");
7708
7709       fprintf (stderr, " proto = %d, nargs = %d\n",
7710                cum->prototype, cum->nargs_prototype);
7711     }
7712
7713   if (fntype
7714       && !TARGET_ALTIVEC
7715       && TARGET_ALTIVEC_ABI
7716       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
7717     {
7718       error ("cannot return value in vector register because"
7719              " altivec instructions are disabled, use -maltivec"
7720              " to enable them");
7721     }
7722 }
7723 \f
7724 /* Return true if TYPE must be passed on the stack and not in registers.  */
7725
7726 static bool
7727 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
7728 {
7729   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
7730     return must_pass_in_stack_var_size (mode, type);
7731   else
7732     return must_pass_in_stack_var_size_or_pad (mode, type);
7733 }
7734
7735 /* If defined, a C expression which determines whether, and in which
7736    direction, to pad out an argument with extra space.  The value
7737    should be of type `enum direction': either `upward' to pad above
7738    the argument, `downward' to pad below, or `none' to inhibit
7739    padding.
7740
7741    For the AIX ABI structs are always stored left shifted in their
7742    argument slot.  */
7743
7744 enum direction
7745 function_arg_padding (enum machine_mode mode, const_tree type)
7746 {
7747 #ifndef AGGREGATE_PADDING_FIXED
7748 #define AGGREGATE_PADDING_FIXED 0
7749 #endif
7750 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
7751 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
7752 #endif
7753
7754   if (!AGGREGATE_PADDING_FIXED)
7755     {
7756       /* GCC used to pass structures of the same size as integer types as
7757          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
7758          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
7759          passed padded downward, except that -mstrict-align further
7760          muddied the water in that multi-component structures of 2 and 4
7761          bytes in size were passed padded upward.
7762
7763          The following arranges for best compatibility with previous
7764          versions of gcc, but removes the -mstrict-align dependency.  */
7765       if (BYTES_BIG_ENDIAN)
7766         {
7767           HOST_WIDE_INT size = 0;
7768
7769           if (mode == BLKmode)
7770             {
7771               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
7772                 size = int_size_in_bytes (type);
7773             }
7774           else
7775             size = GET_MODE_SIZE (mode);
7776
7777           if (size == 1 || size == 2 || size == 4)
7778             return downward;
7779         }
7780       return upward;
7781     }
7782
7783   if (AGGREGATES_PAD_UPWARD_ALWAYS)
7784     {
7785       if (type != 0 && AGGREGATE_TYPE_P (type))
7786         return upward;
7787     }
7788
7789   /* Fall back to the default.  */
7790   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7791 }
7792
7793 /* If defined, a C expression that gives the alignment boundary, in bits,
7794    of an argument with the specified mode and type.  If it is not defined,
7795    PARM_BOUNDARY is used for all arguments.
7796
7797    V.4 wants long longs and doubles to be double word aligned.  Just
7798    testing the mode size is a boneheaded way to do this as it means
7799    that other types such as complex int are also double word aligned.
7800    However, we're stuck with this because changing the ABI might break
7801    existing library interfaces.
7802
7803    Doubleword align SPE vectors.
7804    Quadword align Altivec vectors.
7805    Quadword align large synthetic vector types.   */
7806
7807 int
7808 function_arg_boundary (enum machine_mode mode, const_tree type)
7809 {
7810   if (DEFAULT_ABI == ABI_V4
7811       && (GET_MODE_SIZE (mode) == 8
7812           || (TARGET_HARD_FLOAT
7813               && TARGET_FPRS
7814               && (mode == TFmode || mode == TDmode))))
7815     return 64;
7816   else if (SPE_VECTOR_MODE (mode)
7817            || (type && TREE_CODE (type) == VECTOR_TYPE
7818                && int_size_in_bytes (type) >= 8
7819                && int_size_in_bytes (type) < 16))
7820     return 64;
7821   else if ((ALTIVEC_VECTOR_MODE (mode) || VSX_VECTOR_MODE (mode))
7822            || (type && TREE_CODE (type) == VECTOR_TYPE
7823                && int_size_in_bytes (type) >= 16))
7824     return 128;
7825   else if (TARGET_MACHO
7826            && rs6000_darwin64_abi
7827            && mode == BLKmode
7828            && type && TYPE_ALIGN (type) > 64)
7829     return 128;
7830   else
7831     return PARM_BOUNDARY;
7832 }
7833
7834 /* For a function parm of MODE and TYPE, return the starting word in
7835    the parameter area.  NWORDS of the parameter area are already used.  */
7836
7837 static unsigned int
7838 rs6000_parm_start (enum machine_mode mode, const_tree type,
7839                    unsigned int nwords)
7840 {
7841   unsigned int align;
7842   unsigned int parm_offset;
7843
7844   align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
7845   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
7846   return nwords + (-(parm_offset + nwords) & align);
7847 }
7848
7849 /* Compute the size (in words) of a function argument.  */
7850
7851 static unsigned long
7852 rs6000_arg_size (enum machine_mode mode, const_tree type)
7853 {
7854   unsigned long size;
7855
7856   if (mode != BLKmode)
7857     size = GET_MODE_SIZE (mode);
7858   else
7859     size = int_size_in_bytes (type);
7860
7861   if (TARGET_32BIT)
7862     return (size + 3) >> 2;
7863   else
7864     return (size + 7) >> 3;
7865 }
7866 \f
7867 /* Use this to flush pending int fields.  */
7868
7869 static void
7870 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
7871                                           HOST_WIDE_INT bitpos, int final)
7872 {
7873   unsigned int startbit, endbit;
7874   int intregs, intoffset;
7875   enum machine_mode mode;
7876
7877   /* Handle the situations where a float is taking up the first half
7878      of the GPR, and the other half is empty (typically due to
7879      alignment restrictions). We can detect this by a 8-byte-aligned
7880      int field, or by seeing that this is the final flush for this
7881      argument. Count the word and continue on.  */
7882   if (cum->floats_in_gpr == 1
7883       && (cum->intoffset % 64 == 0
7884           || (cum->intoffset == -1 && final)))
7885     {
7886       cum->words++;
7887       cum->floats_in_gpr = 0;
7888     }
7889
7890   if (cum->intoffset == -1)
7891     return;
7892
7893   intoffset = cum->intoffset;
7894   cum->intoffset = -1;
7895   cum->floats_in_gpr = 0;
7896
7897   if (intoffset % BITS_PER_WORD != 0)
7898     {
7899       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
7900                             MODE_INT, 0);
7901       if (mode == BLKmode)
7902         {
7903           /* We couldn't find an appropriate mode, which happens,
7904              e.g., in packed structs when there are 3 bytes to load.
7905              Back intoffset back to the beginning of the word in this
7906              case.  */
7907           intoffset = intoffset & -BITS_PER_WORD;
7908         }
7909     }
7910
7911   startbit = intoffset & -BITS_PER_WORD;
7912   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
7913   intregs = (endbit - startbit) / BITS_PER_WORD;
7914   cum->words += intregs;
7915   /* words should be unsigned. */
7916   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
7917     {
7918       int pad = (endbit/BITS_PER_WORD) - cum->words;
7919       cum->words += pad;
7920     }
7921 }
7922
7923 /* The darwin64 ABI calls for us to recurse down through structs,
7924    looking for elements passed in registers.  Unfortunately, we have
7925    to track int register count here also because of misalignments
7926    in powerpc alignment mode.  */
7927
7928 static void
7929 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
7930                                             const_tree type,
7931                                             HOST_WIDE_INT startbitpos)
7932 {
7933   tree f;
7934
7935   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
7936     if (TREE_CODE (f) == FIELD_DECL)
7937       {
7938         HOST_WIDE_INT bitpos = startbitpos;
7939         tree ftype = TREE_TYPE (f);
7940         enum machine_mode mode;
7941         if (ftype == error_mark_node)
7942           continue;
7943         mode = TYPE_MODE (ftype);
7944
7945         if (DECL_SIZE (f) != 0
7946             && host_integerp (bit_position (f), 1))
7947           bitpos += int_bit_position (f);
7948
7949         /* ??? FIXME: else assume zero offset.  */
7950
7951         if (TREE_CODE (ftype) == RECORD_TYPE)
7952           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
7953         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
7954           {
7955             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7956             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
7957             /* Single-precision floats present a special problem for
7958                us, because they are smaller than an 8-byte GPR, and so
7959                the structure-packing rules combined with the standard
7960                varargs behavior mean that we want to pack float/float
7961                and float/int combinations into a single register's
7962                space. This is complicated by the arg advance flushing,
7963                which works on arbitrarily large groups of int-type
7964                fields.  */
7965             if (mode == SFmode)
7966               {
7967                 if (cum->floats_in_gpr == 1)
7968                   {
7969                     /* Two floats in a word; count the word and reset
7970                        the float count.  */
7971                     cum->words++;
7972                     cum->floats_in_gpr = 0;
7973                   }
7974                 else if (bitpos % 64 == 0)
7975                   {
7976                     /* A float at the beginning of an 8-byte word;
7977                        count it and put off adjusting cum->words until
7978                        we see if a arg advance flush is going to do it
7979                        for us.  */
7980                     cum->floats_in_gpr++;
7981                   }
7982                 else
7983                   {
7984                     /* The float is at the end of a word, preceded
7985                        by integer fields, so the arg advance flush
7986                        just above has already set cum->words and
7987                        everything is taken care of.  */
7988                   }
7989               }
7990             else
7991               cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
7992           }
7993         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
7994           {
7995             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7996             cum->vregno++;
7997             cum->words += 2;
7998           }
7999         else if (cum->intoffset == -1)
8000           cum->intoffset = bitpos;
8001       }
8002 }
8003
8004 /* Check for an item that needs to be considered specially under the darwin 64
8005    bit ABI.  These are record types where the mode is BLK or the structure is
8006    8 bytes in size.  */
8007 static int
8008 rs6000_darwin64_struct_check_p (enum machine_mode mode, const_tree type)
8009 {
8010   return rs6000_darwin64_abi
8011          && ((mode == BLKmode 
8012               && TREE_CODE (type) == RECORD_TYPE 
8013               && int_size_in_bytes (type) > 0)
8014           || (type && TREE_CODE (type) == RECORD_TYPE 
8015               && int_size_in_bytes (type) == 8)) ? 1 : 0;
8016 }
8017
8018 /* Update the data in CUM to advance over an argument
8019    of mode MODE and data type TYPE.
8020    (TYPE is null for libcalls where that information may not be available.)
8021
8022    Note that for args passed by reference, function_arg will be called
8023    with MODE and TYPE set to that of the pointer to the arg, not the arg
8024    itself.  */
8025
8026 static void
8027 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8028                                const_tree type, bool named, int depth)
8029 {
8030
8031   /* Only tick off an argument if we're not recursing.  */
8032   if (depth == 0)
8033     cum->nargs_prototype--;
8034
8035   if (TARGET_ALTIVEC_ABI
8036       && (ALTIVEC_VECTOR_MODE (mode)
8037           || VSX_VECTOR_MODE (mode)
8038           || (type && TREE_CODE (type) == VECTOR_TYPE
8039               && int_size_in_bytes (type) == 16)))
8040     {
8041       bool stack = false;
8042
8043       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8044         {
8045           cum->vregno++;
8046           if (!TARGET_ALTIVEC)
8047             error ("cannot pass argument in vector register because"
8048                    " altivec instructions are disabled, use -maltivec"
8049                    " to enable them");
8050
8051           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
8052              even if it is going to be passed in a vector register.
8053              Darwin does the same for variable-argument functions.  */
8054           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
8055               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
8056             stack = true;
8057         }
8058       else
8059         stack = true;
8060
8061       if (stack)
8062         {
8063           int align;
8064
8065           /* Vector parameters must be 16-byte aligned.  This places
8066              them at 2 mod 4 in terms of words in 32-bit mode, since
8067              the parameter save area starts at offset 24 from the
8068              stack.  In 64-bit mode, they just have to start on an
8069              even word, since the parameter save area is 16-byte
8070              aligned.  Space for GPRs is reserved even if the argument
8071              will be passed in memory.  */
8072           if (TARGET_32BIT)
8073             align = (2 - cum->words) & 3;
8074           else
8075             align = cum->words & 1;
8076           cum->words += align + rs6000_arg_size (mode, type);
8077
8078           if (TARGET_DEBUG_ARG)
8079             {
8080               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
8081                        cum->words, align);
8082               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
8083                        cum->nargs_prototype, cum->prototype,
8084                        GET_MODE_NAME (mode));
8085             }
8086         }
8087     }
8088   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
8089            && !cum->stdarg
8090            && cum->sysv_gregno <= GP_ARG_MAX_REG)
8091     cum->sysv_gregno++;
8092
8093   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8094     {
8095       int size = int_size_in_bytes (type);
8096       /* Variable sized types have size == -1 and are
8097          treated as if consisting entirely of ints.
8098          Pad to 16 byte boundary if needed.  */
8099       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8100           && (cum->words % 2) != 0)
8101         cum->words++;
8102       /* For varargs, we can just go up by the size of the struct. */
8103       if (!named)
8104         cum->words += (size + 7) / 8;
8105       else
8106         {
8107           /* It is tempting to say int register count just goes up by
8108              sizeof(type)/8, but this is wrong in a case such as
8109              { int; double; int; } [powerpc alignment].  We have to
8110              grovel through the fields for these too.  */
8111           cum->intoffset = 0;
8112           cum->floats_in_gpr = 0;
8113           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
8114           rs6000_darwin64_record_arg_advance_flush (cum,
8115                                                     size * BITS_PER_UNIT, 1);
8116         }
8117           if (TARGET_DEBUG_ARG)
8118             {
8119               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
8120                        cum->words, TYPE_ALIGN (type), size);
8121               fprintf (stderr, 
8122                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
8123                        cum->nargs_prototype, cum->prototype,
8124                        GET_MODE_NAME (mode));
8125             }
8126     }
8127   else if (DEFAULT_ABI == ABI_V4)
8128     {
8129       if (TARGET_HARD_FLOAT && TARGET_FPRS
8130           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8131               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8132               || (mode == TFmode && !TARGET_IEEEQUAD)
8133               || mode == SDmode || mode == DDmode || mode == TDmode))
8134         {
8135           /* _Decimal128 must use an even/odd register pair.  This assumes
8136              that the register number is odd when fregno is odd.  */
8137           if (mode == TDmode && (cum->fregno % 2) == 1)
8138             cum->fregno++;
8139
8140           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8141               <= FP_ARG_V4_MAX_REG)
8142             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8143           else
8144             {
8145               cum->fregno = FP_ARG_V4_MAX_REG + 1;
8146               if (mode == DFmode || mode == TFmode
8147                   || mode == DDmode || mode == TDmode)
8148                 cum->words += cum->words & 1;
8149               cum->words += rs6000_arg_size (mode, type);
8150             }
8151         }
8152       else
8153         {
8154           int n_words = rs6000_arg_size (mode, type);
8155           int gregno = cum->sysv_gregno;
8156
8157           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8158              (r7,r8) or (r9,r10).  As does any other 2 word item such
8159              as complex int due to a historical mistake.  */
8160           if (n_words == 2)
8161             gregno += (1 - gregno) & 1;
8162
8163           /* Multi-reg args are not split between registers and stack.  */
8164           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8165             {
8166               /* Long long and SPE vectors are aligned on the stack.
8167                  So are other 2 word items such as complex int due to
8168                  a historical mistake.  */
8169               if (n_words == 2)
8170                 cum->words += cum->words & 1;
8171               cum->words += n_words;
8172             }
8173
8174           /* Note: continuing to accumulate gregno past when we've started
8175              spilling to the stack indicates the fact that we've started
8176              spilling to the stack to expand_builtin_saveregs.  */
8177           cum->sysv_gregno = gregno + n_words;
8178         }
8179
8180       if (TARGET_DEBUG_ARG)
8181         {
8182           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8183                    cum->words, cum->fregno);
8184           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
8185                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
8186           fprintf (stderr, "mode = %4s, named = %d\n",
8187                    GET_MODE_NAME (mode), named);
8188         }
8189     }
8190   else
8191     {
8192       int n_words = rs6000_arg_size (mode, type);
8193       int start_words = cum->words;
8194       int align_words = rs6000_parm_start (mode, type, start_words);
8195
8196       cum->words = align_words + n_words;
8197
8198       if (SCALAR_FLOAT_MODE_P (mode)
8199           && TARGET_HARD_FLOAT && TARGET_FPRS)
8200         {
8201           /* _Decimal128 must be passed in an even/odd float register pair.
8202              This assumes that the register number is odd when fregno is
8203              odd.  */
8204           if (mode == TDmode && (cum->fregno % 2) == 1)
8205             cum->fregno++;
8206           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8207         }
8208
8209       if (TARGET_DEBUG_ARG)
8210         {
8211           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8212                    cum->words, cum->fregno);
8213           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
8214                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
8215           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
8216                    named, align_words - start_words, depth);
8217         }
8218     }
8219 }
8220
8221 static void
8222 rs6000_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8223                              const_tree type, bool named)
8224 {
8225   rs6000_function_arg_advance_1 (cum, mode, type, named, 0);
8226 }
8227
8228 static rtx
8229 spe_build_register_parallel (enum machine_mode mode, int gregno)
8230 {
8231   rtx r1, r3, r5, r7;
8232
8233   switch (mode)
8234     {
8235     case DFmode:
8236       r1 = gen_rtx_REG (DImode, gregno);
8237       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8238       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
8239
8240     case DCmode:
8241     case TFmode:
8242       r1 = gen_rtx_REG (DImode, gregno);
8243       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8244       r3 = gen_rtx_REG (DImode, gregno + 2);
8245       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8246       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
8247
8248     case TCmode:
8249       r1 = gen_rtx_REG (DImode, gregno);
8250       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8251       r3 = gen_rtx_REG (DImode, gregno + 2);
8252       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8253       r5 = gen_rtx_REG (DImode, gregno + 4);
8254       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
8255       r7 = gen_rtx_REG (DImode, gregno + 6);
8256       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
8257       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
8258
8259     default:
8260       gcc_unreachable ();
8261     }
8262 }
8263
8264 /* Determine where to put a SIMD argument on the SPE.  */
8265 static rtx
8266 rs6000_spe_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
8267                          const_tree type)
8268 {
8269   int gregno = cum->sysv_gregno;
8270
8271   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
8272      are passed and returned in a pair of GPRs for ABI compatibility.  */
8273   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
8274                              || mode == DCmode || mode == TCmode))
8275     {
8276       int n_words = rs6000_arg_size (mode, type);
8277
8278       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
8279       if (mode == DFmode)
8280         gregno += (1 - gregno) & 1;
8281
8282       /* Multi-reg args are not split between registers and stack.  */
8283       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8284         return NULL_RTX;
8285
8286       return spe_build_register_parallel (mode, gregno);
8287     }
8288   if (cum->stdarg)
8289     {
8290       int n_words = rs6000_arg_size (mode, type);
8291
8292       /* SPE vectors are put in odd registers.  */
8293       if (n_words == 2 && (gregno & 1) == 0)
8294         gregno += 1;
8295
8296       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
8297         {
8298           rtx r1, r2;
8299           enum machine_mode m = SImode;
8300
8301           r1 = gen_rtx_REG (m, gregno);
8302           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
8303           r2 = gen_rtx_REG (m, gregno + 1);
8304           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
8305           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
8306         }
8307       else
8308         return NULL_RTX;
8309     }
8310   else
8311     {
8312       if (gregno <= GP_ARG_MAX_REG)
8313         return gen_rtx_REG (mode, gregno);
8314       else
8315         return NULL_RTX;
8316     }
8317 }
8318
8319 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
8320    structure between cum->intoffset and bitpos to integer registers.  */
8321
8322 static void
8323 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
8324                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
8325 {
8326   enum machine_mode mode;
8327   unsigned int regno;
8328   unsigned int startbit, endbit;
8329   int this_regno, intregs, intoffset;
8330   rtx reg;
8331
8332   if (cum->intoffset == -1)
8333     return;
8334
8335   intoffset = cum->intoffset;
8336   cum->intoffset = -1;
8337
8338   /* If this is the trailing part of a word, try to only load that
8339      much into the register.  Otherwise load the whole register.  Note
8340      that in the latter case we may pick up unwanted bits.  It's not a
8341      problem at the moment but may wish to revisit.  */
8342
8343   if (intoffset % BITS_PER_WORD != 0)
8344     {
8345       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8346                           MODE_INT, 0);
8347       if (mode == BLKmode)
8348         {
8349           /* We couldn't find an appropriate mode, which happens,
8350              e.g., in packed structs when there are 3 bytes to load.
8351              Back intoffset back to the beginning of the word in this
8352              case.  */
8353          intoffset = intoffset & -BITS_PER_WORD;
8354          mode = word_mode;
8355         }
8356     }
8357   else
8358     mode = word_mode;
8359
8360   startbit = intoffset & -BITS_PER_WORD;
8361   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8362   intregs = (endbit - startbit) / BITS_PER_WORD;
8363   this_regno = cum->words + intoffset / BITS_PER_WORD;
8364
8365   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
8366     cum->use_stack = 1;
8367
8368   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
8369   if (intregs <= 0)
8370     return;
8371
8372   intoffset /= BITS_PER_UNIT;
8373   do
8374     {
8375       regno = GP_ARG_MIN_REG + this_regno;
8376       reg = gen_rtx_REG (mode, regno);
8377       rvec[(*k)++] =
8378         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
8379
8380       this_regno += 1;
8381       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
8382       mode = word_mode;
8383       intregs -= 1;
8384     }
8385   while (intregs > 0);
8386 }
8387
8388 /* Recursive workhorse for the following.  */
8389
8390 static void
8391 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
8392                                     HOST_WIDE_INT startbitpos, rtx rvec[],
8393                                     int *k)
8394 {
8395   tree f;
8396
8397   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8398     if (TREE_CODE (f) == FIELD_DECL)
8399       {
8400         HOST_WIDE_INT bitpos = startbitpos;
8401         tree ftype = TREE_TYPE (f);
8402         enum machine_mode mode;
8403         if (ftype == error_mark_node)
8404           continue;
8405         mode = TYPE_MODE (ftype);
8406
8407         if (DECL_SIZE (f) != 0
8408             && host_integerp (bit_position (f), 1))
8409           bitpos += int_bit_position (f);
8410
8411         /* ??? FIXME: else assume zero offset.  */
8412
8413         if (TREE_CODE (ftype) == RECORD_TYPE)
8414           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
8415         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
8416           {
8417 #if 0
8418             switch (mode)
8419               {
8420               case SCmode: mode = SFmode; break;
8421               case DCmode: mode = DFmode; break;
8422               case TCmode: mode = TFmode; break;
8423               default: break;
8424               }
8425 #endif
8426             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8427             rvec[(*k)++]
8428               = gen_rtx_EXPR_LIST (VOIDmode,
8429                                    gen_rtx_REG (mode, cum->fregno++),
8430                                    GEN_INT (bitpos / BITS_PER_UNIT));
8431             if (mode == TFmode || mode == TDmode)
8432               cum->fregno++;
8433           }
8434         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
8435           {
8436             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8437             rvec[(*k)++]
8438               = gen_rtx_EXPR_LIST (VOIDmode,
8439                                    gen_rtx_REG (mode, cum->vregno++),
8440                                    GEN_INT (bitpos / BITS_PER_UNIT));
8441           }
8442         else if (cum->intoffset == -1)
8443           cum->intoffset = bitpos;
8444       }
8445 }
8446
8447 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
8448    the register(s) to be used for each field and subfield of a struct
8449    being passed by value, along with the offset of where the
8450    register's value may be found in the block.  FP fields go in FP
8451    register, vector fields go in vector registers, and everything
8452    else goes in int registers, packed as in memory.
8453
8454    This code is also used for function return values.  RETVAL indicates
8455    whether this is the case.
8456
8457    Much of this is taken from the SPARC V9 port, which has a similar
8458    calling convention.  */
8459
8460 static rtx
8461 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
8462                             bool named, bool retval)
8463 {
8464   rtx rvec[FIRST_PSEUDO_REGISTER];
8465   int k = 1, kbase = 1;
8466   HOST_WIDE_INT typesize = int_size_in_bytes (type);
8467   /* This is a copy; modifications are not visible to our caller.  */
8468   CUMULATIVE_ARGS copy_cum = *orig_cum;
8469   CUMULATIVE_ARGS *cum = &copy_cum;
8470
8471   /* Pad to 16 byte boundary if needed.  */
8472   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8473       && (cum->words % 2) != 0)
8474     cum->words++;
8475
8476   cum->intoffset = 0;
8477   cum->use_stack = 0;
8478   cum->named = named;
8479
8480   /* Put entries into rvec[] for individual FP and vector fields, and
8481      for the chunks of memory that go in int regs.  Note we start at
8482      element 1; 0 is reserved for an indication of using memory, and
8483      may or may not be filled in below. */
8484   rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
8485   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
8486
8487   /* If any part of the struct went on the stack put all of it there.
8488      This hack is because the generic code for
8489      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
8490      parts of the struct are not at the beginning.  */
8491   if (cum->use_stack)
8492     {
8493       if (retval)
8494         return NULL_RTX;    /* doesn't go in registers at all */
8495       kbase = 0;
8496       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8497     }
8498   if (k > 1 || cum->use_stack)
8499     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
8500   else
8501     return NULL_RTX;
8502 }
8503
8504 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
8505
8506 static rtx
8507 rs6000_mixed_function_arg (enum machine_mode mode, const_tree type,
8508                            int align_words)
8509 {
8510   int n_units;
8511   int i, k;
8512   rtx rvec[GP_ARG_NUM_REG + 1];
8513
8514   if (align_words >= GP_ARG_NUM_REG)
8515     return NULL_RTX;
8516
8517   n_units = rs6000_arg_size (mode, type);
8518
8519   /* Optimize the simple case where the arg fits in one gpr, except in
8520      the case of BLKmode due to assign_parms assuming that registers are
8521      BITS_PER_WORD wide.  */
8522   if (n_units == 0
8523       || (n_units == 1 && mode != BLKmode))
8524     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8525
8526   k = 0;
8527   if (align_words + n_units > GP_ARG_NUM_REG)
8528     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
8529        using a magic NULL_RTX component.
8530        This is not strictly correct.  Only some of the arg belongs in
8531        memory, not all of it.  However, the normal scheme using
8532        function_arg_partial_nregs can result in unusual subregs, eg.
8533        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
8534        store the whole arg to memory is often more efficient than code
8535        to store pieces, and we know that space is available in the right
8536        place for the whole arg.  */
8537     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8538
8539   i = 0;
8540   do
8541     {
8542       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
8543       rtx off = GEN_INT (i++ * 4);
8544       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8545     }
8546   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
8547
8548   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8549 }
8550
8551 /* Determine where to put an argument to a function.
8552    Value is zero to push the argument on the stack,
8553    or a hard register in which to store the argument.
8554
8555    MODE is the argument's machine mode.
8556    TYPE is the data type of the argument (as a tree).
8557     This is null for libcalls where that information may
8558     not be available.
8559    CUM is a variable of type CUMULATIVE_ARGS which gives info about
8560     the preceding args and about the function being called.  It is
8561     not modified in this routine.
8562    NAMED is nonzero if this argument is a named parameter
8563     (otherwise it is an extra parameter matching an ellipsis).
8564
8565    On RS/6000 the first eight words of non-FP are normally in registers
8566    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
8567    Under V.4, the first 8 FP args are in registers.
8568
8569    If this is floating-point and no prototype is specified, we use
8570    both an FP and integer register (or possibly FP reg and stack).  Library
8571    functions (when CALL_LIBCALL is set) always have the proper types for args,
8572    so we can pass the FP value just in one register.  emit_library_function
8573    doesn't support PARALLEL anyway.
8574
8575    Note that for args passed by reference, function_arg will be called
8576    with MODE and TYPE set to that of the pointer to the arg, not the arg
8577    itself.  */
8578
8579 static rtx
8580 rs6000_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8581                      const_tree type, bool named)
8582 {
8583   enum rs6000_abi abi = DEFAULT_ABI;
8584
8585   /* Return a marker to indicate whether CR1 needs to set or clear the
8586      bit that V.4 uses to say fp args were passed in registers.
8587      Assume that we don't need the marker for software floating point,
8588      or compiler generated library calls.  */
8589   if (mode == VOIDmode)
8590     {
8591       if (abi == ABI_V4
8592           && (cum->call_cookie & CALL_LIBCALL) == 0
8593           && (cum->stdarg
8594               || (cum->nargs_prototype < 0
8595                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
8596         {
8597           /* For the SPE, we need to crxor CR6 always.  */
8598           if (TARGET_SPE_ABI)
8599             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
8600           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
8601             return GEN_INT (cum->call_cookie
8602                             | ((cum->fregno == FP_ARG_MIN_REG)
8603                                ? CALL_V4_SET_FP_ARGS
8604                                : CALL_V4_CLEAR_FP_ARGS));
8605         }
8606
8607       return GEN_INT (cum->call_cookie);
8608     }
8609
8610   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8611     {
8612       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
8613       if (rslt != NULL_RTX)
8614         return rslt;
8615       /* Else fall through to usual handling.  */
8616     }
8617
8618   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8619     if (TARGET_64BIT && ! cum->prototype)
8620       {
8621         /* Vector parameters get passed in vector register
8622            and also in GPRs or memory, in absence of prototype.  */
8623         int align_words;
8624         rtx slot;
8625         align_words = (cum->words + 1) & ~1;
8626
8627         if (align_words >= GP_ARG_NUM_REG)
8628           {
8629             slot = NULL_RTX;
8630           }
8631         else
8632           {
8633             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8634           }
8635         return gen_rtx_PARALLEL (mode,
8636                  gen_rtvec (2,
8637                             gen_rtx_EXPR_LIST (VOIDmode,
8638                                                slot, const0_rtx),
8639                             gen_rtx_EXPR_LIST (VOIDmode,
8640                                                gen_rtx_REG (mode, cum->vregno),
8641                                                const0_rtx)));
8642       }
8643     else
8644       return gen_rtx_REG (mode, cum->vregno);
8645   else if (TARGET_ALTIVEC_ABI
8646            && (ALTIVEC_VECTOR_MODE (mode)
8647                || VSX_VECTOR_MODE (mode)
8648                || (type && TREE_CODE (type) == VECTOR_TYPE
8649                    && int_size_in_bytes (type) == 16)))
8650     {
8651       if (named || abi == ABI_V4)
8652         return NULL_RTX;
8653       else
8654         {
8655           /* Vector parameters to varargs functions under AIX or Darwin
8656              get passed in memory and possibly also in GPRs.  */
8657           int align, align_words, n_words;
8658           enum machine_mode part_mode;
8659
8660           /* Vector parameters must be 16-byte aligned.  This places them at
8661              2 mod 4 in terms of words in 32-bit mode, since the parameter
8662              save area starts at offset 24 from the stack.  In 64-bit mode,
8663              they just have to start on an even word, since the parameter
8664              save area is 16-byte aligned.  */
8665           if (TARGET_32BIT)
8666             align = (2 - cum->words) & 3;
8667           else
8668             align = cum->words & 1;
8669           align_words = cum->words + align;
8670
8671           /* Out of registers?  Memory, then.  */
8672           if (align_words >= GP_ARG_NUM_REG)
8673             return NULL_RTX;
8674
8675           if (TARGET_32BIT && TARGET_POWERPC64)
8676             return rs6000_mixed_function_arg (mode, type, align_words);
8677
8678           /* The vector value goes in GPRs.  Only the part of the
8679              value in GPRs is reported here.  */
8680           part_mode = mode;
8681           n_words = rs6000_arg_size (mode, type);
8682           if (align_words + n_words > GP_ARG_NUM_REG)
8683             /* Fortunately, there are only two possibilities, the value
8684                is either wholly in GPRs or half in GPRs and half not.  */
8685             part_mode = DImode;
8686
8687           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
8688         }
8689     }
8690   else if (TARGET_SPE_ABI && TARGET_SPE
8691            && (SPE_VECTOR_MODE (mode)
8692                || (TARGET_E500_DOUBLE && (mode == DFmode
8693                                           || mode == DCmode
8694                                           || mode == TFmode
8695                                           || mode == TCmode))))
8696     return rs6000_spe_function_arg (cum, mode, type);
8697
8698   else if (abi == ABI_V4)
8699     {
8700       if (TARGET_HARD_FLOAT && TARGET_FPRS
8701           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8702               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8703               || (mode == TFmode && !TARGET_IEEEQUAD)
8704               || mode == SDmode || mode == DDmode || mode == TDmode))
8705         {
8706           /* _Decimal128 must use an even/odd register pair.  This assumes
8707              that the register number is odd when fregno is odd.  */
8708           if (mode == TDmode && (cum->fregno % 2) == 1)
8709             cum->fregno++;
8710
8711           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8712               <= FP_ARG_V4_MAX_REG)
8713             return gen_rtx_REG (mode, cum->fregno);
8714           else
8715             return NULL_RTX;
8716         }
8717       else
8718         {
8719           int n_words = rs6000_arg_size (mode, type);
8720           int gregno = cum->sysv_gregno;
8721
8722           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8723              (r7,r8) or (r9,r10).  As does any other 2 word item such
8724              as complex int due to a historical mistake.  */
8725           if (n_words == 2)
8726             gregno += (1 - gregno) & 1;
8727
8728           /* Multi-reg args are not split between registers and stack.  */
8729           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8730             return NULL_RTX;
8731
8732           if (TARGET_32BIT && TARGET_POWERPC64)
8733             return rs6000_mixed_function_arg (mode, type,
8734                                               gregno - GP_ARG_MIN_REG);
8735           return gen_rtx_REG (mode, gregno);
8736         }
8737     }
8738   else
8739     {
8740       int align_words = rs6000_parm_start (mode, type, cum->words);
8741
8742       /* _Decimal128 must be passed in an even/odd float register pair.
8743          This assumes that the register number is odd when fregno is odd.  */
8744       if (mode == TDmode && (cum->fregno % 2) == 1)
8745         cum->fregno++;
8746
8747       if (USE_FP_FOR_ARG_P (cum, mode, type))
8748         {
8749           rtx rvec[GP_ARG_NUM_REG + 1];
8750           rtx r;
8751           int k;
8752           bool needs_psave;
8753           enum machine_mode fmode = mode;
8754           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8755
8756           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8757             {
8758               /* Currently, we only ever need one reg here because complex
8759                  doubles are split.  */
8760               gcc_assert (cum->fregno == FP_ARG_MAX_REG
8761                           && (fmode == TFmode || fmode == TDmode));
8762
8763               /* Long double or _Decimal128 split over regs and memory.  */
8764               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
8765             }
8766
8767           /* Do we also need to pass this arg in the parameter save
8768              area?  */
8769           needs_psave = (type
8770                          && (cum->nargs_prototype <= 0
8771                              || (DEFAULT_ABI == ABI_AIX
8772                                  && TARGET_XL_COMPAT
8773                                  && align_words >= GP_ARG_NUM_REG)));
8774
8775           if (!needs_psave && mode == fmode)
8776             return gen_rtx_REG (fmode, cum->fregno);
8777
8778           k = 0;
8779           if (needs_psave)
8780             {
8781               /* Describe the part that goes in gprs or the stack.
8782                  This piece must come first, before the fprs.  */
8783               if (align_words < GP_ARG_NUM_REG)
8784                 {
8785                   unsigned long n_words = rs6000_arg_size (mode, type);
8786
8787                   if (align_words + n_words > GP_ARG_NUM_REG
8788                       || (TARGET_32BIT && TARGET_POWERPC64))
8789                     {
8790                       /* If this is partially on the stack, then we only
8791                          include the portion actually in registers here.  */
8792                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
8793                       rtx off;
8794                       int i = 0;
8795                       if (align_words + n_words > GP_ARG_NUM_REG)
8796                         /* Not all of the arg fits in gprs.  Say that it
8797                            goes in memory too, using a magic NULL_RTX
8798                            component.  Also see comment in
8799                            rs6000_mixed_function_arg for why the normal
8800                            function_arg_partial_nregs scheme doesn't work
8801                            in this case. */
8802                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
8803                                                        const0_rtx);
8804                       do
8805                         {
8806                           r = gen_rtx_REG (rmode,
8807                                            GP_ARG_MIN_REG + align_words);
8808                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
8809                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8810                         }
8811                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
8812                     }
8813                   else
8814                     {
8815                       /* The whole arg fits in gprs.  */
8816                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8817                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8818                     }
8819                 }
8820               else
8821                 /* It's entirely in memory.  */
8822                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8823             }
8824
8825           /* Describe where this piece goes in the fprs.  */
8826           r = gen_rtx_REG (fmode, cum->fregno);
8827           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8828
8829           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8830         }
8831       else if (align_words < GP_ARG_NUM_REG)
8832         {
8833           if (TARGET_32BIT && TARGET_POWERPC64)
8834             return rs6000_mixed_function_arg (mode, type, align_words);
8835
8836           if (mode == BLKmode)
8837             mode = Pmode;
8838
8839           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8840         }
8841       else
8842         return NULL_RTX;
8843     }
8844 }
8845 \f
8846 /* For an arg passed partly in registers and partly in memory, this is
8847    the number of bytes passed in registers.  For args passed entirely in
8848    registers or entirely in memory, zero.  When an arg is described by a
8849    PARALLEL, perhaps using more than one register type, this function
8850    returns the number of bytes used by the first element of the PARALLEL.  */
8851
8852 static int
8853 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8854                           tree type, bool named)
8855 {
8856   int ret = 0;
8857   int align_words;
8858
8859   if (DEFAULT_ABI == ABI_V4)
8860     return 0;
8861
8862   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
8863       && cum->nargs_prototype >= 0)
8864     return 0;
8865
8866   /* In this complicated case we just disable the partial_nregs code.  */
8867   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8868     return 0;
8869
8870   align_words = rs6000_parm_start (mode, type, cum->words);
8871
8872   if (USE_FP_FOR_ARG_P (cum, mode, type))
8873     {
8874       /* If we are passing this arg in the fixed parameter save area
8875          (gprs or memory) as well as fprs, then this function should
8876          return the number of partial bytes passed in the parameter
8877          save area rather than partial bytes passed in fprs.  */
8878       if (type
8879           && (cum->nargs_prototype <= 0
8880               || (DEFAULT_ABI == ABI_AIX
8881                   && TARGET_XL_COMPAT
8882                   && align_words >= GP_ARG_NUM_REG)))
8883         return 0;
8884       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
8885                > FP_ARG_MAX_REG + 1)
8886         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
8887       else if (cum->nargs_prototype >= 0)
8888         return 0;
8889     }
8890
8891   if (align_words < GP_ARG_NUM_REG
8892       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
8893     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
8894
8895   if (ret != 0 && TARGET_DEBUG_ARG)
8896     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
8897
8898   return ret;
8899 }
8900 \f
8901 /* A C expression that indicates when an argument must be passed by
8902    reference.  If nonzero for an argument, a copy of that argument is
8903    made in memory and a pointer to the argument is passed instead of
8904    the argument itself.  The pointer is passed in whatever way is
8905    appropriate for passing a pointer to that type.
8906
8907    Under V.4, aggregates and long double are passed by reference.
8908
8909    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
8910    reference unless the AltiVec vector extension ABI is in force.
8911
8912    As an extension to all ABIs, variable sized types are passed by
8913    reference.  */
8914
8915 static bool
8916 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
8917                           enum machine_mode mode, const_tree type,
8918                           bool named ATTRIBUTE_UNUSED)
8919 {
8920   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
8921     {
8922       if (TARGET_DEBUG_ARG)
8923         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
8924       return 1;
8925     }
8926
8927   if (!type)
8928     return 0;
8929
8930   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
8931     {
8932       if (TARGET_DEBUG_ARG)
8933         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
8934       return 1;
8935     }
8936
8937   if (int_size_in_bytes (type) < 0)
8938     {
8939       if (TARGET_DEBUG_ARG)
8940         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
8941       return 1;
8942     }
8943
8944   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
8945      modes only exist for GCC vector types if -maltivec.  */
8946   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
8947     {
8948       if (TARGET_DEBUG_ARG)
8949         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
8950       return 1;
8951     }
8952
8953   /* Pass synthetic vectors in memory.  */
8954   if (TREE_CODE (type) == VECTOR_TYPE
8955       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
8956     {
8957       static bool warned_for_pass_big_vectors = false;
8958       if (TARGET_DEBUG_ARG)
8959         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
8960       if (!warned_for_pass_big_vectors)
8961         {
8962           warning (0, "GCC vector passed by reference: "
8963                    "non-standard ABI extension with no compatibility guarantee");
8964           warned_for_pass_big_vectors = true;
8965         }
8966       return 1;
8967     }
8968
8969   return 0;
8970 }
8971
8972 static void
8973 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
8974 {
8975   int i;
8976   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
8977
8978   if (nregs == 0)
8979     return;
8980
8981   for (i = 0; i < nregs; i++)
8982     {
8983       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
8984       if (reload_completed)
8985         {
8986           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
8987             tem = NULL_RTX;
8988           else
8989             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
8990                                        i * GET_MODE_SIZE (reg_mode));
8991         }
8992       else
8993         tem = replace_equiv_address (tem, XEXP (tem, 0));
8994
8995       gcc_assert (tem);
8996
8997       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
8998     }
8999 }
9000 \f
9001 /* Perform any needed actions needed for a function that is receiving a
9002    variable number of arguments.
9003
9004    CUM is as above.
9005
9006    MODE and TYPE are the mode and type of the current parameter.
9007
9008    PRETEND_SIZE is a variable that should be set to the amount of stack
9009    that must be pushed by the prolog to pretend that our caller pushed
9010    it.
9011
9012    Normally, this macro will push all remaining incoming registers on the
9013    stack and set PRETEND_SIZE to the length of the registers pushed.  */
9014
9015 static void
9016 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9017                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
9018                         int no_rtl)
9019 {
9020   CUMULATIVE_ARGS next_cum;
9021   int reg_size = TARGET_32BIT ? 4 : 8;
9022   rtx save_area = NULL_RTX, mem;
9023   int first_reg_offset;
9024   alias_set_type set;
9025
9026   /* Skip the last named argument.  */
9027   next_cum = *cum;
9028   rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
9029
9030   if (DEFAULT_ABI == ABI_V4)
9031     {
9032       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
9033
9034       if (! no_rtl)
9035         {
9036           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
9037           HOST_WIDE_INT offset = 0;
9038
9039           /* Try to optimize the size of the varargs save area.
9040              The ABI requires that ap.reg_save_area is doubleword
9041              aligned, but we don't need to allocate space for all
9042              the bytes, only those to which we actually will save
9043              anything.  */
9044           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
9045             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
9046           if (TARGET_HARD_FLOAT && TARGET_FPRS
9047               && next_cum.fregno <= FP_ARG_V4_MAX_REG
9048               && cfun->va_list_fpr_size)
9049             {
9050               if (gpr_reg_num)
9051                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
9052                            * UNITS_PER_FP_WORD;
9053               if (cfun->va_list_fpr_size
9054                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
9055                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
9056               else
9057                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
9058                             * UNITS_PER_FP_WORD;
9059             }
9060           if (gpr_reg_num)
9061             {
9062               offset = -((first_reg_offset * reg_size) & ~7);
9063               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
9064                 {
9065                   gpr_reg_num = cfun->va_list_gpr_size;
9066                   if (reg_size == 4 && (first_reg_offset & 1))
9067                     gpr_reg_num++;
9068                 }
9069               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
9070             }
9071           else if (fpr_size)
9072             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
9073                        * UNITS_PER_FP_WORD
9074                      - (int) (GP_ARG_NUM_REG * reg_size);
9075
9076           if (gpr_size + fpr_size)
9077             {
9078               rtx reg_save_area
9079                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
9080               gcc_assert (GET_CODE (reg_save_area) == MEM);
9081               reg_save_area = XEXP (reg_save_area, 0);
9082               if (GET_CODE (reg_save_area) == PLUS)
9083                 {
9084                   gcc_assert (XEXP (reg_save_area, 0)
9085                               == virtual_stack_vars_rtx);
9086                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
9087                   offset += INTVAL (XEXP (reg_save_area, 1));
9088                 }
9089               else
9090                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
9091             }
9092
9093           cfun->machine->varargs_save_offset = offset;
9094           save_area = plus_constant (virtual_stack_vars_rtx, offset);
9095         }
9096     }
9097   else
9098     {
9099       first_reg_offset = next_cum.words;
9100       save_area = virtual_incoming_args_rtx;
9101
9102       if (targetm.calls.must_pass_in_stack (mode, type))
9103         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
9104     }
9105
9106   set = get_varargs_alias_set ();
9107   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
9108       && cfun->va_list_gpr_size)
9109     {
9110       int nregs = GP_ARG_NUM_REG - first_reg_offset;
9111
9112       if (va_list_gpr_counter_field)
9113         {
9114           /* V4 va_list_gpr_size counts number of registers needed.  */
9115           if (nregs > cfun->va_list_gpr_size)
9116             nregs = cfun->va_list_gpr_size;
9117         }
9118       else
9119         {
9120           /* char * va_list instead counts number of bytes needed.  */
9121           if (nregs > cfun->va_list_gpr_size / reg_size)
9122             nregs = cfun->va_list_gpr_size / reg_size;
9123         }
9124
9125       mem = gen_rtx_MEM (BLKmode,
9126                          plus_constant (save_area,
9127                                         first_reg_offset * reg_size));
9128       MEM_NOTRAP_P (mem) = 1;
9129       set_mem_alias_set (mem, set);
9130       set_mem_align (mem, BITS_PER_WORD);
9131
9132       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
9133                                   nregs);
9134     }
9135
9136   /* Save FP registers if needed.  */
9137   if (DEFAULT_ABI == ABI_V4
9138       && TARGET_HARD_FLOAT && TARGET_FPRS
9139       && ! no_rtl
9140       && next_cum.fregno <= FP_ARG_V4_MAX_REG
9141       && cfun->va_list_fpr_size)
9142     {
9143       int fregno = next_cum.fregno, nregs;
9144       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
9145       rtx lab = gen_label_rtx ();
9146       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
9147                                                * UNITS_PER_FP_WORD);
9148
9149       emit_jump_insn
9150         (gen_rtx_SET (VOIDmode,
9151                       pc_rtx,
9152                       gen_rtx_IF_THEN_ELSE (VOIDmode,
9153                                             gen_rtx_NE (VOIDmode, cr1,
9154                                                         const0_rtx),
9155                                             gen_rtx_LABEL_REF (VOIDmode, lab),
9156                                             pc_rtx)));
9157
9158       for (nregs = 0;
9159            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
9160            fregno++, off += UNITS_PER_FP_WORD, nregs++)
9161         {
9162           mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9163                               ? DFmode : SFmode, 
9164                              plus_constant (save_area, off));
9165           MEM_NOTRAP_P (mem) = 1;
9166           set_mem_alias_set (mem, set);
9167           set_mem_align (mem, GET_MODE_ALIGNMENT (
9168                          (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9169                           ? DFmode : SFmode));
9170           emit_move_insn (mem, gen_rtx_REG (
9171                           (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9172                            ? DFmode : SFmode, fregno));
9173         }
9174
9175       emit_label (lab);
9176     }
9177 }
9178
9179 /* Create the va_list data type.  */
9180
9181 static tree
9182 rs6000_build_builtin_va_list (void)
9183 {
9184   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
9185
9186   /* For AIX, prefer 'char *' because that's what the system
9187      header files like.  */
9188   if (DEFAULT_ABI != ABI_V4)
9189     return build_pointer_type (char_type_node);
9190
9191   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
9192   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
9193                           get_identifier ("__va_list_tag"), record);
9194
9195   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
9196                       unsigned_char_type_node);
9197   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
9198                       unsigned_char_type_node);
9199   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
9200      every user file.  */
9201   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9202                       get_identifier ("reserved"), short_unsigned_type_node);
9203   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9204                       get_identifier ("overflow_arg_area"),
9205                       ptr_type_node);
9206   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9207                       get_identifier ("reg_save_area"),
9208                       ptr_type_node);
9209
9210   va_list_gpr_counter_field = f_gpr;
9211   va_list_fpr_counter_field = f_fpr;
9212
9213   DECL_FIELD_CONTEXT (f_gpr) = record;
9214   DECL_FIELD_CONTEXT (f_fpr) = record;
9215   DECL_FIELD_CONTEXT (f_res) = record;
9216   DECL_FIELD_CONTEXT (f_ovf) = record;
9217   DECL_FIELD_CONTEXT (f_sav) = record;
9218
9219   TYPE_STUB_DECL (record) = type_decl;
9220   TYPE_NAME (record) = type_decl;
9221   TYPE_FIELDS (record) = f_gpr;
9222   DECL_CHAIN (f_gpr) = f_fpr;
9223   DECL_CHAIN (f_fpr) = f_res;
9224   DECL_CHAIN (f_res) = f_ovf;
9225   DECL_CHAIN (f_ovf) = f_sav;
9226
9227   layout_type (record);
9228
9229   /* The correct type is an array type of one element.  */
9230   return build_array_type (record, build_index_type (size_zero_node));
9231 }
9232
9233 /* Implement va_start.  */
9234
9235 static void
9236 rs6000_va_start (tree valist, rtx nextarg)
9237 {
9238   HOST_WIDE_INT words, n_gpr, n_fpr;
9239   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9240   tree gpr, fpr, ovf, sav, t;
9241
9242   /* Only SVR4 needs something special.  */
9243   if (DEFAULT_ABI != ABI_V4)
9244     {
9245       std_expand_builtin_va_start (valist, nextarg);
9246       return;
9247     }
9248
9249   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9250   f_fpr = DECL_CHAIN (f_gpr);
9251   f_res = DECL_CHAIN (f_fpr);
9252   f_ovf = DECL_CHAIN (f_res);
9253   f_sav = DECL_CHAIN (f_ovf);
9254
9255   valist = build_va_arg_indirect_ref (valist);
9256   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9257   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9258                 f_fpr, NULL_TREE);
9259   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9260                 f_ovf, NULL_TREE);
9261   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9262                 f_sav, NULL_TREE);
9263
9264   /* Count number of gp and fp argument registers used.  */
9265   words = crtl->args.info.words;
9266   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
9267                GP_ARG_NUM_REG);
9268   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
9269                FP_ARG_NUM_REG);
9270
9271   if (TARGET_DEBUG_ARG)
9272     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
9273              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
9274              words, n_gpr, n_fpr);
9275
9276   if (cfun->va_list_gpr_size)
9277     {
9278       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
9279                   build_int_cst (NULL_TREE, n_gpr));
9280       TREE_SIDE_EFFECTS (t) = 1;
9281       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9282     }
9283
9284   if (cfun->va_list_fpr_size)
9285     {
9286       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
9287                   build_int_cst (NULL_TREE, n_fpr));
9288       TREE_SIDE_EFFECTS (t) = 1;
9289       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9290     }
9291
9292   /* Find the overflow area.  */
9293   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
9294   if (words != 0)
9295     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
9296                 size_int (words * UNITS_PER_WORD));
9297   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
9298   TREE_SIDE_EFFECTS (t) = 1;
9299   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9300
9301   /* If there were no va_arg invocations, don't set up the register
9302      save area.  */
9303   if (!cfun->va_list_gpr_size
9304       && !cfun->va_list_fpr_size
9305       && n_gpr < GP_ARG_NUM_REG
9306       && n_fpr < FP_ARG_V4_MAX_REG)
9307     return;
9308
9309   /* Find the register save area.  */
9310   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
9311   if (cfun->machine->varargs_save_offset)
9312     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
9313                 size_int (cfun->machine->varargs_save_offset));
9314   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
9315   TREE_SIDE_EFFECTS (t) = 1;
9316   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9317 }
9318
9319 /* Implement va_arg.  */
9320
9321 tree
9322 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
9323                         gimple_seq *post_p)
9324 {
9325   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9326   tree gpr, fpr, ovf, sav, reg, t, u;
9327   int size, rsize, n_reg, sav_ofs, sav_scale;
9328   tree lab_false, lab_over, addr;
9329   int align;
9330   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
9331   int regalign = 0;
9332   gimple stmt;
9333
9334   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
9335     {
9336       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
9337       return build_va_arg_indirect_ref (t);
9338     }
9339
9340   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
9341      earlier version of gcc, with the property that it always applied alignment
9342      adjustments to the va-args (even for zero-sized types).  The cheapest way
9343      to deal with this is to replicate the effect of the part of 
9344      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
9345      of relevance.  
9346      We don't need to check for pass-by-reference because of the test above.
9347      We can return a simplifed answer, since we know there's no offset to add.  */
9348
9349   if (TARGET_MACHO
9350       && rs6000_darwin64_abi 
9351       && integer_zerop (TYPE_SIZE (type)))
9352     {
9353       unsigned HOST_WIDE_INT align, boundary;
9354       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
9355       align = PARM_BOUNDARY / BITS_PER_UNIT;
9356       boundary = FUNCTION_ARG_BOUNDARY (TYPE_MODE (type), type);
9357       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
9358         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
9359       boundary /= BITS_PER_UNIT;
9360       if (boundary > align)
9361         {
9362           tree t ;
9363           /* This updates arg ptr by the amount that would be necessary
9364              to align the zero-sized (but not zero-alignment) item.  */
9365           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9366                   fold_build2 (POINTER_PLUS_EXPR,
9367                                TREE_TYPE (valist),
9368                                valist_tmp, size_int (boundary - 1)));
9369           gimplify_and_add (t, pre_p);
9370
9371           t = fold_convert (sizetype, valist_tmp);
9372           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9373                   fold_convert (TREE_TYPE (valist),
9374                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
9375                                              size_int (-boundary))));
9376           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
9377           gimplify_and_add (t, pre_p);
9378         }
9379       /* Since it is zero-sized there's no increment for the item itself. */
9380       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
9381       return build_va_arg_indirect_ref (valist_tmp);
9382     }
9383
9384   if (DEFAULT_ABI != ABI_V4)
9385     {
9386       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
9387         {
9388           tree elem_type = TREE_TYPE (type);
9389           enum machine_mode elem_mode = TYPE_MODE (elem_type);
9390           int elem_size = GET_MODE_SIZE (elem_mode);
9391
9392           if (elem_size < UNITS_PER_WORD)
9393             {
9394               tree real_part, imag_part;
9395               gimple_seq post = NULL;
9396
9397               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9398                                                   &post);
9399               /* Copy the value into a temporary, lest the formal temporary
9400                  be reused out from under us.  */
9401               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
9402               gimple_seq_add_seq (pre_p, post);
9403
9404               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9405                                                   post_p);
9406
9407               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
9408             }
9409         }
9410
9411       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
9412     }
9413
9414   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9415   f_fpr = DECL_CHAIN (f_gpr);
9416   f_res = DECL_CHAIN (f_fpr);
9417   f_ovf = DECL_CHAIN (f_res);
9418   f_sav = DECL_CHAIN (f_ovf);
9419
9420   valist = build_va_arg_indirect_ref (valist);
9421   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9422   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9423                 f_fpr, NULL_TREE);
9424   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9425                 f_ovf, NULL_TREE);
9426   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9427                 f_sav, NULL_TREE);
9428
9429   size = int_size_in_bytes (type);
9430   rsize = (size + 3) / 4;
9431   align = 1;
9432
9433   if (TARGET_HARD_FLOAT && TARGET_FPRS
9434       && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
9435           || (TARGET_DOUBLE_FLOAT 
9436               && (TYPE_MODE (type) == DFmode 
9437                   || TYPE_MODE (type) == TFmode
9438                   || TYPE_MODE (type) == SDmode
9439                   || TYPE_MODE (type) == DDmode
9440                   || TYPE_MODE (type) == TDmode))))
9441     {
9442       /* FP args go in FP registers, if present.  */
9443       reg = fpr;
9444       n_reg = (size + 7) / 8;
9445       sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
9446       sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
9447       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
9448         align = 8;
9449     }
9450   else
9451     {
9452       /* Otherwise into GP registers.  */
9453       reg = gpr;
9454       n_reg = rsize;
9455       sav_ofs = 0;
9456       sav_scale = 4;
9457       if (n_reg == 2)
9458         align = 8;
9459     }
9460
9461   /* Pull the value out of the saved registers....  */
9462
9463   lab_over = NULL;
9464   addr = create_tmp_var (ptr_type_node, "addr");
9465
9466   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
9467   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
9468     align = 16;
9469   else
9470     {
9471       lab_false = create_artificial_label (input_location);
9472       lab_over = create_artificial_label (input_location);
9473
9474       /* Long long and SPE vectors are aligned in the registers.
9475          As are any other 2 gpr item such as complex int due to a
9476          historical mistake.  */
9477       u = reg;
9478       if (n_reg == 2 && reg == gpr)
9479         {
9480           regalign = 1;
9481           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9482                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
9483           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
9484                       unshare_expr (reg), u);
9485         }
9486       /* _Decimal128 is passed in even/odd fpr pairs; the stored
9487          reg number is 0 for f1, so we want to make it odd.  */
9488       else if (reg == fpr && TYPE_MODE (type) == TDmode)
9489         {
9490           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9491                       build_int_cst (TREE_TYPE (reg), 1));
9492           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
9493         }
9494
9495       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
9496       t = build2 (GE_EXPR, boolean_type_node, u, t);
9497       u = build1 (GOTO_EXPR, void_type_node, lab_false);
9498       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
9499       gimplify_and_add (t, pre_p);
9500
9501       t = sav;
9502       if (sav_ofs)
9503         t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
9504
9505       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9506                   build_int_cst (TREE_TYPE (reg), n_reg));
9507       u = fold_convert (sizetype, u);
9508       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
9509       t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
9510
9511       /* _Decimal32 varargs are located in the second word of the 64-bit
9512          FP register for 32-bit binaries.  */
9513       if (!TARGET_POWERPC64
9514           && TARGET_HARD_FLOAT && TARGET_FPRS
9515           && TYPE_MODE (type) == SDmode)
9516         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9517
9518       gimplify_assign (addr, t, pre_p);
9519
9520       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
9521
9522       stmt = gimple_build_label (lab_false);
9523       gimple_seq_add_stmt (pre_p, stmt);
9524
9525       if ((n_reg == 2 && !regalign) || n_reg > 2)
9526         {
9527           /* Ensure that we don't find any more args in regs.
9528              Alignment has taken care of for special cases.  */
9529           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
9530         }
9531     }
9532
9533   /* ... otherwise out of the overflow area.  */
9534
9535   /* Care for on-stack alignment if needed.  */
9536   t = ovf;
9537   if (align != 1)
9538     {
9539       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
9540       t = fold_convert (sizetype, t);
9541       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
9542                   size_int (-align));
9543       t = fold_convert (TREE_TYPE (ovf), t);
9544     }
9545   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
9546
9547   gimplify_assign (unshare_expr (addr), t, pre_p);
9548
9549   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9550   gimplify_assign (unshare_expr (ovf), t, pre_p);
9551
9552   if (lab_over)
9553     {
9554       stmt = gimple_build_label (lab_over);
9555       gimple_seq_add_stmt (pre_p, stmt);
9556     }
9557
9558   if (STRICT_ALIGNMENT
9559       && (TYPE_ALIGN (type)
9560           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
9561     {
9562       /* The value (of type complex double, for example) may not be
9563          aligned in memory in the saved registers, so copy via a
9564          temporary.  (This is the same code as used for SPARC.)  */
9565       tree tmp = create_tmp_var (type, "va_arg_tmp");
9566       tree dest_addr = build_fold_addr_expr (tmp);
9567
9568       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
9569                                    3, dest_addr, addr, size_int (rsize * 4));
9570
9571       gimplify_and_add (copy, pre_p);
9572       addr = dest_addr;
9573     }
9574
9575   addr = fold_convert (ptrtype, addr);
9576   return build_va_arg_indirect_ref (addr);
9577 }
9578
9579 /* Builtins.  */
9580
9581 static void
9582 def_builtin (int mask, const char *name, tree type, int code)
9583 {
9584   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
9585     {
9586       tree t;
9587       if (rs6000_builtin_decls[code])
9588         fatal_error ("internal error: builtin function to %s already processed.",
9589                      name);
9590
9591       rs6000_builtin_decls[code] = t =
9592         add_builtin_function (name, type, code, BUILT_IN_MD,
9593                               NULL, NULL_TREE);
9594
9595       gcc_assert (code >= 0 && code < (int)RS6000_BUILTIN_COUNT);
9596       switch (builtin_classify[code])
9597         {
9598         default:
9599           gcc_unreachable ();
9600
9601           /* assume builtin can do anything.  */
9602         case RS6000_BTC_MISC:
9603           break;
9604
9605           /* const function, function only depends on the inputs.  */
9606         case RS6000_BTC_CONST:
9607           TREE_READONLY (t) = 1;
9608           TREE_NOTHROW (t) = 1;
9609           break;
9610
9611           /* pure function, function can read global memory.  */
9612         case RS6000_BTC_PURE:
9613           DECL_PURE_P (t) = 1;
9614           TREE_NOTHROW (t) = 1;
9615           break;
9616
9617           /* Function is a math function.  If rounding mode is on, then treat
9618              the function as not reading global memory, but it can have
9619              arbitrary side effects.  If it is off, then assume the function is
9620              a const function.  This mimics the ATTR_MATHFN_FPROUNDING
9621              attribute in builtin-attribute.def that is used for the math
9622              functions. */
9623         case RS6000_BTC_FP_PURE:
9624           TREE_NOTHROW (t) = 1;
9625           if (flag_rounding_math)
9626             {
9627               DECL_PURE_P (t) = 1;
9628               DECL_IS_NOVOPS (t) = 1;
9629             }
9630           else
9631             TREE_READONLY (t) = 1;
9632           break;
9633         }
9634     }
9635 }
9636
9637 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
9638
9639 static const struct builtin_description bdesc_3arg[] =
9640 {
9641   { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
9642   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
9643   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
9644   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
9645   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
9646   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
9647   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
9648   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
9649   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
9650   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
9651   { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
9652   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2df, "__builtin_altivec_vperm_2df", ALTIVEC_BUILTIN_VPERM_2DF },
9653   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di, "__builtin_altivec_vperm_2di", ALTIVEC_BUILTIN_VPERM_2DI },
9654   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
9655   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
9656   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
9657   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
9658   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_altivec_vperm_2di_uns", ALTIVEC_BUILTIN_VPERM_2DI_UNS },
9659   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_altivec_vperm_4si_uns", ALTIVEC_BUILTIN_VPERM_4SI_UNS },
9660   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_altivec_vperm_8hi_uns", ALTIVEC_BUILTIN_VPERM_8HI_UNS },
9661   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi_uns", ALTIVEC_BUILTIN_VPERM_16QI_UNS },
9662   { MASK_ALTIVEC, CODE_FOR_vector_select_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
9663   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
9664   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
9665   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
9666   { MASK_ALTIVEC, CODE_FOR_vector_select_v2df, "__builtin_altivec_vsel_2df", ALTIVEC_BUILTIN_VSEL_2DF },
9667   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di, "__builtin_altivec_vsel_2di", ALTIVEC_BUILTIN_VSEL_2DI },
9668   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si_uns, "__builtin_altivec_vsel_4si_uns", ALTIVEC_BUILTIN_VSEL_4SI_UNS },
9669   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi_uns, "__builtin_altivec_vsel_8hi_uns", ALTIVEC_BUILTIN_VSEL_8HI_UNS },
9670   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi_uns, "__builtin_altivec_vsel_16qi_uns", ALTIVEC_BUILTIN_VSEL_16QI_UNS },
9671   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di_uns, "__builtin_altivec_vsel_2di_uns", ALTIVEC_BUILTIN_VSEL_2DI_UNS },
9672   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
9673   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
9674   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
9675   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
9676
9677   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
9678   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
9679   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
9680   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
9681   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
9682   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
9683   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
9684   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
9685   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
9686   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
9687   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
9688   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
9689   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
9690   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
9691   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
9692
9693   { MASK_VSX, CODE_FOR_vsx_fmaddv2df4, "__builtin_vsx_xvmadddp", VSX_BUILTIN_XVMADDDP },
9694   { MASK_VSX, CODE_FOR_vsx_fmsubv2df4, "__builtin_vsx_xvmsubdp", VSX_BUILTIN_XVMSUBDP },
9695   { MASK_VSX, CODE_FOR_vsx_fnmaddv2df4, "__builtin_vsx_xvnmadddp", VSX_BUILTIN_XVNMADDDP },
9696   { MASK_VSX, CODE_FOR_vsx_fnmsubv2df4, "__builtin_vsx_xvnmsubdp", VSX_BUILTIN_XVNMSUBDP },
9697
9698   { MASK_VSX, CODE_FOR_vsx_fmaddv4sf4, "__builtin_vsx_xvmaddsp", VSX_BUILTIN_XVMADDSP },
9699   { MASK_VSX, CODE_FOR_vsx_fmsubv4sf4, "__builtin_vsx_xvmsubsp", VSX_BUILTIN_XVMSUBSP },
9700   { MASK_VSX, CODE_FOR_vsx_fnmaddv4sf4, "__builtin_vsx_xvnmaddsp", VSX_BUILTIN_XVNMADDSP },
9701   { MASK_VSX, CODE_FOR_vsx_fnmsubv4sf4, "__builtin_vsx_xvnmsubsp", VSX_BUILTIN_XVNMSUBSP },
9702
9703   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msub", VSX_BUILTIN_VEC_MSUB },
9704   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmadd", VSX_BUILTIN_VEC_NMADD },
9705
9706   { MASK_VSX, CODE_FOR_vector_select_v2di, "__builtin_vsx_xxsel_2di", VSX_BUILTIN_XXSEL_2DI },
9707   { MASK_VSX, CODE_FOR_vector_select_v2df, "__builtin_vsx_xxsel_2df", VSX_BUILTIN_XXSEL_2DF },
9708   { MASK_VSX, CODE_FOR_vector_select_v4sf, "__builtin_vsx_xxsel_4sf", VSX_BUILTIN_XXSEL_4SF },
9709   { MASK_VSX, CODE_FOR_vector_select_v4si, "__builtin_vsx_xxsel_4si", VSX_BUILTIN_XXSEL_4SI },
9710   { MASK_VSX, CODE_FOR_vector_select_v8hi, "__builtin_vsx_xxsel_8hi", VSX_BUILTIN_XXSEL_8HI },
9711   { MASK_VSX, CODE_FOR_vector_select_v16qi, "__builtin_vsx_xxsel_16qi", VSX_BUILTIN_XXSEL_16QI },
9712   { MASK_VSX, CODE_FOR_vector_select_v2di_uns, "__builtin_vsx_xxsel_2di_uns", VSX_BUILTIN_XXSEL_2DI_UNS },
9713   { MASK_VSX, CODE_FOR_vector_select_v4si_uns, "__builtin_vsx_xxsel_4si_uns", VSX_BUILTIN_XXSEL_4SI_UNS },
9714   { MASK_VSX, CODE_FOR_vector_select_v8hi_uns, "__builtin_vsx_xxsel_8hi_uns", VSX_BUILTIN_XXSEL_8HI_UNS },
9715   { MASK_VSX, CODE_FOR_vector_select_v16qi_uns, "__builtin_vsx_xxsel_16qi_uns", VSX_BUILTIN_XXSEL_16QI_UNS },
9716
9717   { MASK_VSX, CODE_FOR_altivec_vperm_v2di, "__builtin_vsx_vperm_2di", VSX_BUILTIN_VPERM_2DI },
9718   { MASK_VSX, CODE_FOR_altivec_vperm_v2df, "__builtin_vsx_vperm_2df", VSX_BUILTIN_VPERM_2DF },
9719   { MASK_VSX, CODE_FOR_altivec_vperm_v4sf, "__builtin_vsx_vperm_4sf", VSX_BUILTIN_VPERM_4SF },
9720   { MASK_VSX, CODE_FOR_altivec_vperm_v4si, "__builtin_vsx_vperm_4si", VSX_BUILTIN_VPERM_4SI },
9721   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi, "__builtin_vsx_vperm_8hi", VSX_BUILTIN_VPERM_8HI },
9722   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi, "__builtin_vsx_vperm_16qi", VSX_BUILTIN_VPERM_16QI },
9723   { MASK_VSX, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_vsx_vperm_2di_uns", VSX_BUILTIN_VPERM_2DI_UNS },
9724   { MASK_VSX, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_vsx_vperm_4si_uns", VSX_BUILTIN_VPERM_4SI_UNS },
9725   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_vsx_vperm_8hi_uns", VSX_BUILTIN_VPERM_8HI_UNS },
9726   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_vsx_vperm_16qi_uns", VSX_BUILTIN_VPERM_16QI_UNS },
9727
9728   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2df, "__builtin_vsx_xxpermdi_2df", VSX_BUILTIN_XXPERMDI_2DF },
9729   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2di, "__builtin_vsx_xxpermdi_2di", VSX_BUILTIN_XXPERMDI_2DI },
9730   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4sf, "__builtin_vsx_xxpermdi_4sf", VSX_BUILTIN_XXPERMDI_4SF },
9731   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4si, "__builtin_vsx_xxpermdi_4si", VSX_BUILTIN_XXPERMDI_4SI },
9732   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v8hi, "__builtin_vsx_xxpermdi_8hi", VSX_BUILTIN_XXPERMDI_8HI },
9733   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v16qi, "__builtin_vsx_xxpermdi_16qi", VSX_BUILTIN_XXPERMDI_16QI },
9734   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxpermdi", VSX_BUILTIN_VEC_XXPERMDI },
9735   { MASK_VSX, CODE_FOR_vsx_set_v2df, "__builtin_vsx_set_2df", VSX_BUILTIN_SET_2DF },
9736   { MASK_VSX, CODE_FOR_vsx_set_v2di, "__builtin_vsx_set_2di", VSX_BUILTIN_SET_2DI },
9737
9738   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2di, "__builtin_vsx_xxsldwi_2di", VSX_BUILTIN_XXSLDWI_2DI },
9739   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2df, "__builtin_vsx_xxsldwi_2df", VSX_BUILTIN_XXSLDWI_2DF },
9740   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4sf, "__builtin_vsx_xxsldwi_4sf", VSX_BUILTIN_XXSLDWI_4SF },
9741   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4si, "__builtin_vsx_xxsldwi_4si", VSX_BUILTIN_XXSLDWI_4SI },
9742   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v8hi, "__builtin_vsx_xxsldwi_8hi", VSX_BUILTIN_XXSLDWI_8HI },
9743   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v16qi, "__builtin_vsx_xxsldwi_16qi", VSX_BUILTIN_XXSLDWI_16QI },
9744   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxsldwi", VSX_BUILTIN_VEC_XXSLDWI },
9745
9746   { 0, CODE_FOR_paired_msub, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
9747   { 0, CODE_FOR_paired_madd, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
9748   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
9749   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
9750   { 0, CODE_FOR_paired_nmsub, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
9751   { 0, CODE_FOR_paired_nmadd, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
9752   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
9753   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
9754   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
9755 };
9756
9757 /* DST operations: void foo (void *, const int, const char).  */
9758
9759 static const struct builtin_description bdesc_dst[] =
9760 {
9761   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
9762   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
9763   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
9764   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
9765
9766   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
9767   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
9768   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
9769   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
9770 };
9771
9772 /* Simple binary operations: VECc = foo (VECa, VECb).  */
9773
9774 static struct builtin_description bdesc_2arg[] =
9775 {
9776   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
9777   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
9778   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
9779   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
9780   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
9781   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
9782   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
9783   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
9784   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
9785   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
9786   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
9787   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
9788   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
9789   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
9790   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
9791   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
9792   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
9793   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
9794   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
9795   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
9796   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
9797   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
9798   { MASK_ALTIVEC, CODE_FOR_vector_eqv16qi, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
9799   { MASK_ALTIVEC, CODE_FOR_vector_eqv8hi, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
9800   { MASK_ALTIVEC, CODE_FOR_vector_eqv4si, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
9801   { MASK_ALTIVEC, CODE_FOR_vector_eqv4sf, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
9802   { MASK_ALTIVEC, CODE_FOR_vector_gev4sf, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
9803   { MASK_ALTIVEC, CODE_FOR_vector_gtuv16qi, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
9804   { MASK_ALTIVEC, CODE_FOR_vector_gtv16qi, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
9805   { MASK_ALTIVEC, CODE_FOR_vector_gtuv8hi, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
9806   { MASK_ALTIVEC, CODE_FOR_vector_gtv8hi, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
9807   { MASK_ALTIVEC, CODE_FOR_vector_gtuv4si, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
9808   { MASK_ALTIVEC, CODE_FOR_vector_gtv4si, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
9809   { MASK_ALTIVEC, CODE_FOR_vector_gtv4sf, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
9810   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
9811   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
9812   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
9813   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
9814   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
9815   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
9816   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
9817   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
9818   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
9819   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
9820   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
9821   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
9822   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
9823   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
9824   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
9825   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
9826   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
9827   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
9828   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
9829   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
9830   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
9831   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
9832   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
9833   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub_uns", ALTIVEC_BUILTIN_VMULEUB_UNS },
9834   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
9835   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
9836   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh_uns", ALTIVEC_BUILTIN_VMULEUH_UNS },
9837   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
9838   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
9839   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub_uns", ALTIVEC_BUILTIN_VMULOUB_UNS },
9840   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
9841   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
9842   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh_uns", ALTIVEC_BUILTIN_VMULOUH_UNS },
9843   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
9844   { MASK_ALTIVEC, CODE_FOR_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
9845   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
9846   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
9847   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
9848   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
9849   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
9850   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
9851   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
9852   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
9853   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
9854   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
9855   { MASK_ALTIVEC, CODE_FOR_recipv4sf3, "__builtin_altivec_vrecipdivfp", ALTIVEC_BUILTIN_VRECIPFP },
9856   { MASK_ALTIVEC, CODE_FOR_vrotlv16qi3, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
9857   { MASK_ALTIVEC, CODE_FOR_vrotlv8hi3, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
9858   { MASK_ALTIVEC, CODE_FOR_vrotlv4si3, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
9859   { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
9860   { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
9861   { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
9862   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
9863   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
9864   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
9865   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
9866   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
9867   { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
9868   { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
9869   { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
9870   { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
9871   { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
9872   { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
9873   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
9874   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
9875   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
9876   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
9877   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
9878   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
9879   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
9880   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
9881   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
9882   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
9883   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
9884   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
9885   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
9886   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
9887   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
9888   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
9889   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
9890   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
9891   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
9892   { MASK_ALTIVEC, CODE_FOR_vector_copysignv4sf3, "__builtin_altivec_copysignfp", ALTIVEC_BUILTIN_COPYSIGN_V4SF },
9893
9894   { MASK_VSX, CODE_FOR_addv2df3, "__builtin_vsx_xvadddp", VSX_BUILTIN_XVADDDP },
9895   { MASK_VSX, CODE_FOR_subv2df3, "__builtin_vsx_xvsubdp", VSX_BUILTIN_XVSUBDP },
9896   { MASK_VSX, CODE_FOR_mulv2df3, "__builtin_vsx_xvmuldp", VSX_BUILTIN_XVMULDP },
9897   { MASK_VSX, CODE_FOR_divv2df3, "__builtin_vsx_xvdivdp", VSX_BUILTIN_XVDIVDP },
9898   { MASK_VSX, CODE_FOR_recipv2df3, "__builtin_vsx_xvrecipdivdp", VSX_BUILTIN_RECIP_V2DF },
9899   { MASK_VSX, CODE_FOR_sminv2df3, "__builtin_vsx_xvmindp", VSX_BUILTIN_XVMINDP },
9900   { MASK_VSX, CODE_FOR_smaxv2df3, "__builtin_vsx_xvmaxdp", VSX_BUILTIN_XVMAXDP },
9901   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fe, "__builtin_vsx_xvtdivdp_fe", VSX_BUILTIN_XVTDIVDP_FE },
9902   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fg, "__builtin_vsx_xvtdivdp_fg", VSX_BUILTIN_XVTDIVDP_FG },
9903   { MASK_VSX, CODE_FOR_vector_eqv2df, "__builtin_vsx_xvcmpeqdp", VSX_BUILTIN_XVCMPEQDP },
9904   { MASK_VSX, CODE_FOR_vector_gtv2df, "__builtin_vsx_xvcmpgtdp", VSX_BUILTIN_XVCMPGTDP },
9905   { MASK_VSX, CODE_FOR_vector_gev2df, "__builtin_vsx_xvcmpgedp", VSX_BUILTIN_XVCMPGEDP },
9906
9907   { MASK_VSX, CODE_FOR_addv4sf3, "__builtin_vsx_xvaddsp", VSX_BUILTIN_XVADDSP },
9908   { MASK_VSX, CODE_FOR_subv4sf3, "__builtin_vsx_xvsubsp", VSX_BUILTIN_XVSUBSP },
9909   { MASK_VSX, CODE_FOR_mulv4sf3, "__builtin_vsx_xvmulsp", VSX_BUILTIN_XVMULSP },
9910   { MASK_VSX, CODE_FOR_divv4sf3, "__builtin_vsx_xvdivsp", VSX_BUILTIN_XVDIVSP },
9911   { MASK_VSX, CODE_FOR_recipv4sf3, "__builtin_vsx_xvrecipdivsp", VSX_BUILTIN_RECIP_V4SF },
9912   { MASK_VSX, CODE_FOR_sminv4sf3, "__builtin_vsx_xvminsp", VSX_BUILTIN_XVMINSP },
9913   { MASK_VSX, CODE_FOR_smaxv4sf3, "__builtin_vsx_xvmaxsp", VSX_BUILTIN_XVMAXSP },
9914   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fe, "__builtin_vsx_xvtdivsp_fe", VSX_BUILTIN_XVTDIVSP_FE },
9915   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fg, "__builtin_vsx_xvtdivsp_fg", VSX_BUILTIN_XVTDIVSP_FG },
9916   { MASK_VSX, CODE_FOR_vector_eqv4sf, "__builtin_vsx_xvcmpeqsp", VSX_BUILTIN_XVCMPEQSP },
9917   { MASK_VSX, CODE_FOR_vector_gtv4sf, "__builtin_vsx_xvcmpgtsp", VSX_BUILTIN_XVCMPGTSP },
9918   { MASK_VSX, CODE_FOR_vector_gev4sf, "__builtin_vsx_xvcmpgesp", VSX_BUILTIN_XVCMPGESP },
9919
9920   { MASK_VSX, CODE_FOR_smindf3, "__builtin_vsx_xsmindp", VSX_BUILTIN_XSMINDP },
9921   { MASK_VSX, CODE_FOR_smaxdf3, "__builtin_vsx_xsmaxdp", VSX_BUILTIN_XSMAXDP },
9922   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fe, "__builtin_vsx_xstdivdp_fe", VSX_BUILTIN_XSTDIVDP_FE },
9923   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fg, "__builtin_vsx_xstdivdp_fg", VSX_BUILTIN_XSTDIVDP_FG },
9924   { MASK_VSX, CODE_FOR_vector_copysignv2df3, "__builtin_vsx_cpsgndp", VSX_BUILTIN_CPSGNDP },
9925   { MASK_VSX, CODE_FOR_vector_copysignv4sf3, "__builtin_vsx_cpsgnsp", VSX_BUILTIN_CPSGNSP },
9926
9927   { MASK_VSX, CODE_FOR_vsx_concat_v2df, "__builtin_vsx_concat_2df", VSX_BUILTIN_CONCAT_2DF },
9928   { MASK_VSX, CODE_FOR_vsx_concat_v2di, "__builtin_vsx_concat_2di", VSX_BUILTIN_CONCAT_2DI },
9929   { MASK_VSX, CODE_FOR_vsx_splat_v2df, "__builtin_vsx_splat_2df", VSX_BUILTIN_SPLAT_2DF },
9930   { MASK_VSX, CODE_FOR_vsx_splat_v2di, "__builtin_vsx_splat_2di", VSX_BUILTIN_SPLAT_2DI },
9931   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4sf, "__builtin_vsx_xxmrghw", VSX_BUILTIN_XXMRGHW_4SF },
9932   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
9933   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
9934   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
9935   { MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
9936   { MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
9937   { MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
9938   { MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
9939
9940   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
9941   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
9942   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
9943   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
9944   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
9945   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
9946   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
9947   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
9948   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
9949   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
9950   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
9951   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
9952   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
9953   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
9954   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
9955   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
9956   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
9957   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
9958   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
9959   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
9960   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
9961   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
9962   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
9963   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
9964   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
9965   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
9966   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
9967   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
9968   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
9969   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
9970   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
9971   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
9972   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
9973   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
9974   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
9975   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
9976   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
9977   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
9978   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
9979   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_copysign", ALTIVEC_BUILTIN_VEC_COPYSIGN },
9980   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
9981   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
9982   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
9983   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
9984   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
9985   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
9986   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
9987   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
9988   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
9989   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
9990   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
9991   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
9992   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
9993   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
9994   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
9995   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
9996   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
9997   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
9998   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
9999   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
10000   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
10001   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
10002   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
10003   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
10004   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
10005   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
10006   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
10007   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
10008   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
10009   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
10010   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
10011   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
10012   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
10013   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
10014   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
10015   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
10016   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
10017   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
10018   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
10019   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
10020   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
10021   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
10022   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
10023   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
10024   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
10025   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
10026   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
10027   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
10028   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_recipdiv", ALTIVEC_BUILTIN_VEC_RECIP },
10029   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
10030   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
10031   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
10032   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
10033   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
10034   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
10035   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
10036   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
10037   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
10038   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
10039   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
10040   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
10041   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
10042   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
10043   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
10044   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
10045   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
10046   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
10047   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
10048   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
10049   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
10050   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
10051   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
10052   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
10053   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
10054   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
10055   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
10056   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
10057   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
10058   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
10059   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
10060   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
10061   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
10062   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
10063   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
10064   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
10065   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
10066   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
10067   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
10068   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
10069
10070   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_mul", VSX_BUILTIN_VEC_MUL },
10071   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_div", VSX_BUILTIN_VEC_DIV },
10072
10073   { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
10074   { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
10075   { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
10076   { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
10077   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
10078   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
10079   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
10080   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
10081   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
10082   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
10083
10084   /* Place holder, leave as first spe builtin.  */
10085   { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
10086   { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
10087   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
10088   { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
10089   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
10090   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
10091   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
10092   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
10093   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
10094   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
10095   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
10096   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
10097   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
10098   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
10099   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
10100   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
10101   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
10102   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
10103   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
10104   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
10105   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
10106   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
10107   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
10108   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
10109   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
10110   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
10111   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
10112   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
10113   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
10114   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
10115   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
10116   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
10117   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
10118   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
10119   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
10120   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
10121   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
10122   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
10123   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
10124   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
10125   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
10126   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
10127   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
10128   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
10129   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
10130   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
10131   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
10132   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
10133   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
10134   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
10135   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
10136   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
10137   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
10138   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
10139   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
10140   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
10141   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
10142   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
10143   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
10144   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
10145   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
10146   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
10147   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
10148   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
10149   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
10150   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
10151   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
10152   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
10153   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
10154   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
10155   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
10156   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
10157   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
10158   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
10159   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
10160   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
10161   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
10162   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
10163   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
10164   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
10165   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
10166   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
10167   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
10168   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
10169   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
10170   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
10171   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
10172   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
10173   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
10174   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
10175   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
10176   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
10177   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
10178   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
10179   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
10180   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
10181   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
10182   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
10183   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
10184   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
10185   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
10186   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
10187   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
10188   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
10189   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
10190   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
10191   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
10192   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
10193   { 0, CODE_FOR_subv2si3, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
10194
10195   /* SPE binary operations expecting a 5-bit unsigned literal.  */
10196   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
10197
10198   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
10199   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
10200   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
10201   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
10202   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
10203   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
10204   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
10205   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
10206   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
10207   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
10208   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
10209   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
10210   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
10211   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
10212   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
10213   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
10214   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
10215   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
10216   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
10217   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
10218   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
10219   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
10220   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
10221   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
10222   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
10223   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
10224
10225   /* Place-holder.  Leave as last binary SPE builtin.  */
10226   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
10227 };
10228
10229 /* AltiVec predicates.  */
10230
10231 struct builtin_description_predicates
10232 {
10233   const unsigned int mask;
10234   const enum insn_code icode;
10235   const char *const name;
10236   const enum rs6000_builtins code;
10237 };
10238
10239 static const struct builtin_description_predicates bdesc_altivec_preds[] =
10240 {
10241   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p",
10242     ALTIVEC_BUILTIN_VCMPBFP_P },
10243   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_eq_v4sf_p,
10244     "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
10245   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_ge_v4sf_p,
10246     "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
10247   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_gt_v4sf_p,
10248     "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
10249   { MASK_ALTIVEC, CODE_FOR_vector_eq_v4si_p, "__builtin_altivec_vcmpequw_p",
10250     ALTIVEC_BUILTIN_VCMPEQUW_P },
10251   { MASK_ALTIVEC, CODE_FOR_vector_gt_v4si_p, "__builtin_altivec_vcmpgtsw_p",
10252     ALTIVEC_BUILTIN_VCMPGTSW_P },
10253   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v4si_p, "__builtin_altivec_vcmpgtuw_p",
10254     ALTIVEC_BUILTIN_VCMPGTUW_P },
10255   { MASK_ALTIVEC, CODE_FOR_vector_eq_v8hi_p, "__builtin_altivec_vcmpequh_p",
10256     ALTIVEC_BUILTIN_VCMPEQUH_P },
10257   { MASK_ALTIVEC, CODE_FOR_vector_gt_v8hi_p, "__builtin_altivec_vcmpgtsh_p",
10258     ALTIVEC_BUILTIN_VCMPGTSH_P },
10259   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v8hi_p, "__builtin_altivec_vcmpgtuh_p",
10260     ALTIVEC_BUILTIN_VCMPGTUH_P },
10261   { MASK_ALTIVEC, CODE_FOR_vector_eq_v16qi_p, "__builtin_altivec_vcmpequb_p",
10262     ALTIVEC_BUILTIN_VCMPEQUB_P },
10263   { MASK_ALTIVEC, CODE_FOR_vector_gt_v16qi_p, "__builtin_altivec_vcmpgtsb_p",
10264     ALTIVEC_BUILTIN_VCMPGTSB_P },
10265   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v16qi_p, "__builtin_altivec_vcmpgtub_p",
10266     ALTIVEC_BUILTIN_VCMPGTUB_P },
10267
10268   { MASK_VSX, CODE_FOR_vector_eq_v4sf_p, "__builtin_vsx_xvcmpeqsp_p",
10269     VSX_BUILTIN_XVCMPEQSP_P },
10270   { MASK_VSX, CODE_FOR_vector_ge_v4sf_p, "__builtin_vsx_xvcmpgesp_p",
10271     VSX_BUILTIN_XVCMPGESP_P },
10272   { MASK_VSX, CODE_FOR_vector_gt_v4sf_p, "__builtin_vsx_xvcmpgtsp_p",
10273     VSX_BUILTIN_XVCMPGTSP_P },
10274   { MASK_VSX, CODE_FOR_vector_eq_v2df_p, "__builtin_vsx_xvcmpeqdp_p",
10275     VSX_BUILTIN_XVCMPEQDP_P },
10276   { MASK_VSX, CODE_FOR_vector_ge_v2df_p, "__builtin_vsx_xvcmpgedp_p",
10277     VSX_BUILTIN_XVCMPGEDP_P },
10278   { MASK_VSX, CODE_FOR_vector_gt_v2df_p, "__builtin_vsx_xvcmpgtdp_p",
10279     VSX_BUILTIN_XVCMPGTDP_P },
10280
10281   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpeq_p",
10282     ALTIVEC_BUILTIN_VCMPEQ_P },
10283   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpgt_p",
10284     ALTIVEC_BUILTIN_VCMPGT_P },
10285   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpge_p",
10286     ALTIVEC_BUILTIN_VCMPGE_P }
10287 };
10288
10289 /* SPE predicates.  */
10290 static struct builtin_description bdesc_spe_predicates[] =
10291 {
10292   /* Place-holder.  Leave as first.  */
10293   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
10294   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
10295   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
10296   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
10297   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
10298   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
10299   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
10300   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
10301   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
10302   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
10303   /* Place-holder.  Leave as last.  */
10304   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
10305 };
10306
10307 /* SPE evsel predicates.  */
10308 static struct builtin_description bdesc_spe_evsel[] =
10309 {
10310   /* Place-holder.  Leave as first.  */
10311   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
10312   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
10313   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
10314   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
10315   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
10316   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
10317   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
10318   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
10319   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
10320   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
10321   /* Place-holder.  Leave as last.  */
10322   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
10323 };
10324
10325 /* PAIRED predicates.  */
10326 static const struct builtin_description bdesc_paired_preds[] =
10327 {
10328   /* Place-holder.  Leave as first.  */
10329   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
10330   /* Place-holder.  Leave as last.  */
10331   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
10332 };
10333
10334 /* ABS* operations.  */
10335
10336 static const struct builtin_description bdesc_abs[] =
10337 {
10338   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
10339   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
10340   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
10341   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
10342   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
10343   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
10344   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI },
10345   { MASK_VSX, CODE_FOR_absv2df2, "__builtin_vsx_xvabsdp", VSX_BUILTIN_XVABSDP },
10346   { MASK_VSX, CODE_FOR_vsx_nabsv2df2, "__builtin_vsx_xvnabsdp", VSX_BUILTIN_XVNABSDP },
10347   { MASK_VSX, CODE_FOR_absv4sf2, "__builtin_vsx_xvabssp", VSX_BUILTIN_XVABSSP },
10348   { MASK_VSX, CODE_FOR_vsx_nabsv4sf2, "__builtin_vsx_xvnabssp", VSX_BUILTIN_XVNABSSP },
10349 };
10350
10351 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
10352    foo (VECa).  */
10353
10354 static struct builtin_description bdesc_1arg[] =
10355 {
10356   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
10357   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
10358   { MASK_ALTIVEC, CODE_FOR_rev4sf2, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
10359   { MASK_ALTIVEC, CODE_FOR_vector_floorv4sf2, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
10360   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
10361   { MASK_ALTIVEC, CODE_FOR_vector_ceilv4sf2, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
10362   { MASK_ALTIVEC, CODE_FOR_vector_btruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
10363   { MASK_ALTIVEC, CODE_FOR_rsqrtv4sf2, "__builtin_altivec_vrsqrtfp", ALTIVEC_BUILTIN_VRSQRTFP },
10364   { MASK_ALTIVEC, CODE_FOR_rsqrtev4sf2, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
10365   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
10366   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
10367   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
10368   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
10369   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
10370   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
10371   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
10372   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
10373   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
10374
10375   { MASK_VSX, CODE_FOR_negv2df2, "__builtin_vsx_xvnegdp", VSX_BUILTIN_XVNEGDP },
10376   { MASK_VSX, CODE_FOR_sqrtv2df2, "__builtin_vsx_xvsqrtdp", VSX_BUILTIN_XVSQRTDP },
10377   { MASK_VSX, CODE_FOR_rsqrtv2df2, "__builtin_vsx_xvrsqrtdp", VSX_BUILTIN_VEC_RSQRT_V2DF },
10378   { MASK_VSX, CODE_FOR_rsqrtev2df2, "__builtin_vsx_xvrsqrtedp", VSX_BUILTIN_XVRSQRTEDP },
10379   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fe, "__builtin_vsx_xvtsqrtdp_fe", VSX_BUILTIN_XVTSQRTDP_FE },
10380   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fg, "__builtin_vsx_xvtsqrtdp_fg", VSX_BUILTIN_XVTSQRTDP_FG },
10381   { MASK_VSX, CODE_FOR_vsx_frev2df2, "__builtin_vsx_xvredp", VSX_BUILTIN_XVREDP },
10382
10383   { MASK_VSX, CODE_FOR_negv4sf2, "__builtin_vsx_xvnegsp", VSX_BUILTIN_XVNEGSP },
10384   { MASK_VSX, CODE_FOR_sqrtv4sf2, "__builtin_vsx_xvsqrtsp", VSX_BUILTIN_XVSQRTSP },
10385   { MASK_VSX, CODE_FOR_rsqrtv4sf2, "__builtin_vsx_xvrsqrtsp", VSX_BUILTIN_VEC_RSQRT_V4SF },
10386   { MASK_VSX, CODE_FOR_rsqrtev4sf2, "__builtin_vsx_xvrsqrtesp", VSX_BUILTIN_XVRSQRTESP },
10387   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fe, "__builtin_vsx_xvtsqrtsp_fe", VSX_BUILTIN_XVTSQRTSP_FE },
10388   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fg, "__builtin_vsx_xvtsqrtsp_fg", VSX_BUILTIN_XVTSQRTSP_FG },
10389   { MASK_VSX, CODE_FOR_vsx_frev4sf2, "__builtin_vsx_xvresp", VSX_BUILTIN_XVRESP },
10390
10391   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvdpsp", VSX_BUILTIN_XSCVDPSP },
10392   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvspdp", VSX_BUILTIN_XSCVSPDP },
10393   { MASK_VSX, CODE_FOR_vsx_xvcvdpsp, "__builtin_vsx_xvcvdpsp", VSX_BUILTIN_XVCVDPSP },
10394   { MASK_VSX, CODE_FOR_vsx_xvcvspdp, "__builtin_vsx_xvcvspdp", VSX_BUILTIN_XVCVSPDP },
10395   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fe, "__builtin_vsx_xstsqrtdp_fe", VSX_BUILTIN_XSTSQRTDP_FE },
10396   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fg, "__builtin_vsx_xstsqrtdp_fg", VSX_BUILTIN_XSTSQRTDP_FG },
10397
10398   { MASK_VSX, CODE_FOR_vsx_fix_truncv2dfv2di2, "__builtin_vsx_xvcvdpsxds", VSX_BUILTIN_XVCVDPSXDS },
10399   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds", VSX_BUILTIN_XVCVDPUXDS },
10400   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds_uns", VSX_BUILTIN_XVCVDPUXDS_UNS },
10401   { MASK_VSX, CODE_FOR_vsx_floatv2div2df2, "__builtin_vsx_xvcvsxddp", VSX_BUILTIN_XVCVSXDDP },
10402   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp", VSX_BUILTIN_XVCVUXDDP },
10403   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp_uns", VSX_BUILTIN_XVCVUXDDP_UNS },
10404
10405   { MASK_VSX, CODE_FOR_vsx_fix_truncv4sfv4si2, "__builtin_vsx_xvcvspsxws", VSX_BUILTIN_XVCVSPSXWS },
10406   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv4sfv4si2, "__builtin_vsx_xvcvspuxws", VSX_BUILTIN_XVCVSPUXWS },
10407   { MASK_VSX, CODE_FOR_vsx_floatv4siv4sf2, "__builtin_vsx_xvcvsxwsp", VSX_BUILTIN_XVCVSXWSP },
10408   { MASK_VSX, CODE_FOR_vsx_floatunsv4siv4sf2, "__builtin_vsx_xvcvuxwsp", VSX_BUILTIN_XVCVUXWSP },
10409
10410   { MASK_VSX, CODE_FOR_vsx_xvcvdpsxws, "__builtin_vsx_xvcvdpsxws", VSX_BUILTIN_XVCVDPSXWS },
10411   { MASK_VSX, CODE_FOR_vsx_xvcvdpuxws, "__builtin_vsx_xvcvdpuxws", VSX_BUILTIN_XVCVDPUXWS },
10412   { MASK_VSX, CODE_FOR_vsx_xvcvsxwdp, "__builtin_vsx_xvcvsxwdp", VSX_BUILTIN_XVCVSXWDP },
10413   { MASK_VSX, CODE_FOR_vsx_xvcvuxwdp, "__builtin_vsx_xvcvuxwdp", VSX_BUILTIN_XVCVUXWDP },
10414   { MASK_VSX, CODE_FOR_vsx_xvrdpi, "__builtin_vsx_xvrdpi", VSX_BUILTIN_XVRDPI },
10415   { MASK_VSX, CODE_FOR_vsx_xvrdpic, "__builtin_vsx_xvrdpic", VSX_BUILTIN_XVRDPIC },
10416   { MASK_VSX, CODE_FOR_vsx_floorv2df2, "__builtin_vsx_xvrdpim", VSX_BUILTIN_XVRDPIM },
10417   { MASK_VSX, CODE_FOR_vsx_ceilv2df2, "__builtin_vsx_xvrdpip", VSX_BUILTIN_XVRDPIP },
10418   { MASK_VSX, CODE_FOR_vsx_btruncv2df2, "__builtin_vsx_xvrdpiz", VSX_BUILTIN_XVRDPIZ },
10419
10420   { MASK_VSX, CODE_FOR_vsx_xvcvspsxds, "__builtin_vsx_xvcvspsxds", VSX_BUILTIN_XVCVSPSXDS },
10421   { MASK_VSX, CODE_FOR_vsx_xvcvspuxds, "__builtin_vsx_xvcvspuxds", VSX_BUILTIN_XVCVSPUXDS },
10422   { MASK_VSX, CODE_FOR_vsx_xvcvsxdsp, "__builtin_vsx_xvcvsxdsp", VSX_BUILTIN_XVCVSXDSP },
10423   { MASK_VSX, CODE_FOR_vsx_xvcvuxdsp, "__builtin_vsx_xvcvuxdsp", VSX_BUILTIN_XVCVUXDSP },
10424   { MASK_VSX, CODE_FOR_vsx_xvrspi, "__builtin_vsx_xvrspi", VSX_BUILTIN_XVRSPI },
10425   { MASK_VSX, CODE_FOR_vsx_xvrspic, "__builtin_vsx_xvrspic", VSX_BUILTIN_XVRSPIC },
10426   { MASK_VSX, CODE_FOR_vsx_floorv4sf2, "__builtin_vsx_xvrspim", VSX_BUILTIN_XVRSPIM },
10427   { MASK_VSX, CODE_FOR_vsx_ceilv4sf2, "__builtin_vsx_xvrspip", VSX_BUILTIN_XVRSPIP },
10428   { MASK_VSX, CODE_FOR_vsx_btruncv4sf2, "__builtin_vsx_xvrspiz", VSX_BUILTIN_XVRSPIZ },
10429
10430   { MASK_VSX, CODE_FOR_vsx_xsrdpi, "__builtin_vsx_xsrdpi", VSX_BUILTIN_XSRDPI },
10431   { MASK_VSX, CODE_FOR_vsx_xsrdpic, "__builtin_vsx_xsrdpic", VSX_BUILTIN_XSRDPIC },
10432   { MASK_VSX, CODE_FOR_vsx_floordf2, "__builtin_vsx_xsrdpim", VSX_BUILTIN_XSRDPIM },
10433   { MASK_VSX, CODE_FOR_vsx_ceildf2, "__builtin_vsx_xsrdpip", VSX_BUILTIN_XSRDPIP },
10434   { MASK_VSX, CODE_FOR_vsx_btruncdf2, "__builtin_vsx_xsrdpiz", VSX_BUILTIN_XSRDPIZ },
10435
10436   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
10437   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
10438   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
10439   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
10440   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
10441   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
10442   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
10443   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
10444   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
10445   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrt", ALTIVEC_BUILTIN_VEC_RSQRT },
10446   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
10447   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
10448   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
10449   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
10450   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
10451   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
10452   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
10453   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
10454   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
10455   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
10456
10457   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nearbyint", ALTIVEC_BUILTIN_VEC_NEARBYINT },
10458   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_rint", ALTIVEC_BUILTIN_VEC_RINT },
10459   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sqrt", ALTIVEC_BUILTIN_VEC_SQRT },
10460
10461   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_floatv4siv4sf2, "__builtin_vec_float_sisf", VECTOR_BUILTIN_FLOAT_V4SI_V4SF },
10462   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_unsigned_floatv4siv4sf2, "__builtin_vec_uns_float_sisf", VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF },
10463   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fix_truncv4sfv4si2, "__builtin_vec_fix_sfsi", VECTOR_BUILTIN_FIX_V4SF_V4SI },
10464   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fixuns_truncv4sfv4si2, "__builtin_vec_fixuns_sfsi", VECTOR_BUILTIN_FIXUNS_V4SF_V4SI },
10465
10466   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
10467      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
10468   { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
10469   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
10470   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
10471   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
10472   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
10473   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
10474   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
10475   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
10476   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
10477   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
10478   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
10479   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
10480   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
10481   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
10482   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
10483   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
10484   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
10485   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
10486   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
10487   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
10488   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
10489   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
10490   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
10491   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
10492   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
10493   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
10494   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
10495   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
10496
10497   /* Place-holder.  Leave as last unary SPE builtin.  */
10498   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
10499
10500   { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
10501   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
10502   { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
10503   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
10504   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
10505 };
10506
10507 static rtx
10508 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
10509 {
10510   rtx pat;
10511   tree arg0 = CALL_EXPR_ARG (exp, 0);
10512   rtx op0 = expand_normal (arg0);
10513   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10514   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10515
10516   if (icode == CODE_FOR_nothing)
10517     /* Builtin not supported on this processor.  */
10518     return 0;
10519
10520   /* If we got invalid arguments bail out before generating bad rtl.  */
10521   if (arg0 == error_mark_node)
10522     return const0_rtx;
10523
10524   if (icode == CODE_FOR_altivec_vspltisb
10525       || icode == CODE_FOR_altivec_vspltish
10526       || icode == CODE_FOR_altivec_vspltisw
10527       || icode == CODE_FOR_spe_evsplatfi
10528       || icode == CODE_FOR_spe_evsplati)
10529     {
10530       /* Only allow 5-bit *signed* literals.  */
10531       if (GET_CODE (op0) != CONST_INT
10532           || INTVAL (op0) > 15
10533           || INTVAL (op0) < -16)
10534         {
10535           error ("argument 1 must be a 5-bit signed literal");
10536           return const0_rtx;
10537         }
10538     }
10539
10540   if (target == 0
10541       || GET_MODE (target) != tmode
10542       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10543     target = gen_reg_rtx (tmode);
10544
10545   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10546     op0 = copy_to_mode_reg (mode0, op0);
10547
10548   pat = GEN_FCN (icode) (target, op0);
10549   if (! pat)
10550     return 0;
10551   emit_insn (pat);
10552
10553   return target;
10554 }
10555
10556 static rtx
10557 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
10558 {
10559   rtx pat, scratch1, scratch2;
10560   tree arg0 = CALL_EXPR_ARG (exp, 0);
10561   rtx op0 = expand_normal (arg0);
10562   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10563   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10564
10565   /* If we have invalid arguments, bail out before generating bad rtl.  */
10566   if (arg0 == error_mark_node)
10567     return const0_rtx;
10568
10569   if (target == 0
10570       || GET_MODE (target) != tmode
10571       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10572     target = gen_reg_rtx (tmode);
10573
10574   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10575     op0 = copy_to_mode_reg (mode0, op0);
10576
10577   scratch1 = gen_reg_rtx (mode0);
10578   scratch2 = gen_reg_rtx (mode0);
10579
10580   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
10581   if (! pat)
10582     return 0;
10583   emit_insn (pat);
10584
10585   return target;
10586 }
10587
10588 static rtx
10589 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
10590 {
10591   rtx pat;
10592   tree arg0 = CALL_EXPR_ARG (exp, 0);
10593   tree arg1 = CALL_EXPR_ARG (exp, 1);
10594   rtx op0 = expand_normal (arg0);
10595   rtx op1 = expand_normal (arg1);
10596   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10597   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10598   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10599
10600   if (icode == CODE_FOR_nothing)
10601     /* Builtin not supported on this processor.  */
10602     return 0;
10603
10604   /* If we got invalid arguments bail out before generating bad rtl.  */
10605   if (arg0 == error_mark_node || arg1 == error_mark_node)
10606     return const0_rtx;
10607
10608   if (icode == CODE_FOR_altivec_vcfux
10609       || icode == CODE_FOR_altivec_vcfsx
10610       || icode == CODE_FOR_altivec_vctsxs
10611       || icode == CODE_FOR_altivec_vctuxs
10612       || icode == CODE_FOR_altivec_vspltb
10613       || icode == CODE_FOR_altivec_vsplth
10614       || icode == CODE_FOR_altivec_vspltw
10615       || icode == CODE_FOR_spe_evaddiw
10616       || icode == CODE_FOR_spe_evldd
10617       || icode == CODE_FOR_spe_evldh
10618       || icode == CODE_FOR_spe_evldw
10619       || icode == CODE_FOR_spe_evlhhesplat
10620       || icode == CODE_FOR_spe_evlhhossplat
10621       || icode == CODE_FOR_spe_evlhhousplat
10622       || icode == CODE_FOR_spe_evlwhe
10623       || icode == CODE_FOR_spe_evlwhos
10624       || icode == CODE_FOR_spe_evlwhou
10625       || icode == CODE_FOR_spe_evlwhsplat
10626       || icode == CODE_FOR_spe_evlwwsplat
10627       || icode == CODE_FOR_spe_evrlwi
10628       || icode == CODE_FOR_spe_evslwi
10629       || icode == CODE_FOR_spe_evsrwis
10630       || icode == CODE_FOR_spe_evsubifw
10631       || icode == CODE_FOR_spe_evsrwiu)
10632     {
10633       /* Only allow 5-bit unsigned literals.  */
10634       STRIP_NOPS (arg1);
10635       if (TREE_CODE (arg1) != INTEGER_CST
10636           || TREE_INT_CST_LOW (arg1) & ~0x1f)
10637         {
10638           error ("argument 2 must be a 5-bit unsigned literal");
10639           return const0_rtx;
10640         }
10641     }
10642
10643   if (target == 0
10644       || GET_MODE (target) != tmode
10645       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10646     target = gen_reg_rtx (tmode);
10647
10648   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10649     op0 = copy_to_mode_reg (mode0, op0);
10650   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10651     op1 = copy_to_mode_reg (mode1, op1);
10652
10653   pat = GEN_FCN (icode) (target, op0, op1);
10654   if (! pat)
10655     return 0;
10656   emit_insn (pat);
10657
10658   return target;
10659 }
10660
10661 static rtx
10662 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
10663 {
10664   rtx pat, scratch;
10665   tree cr6_form = CALL_EXPR_ARG (exp, 0);
10666   tree arg0 = CALL_EXPR_ARG (exp, 1);
10667   tree arg1 = CALL_EXPR_ARG (exp, 2);
10668   rtx op0 = expand_normal (arg0);
10669   rtx op1 = expand_normal (arg1);
10670   enum machine_mode tmode = SImode;
10671   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10672   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10673   int cr6_form_int;
10674
10675   if (TREE_CODE (cr6_form) != INTEGER_CST)
10676     {
10677       error ("argument 1 of __builtin_altivec_predicate must be a constant");
10678       return const0_rtx;
10679     }
10680   else
10681     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
10682
10683   gcc_assert (mode0 == mode1);
10684
10685   /* If we have invalid arguments, bail out before generating bad rtl.  */
10686   if (arg0 == error_mark_node || arg1 == error_mark_node)
10687     return const0_rtx;
10688
10689   if (target == 0
10690       || GET_MODE (target) != tmode
10691       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10692     target = gen_reg_rtx (tmode);
10693
10694   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10695     op0 = copy_to_mode_reg (mode0, op0);
10696   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10697     op1 = copy_to_mode_reg (mode1, op1);
10698
10699   scratch = gen_reg_rtx (mode0);
10700
10701   pat = GEN_FCN (icode) (scratch, op0, op1);
10702   if (! pat)
10703     return 0;
10704   emit_insn (pat);
10705
10706   /* The vec_any* and vec_all* predicates use the same opcodes for two
10707      different operations, but the bits in CR6 will be different
10708      depending on what information we want.  So we have to play tricks
10709      with CR6 to get the right bits out.
10710
10711      If you think this is disgusting, look at the specs for the
10712      AltiVec predicates.  */
10713
10714   switch (cr6_form_int)
10715     {
10716     case 0:
10717       emit_insn (gen_cr6_test_for_zero (target));
10718       break;
10719     case 1:
10720       emit_insn (gen_cr6_test_for_zero_reverse (target));
10721       break;
10722     case 2:
10723       emit_insn (gen_cr6_test_for_lt (target));
10724       break;
10725     case 3:
10726       emit_insn (gen_cr6_test_for_lt_reverse (target));
10727       break;
10728     default:
10729       error ("argument 1 of __builtin_altivec_predicate is out of range");
10730       break;
10731     }
10732
10733   return target;
10734 }
10735
10736 static rtx
10737 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
10738 {
10739   rtx pat, addr;
10740   tree arg0 = CALL_EXPR_ARG (exp, 0);
10741   tree arg1 = CALL_EXPR_ARG (exp, 1);
10742   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10743   enum machine_mode mode0 = Pmode;
10744   enum machine_mode mode1 = Pmode;
10745   rtx op0 = expand_normal (arg0);
10746   rtx op1 = expand_normal (arg1);
10747
10748   if (icode == CODE_FOR_nothing)
10749     /* Builtin not supported on this processor.  */
10750     return 0;
10751
10752   /* If we got invalid arguments bail out before generating bad rtl.  */
10753   if (arg0 == error_mark_node || arg1 == error_mark_node)
10754     return const0_rtx;
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   op1 = copy_to_mode_reg (mode1, op1);
10762
10763   if (op0 == const0_rtx)
10764     {
10765       addr = gen_rtx_MEM (tmode, op1);
10766     }
10767   else
10768     {
10769       op0 = copy_to_mode_reg (mode0, op0);
10770       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
10771     }
10772
10773   pat = GEN_FCN (icode) (target, addr);
10774
10775   if (! pat)
10776     return 0;
10777   emit_insn (pat);
10778
10779   return target;
10780 }
10781
10782 static rtx
10783 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
10784 {
10785   rtx pat, addr;
10786   tree arg0 = CALL_EXPR_ARG (exp, 0);
10787   tree arg1 = CALL_EXPR_ARG (exp, 1);
10788   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10789   enum machine_mode mode0 = Pmode;
10790   enum machine_mode mode1 = Pmode;
10791   rtx op0 = expand_normal (arg0);
10792   rtx op1 = expand_normal (arg1);
10793
10794   if (icode == CODE_FOR_nothing)
10795     /* Builtin not supported on this processor.  */
10796     return 0;
10797
10798   /* If we got invalid arguments bail out before generating bad rtl.  */
10799   if (arg0 == error_mark_node || arg1 == error_mark_node)
10800     return const0_rtx;
10801
10802   if (target == 0
10803       || GET_MODE (target) != tmode
10804       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10805     target = gen_reg_rtx (tmode);
10806
10807   op1 = copy_to_mode_reg (mode1, op1);
10808
10809   if (op0 == const0_rtx)
10810     {
10811       addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
10812     }
10813   else
10814     {
10815       op0 = copy_to_mode_reg (mode0, op0);
10816       addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
10817     }
10818
10819   pat = GEN_FCN (icode) (target, addr);
10820
10821   if (! pat)
10822     return 0;
10823   emit_insn (pat);
10824
10825   return target;
10826 }
10827
10828 static rtx
10829 spe_expand_stv_builtin (enum insn_code icode, tree exp)
10830 {
10831   tree arg0 = CALL_EXPR_ARG (exp, 0);
10832   tree arg1 = CALL_EXPR_ARG (exp, 1);
10833   tree arg2 = CALL_EXPR_ARG (exp, 2);
10834   rtx op0 = expand_normal (arg0);
10835   rtx op1 = expand_normal (arg1);
10836   rtx op2 = expand_normal (arg2);
10837   rtx pat;
10838   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
10839   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
10840   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
10841
10842   /* Invalid arguments.  Bail before doing anything stoopid!  */
10843   if (arg0 == error_mark_node
10844       || arg1 == error_mark_node
10845       || arg2 == error_mark_node)
10846     return const0_rtx;
10847
10848   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
10849     op0 = copy_to_mode_reg (mode2, op0);
10850   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
10851     op1 = copy_to_mode_reg (mode0, op1);
10852   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
10853     op2 = copy_to_mode_reg (mode1, op2);
10854
10855   pat = GEN_FCN (icode) (op1, op2, op0);
10856   if (pat)
10857     emit_insn (pat);
10858   return NULL_RTX;
10859 }
10860
10861 static rtx
10862 paired_expand_stv_builtin (enum insn_code icode, tree exp)
10863 {
10864   tree arg0 = CALL_EXPR_ARG (exp, 0);
10865   tree arg1 = CALL_EXPR_ARG (exp, 1);
10866   tree arg2 = CALL_EXPR_ARG (exp, 2);
10867   rtx op0 = expand_normal (arg0);
10868   rtx op1 = expand_normal (arg1);
10869   rtx op2 = expand_normal (arg2);
10870   rtx pat, addr;
10871   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10872   enum machine_mode mode1 = Pmode;
10873   enum machine_mode mode2 = Pmode;
10874
10875   /* Invalid arguments.  Bail before doing anything stoopid!  */
10876   if (arg0 == error_mark_node
10877       || arg1 == error_mark_node
10878       || arg2 == error_mark_node)
10879     return const0_rtx;
10880
10881   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
10882     op0 = copy_to_mode_reg (tmode, op0);
10883
10884   op2 = copy_to_mode_reg (mode2, op2);
10885
10886   if (op1 == const0_rtx)
10887     {
10888       addr = gen_rtx_MEM (tmode, op2);
10889     }
10890   else
10891     {
10892       op1 = copy_to_mode_reg (mode1, op1);
10893       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10894     }
10895
10896   pat = GEN_FCN (icode) (addr, op0);
10897   if (pat)
10898     emit_insn (pat);
10899   return NULL_RTX;
10900 }
10901
10902 static rtx
10903 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
10904 {
10905   tree arg0 = CALL_EXPR_ARG (exp, 0);
10906   tree arg1 = CALL_EXPR_ARG (exp, 1);
10907   tree arg2 = CALL_EXPR_ARG (exp, 2);
10908   rtx op0 = expand_normal (arg0);
10909   rtx op1 = expand_normal (arg1);
10910   rtx op2 = expand_normal (arg2);
10911   rtx pat, addr;
10912   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10913   enum machine_mode mode1 = Pmode;
10914   enum machine_mode mode2 = Pmode;
10915
10916   /* Invalid arguments.  Bail before doing anything stoopid!  */
10917   if (arg0 == error_mark_node
10918       || arg1 == error_mark_node
10919       || arg2 == error_mark_node)
10920     return const0_rtx;
10921
10922   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
10923     op0 = copy_to_mode_reg (tmode, op0);
10924
10925   op2 = copy_to_mode_reg (mode2, op2);
10926
10927   if (op1 == const0_rtx)
10928     {
10929       addr = gen_rtx_MEM (tmode, op2);
10930     }
10931   else
10932     {
10933       op1 = copy_to_mode_reg (mode1, op1);
10934       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10935     }
10936
10937   pat = GEN_FCN (icode) (addr, op0);
10938   if (pat)
10939     emit_insn (pat);
10940   return NULL_RTX;
10941 }
10942
10943 static rtx
10944 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
10945 {
10946   rtx pat;
10947   tree arg0 = CALL_EXPR_ARG (exp, 0);
10948   tree arg1 = CALL_EXPR_ARG (exp, 1);
10949   tree arg2 = CALL_EXPR_ARG (exp, 2);
10950   rtx op0 = expand_normal (arg0);
10951   rtx op1 = expand_normal (arg1);
10952   rtx op2 = expand_normal (arg2);
10953   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10954   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10955   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10956   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
10957
10958   if (icode == CODE_FOR_nothing)
10959     /* Builtin not supported on this processor.  */
10960     return 0;
10961
10962   /* If we got invalid arguments bail out before generating bad rtl.  */
10963   if (arg0 == error_mark_node
10964       || arg1 == error_mark_node
10965       || arg2 == error_mark_node)
10966     return const0_rtx;
10967
10968   /* Check and prepare argument depending on the instruction code.
10969
10970      Note that a switch statement instead of the sequence of tests
10971      would be incorrect as many of the CODE_FOR values could be
10972      CODE_FOR_nothing and that would yield multiple alternatives
10973      with identical values.  We'd never reach here at runtime in
10974      this case.  */
10975   if (icode == CODE_FOR_altivec_vsldoi_v4sf
10976       || icode == CODE_FOR_altivec_vsldoi_v4si
10977       || icode == CODE_FOR_altivec_vsldoi_v8hi
10978       || icode == CODE_FOR_altivec_vsldoi_v16qi)
10979     {
10980       /* Only allow 4-bit unsigned literals.  */
10981       STRIP_NOPS (arg2);
10982       if (TREE_CODE (arg2) != INTEGER_CST
10983           || TREE_INT_CST_LOW (arg2) & ~0xf)
10984         {
10985           error ("argument 3 must be a 4-bit unsigned literal");
10986           return const0_rtx;
10987         }
10988     }
10989   else if (icode == CODE_FOR_vsx_xxpermdi_v2df
10990            || icode == CODE_FOR_vsx_xxpermdi_v2di
10991            || icode == CODE_FOR_vsx_xxsldwi_v16qi
10992            || icode == CODE_FOR_vsx_xxsldwi_v8hi
10993            || icode == CODE_FOR_vsx_xxsldwi_v4si
10994            || icode == CODE_FOR_vsx_xxsldwi_v4sf
10995            || icode == CODE_FOR_vsx_xxsldwi_v2di
10996            || icode == CODE_FOR_vsx_xxsldwi_v2df)
10997     {
10998       /* Only allow 2-bit unsigned literals.  */
10999       STRIP_NOPS (arg2);
11000       if (TREE_CODE (arg2) != INTEGER_CST
11001           || TREE_INT_CST_LOW (arg2) & ~0x3)
11002         {
11003           error ("argument 3 must be a 2-bit unsigned literal");
11004           return const0_rtx;
11005         }
11006     }
11007   else if (icode == CODE_FOR_vsx_set_v2df
11008            || icode == CODE_FOR_vsx_set_v2di)
11009     {
11010       /* Only allow 1-bit unsigned literals.  */
11011       STRIP_NOPS (arg2);
11012       if (TREE_CODE (arg2) != INTEGER_CST
11013           || TREE_INT_CST_LOW (arg2) & ~0x1)
11014         {
11015           error ("argument 3 must be a 1-bit unsigned literal");
11016           return const0_rtx;
11017         }
11018     }
11019
11020   if (target == 0
11021       || GET_MODE (target) != tmode
11022       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11023     target = gen_reg_rtx (tmode);
11024
11025   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11026     op0 = copy_to_mode_reg (mode0, op0);
11027   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11028     op1 = copy_to_mode_reg (mode1, op1);
11029   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
11030     op2 = copy_to_mode_reg (mode2, op2);
11031
11032   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
11033     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
11034   else 
11035     pat = GEN_FCN (icode) (target, op0, op1, op2);
11036   if (! pat)
11037     return 0;
11038   emit_insn (pat);
11039
11040   return target;
11041 }
11042
11043 /* Expand the lvx builtins.  */
11044 static rtx
11045 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
11046 {
11047   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11048   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11049   tree arg0;
11050   enum machine_mode tmode, mode0;
11051   rtx pat, op0;
11052   enum insn_code icode;
11053
11054   switch (fcode)
11055     {
11056     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
11057       icode = CODE_FOR_vector_load_v16qi;
11058       break;
11059     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
11060       icode = CODE_FOR_vector_load_v8hi;
11061       break;
11062     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
11063       icode = CODE_FOR_vector_load_v4si;
11064       break;
11065     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
11066       icode = CODE_FOR_vector_load_v4sf;
11067       break;
11068     default:
11069       *expandedp = false;
11070       return NULL_RTX;
11071     }
11072
11073   *expandedp = true;
11074
11075   arg0 = CALL_EXPR_ARG (exp, 0);
11076   op0 = expand_normal (arg0);
11077   tmode = insn_data[icode].operand[0].mode;
11078   mode0 = insn_data[icode].operand[1].mode;
11079
11080   if (target == 0
11081       || GET_MODE (target) != tmode
11082       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11083     target = gen_reg_rtx (tmode);
11084
11085   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11086     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
11087
11088   pat = GEN_FCN (icode) (target, op0);
11089   if (! pat)
11090     return 0;
11091   emit_insn (pat);
11092   return target;
11093 }
11094
11095 /* Expand the stvx builtins.  */
11096 static rtx
11097 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
11098                            bool *expandedp)
11099 {
11100   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11101   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11102   tree arg0, arg1;
11103   enum machine_mode mode0, mode1;
11104   rtx pat, op0, op1;
11105   enum insn_code icode;
11106
11107   switch (fcode)
11108     {
11109     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
11110       icode = CODE_FOR_vector_store_v16qi;
11111       break;
11112     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
11113       icode = CODE_FOR_vector_store_v8hi;
11114       break;
11115     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
11116       icode = CODE_FOR_vector_store_v4si;
11117       break;
11118     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
11119       icode = CODE_FOR_vector_store_v4sf;
11120       break;
11121     default:
11122       *expandedp = false;
11123       return NULL_RTX;
11124     }
11125
11126   arg0 = CALL_EXPR_ARG (exp, 0);
11127   arg1 = CALL_EXPR_ARG (exp, 1);
11128   op0 = expand_normal (arg0);
11129   op1 = expand_normal (arg1);
11130   mode0 = insn_data[icode].operand[0].mode;
11131   mode1 = insn_data[icode].operand[1].mode;
11132
11133   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11134     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
11135   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11136     op1 = copy_to_mode_reg (mode1, op1);
11137
11138   pat = GEN_FCN (icode) (op0, op1);
11139   if (pat)
11140     emit_insn (pat);
11141
11142   *expandedp = true;
11143   return NULL_RTX;
11144 }
11145
11146 /* Expand the dst builtins.  */
11147 static rtx
11148 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
11149                             bool *expandedp)
11150 {
11151   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11152   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11153   tree arg0, arg1, arg2;
11154   enum machine_mode mode0, mode1;
11155   rtx pat, op0, op1, op2;
11156   const struct builtin_description *d;
11157   size_t i;
11158
11159   *expandedp = false;
11160
11161   /* Handle DST variants.  */
11162   d = bdesc_dst;
11163   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
11164     if (d->code == fcode)
11165       {
11166         arg0 = CALL_EXPR_ARG (exp, 0);
11167         arg1 = CALL_EXPR_ARG (exp, 1);
11168         arg2 = CALL_EXPR_ARG (exp, 2);
11169         op0 = expand_normal (arg0);
11170         op1 = expand_normal (arg1);
11171         op2 = expand_normal (arg2);
11172         mode0 = insn_data[d->icode].operand[0].mode;
11173         mode1 = insn_data[d->icode].operand[1].mode;
11174
11175         /* Invalid arguments, bail out before generating bad rtl.  */
11176         if (arg0 == error_mark_node
11177             || arg1 == error_mark_node
11178             || arg2 == error_mark_node)
11179           return const0_rtx;
11180
11181         *expandedp = true;
11182         STRIP_NOPS (arg2);
11183         if (TREE_CODE (arg2) != INTEGER_CST
11184             || TREE_INT_CST_LOW (arg2) & ~0x3)
11185           {
11186             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
11187             return const0_rtx;
11188           }
11189
11190         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
11191           op0 = copy_to_mode_reg (Pmode, op0);
11192         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
11193           op1 = copy_to_mode_reg (mode1, op1);
11194
11195         pat = GEN_FCN (d->icode) (op0, op1, op2);
11196         if (pat != 0)
11197           emit_insn (pat);
11198
11199         return NULL_RTX;
11200       }
11201
11202   return NULL_RTX;
11203 }
11204
11205 /* Expand vec_init builtin.  */
11206 static rtx
11207 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
11208 {
11209   enum machine_mode tmode = TYPE_MODE (type);
11210   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
11211   int i, n_elt = GET_MODE_NUNITS (tmode);
11212   rtvec v = rtvec_alloc (n_elt);
11213
11214   gcc_assert (VECTOR_MODE_P (tmode));
11215   gcc_assert (n_elt == call_expr_nargs (exp));
11216
11217   for (i = 0; i < n_elt; ++i)
11218     {
11219       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
11220       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
11221     }
11222
11223   if (!target || !register_operand (target, tmode))
11224     target = gen_reg_rtx (tmode);
11225
11226   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
11227   return target;
11228 }
11229
11230 /* Return the integer constant in ARG.  Constrain it to be in the range
11231    of the subparts of VEC_TYPE; issue an error if not.  */
11232
11233 static int
11234 get_element_number (tree vec_type, tree arg)
11235 {
11236   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
11237
11238   if (!host_integerp (arg, 1)
11239       || (elt = tree_low_cst (arg, 1), elt > max))
11240     {
11241       error ("selector must be an integer constant in the range 0..%wi", max);
11242       return 0;
11243     }
11244
11245   return elt;
11246 }
11247
11248 /* Expand vec_set builtin.  */
11249 static rtx
11250 altivec_expand_vec_set_builtin (tree exp)
11251 {
11252   enum machine_mode tmode, mode1;
11253   tree arg0, arg1, arg2;
11254   int elt;
11255   rtx op0, op1;
11256
11257   arg0 = CALL_EXPR_ARG (exp, 0);
11258   arg1 = CALL_EXPR_ARG (exp, 1);
11259   arg2 = CALL_EXPR_ARG (exp, 2);
11260
11261   tmode = TYPE_MODE (TREE_TYPE (arg0));
11262   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11263   gcc_assert (VECTOR_MODE_P (tmode));
11264
11265   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
11266   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
11267   elt = get_element_number (TREE_TYPE (arg0), arg2);
11268
11269   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
11270     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
11271
11272   op0 = force_reg (tmode, op0);
11273   op1 = force_reg (mode1, op1);
11274
11275   rs6000_expand_vector_set (op0, op1, elt);
11276
11277   return op0;
11278 }
11279
11280 /* Expand vec_ext builtin.  */
11281 static rtx
11282 altivec_expand_vec_ext_builtin (tree exp, rtx target)
11283 {
11284   enum machine_mode tmode, mode0;
11285   tree arg0, arg1;
11286   int elt;
11287   rtx op0;
11288
11289   arg0 = CALL_EXPR_ARG (exp, 0);
11290   arg1 = CALL_EXPR_ARG (exp, 1);
11291
11292   op0 = expand_normal (arg0);
11293   elt = get_element_number (TREE_TYPE (arg0), arg1);
11294
11295   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11296   mode0 = TYPE_MODE (TREE_TYPE (arg0));
11297   gcc_assert (VECTOR_MODE_P (mode0));
11298
11299   op0 = force_reg (mode0, op0);
11300
11301   if (optimize || !target || !register_operand (target, tmode))
11302     target = gen_reg_rtx (tmode);
11303
11304   rs6000_expand_vector_extract (target, op0, elt);
11305
11306   return target;
11307 }
11308
11309 /* Expand the builtin in EXP and store the result in TARGET.  Store
11310    true in *EXPANDEDP if we found a builtin to expand.  */
11311 static rtx
11312 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
11313 {
11314   const struct builtin_description *d;
11315   const struct builtin_description_predicates *dp;
11316   size_t i;
11317   enum insn_code icode;
11318   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11319   tree arg0;
11320   rtx op0, pat;
11321   enum machine_mode tmode, mode0;
11322   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11323
11324   if ((fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
11325        && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
11326       || (fcode >= VSX_BUILTIN_OVERLOADED_FIRST
11327           && fcode <= VSX_BUILTIN_OVERLOADED_LAST))
11328     {
11329       *expandedp = true;
11330       error ("unresolved overload for Altivec builtin %qF", fndecl);
11331       return const0_rtx;
11332     }
11333
11334   target = altivec_expand_ld_builtin (exp, target, expandedp);
11335   if (*expandedp)
11336     return target;
11337
11338   target = altivec_expand_st_builtin (exp, target, expandedp);
11339   if (*expandedp)
11340     return target;
11341
11342   target = altivec_expand_dst_builtin (exp, target, expandedp);
11343   if (*expandedp)
11344     return target;
11345
11346   *expandedp = true;
11347
11348   switch (fcode)
11349     {
11350     case ALTIVEC_BUILTIN_STVX:
11351       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, exp);
11352     case ALTIVEC_BUILTIN_STVEBX:
11353       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
11354     case ALTIVEC_BUILTIN_STVEHX:
11355       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
11356     case ALTIVEC_BUILTIN_STVEWX:
11357       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
11358     case ALTIVEC_BUILTIN_STVXL:
11359       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
11360
11361     case ALTIVEC_BUILTIN_STVLX:
11362       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
11363     case ALTIVEC_BUILTIN_STVLXL:
11364       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
11365     case ALTIVEC_BUILTIN_STVRX:
11366       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
11367     case ALTIVEC_BUILTIN_STVRXL:
11368       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
11369
11370     case ALTIVEC_BUILTIN_MFVSCR:
11371       icode = CODE_FOR_altivec_mfvscr;
11372       tmode = insn_data[icode].operand[0].mode;
11373
11374       if (target == 0
11375           || GET_MODE (target) != tmode
11376           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11377         target = gen_reg_rtx (tmode);
11378
11379       pat = GEN_FCN (icode) (target);
11380       if (! pat)
11381         return 0;
11382       emit_insn (pat);
11383       return target;
11384
11385     case ALTIVEC_BUILTIN_MTVSCR:
11386       icode = CODE_FOR_altivec_mtvscr;
11387       arg0 = CALL_EXPR_ARG (exp, 0);
11388       op0 = expand_normal (arg0);
11389       mode0 = insn_data[icode].operand[0].mode;
11390
11391       /* If we got invalid arguments bail out before generating bad rtl.  */
11392       if (arg0 == error_mark_node)
11393         return const0_rtx;
11394
11395       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11396         op0 = copy_to_mode_reg (mode0, op0);
11397
11398       pat = GEN_FCN (icode) (op0);
11399       if (pat)
11400         emit_insn (pat);
11401       return NULL_RTX;
11402
11403     case ALTIVEC_BUILTIN_DSSALL:
11404       emit_insn (gen_altivec_dssall ());
11405       return NULL_RTX;
11406
11407     case ALTIVEC_BUILTIN_DSS:
11408       icode = CODE_FOR_altivec_dss;
11409       arg0 = CALL_EXPR_ARG (exp, 0);
11410       STRIP_NOPS (arg0);
11411       op0 = expand_normal (arg0);
11412       mode0 = insn_data[icode].operand[0].mode;
11413
11414       /* If we got invalid arguments bail out before generating bad rtl.  */
11415       if (arg0 == error_mark_node)
11416         return const0_rtx;
11417
11418       if (TREE_CODE (arg0) != INTEGER_CST
11419           || TREE_INT_CST_LOW (arg0) & ~0x3)
11420         {
11421           error ("argument to dss must be a 2-bit unsigned literal");
11422           return const0_rtx;
11423         }
11424
11425       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11426         op0 = copy_to_mode_reg (mode0, op0);
11427
11428       emit_insn (gen_altivec_dss (op0));
11429       return NULL_RTX;
11430
11431     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
11432     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
11433     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
11434     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
11435     case VSX_BUILTIN_VEC_INIT_V2DF:
11436     case VSX_BUILTIN_VEC_INIT_V2DI:
11437       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
11438
11439     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
11440     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
11441     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
11442     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
11443     case VSX_BUILTIN_VEC_SET_V2DF:
11444     case VSX_BUILTIN_VEC_SET_V2DI:
11445       return altivec_expand_vec_set_builtin (exp);
11446
11447     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
11448     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
11449     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
11450     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
11451     case VSX_BUILTIN_VEC_EXT_V2DF:
11452     case VSX_BUILTIN_VEC_EXT_V2DI:
11453       return altivec_expand_vec_ext_builtin (exp, target);
11454
11455     default:
11456       break;
11457       /* Fall through.  */
11458     }
11459
11460   /* Expand abs* operations.  */
11461   d = bdesc_abs;
11462   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
11463     if (d->code == fcode)
11464       return altivec_expand_abs_builtin (d->icode, exp, target);
11465
11466   /* Expand the AltiVec predicates.  */
11467   dp = bdesc_altivec_preds;
11468   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
11469     if (dp->code == fcode)
11470       return altivec_expand_predicate_builtin (dp->icode, exp, target);
11471
11472   /* LV* are funky.  We initialized them differently.  */
11473   switch (fcode)
11474     {
11475     case ALTIVEC_BUILTIN_LVSL:
11476       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
11477                                         exp, target, false);
11478     case ALTIVEC_BUILTIN_LVSR:
11479       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
11480                                         exp, target, false);
11481     case ALTIVEC_BUILTIN_LVEBX:
11482       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
11483                                         exp, target, false);
11484     case ALTIVEC_BUILTIN_LVEHX:
11485       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
11486                                         exp, target, false);
11487     case ALTIVEC_BUILTIN_LVEWX:
11488       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
11489                                         exp, target, false);
11490     case ALTIVEC_BUILTIN_LVXL:
11491       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
11492                                         exp, target, false);
11493     case ALTIVEC_BUILTIN_LVX:
11494       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
11495                                         exp, target, false);
11496     case ALTIVEC_BUILTIN_LVLX:
11497       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
11498                                         exp, target, true);
11499     case ALTIVEC_BUILTIN_LVLXL:
11500       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
11501                                         exp, target, true);
11502     case ALTIVEC_BUILTIN_LVRX:
11503       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
11504                                         exp, target, true);
11505     case ALTIVEC_BUILTIN_LVRXL:
11506       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
11507                                         exp, target, true);
11508     default:
11509       break;
11510       /* Fall through.  */
11511     }
11512
11513   *expandedp = false;
11514   return NULL_RTX;
11515 }
11516
11517 /* Expand the builtin in EXP and store the result in TARGET.  Store
11518    true in *EXPANDEDP if we found a builtin to expand.  */
11519 static rtx
11520 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
11521 {
11522   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11523   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11524   const struct builtin_description *d;
11525   size_t i;
11526
11527   *expandedp = true;
11528
11529   switch (fcode)
11530     {
11531     case PAIRED_BUILTIN_STX:
11532       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
11533     case PAIRED_BUILTIN_LX:
11534       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
11535     default:
11536       break;
11537       /* Fall through.  */
11538     }
11539
11540   /* Expand the paired predicates.  */
11541   d = bdesc_paired_preds;
11542   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
11543     if (d->code == fcode)
11544       return paired_expand_predicate_builtin (d->icode, exp, target);
11545
11546   *expandedp = false;
11547   return NULL_RTX;
11548 }
11549
11550 /* Binops that need to be initialized manually, but can be expanded
11551    automagically by rs6000_expand_binop_builtin.  */
11552 static struct builtin_description bdesc_2arg_spe[] =
11553 {
11554   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
11555   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
11556   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
11557   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
11558   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
11559   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
11560   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
11561   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
11562   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
11563   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
11564   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
11565   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
11566   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
11567   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
11568   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
11569   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
11570   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
11571   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
11572   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
11573   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
11574   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
11575   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
11576 };
11577
11578 /* Expand the builtin in EXP and store the result in TARGET.  Store
11579    true in *EXPANDEDP if we found a builtin to expand.
11580
11581    This expands the SPE builtins that are not simple unary and binary
11582    operations.  */
11583 static rtx
11584 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
11585 {
11586   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11587   tree arg1, arg0;
11588   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11589   enum insn_code icode;
11590   enum machine_mode tmode, mode0;
11591   rtx pat, op0;
11592   struct builtin_description *d;
11593   size_t i;
11594
11595   *expandedp = true;
11596
11597   /* Syntax check for a 5-bit unsigned immediate.  */
11598   switch (fcode)
11599     {
11600     case SPE_BUILTIN_EVSTDD:
11601     case SPE_BUILTIN_EVSTDH:
11602     case SPE_BUILTIN_EVSTDW:
11603     case SPE_BUILTIN_EVSTWHE:
11604     case SPE_BUILTIN_EVSTWHO:
11605     case SPE_BUILTIN_EVSTWWE:
11606     case SPE_BUILTIN_EVSTWWO:
11607       arg1 = CALL_EXPR_ARG (exp, 2);
11608       if (TREE_CODE (arg1) != INTEGER_CST
11609           || TREE_INT_CST_LOW (arg1) & ~0x1f)
11610         {
11611           error ("argument 2 must be a 5-bit unsigned literal");
11612           return const0_rtx;
11613         }
11614       break;
11615     default:
11616       break;
11617     }
11618
11619   /* The evsplat*i instructions are not quite generic.  */
11620   switch (fcode)
11621     {
11622     case SPE_BUILTIN_EVSPLATFI:
11623       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
11624                                          exp, target);
11625     case SPE_BUILTIN_EVSPLATI:
11626       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
11627                                          exp, target);
11628     default:
11629       break;
11630     }
11631
11632   d = (struct builtin_description *) bdesc_2arg_spe;
11633   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
11634     if (d->code == fcode)
11635       return rs6000_expand_binop_builtin (d->icode, exp, target);
11636
11637   d = (struct builtin_description *) bdesc_spe_predicates;
11638   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
11639     if (d->code == fcode)
11640       return spe_expand_predicate_builtin (d->icode, exp, target);
11641
11642   d = (struct builtin_description *) bdesc_spe_evsel;
11643   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
11644     if (d->code == fcode)
11645       return spe_expand_evsel_builtin (d->icode, exp, target);
11646
11647   switch (fcode)
11648     {
11649     case SPE_BUILTIN_EVSTDDX:
11650       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
11651     case SPE_BUILTIN_EVSTDHX:
11652       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
11653     case SPE_BUILTIN_EVSTDWX:
11654       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
11655     case SPE_BUILTIN_EVSTWHEX:
11656       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
11657     case SPE_BUILTIN_EVSTWHOX:
11658       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
11659     case SPE_BUILTIN_EVSTWWEX:
11660       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
11661     case SPE_BUILTIN_EVSTWWOX:
11662       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
11663     case SPE_BUILTIN_EVSTDD:
11664       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
11665     case SPE_BUILTIN_EVSTDH:
11666       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
11667     case SPE_BUILTIN_EVSTDW:
11668       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
11669     case SPE_BUILTIN_EVSTWHE:
11670       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
11671     case SPE_BUILTIN_EVSTWHO:
11672       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
11673     case SPE_BUILTIN_EVSTWWE:
11674       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
11675     case SPE_BUILTIN_EVSTWWO:
11676       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
11677     case SPE_BUILTIN_MFSPEFSCR:
11678       icode = CODE_FOR_spe_mfspefscr;
11679       tmode = insn_data[icode].operand[0].mode;
11680
11681       if (target == 0
11682           || GET_MODE (target) != tmode
11683           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11684         target = gen_reg_rtx (tmode);
11685
11686       pat = GEN_FCN (icode) (target);
11687       if (! pat)
11688         return 0;
11689       emit_insn (pat);
11690       return target;
11691     case SPE_BUILTIN_MTSPEFSCR:
11692       icode = CODE_FOR_spe_mtspefscr;
11693       arg0 = CALL_EXPR_ARG (exp, 0);
11694       op0 = expand_normal (arg0);
11695       mode0 = insn_data[icode].operand[0].mode;
11696
11697       if (arg0 == error_mark_node)
11698         return const0_rtx;
11699
11700       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11701         op0 = copy_to_mode_reg (mode0, op0);
11702
11703       pat = GEN_FCN (icode) (op0);
11704       if (pat)
11705         emit_insn (pat);
11706       return NULL_RTX;
11707     default:
11708       break;
11709     }
11710
11711   *expandedp = false;
11712   return NULL_RTX;
11713 }
11714
11715 static rtx
11716 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11717 {
11718   rtx pat, scratch, tmp;
11719   tree form = CALL_EXPR_ARG (exp, 0);
11720   tree arg0 = CALL_EXPR_ARG (exp, 1);
11721   tree arg1 = CALL_EXPR_ARG (exp, 2);
11722   rtx op0 = expand_normal (arg0);
11723   rtx op1 = expand_normal (arg1);
11724   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11725   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11726   int form_int;
11727   enum rtx_code code;
11728
11729   if (TREE_CODE (form) != INTEGER_CST)
11730     {
11731       error ("argument 1 of __builtin_paired_predicate must be a constant");
11732       return const0_rtx;
11733     }
11734   else
11735     form_int = TREE_INT_CST_LOW (form);
11736
11737   gcc_assert (mode0 == mode1);
11738
11739   if (arg0 == error_mark_node || arg1 == error_mark_node)
11740     return const0_rtx;
11741
11742   if (target == 0
11743       || GET_MODE (target) != SImode
11744       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
11745     target = gen_reg_rtx (SImode);
11746   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
11747     op0 = copy_to_mode_reg (mode0, op0);
11748   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
11749     op1 = copy_to_mode_reg (mode1, op1);
11750
11751   scratch = gen_reg_rtx (CCFPmode);
11752
11753   pat = GEN_FCN (icode) (scratch, op0, op1);
11754   if (!pat)
11755     return const0_rtx;
11756
11757   emit_insn (pat);
11758
11759   switch (form_int)
11760     {
11761       /* LT bit.  */
11762     case 0:
11763       code = LT;
11764       break;
11765       /* GT bit.  */
11766     case 1:
11767       code = GT;
11768       break;
11769       /* EQ bit.  */
11770     case 2:
11771       code = EQ;
11772       break;
11773       /* UN bit.  */
11774     case 3:
11775       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11776       return target;
11777     default:
11778       error ("argument 1 of __builtin_paired_predicate is out of range");
11779       return const0_rtx;
11780     }
11781
11782   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11783   emit_move_insn (target, tmp);
11784   return target;
11785 }
11786
11787 static rtx
11788 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11789 {
11790   rtx pat, scratch, tmp;
11791   tree form = CALL_EXPR_ARG (exp, 0);
11792   tree arg0 = CALL_EXPR_ARG (exp, 1);
11793   tree arg1 = CALL_EXPR_ARG (exp, 2);
11794   rtx op0 = expand_normal (arg0);
11795   rtx op1 = expand_normal (arg1);
11796   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11797   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11798   int form_int;
11799   enum rtx_code code;
11800
11801   if (TREE_CODE (form) != INTEGER_CST)
11802     {
11803       error ("argument 1 of __builtin_spe_predicate must be a constant");
11804       return const0_rtx;
11805     }
11806   else
11807     form_int = TREE_INT_CST_LOW (form);
11808
11809   gcc_assert (mode0 == mode1);
11810
11811   if (arg0 == error_mark_node || arg1 == error_mark_node)
11812     return const0_rtx;
11813
11814   if (target == 0
11815       || GET_MODE (target) != SImode
11816       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
11817     target = gen_reg_rtx (SImode);
11818
11819   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11820     op0 = copy_to_mode_reg (mode0, op0);
11821   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11822     op1 = copy_to_mode_reg (mode1, op1);
11823
11824   scratch = gen_reg_rtx (CCmode);
11825
11826   pat = GEN_FCN (icode) (scratch, op0, op1);
11827   if (! pat)
11828     return const0_rtx;
11829   emit_insn (pat);
11830
11831   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
11832      _lower_.  We use one compare, but look in different bits of the
11833      CR for each variant.
11834
11835      There are 2 elements in each SPE simd type (upper/lower).  The CR
11836      bits are set as follows:
11837
11838      BIT0  | BIT 1  | BIT 2   | BIT 3
11839      U     |   L    | (U | L) | (U & L)
11840
11841      So, for an "all" relationship, BIT 3 would be set.
11842      For an "any" relationship, BIT 2 would be set.  Etc.
11843
11844      Following traditional nomenclature, these bits map to:
11845
11846      BIT0  | BIT 1  | BIT 2   | BIT 3
11847      LT    | GT     | EQ      | OV
11848
11849      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
11850   */
11851
11852   switch (form_int)
11853     {
11854       /* All variant.  OV bit.  */
11855     case 0:
11856       /* We need to get to the OV bit, which is the ORDERED bit.  We
11857          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
11858          that's ugly and will make validate_condition_mode die.
11859          So let's just use another pattern.  */
11860       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11861       return target;
11862       /* Any variant.  EQ bit.  */
11863     case 1:
11864       code = EQ;
11865       break;
11866       /* Upper variant.  LT bit.  */
11867     case 2:
11868       code = LT;
11869       break;
11870       /* Lower variant.  GT bit.  */
11871     case 3:
11872       code = GT;
11873       break;
11874     default:
11875       error ("argument 1 of __builtin_spe_predicate is out of range");
11876       return const0_rtx;
11877     }
11878
11879   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11880   emit_move_insn (target, tmp);
11881
11882   return target;
11883 }
11884
11885 /* The evsel builtins look like this:
11886
11887      e = __builtin_spe_evsel_OP (a, b, c, d);
11888
11889    and work like this:
11890
11891      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
11892      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
11893 */
11894
11895 static rtx
11896 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
11897 {
11898   rtx pat, scratch;
11899   tree arg0 = CALL_EXPR_ARG (exp, 0);
11900   tree arg1 = CALL_EXPR_ARG (exp, 1);
11901   tree arg2 = CALL_EXPR_ARG (exp, 2);
11902   tree arg3 = CALL_EXPR_ARG (exp, 3);
11903   rtx op0 = expand_normal (arg0);
11904   rtx op1 = expand_normal (arg1);
11905   rtx op2 = expand_normal (arg2);
11906   rtx op3 = expand_normal (arg3);
11907   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11908   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11909
11910   gcc_assert (mode0 == mode1);
11911
11912   if (arg0 == error_mark_node || arg1 == error_mark_node
11913       || arg2 == error_mark_node || arg3 == error_mark_node)
11914     return const0_rtx;
11915
11916   if (target == 0
11917       || GET_MODE (target) != mode0
11918       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
11919     target = gen_reg_rtx (mode0);
11920
11921   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11922     op0 = copy_to_mode_reg (mode0, op0);
11923   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11924     op1 = copy_to_mode_reg (mode0, op1);
11925   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
11926     op2 = copy_to_mode_reg (mode0, op2);
11927   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
11928     op3 = copy_to_mode_reg (mode0, op3);
11929
11930   /* Generate the compare.  */
11931   scratch = gen_reg_rtx (CCmode);
11932   pat = GEN_FCN (icode) (scratch, op0, op1);
11933   if (! pat)
11934     return const0_rtx;
11935   emit_insn (pat);
11936
11937   if (mode0 == V2SImode)
11938     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
11939   else
11940     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
11941
11942   return target;
11943 }
11944
11945 /* Expand an expression EXP that calls a built-in function,
11946    with result going to TARGET if that's convenient
11947    (and in mode MODE if that's convenient).
11948    SUBTARGET may be used as the target for computing one of EXP's operands.
11949    IGNORE is nonzero if the value is to be ignored.  */
11950
11951 static rtx
11952 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
11953                        enum machine_mode mode ATTRIBUTE_UNUSED,
11954                        int ignore ATTRIBUTE_UNUSED)
11955 {
11956   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11957   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11958   const struct builtin_description *d;
11959   size_t i;
11960   rtx ret;
11961   bool success;
11962
11963   switch (fcode)
11964     {
11965     case RS6000_BUILTIN_RECIP:
11966       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
11967
11968     case RS6000_BUILTIN_RECIPF:
11969       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
11970
11971     case RS6000_BUILTIN_RSQRTF:
11972       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
11973
11974     case RS6000_BUILTIN_RSQRT:
11975       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
11976
11977     case RS6000_BUILTIN_BSWAP_HI:
11978       return rs6000_expand_unop_builtin (CODE_FOR_bswaphi2, exp, target);
11979
11980     case POWER7_BUILTIN_BPERMD:
11981       return rs6000_expand_binop_builtin (((TARGET_64BIT)
11982                                            ? CODE_FOR_bpermd_di
11983                                            : CODE_FOR_bpermd_si), exp, target);
11984
11985     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
11986     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
11987       {
11988         int icode = (int) CODE_FOR_altivec_lvsr;
11989         enum machine_mode tmode = insn_data[icode].operand[0].mode;
11990         enum machine_mode mode = insn_data[icode].operand[1].mode;
11991         tree arg;
11992         rtx op, addr, pat;
11993
11994         gcc_assert (TARGET_ALTIVEC);
11995
11996         arg = CALL_EXPR_ARG (exp, 0);
11997         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
11998         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
11999         addr = memory_address (mode, op);
12000         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
12001           op = addr;
12002         else
12003           {
12004             /* For the load case need to negate the address.  */
12005             op = gen_reg_rtx (GET_MODE (addr));
12006             emit_insn (gen_rtx_SET (VOIDmode, op,
12007                                     gen_rtx_NEG (GET_MODE (addr), addr)));
12008           }
12009         op = gen_rtx_MEM (mode, op);
12010
12011         if (target == 0
12012             || GET_MODE (target) != tmode
12013             || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
12014           target = gen_reg_rtx (tmode);
12015
12016         /*pat = gen_altivec_lvsr (target, op);*/
12017         pat = GEN_FCN (icode) (target, op);
12018         if (!pat)
12019           return 0;
12020         emit_insn (pat);
12021
12022         return target;
12023       }
12024
12025     case ALTIVEC_BUILTIN_VCFUX:
12026     case ALTIVEC_BUILTIN_VCFSX:
12027     case ALTIVEC_BUILTIN_VCTUXS:
12028     case ALTIVEC_BUILTIN_VCTSXS:
12029   /* FIXME: There's got to be a nicer way to handle this case than
12030      constructing a new CALL_EXPR.  */
12031       if (call_expr_nargs (exp) == 1)
12032         {
12033           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
12034                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
12035         }
12036       break;
12037
12038     default:
12039       break;
12040     }
12041
12042   if (TARGET_ALTIVEC)
12043     {
12044       ret = altivec_expand_builtin (exp, target, &success);
12045
12046       if (success)
12047         return ret;
12048     }
12049   if (TARGET_SPE)
12050     {
12051       ret = spe_expand_builtin (exp, target, &success);
12052
12053       if (success)
12054         return ret;
12055     }
12056   if (TARGET_PAIRED_FLOAT)
12057     {
12058       ret = paired_expand_builtin (exp, target, &success);
12059
12060       if (success)
12061         return ret;
12062     }  
12063
12064   gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
12065
12066   /* Handle simple unary operations.  */
12067   d = (struct builtin_description *) bdesc_1arg;
12068   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
12069     if (d->code == fcode)
12070       return rs6000_expand_unop_builtin (d->icode, exp, target);
12071
12072   /* Handle simple binary operations.  */
12073   d = (struct builtin_description *) bdesc_2arg;
12074   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
12075     if (d->code == fcode)
12076       return rs6000_expand_binop_builtin (d->icode, exp, target);
12077
12078   /* Handle simple ternary operations.  */
12079   d = bdesc_3arg;
12080   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
12081     if (d->code == fcode)
12082       return rs6000_expand_ternop_builtin (d->icode, exp, target);
12083
12084   gcc_unreachable ();
12085 }
12086
12087 static void
12088 rs6000_init_builtins (void)
12089 {
12090   tree tdecl;
12091   tree ftype;
12092
12093   V2SI_type_node = build_vector_type (intSI_type_node, 2);
12094   V2SF_type_node = build_vector_type (float_type_node, 2);
12095   V2DI_type_node = build_vector_type (intDI_type_node, 2);
12096   V2DF_type_node = build_vector_type (double_type_node, 2);
12097   V4HI_type_node = build_vector_type (intHI_type_node, 4);
12098   V4SI_type_node = build_vector_type (intSI_type_node, 4);
12099   V4SF_type_node = build_vector_type (float_type_node, 4);
12100   V8HI_type_node = build_vector_type (intHI_type_node, 8);
12101   V16QI_type_node = build_vector_type (intQI_type_node, 16);
12102
12103   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
12104   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
12105   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
12106   unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2);
12107
12108   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
12109   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
12110   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
12111   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
12112
12113   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
12114      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
12115      'vector unsigned short'.  */
12116
12117   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
12118   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12119   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
12120   bool_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
12121   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12122
12123   long_integer_type_internal_node = long_integer_type_node;
12124   long_unsigned_type_internal_node = long_unsigned_type_node;
12125   intQI_type_internal_node = intQI_type_node;
12126   uintQI_type_internal_node = unsigned_intQI_type_node;
12127   intHI_type_internal_node = intHI_type_node;
12128   uintHI_type_internal_node = unsigned_intHI_type_node;
12129   intSI_type_internal_node = intSI_type_node;
12130   uintSI_type_internal_node = unsigned_intSI_type_node;
12131   intDI_type_internal_node = intDI_type_node;
12132   uintDI_type_internal_node = unsigned_intDI_type_node;
12133   float_type_internal_node = float_type_node;
12134   double_type_internal_node = float_type_node;
12135   void_type_internal_node = void_type_node;
12136
12137   /* Initialize the modes for builtin_function_type, mapping a machine mode to
12138      tree type node.  */
12139   builtin_mode_to_type[QImode][0] = integer_type_node;
12140   builtin_mode_to_type[HImode][0] = integer_type_node;
12141   builtin_mode_to_type[SImode][0] = intSI_type_node;
12142   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
12143   builtin_mode_to_type[DImode][0] = intDI_type_node;
12144   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
12145   builtin_mode_to_type[SFmode][0] = float_type_node;
12146   builtin_mode_to_type[DFmode][0] = double_type_node;
12147   builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
12148   builtin_mode_to_type[V2SFmode][0] = V2SF_type_node;
12149   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
12150   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
12151   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
12152   builtin_mode_to_type[V4HImode][0] = V4HI_type_node;
12153   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
12154   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
12155   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
12156   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
12157   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
12158   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
12159   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
12160
12161   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12162                       get_identifier ("__bool char"),
12163                       bool_char_type_node);
12164   TYPE_NAME (bool_char_type_node) = tdecl;
12165   (*lang_hooks.decls.pushdecl) (tdecl);
12166   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12167                       get_identifier ("__bool short"),
12168                       bool_short_type_node);
12169   TYPE_NAME (bool_short_type_node) = tdecl;
12170   (*lang_hooks.decls.pushdecl) (tdecl);
12171   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12172                       get_identifier ("__bool int"),
12173                       bool_int_type_node);
12174   TYPE_NAME (bool_int_type_node) = tdecl;
12175   (*lang_hooks.decls.pushdecl) (tdecl);
12176   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"),
12177                       pixel_type_node);
12178   TYPE_NAME (pixel_type_node) = tdecl;
12179   (*lang_hooks.decls.pushdecl) (tdecl);
12180
12181   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
12182   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
12183   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
12184   bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2);
12185   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
12186
12187   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12188                       get_identifier ("__vector unsigned char"),
12189                       unsigned_V16QI_type_node);
12190   TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
12191   (*lang_hooks.decls.pushdecl) (tdecl);
12192   tdecl = build_decl (BUILTINS_LOCATION,
12193                       TYPE_DECL, get_identifier ("__vector signed char"),
12194                       V16QI_type_node);
12195   TYPE_NAME (V16QI_type_node) = tdecl;
12196   (*lang_hooks.decls.pushdecl) (tdecl);
12197   tdecl = build_decl (BUILTINS_LOCATION,
12198                       TYPE_DECL, get_identifier ("__vector __bool char"),
12199                       bool_V16QI_type_node);
12200   TYPE_NAME ( bool_V16QI_type_node) = tdecl;
12201   (*lang_hooks.decls.pushdecl) (tdecl);
12202
12203   tdecl = build_decl (BUILTINS_LOCATION,
12204                       TYPE_DECL, get_identifier ("__vector unsigned short"),
12205                       unsigned_V8HI_type_node);
12206   TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
12207   (*lang_hooks.decls.pushdecl) (tdecl);
12208   tdecl = build_decl (BUILTINS_LOCATION,
12209                       TYPE_DECL, get_identifier ("__vector signed short"),
12210                       V8HI_type_node);
12211   TYPE_NAME (V8HI_type_node) = tdecl;
12212   (*lang_hooks.decls.pushdecl) (tdecl);
12213   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12214                       get_identifier ("__vector __bool short"),
12215                       bool_V8HI_type_node);
12216   TYPE_NAME (bool_V8HI_type_node) = tdecl;
12217   (*lang_hooks.decls.pushdecl) (tdecl);
12218
12219   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12220                       get_identifier ("__vector unsigned int"),
12221                       unsigned_V4SI_type_node);
12222   TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
12223   (*lang_hooks.decls.pushdecl) (tdecl);
12224   tdecl = build_decl (BUILTINS_LOCATION,
12225                       TYPE_DECL, get_identifier ("__vector signed int"),
12226                       V4SI_type_node);
12227   TYPE_NAME (V4SI_type_node) = tdecl;
12228   (*lang_hooks.decls.pushdecl) (tdecl);
12229   tdecl = build_decl (BUILTINS_LOCATION,
12230                       TYPE_DECL, get_identifier ("__vector __bool int"),
12231                       bool_V4SI_type_node);
12232   TYPE_NAME (bool_V4SI_type_node) = tdecl;
12233   (*lang_hooks.decls.pushdecl) (tdecl);
12234
12235   tdecl = build_decl (BUILTINS_LOCATION,
12236                       TYPE_DECL, get_identifier ("__vector float"),
12237                       V4SF_type_node);
12238   TYPE_NAME (V4SF_type_node) = tdecl;
12239   (*lang_hooks.decls.pushdecl) (tdecl);
12240   tdecl = build_decl (BUILTINS_LOCATION,
12241                       TYPE_DECL, get_identifier ("__vector __pixel"),
12242                       pixel_V8HI_type_node);
12243   TYPE_NAME (pixel_V8HI_type_node) = tdecl;
12244   (*lang_hooks.decls.pushdecl) (tdecl);
12245
12246   if (TARGET_VSX)
12247     {
12248       tdecl = build_decl (BUILTINS_LOCATION,
12249                           TYPE_DECL, get_identifier ("__vector double"),
12250                           V2DF_type_node);
12251       TYPE_NAME (V2DF_type_node) = tdecl;
12252       (*lang_hooks.decls.pushdecl) (tdecl);
12253
12254       tdecl = build_decl (BUILTINS_LOCATION,
12255                           TYPE_DECL, get_identifier ("__vector long"),
12256                           V2DI_type_node);
12257       TYPE_NAME (V2DI_type_node) = tdecl;
12258       (*lang_hooks.decls.pushdecl) (tdecl);
12259
12260       tdecl = build_decl (BUILTINS_LOCATION,
12261                           TYPE_DECL, get_identifier ("__vector unsigned long"),
12262                           unsigned_V2DI_type_node);
12263       TYPE_NAME (unsigned_V2DI_type_node) = tdecl;
12264       (*lang_hooks.decls.pushdecl) (tdecl);
12265
12266       tdecl = build_decl (BUILTINS_LOCATION,
12267                           TYPE_DECL, get_identifier ("__vector __bool long"),
12268                           bool_V2DI_type_node);
12269       TYPE_NAME (bool_V2DI_type_node) = tdecl;
12270       (*lang_hooks.decls.pushdecl) (tdecl);
12271     }
12272
12273   if (TARGET_PAIRED_FLOAT)
12274     paired_init_builtins ();
12275   if (TARGET_SPE)
12276     spe_init_builtins ();
12277   if (TARGET_ALTIVEC)
12278     altivec_init_builtins ();
12279   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT || TARGET_VSX)
12280     rs6000_common_init_builtins ();
12281   if (TARGET_FRE)
12282     {
12283       ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
12284                                      RS6000_BUILTIN_RECIP,
12285                                      "__builtin_recipdiv");
12286       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
12287                    RS6000_BUILTIN_RECIP);
12288     }
12289   if (TARGET_FRES)
12290     {
12291       ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
12292                                      RS6000_BUILTIN_RECIPF,
12293                                      "__builtin_recipdivf");
12294       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
12295                    RS6000_BUILTIN_RECIPF);
12296     }
12297   if (TARGET_FRSQRTE)
12298     {
12299       ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
12300                                      RS6000_BUILTIN_RSQRT,
12301                                      "__builtin_rsqrt");
12302       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrt", ftype,
12303                    RS6000_BUILTIN_RSQRT);
12304     }
12305   if (TARGET_FRSQRTES)
12306     {
12307       ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
12308                                      RS6000_BUILTIN_RSQRTF,
12309                                      "__builtin_rsqrtf");
12310       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
12311                    RS6000_BUILTIN_RSQRTF);
12312     }
12313   if (TARGET_POPCNTD)
12314     {
12315       enum machine_mode mode = (TARGET_64BIT) ? DImode : SImode;
12316       tree ftype = builtin_function_type (mode, mode, mode, VOIDmode,
12317                                           POWER7_BUILTIN_BPERMD,
12318                                           "__builtin_bpermd");
12319       def_builtin (MASK_POPCNTD, "__builtin_bpermd", ftype,
12320                    POWER7_BUILTIN_BPERMD);
12321     }
12322   if (TARGET_POWERPC)
12323     {
12324       /* Don't use builtin_function_type here, as it maps HI/QI to SI.  */
12325       tree ftype = build_function_type_list (unsigned_intHI_type_node,
12326                                              unsigned_intHI_type_node,
12327                                              NULL_TREE);
12328       def_builtin (MASK_POWERPC, "__builtin_bswap16", ftype,
12329                    RS6000_BUILTIN_BSWAP_HI);
12330     }
12331
12332 #if TARGET_XCOFF
12333   /* AIX libm provides clog as __clog.  */
12334   if (built_in_decls [BUILT_IN_CLOG])
12335     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
12336 #endif
12337
12338 #ifdef SUBTARGET_INIT_BUILTINS
12339   SUBTARGET_INIT_BUILTINS;
12340 #endif
12341 }
12342
12343 /* Returns the rs6000 builtin decl for CODE.  */
12344
12345 static tree
12346 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
12347 {
12348   if (code >= RS6000_BUILTIN_COUNT)
12349     return error_mark_node;
12350
12351   return rs6000_builtin_decls[code];
12352 }
12353
12354 /* Search through a set of builtins and enable the mask bits.
12355    DESC is an array of builtins.
12356    SIZE is the total number of builtins.
12357    START is the builtin enum at which to start.
12358    END is the builtin enum at which to end.  */
12359 static void
12360 enable_mask_for_builtins (struct builtin_description *desc, int size,
12361                           enum rs6000_builtins start,
12362                           enum rs6000_builtins end)
12363 {
12364   int i;
12365
12366   for (i = 0; i < size; ++i)
12367     if (desc[i].code == start)
12368       break;
12369
12370   if (i == size)
12371     return;
12372
12373   for (; i < size; ++i)
12374     {
12375       /* Flip all the bits on.  */
12376       desc[i].mask = target_flags;
12377       if (desc[i].code == end)
12378         break;
12379     }
12380 }
12381
12382 static void
12383 spe_init_builtins (void)
12384 {
12385   tree endlink = void_list_node;
12386   tree puint_type_node = build_pointer_type (unsigned_type_node);
12387   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
12388   struct builtin_description *d;
12389   size_t i;
12390
12391   tree v2si_ftype_4_v2si
12392     = build_function_type
12393     (opaque_V2SI_type_node,
12394      tree_cons (NULL_TREE, opaque_V2SI_type_node,
12395                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12396                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12397                                       tree_cons (NULL_TREE, opaque_V2SI_type_node,
12398                                                  endlink)))));
12399
12400   tree v2sf_ftype_4_v2sf
12401     = build_function_type
12402     (opaque_V2SF_type_node,
12403      tree_cons (NULL_TREE, opaque_V2SF_type_node,
12404                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12405                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
12406                                       tree_cons (NULL_TREE, opaque_V2SF_type_node,
12407                                                  endlink)))));
12408
12409   tree int_ftype_int_v2si_v2si
12410     = build_function_type
12411     (integer_type_node,
12412      tree_cons (NULL_TREE, integer_type_node,
12413                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12414                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12415                                       endlink))));
12416
12417   tree int_ftype_int_v2sf_v2sf
12418     = build_function_type
12419     (integer_type_node,
12420      tree_cons (NULL_TREE, integer_type_node,
12421                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12422                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
12423                                       endlink))));
12424
12425   tree void_ftype_v2si_puint_int
12426     = build_function_type (void_type_node,
12427                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12428                                       tree_cons (NULL_TREE, puint_type_node,
12429                                                  tree_cons (NULL_TREE,
12430                                                             integer_type_node,
12431                                                             endlink))));
12432
12433   tree void_ftype_v2si_puint_char
12434     = build_function_type (void_type_node,
12435                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12436                                       tree_cons (NULL_TREE, puint_type_node,
12437                                                  tree_cons (NULL_TREE,
12438                                                             char_type_node,
12439                                                             endlink))));
12440
12441   tree void_ftype_v2si_pv2si_int
12442     = build_function_type (void_type_node,
12443                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12444                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12445                                                  tree_cons (NULL_TREE,
12446                                                             integer_type_node,
12447                                                             endlink))));
12448
12449   tree void_ftype_v2si_pv2si_char
12450     = build_function_type (void_type_node,
12451                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
12452                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12453                                                  tree_cons (NULL_TREE,
12454                                                             char_type_node,
12455                                                             endlink))));
12456
12457   tree void_ftype_int
12458     = build_function_type (void_type_node,
12459                            tree_cons (NULL_TREE, integer_type_node, endlink));
12460
12461   tree int_ftype_void
12462     = build_function_type (integer_type_node, endlink);
12463
12464   tree v2si_ftype_pv2si_int
12465     = build_function_type (opaque_V2SI_type_node,
12466                            tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12467                                       tree_cons (NULL_TREE, integer_type_node,
12468                                                  endlink)));
12469
12470   tree v2si_ftype_puint_int
12471     = build_function_type (opaque_V2SI_type_node,
12472                            tree_cons (NULL_TREE, puint_type_node,
12473                                       tree_cons (NULL_TREE, integer_type_node,
12474                                                  endlink)));
12475
12476   tree v2si_ftype_pushort_int
12477     = build_function_type (opaque_V2SI_type_node,
12478                            tree_cons (NULL_TREE, pushort_type_node,
12479                                       tree_cons (NULL_TREE, integer_type_node,
12480                                                  endlink)));
12481
12482   tree v2si_ftype_signed_char
12483     = build_function_type (opaque_V2SI_type_node,
12484                            tree_cons (NULL_TREE, signed_char_type_node,
12485                                       endlink));
12486
12487   /* The initialization of the simple binary and unary builtins is
12488      done in rs6000_common_init_builtins, but we have to enable the
12489      mask bits here manually because we have run out of `target_flags'
12490      bits.  We really need to redesign this mask business.  */
12491
12492   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
12493                             ARRAY_SIZE (bdesc_2arg),
12494                             SPE_BUILTIN_EVADDW,
12495                             SPE_BUILTIN_EVXOR);
12496   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
12497                             ARRAY_SIZE (bdesc_1arg),
12498                             SPE_BUILTIN_EVABS,
12499                             SPE_BUILTIN_EVSUBFUSIAAW);
12500   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
12501                             ARRAY_SIZE (bdesc_spe_predicates),
12502                             SPE_BUILTIN_EVCMPEQ,
12503                             SPE_BUILTIN_EVFSTSTLT);
12504   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
12505                             ARRAY_SIZE (bdesc_spe_evsel),
12506                             SPE_BUILTIN_EVSEL_CMPGTS,
12507                             SPE_BUILTIN_EVSEL_FSTSTEQ);
12508
12509   (*lang_hooks.decls.pushdecl)
12510     (build_decl (BUILTINS_LOCATION, TYPE_DECL,
12511                  get_identifier ("__ev64_opaque__"),
12512                  opaque_V2SI_type_node));
12513
12514   /* Initialize irregular SPE builtins.  */
12515
12516   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
12517   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
12518   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
12519   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
12520   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
12521   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
12522   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
12523   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
12524   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
12525   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
12526   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
12527   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
12528   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
12529   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
12530   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
12531   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
12532   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
12533   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
12534
12535   /* Loads.  */
12536   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
12537   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
12538   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
12539   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
12540   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
12541   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
12542   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
12543   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
12544   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
12545   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
12546   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
12547   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
12548   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
12549   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
12550   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
12551   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
12552   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
12553   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
12554   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
12555   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
12556   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
12557   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
12558
12559   /* Predicates.  */
12560   d = (struct builtin_description *) bdesc_spe_predicates;
12561   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
12562     {
12563       tree type;
12564
12565       switch (insn_data[d->icode].operand[1].mode)
12566         {
12567         case V2SImode:
12568           type = int_ftype_int_v2si_v2si;
12569           break;
12570         case V2SFmode:
12571           type = int_ftype_int_v2sf_v2sf;
12572           break;
12573         default:
12574           gcc_unreachable ();
12575         }
12576
12577       def_builtin (d->mask, d->name, type, d->code);
12578     }
12579
12580   /* Evsel predicates.  */
12581   d = (struct builtin_description *) bdesc_spe_evsel;
12582   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
12583     {
12584       tree type;
12585
12586       switch (insn_data[d->icode].operand[1].mode)
12587         {
12588         case V2SImode:
12589           type = v2si_ftype_4_v2si;
12590           break;
12591         case V2SFmode:
12592           type = v2sf_ftype_4_v2sf;
12593           break;
12594         default:
12595           gcc_unreachable ();
12596         }
12597
12598       def_builtin (d->mask, d->name, type, d->code);
12599     }
12600 }
12601
12602 static void
12603 paired_init_builtins (void)
12604 {
12605   const struct builtin_description *d;
12606   size_t i;
12607   tree endlink = void_list_node;
12608
12609    tree int_ftype_int_v2sf_v2sf
12610     = build_function_type
12611     (integer_type_node,
12612      tree_cons (NULL_TREE, integer_type_node,
12613                 tree_cons (NULL_TREE, V2SF_type_node,
12614                            tree_cons (NULL_TREE, V2SF_type_node,
12615                                       endlink))));
12616   tree pcfloat_type_node =
12617     build_pointer_type (build_qualified_type
12618                         (float_type_node, TYPE_QUAL_CONST));
12619
12620   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
12621                                                            long_integer_type_node,
12622                                                            pcfloat_type_node,
12623                                                            NULL_TREE);
12624   tree void_ftype_v2sf_long_pcfloat =
12625     build_function_type_list (void_type_node,
12626                               V2SF_type_node,
12627                               long_integer_type_node,
12628                               pcfloat_type_node,
12629                               NULL_TREE);
12630
12631
12632   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
12633                PAIRED_BUILTIN_LX);
12634
12635
12636   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
12637                PAIRED_BUILTIN_STX);
12638
12639   /* Predicates.  */
12640   d = bdesc_paired_preds;
12641   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
12642     {
12643       tree type;
12644
12645       switch (insn_data[d->icode].operand[1].mode)
12646         {
12647         case V2SFmode:
12648           type = int_ftype_int_v2sf_v2sf;
12649           break;
12650         default:
12651           gcc_unreachable ();
12652         }
12653
12654       def_builtin (d->mask, d->name, type, d->code);
12655     }
12656 }
12657
12658 static void
12659 altivec_init_builtins (void)
12660 {
12661   const struct builtin_description *d;
12662   const struct builtin_description_predicates *dp;
12663   size_t i;
12664   tree ftype;
12665
12666   tree pfloat_type_node = build_pointer_type (float_type_node);
12667   tree pint_type_node = build_pointer_type (integer_type_node);
12668   tree pshort_type_node = build_pointer_type (short_integer_type_node);
12669   tree pchar_type_node = build_pointer_type (char_type_node);
12670
12671   tree pvoid_type_node = build_pointer_type (void_type_node);
12672
12673   tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
12674   tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
12675   tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
12676   tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
12677
12678   tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
12679
12680   tree int_ftype_opaque
12681     = build_function_type_list (integer_type_node,
12682                                 opaque_V4SI_type_node, NULL_TREE);
12683   tree opaque_ftype_opaque
12684     = build_function_type (integer_type_node,
12685                                 NULL_TREE);
12686   tree opaque_ftype_opaque_int
12687     = build_function_type_list (opaque_V4SI_type_node,
12688                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
12689   tree opaque_ftype_opaque_opaque_int
12690     = build_function_type_list (opaque_V4SI_type_node,
12691                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
12692                                 integer_type_node, NULL_TREE);
12693   tree int_ftype_int_opaque_opaque
12694     = build_function_type_list (integer_type_node,
12695                                 integer_type_node, opaque_V4SI_type_node,
12696                                 opaque_V4SI_type_node, NULL_TREE);
12697   tree int_ftype_int_v4si_v4si
12698     = build_function_type_list (integer_type_node,
12699                                 integer_type_node, V4SI_type_node,
12700                                 V4SI_type_node, NULL_TREE);
12701   tree v4sf_ftype_pcfloat
12702     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
12703   tree void_ftype_pfloat_v4sf
12704     = build_function_type_list (void_type_node,
12705                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
12706   tree v4si_ftype_pcint
12707     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
12708   tree void_ftype_pint_v4si
12709     = build_function_type_list (void_type_node,
12710                                 pint_type_node, V4SI_type_node, NULL_TREE);
12711   tree v8hi_ftype_pcshort
12712     = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
12713   tree void_ftype_pshort_v8hi
12714     = build_function_type_list (void_type_node,
12715                                 pshort_type_node, V8HI_type_node, NULL_TREE);
12716   tree v16qi_ftype_pcchar
12717     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
12718   tree void_ftype_pchar_v16qi
12719     = build_function_type_list (void_type_node,
12720                                 pchar_type_node, V16QI_type_node, NULL_TREE);
12721   tree void_ftype_v4si
12722     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
12723   tree v8hi_ftype_void
12724     = build_function_type (V8HI_type_node, void_list_node);
12725   tree void_ftype_void
12726     = build_function_type (void_type_node, void_list_node);
12727   tree void_ftype_int
12728     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
12729
12730   tree opaque_ftype_long_pcvoid
12731     = build_function_type_list (opaque_V4SI_type_node,
12732                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12733   tree v16qi_ftype_long_pcvoid
12734     = build_function_type_list (V16QI_type_node,
12735                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12736   tree v8hi_ftype_long_pcvoid
12737     = build_function_type_list (V8HI_type_node,
12738                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12739   tree v4si_ftype_long_pcvoid
12740     = build_function_type_list (V4SI_type_node,
12741                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
12742
12743   tree void_ftype_opaque_long_pvoid
12744     = build_function_type_list (void_type_node,
12745                                 opaque_V4SI_type_node, long_integer_type_node,
12746                                 pvoid_type_node, NULL_TREE);
12747   tree void_ftype_v4si_long_pvoid
12748     = build_function_type_list (void_type_node,
12749                                 V4SI_type_node, long_integer_type_node,
12750                                 pvoid_type_node, NULL_TREE);
12751   tree void_ftype_v16qi_long_pvoid
12752     = build_function_type_list (void_type_node,
12753                                 V16QI_type_node, long_integer_type_node,
12754                                 pvoid_type_node, NULL_TREE);
12755   tree void_ftype_v8hi_long_pvoid
12756     = build_function_type_list (void_type_node,
12757                                 V8HI_type_node, long_integer_type_node,
12758                                 pvoid_type_node, NULL_TREE);
12759   tree int_ftype_int_v8hi_v8hi
12760     = build_function_type_list (integer_type_node,
12761                                 integer_type_node, V8HI_type_node,
12762                                 V8HI_type_node, NULL_TREE);
12763   tree int_ftype_int_v16qi_v16qi
12764     = build_function_type_list (integer_type_node,
12765                                 integer_type_node, V16QI_type_node,
12766                                 V16QI_type_node, NULL_TREE);
12767   tree int_ftype_int_v4sf_v4sf
12768     = build_function_type_list (integer_type_node,
12769                                 integer_type_node, V4SF_type_node,
12770                                 V4SF_type_node, NULL_TREE);
12771   tree int_ftype_int_v2df_v2df
12772     = build_function_type_list (integer_type_node,
12773                                 integer_type_node, V2DF_type_node,
12774                                 V2DF_type_node, NULL_TREE);
12775   tree v4si_ftype_v4si
12776     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
12777   tree v8hi_ftype_v8hi
12778     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
12779   tree v16qi_ftype_v16qi
12780     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
12781   tree v4sf_ftype_v4sf
12782     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
12783   tree v2df_ftype_v2df
12784     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
12785   tree void_ftype_pcvoid_int_int
12786     = build_function_type_list (void_type_node,
12787                                 pcvoid_type_node, integer_type_node,
12788                                 integer_type_node, NULL_TREE);
12789
12790   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
12791                ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
12792   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
12793                ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
12794   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
12795                ALTIVEC_BUILTIN_LD_INTERNAL_4si);
12796   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
12797                ALTIVEC_BUILTIN_ST_INTERNAL_4si);
12798   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
12799                ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
12800   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
12801                ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
12802   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
12803                ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
12804   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
12805                ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
12806   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
12807   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
12808   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
12809   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
12810   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
12811   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
12812   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
12813   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
12814   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
12815   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
12816   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
12817   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
12818   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
12819   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
12820   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
12821   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
12822   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
12823   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
12824   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
12825   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
12826   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
12827   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
12828   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
12829   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
12830   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
12831   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
12832   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
12833   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
12834   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
12835   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
12836
12837   if (rs6000_cpu == PROCESSOR_CELL)
12838     {
12839       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
12840       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
12841       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
12842       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
12843
12844       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
12845       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
12846       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
12847       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
12848
12849       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
12850       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
12851       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
12852       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
12853
12854       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
12855       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
12856       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
12857       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
12858     }
12859   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
12860   def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
12861   def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
12862
12863   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
12864   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
12865   def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
12866   def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
12867   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
12868   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
12869   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
12870   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
12871   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
12872   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
12873   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
12874   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
12875
12876   /* Add the DST variants.  */
12877   d = bdesc_dst;
12878   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
12879     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
12880
12881   /* Initialize the predicates.  */
12882   dp = bdesc_altivec_preds;
12883   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
12884     {
12885       enum machine_mode mode1;
12886       tree type;
12887       bool is_overloaded = ((dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
12888                              && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
12889                             || (dp->code >= VSX_BUILTIN_OVERLOADED_FIRST
12890                                 && dp->code <= VSX_BUILTIN_OVERLOADED_LAST));
12891
12892       if (is_overloaded)
12893         mode1 = VOIDmode;
12894       else
12895         mode1 = insn_data[dp->icode].operand[1].mode;
12896
12897       switch (mode1)
12898         {
12899         case VOIDmode:
12900           type = int_ftype_int_opaque_opaque;
12901           break;
12902         case V4SImode:
12903           type = int_ftype_int_v4si_v4si;
12904           break;
12905         case V8HImode:
12906           type = int_ftype_int_v8hi_v8hi;
12907           break;
12908         case V16QImode:
12909           type = int_ftype_int_v16qi_v16qi;
12910           break;
12911         case V4SFmode:
12912           type = int_ftype_int_v4sf_v4sf;
12913           break;
12914         case V2DFmode:
12915           type = int_ftype_int_v2df_v2df;
12916           break;
12917         default:
12918           gcc_unreachable ();
12919         }
12920
12921       def_builtin (dp->mask, dp->name, type, dp->code);
12922     }
12923
12924   /* Initialize the abs* operators.  */
12925   d = bdesc_abs;
12926   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
12927     {
12928       enum machine_mode mode0;
12929       tree type;
12930
12931       mode0 = insn_data[d->icode].operand[0].mode;
12932
12933       switch (mode0)
12934         {
12935         case V4SImode:
12936           type = v4si_ftype_v4si;
12937           break;
12938         case V8HImode:
12939           type = v8hi_ftype_v8hi;
12940           break;
12941         case V16QImode:
12942           type = v16qi_ftype_v16qi;
12943           break;
12944         case V4SFmode:
12945           type = v4sf_ftype_v4sf;
12946           break;
12947         case V2DFmode:
12948           type = v2df_ftype_v2df;
12949           break;
12950         default:
12951           gcc_unreachable ();
12952         }
12953
12954       def_builtin (d->mask, d->name, type, d->code);
12955     }
12956
12957   if (TARGET_ALTIVEC)
12958     {
12959       tree decl;
12960
12961       /* Initialize target builtin that implements
12962          targetm.vectorize.builtin_mask_for_load.  */
12963
12964       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
12965                                    v16qi_ftype_long_pcvoid,
12966                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
12967                                    BUILT_IN_MD, NULL, NULL_TREE);
12968       TREE_READONLY (decl) = 1;
12969       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
12970       altivec_builtin_mask_for_load = decl;
12971     }
12972
12973   /* Access to the vec_init patterns.  */
12974   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
12975                                     integer_type_node, integer_type_node,
12976                                     integer_type_node, NULL_TREE);
12977   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
12978                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
12979
12980   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
12981                                     short_integer_type_node,
12982                                     short_integer_type_node,
12983                                     short_integer_type_node,
12984                                     short_integer_type_node,
12985                                     short_integer_type_node,
12986                                     short_integer_type_node,
12987                                     short_integer_type_node, NULL_TREE);
12988   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
12989                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
12990
12991   ftype = build_function_type_list (V16QI_type_node, char_type_node,
12992                                     char_type_node, char_type_node,
12993                                     char_type_node, char_type_node,
12994                                     char_type_node, char_type_node,
12995                                     char_type_node, char_type_node,
12996                                     char_type_node, char_type_node,
12997                                     char_type_node, char_type_node,
12998                                     char_type_node, char_type_node,
12999                                     char_type_node, NULL_TREE);
13000   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
13001                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
13002
13003   ftype = build_function_type_list (V4SF_type_node, float_type_node,
13004                                     float_type_node, float_type_node,
13005                                     float_type_node, NULL_TREE);
13006   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
13007                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
13008
13009   if (TARGET_VSX)
13010     {
13011       ftype = build_function_type_list (V2DF_type_node, double_type_node,
13012                                         double_type_node, NULL_TREE);
13013       def_builtin (MASK_VSX, "__builtin_vec_init_v2df", ftype,
13014                    VSX_BUILTIN_VEC_INIT_V2DF);
13015
13016       ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
13017                                         intDI_type_node, NULL_TREE);
13018       def_builtin (MASK_VSX, "__builtin_vec_init_v2di", ftype,
13019                    VSX_BUILTIN_VEC_INIT_V2DI);
13020     }
13021
13022   /* Access to the vec_set patterns.  */
13023   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
13024                                     intSI_type_node,
13025                                     integer_type_node, NULL_TREE);
13026   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
13027                ALTIVEC_BUILTIN_VEC_SET_V4SI);
13028
13029   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
13030                                     intHI_type_node,
13031                                     integer_type_node, NULL_TREE);
13032   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
13033                ALTIVEC_BUILTIN_VEC_SET_V8HI);
13034
13035   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
13036                                     intQI_type_node,
13037                                     integer_type_node, NULL_TREE);
13038   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
13039                ALTIVEC_BUILTIN_VEC_SET_V16QI);
13040
13041   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
13042                                     float_type_node,
13043                                     integer_type_node, NULL_TREE);
13044   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_set_v4sf", ftype,
13045                ALTIVEC_BUILTIN_VEC_SET_V4SF);
13046
13047   if (TARGET_VSX)
13048     {
13049       ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
13050                                         double_type_node,
13051                                         integer_type_node, NULL_TREE);
13052       def_builtin (MASK_VSX, "__builtin_vec_set_v2df", ftype,
13053                    VSX_BUILTIN_VEC_SET_V2DF);
13054
13055       ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
13056                                         intDI_type_node,
13057                                         integer_type_node, NULL_TREE);
13058       def_builtin (MASK_VSX, "__builtin_vec_set_v2di", ftype,
13059                    VSX_BUILTIN_VEC_SET_V2DI);
13060     }
13061
13062   /* Access to the vec_extract patterns.  */
13063   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
13064                                     integer_type_node, NULL_TREE);
13065   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
13066                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
13067
13068   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
13069                                     integer_type_node, NULL_TREE);
13070   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
13071                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
13072
13073   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
13074                                     integer_type_node, NULL_TREE);
13075   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
13076                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
13077
13078   ftype = build_function_type_list (float_type_node, V4SF_type_node,
13079                                     integer_type_node, NULL_TREE);
13080   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_ext_v4sf", ftype,
13081                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
13082
13083   if (TARGET_VSX)
13084     {
13085       ftype = build_function_type_list (double_type_node, V2DF_type_node,
13086                                         integer_type_node, NULL_TREE);
13087       def_builtin (MASK_VSX, "__builtin_vec_ext_v2df", ftype,
13088                    VSX_BUILTIN_VEC_EXT_V2DF);
13089
13090       ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
13091                                         integer_type_node, NULL_TREE);
13092       def_builtin (MASK_VSX, "__builtin_vec_ext_v2di", ftype,
13093                    VSX_BUILTIN_VEC_EXT_V2DI);
13094     }
13095 }
13096
13097 /* Hash function for builtin functions with up to 3 arguments and a return
13098    type.  */
13099 static unsigned
13100 builtin_hash_function (const void *hash_entry)
13101 {
13102   unsigned ret = 0;
13103   int i;
13104   const struct builtin_hash_struct *bh =
13105     (const struct builtin_hash_struct *) hash_entry;
13106
13107   for (i = 0; i < 4; i++)
13108     {
13109       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
13110       ret = (ret * 2) + bh->uns_p[i];
13111     }
13112
13113   return ret;
13114 }
13115
13116 /* Compare builtin hash entries H1 and H2 for equivalence.  */
13117 static int
13118 builtin_hash_eq (const void *h1, const void *h2)
13119 {
13120   const struct builtin_hash_struct *p1 = (const struct builtin_hash_struct *) h1;
13121   const struct builtin_hash_struct *p2 = (const struct builtin_hash_struct *) h2;
13122
13123   return ((p1->mode[0] == p2->mode[0])
13124           && (p1->mode[1] == p2->mode[1])
13125           && (p1->mode[2] == p2->mode[2])
13126           && (p1->mode[3] == p2->mode[3])
13127           && (p1->uns_p[0] == p2->uns_p[0])
13128           && (p1->uns_p[1] == p2->uns_p[1])
13129           && (p1->uns_p[2] == p2->uns_p[2])
13130           && (p1->uns_p[3] == p2->uns_p[3]));
13131 }
13132
13133 /* Map types for builtin functions with an explicit return type and up to 3
13134    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
13135    of the argument.  */
13136 static tree
13137 builtin_function_type (enum machine_mode mode_ret, enum machine_mode mode_arg0,
13138                        enum machine_mode mode_arg1, enum machine_mode mode_arg2,
13139                        enum rs6000_builtins builtin, const char *name)
13140 {
13141   struct builtin_hash_struct h;
13142   struct builtin_hash_struct *h2;
13143   void **found;
13144   int num_args = 3;
13145   int i;
13146   tree ret_type = NULL_TREE;
13147   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
13148   tree args;
13149
13150   /* Create builtin_hash_table.  */
13151   if (builtin_hash_table == NULL)
13152     builtin_hash_table = htab_create_ggc (1500, builtin_hash_function,
13153                                           builtin_hash_eq, NULL);
13154
13155   h.type = NULL_TREE;
13156   h.mode[0] = mode_ret;
13157   h.mode[1] = mode_arg0;
13158   h.mode[2] = mode_arg1;
13159   h.mode[3] = mode_arg2;
13160   h.uns_p[0] = 0;
13161   h.uns_p[1] = 0;
13162   h.uns_p[2] = 0;
13163   h.uns_p[3] = 0;
13164
13165   /* If the builtin is a type that produces unsigned results or takes unsigned
13166      arguments, and it is returned as a decl for the vectorizer (such as
13167      widening multiplies, permute), make sure the arguments and return value
13168      are type correct.  */
13169   switch (builtin)
13170     {
13171       /* unsigned 2 argument functions.  */
13172     case ALTIVEC_BUILTIN_VMULEUB_UNS:
13173     case ALTIVEC_BUILTIN_VMULEUH_UNS:
13174     case ALTIVEC_BUILTIN_VMULOUB_UNS:
13175     case ALTIVEC_BUILTIN_VMULOUH_UNS:
13176       h.uns_p[0] = 1;
13177       h.uns_p[1] = 1;
13178       h.uns_p[2] = 1;
13179       break;
13180
13181       /* unsigned 3 argument functions.  */
13182     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
13183     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
13184     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
13185     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
13186     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
13187     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
13188     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
13189     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
13190     case VSX_BUILTIN_VPERM_16QI_UNS:
13191     case VSX_BUILTIN_VPERM_8HI_UNS:
13192     case VSX_BUILTIN_VPERM_4SI_UNS:
13193     case VSX_BUILTIN_VPERM_2DI_UNS:
13194     case VSX_BUILTIN_XXSEL_16QI_UNS:
13195     case VSX_BUILTIN_XXSEL_8HI_UNS:
13196     case VSX_BUILTIN_XXSEL_4SI_UNS:
13197     case VSX_BUILTIN_XXSEL_2DI_UNS:
13198       h.uns_p[0] = 1;
13199       h.uns_p[1] = 1;
13200       h.uns_p[2] = 1;
13201       h.uns_p[3] = 1;
13202       break;
13203
13204       /* signed permute functions with unsigned char mask.  */
13205     case ALTIVEC_BUILTIN_VPERM_16QI:
13206     case ALTIVEC_BUILTIN_VPERM_8HI:
13207     case ALTIVEC_BUILTIN_VPERM_4SI:
13208     case ALTIVEC_BUILTIN_VPERM_4SF:
13209     case ALTIVEC_BUILTIN_VPERM_2DI:
13210     case ALTIVEC_BUILTIN_VPERM_2DF:
13211     case VSX_BUILTIN_VPERM_16QI:
13212     case VSX_BUILTIN_VPERM_8HI:
13213     case VSX_BUILTIN_VPERM_4SI:
13214     case VSX_BUILTIN_VPERM_4SF:
13215     case VSX_BUILTIN_VPERM_2DI:
13216     case VSX_BUILTIN_VPERM_2DF:
13217       h.uns_p[3] = 1;
13218       break;
13219
13220       /* unsigned args, signed return.  */
13221     case VSX_BUILTIN_XVCVUXDDP_UNS:
13222     case VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF:
13223       h.uns_p[1] = 1;
13224       break;
13225
13226       /* signed args, unsigned return.  */
13227     case VSX_BUILTIN_XVCVDPUXDS_UNS:
13228     case VECTOR_BUILTIN_FIXUNS_V4SF_V4SI:
13229       h.uns_p[0] = 1;
13230       break;
13231
13232     default:
13233       break;
13234     }
13235
13236   /* Figure out how many args are present.  */
13237   while (num_args > 0 && h.mode[num_args] == VOIDmode)
13238     num_args--;
13239
13240   if (num_args == 0)
13241     fatal_error ("internal error: builtin function %s had no type", name);
13242
13243   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
13244   if (!ret_type && h.uns_p[0])
13245     ret_type = builtin_mode_to_type[h.mode[0]][0];
13246
13247   if (!ret_type)
13248     fatal_error ("internal error: builtin function %s had an unexpected "
13249                  "return type %s", name, GET_MODE_NAME (h.mode[0]));
13250
13251   for (i = 0; i < num_args; i++)
13252     {
13253       int m = (int) h.mode[i+1];
13254       int uns_p = h.uns_p[i+1];
13255
13256       arg_type[i] = builtin_mode_to_type[m][uns_p];
13257       if (!arg_type[i] && uns_p)
13258         arg_type[i] = builtin_mode_to_type[m][0];
13259
13260       if (!arg_type[i])
13261         fatal_error ("internal error: builtin function %s, argument %d "
13262                      "had unexpected argument type %s", name, i,
13263                      GET_MODE_NAME (m));
13264     }
13265
13266   found = htab_find_slot (builtin_hash_table, &h, INSERT);
13267   if (*found == NULL)
13268     {
13269       h2 = ggc_alloc_builtin_hash_struct ();
13270       *h2 = h;
13271       *found = (void *)h2;
13272       args = void_list_node;
13273
13274       for (i = num_args - 1; i >= 0; i--)
13275         args = tree_cons (NULL_TREE, arg_type[i], args);
13276
13277       h2->type = build_function_type (ret_type, args);
13278     }
13279
13280   return ((struct builtin_hash_struct *)(*found))->type;
13281 }
13282
13283 static void
13284 rs6000_common_init_builtins (void)
13285 {
13286   const struct builtin_description *d;
13287   size_t i;
13288
13289   tree opaque_ftype_opaque = NULL_TREE;
13290   tree opaque_ftype_opaque_opaque = NULL_TREE;
13291   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
13292   tree v2si_ftype_qi = NULL_TREE;
13293   tree v2si_ftype_v2si_qi = NULL_TREE;
13294   tree v2si_ftype_int_qi = NULL_TREE;
13295
13296   if (!TARGET_PAIRED_FLOAT)
13297     {
13298       builtin_mode_to_type[V2SImode][0] = opaque_V2SI_type_node;
13299       builtin_mode_to_type[V2SFmode][0] = opaque_V2SF_type_node;
13300     }
13301
13302   /* Add the ternary operators.  */
13303   d = bdesc_3arg;
13304   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
13305     {
13306       tree type;
13307       int mask = d->mask;
13308
13309       if ((mask != 0 && (mask & target_flags) == 0)
13310           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13311         continue;
13312
13313       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13314            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13315           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13316               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13317         {
13318           if (! (type = opaque_ftype_opaque_opaque_opaque))
13319             type = opaque_ftype_opaque_opaque_opaque
13320               = build_function_type_list (opaque_V4SI_type_node,
13321                                           opaque_V4SI_type_node,
13322                                           opaque_V4SI_type_node,
13323                                           opaque_V4SI_type_node,
13324                                           NULL_TREE);
13325         }
13326       else
13327         {
13328           enum insn_code icode = d->icode;
13329           if (d->name == 0 || icode == CODE_FOR_nothing)
13330             continue;
13331
13332           type = builtin_function_type (insn_data[icode].operand[0].mode,
13333                                         insn_data[icode].operand[1].mode,
13334                                         insn_data[icode].operand[2].mode,
13335                                         insn_data[icode].operand[3].mode,
13336                                         d->code, d->name);
13337         }
13338
13339       def_builtin (d->mask, d->name, type, d->code);
13340     }
13341
13342   /* Add the binary operators.  */
13343   d = bdesc_2arg;
13344   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13345     {
13346       enum machine_mode mode0, mode1, mode2;
13347       tree type;
13348       int mask = d->mask;
13349
13350       if ((mask != 0 && (mask & target_flags) == 0)
13351           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13352         continue;
13353
13354       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13355            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13356           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13357               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13358         {
13359           if (! (type = opaque_ftype_opaque_opaque))
13360             type = opaque_ftype_opaque_opaque
13361               = build_function_type_list (opaque_V4SI_type_node,
13362                                           opaque_V4SI_type_node,
13363                                           opaque_V4SI_type_node,
13364                                           NULL_TREE);
13365         }
13366       else
13367         {
13368           enum insn_code icode = d->icode;
13369           if (d->name == 0 || icode == CODE_FOR_nothing)
13370             continue;
13371
13372           mode0 = insn_data[icode].operand[0].mode;
13373           mode1 = insn_data[icode].operand[1].mode;
13374           mode2 = insn_data[icode].operand[2].mode;
13375
13376           if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
13377             {
13378               if (! (type = v2si_ftype_v2si_qi))
13379                 type = v2si_ftype_v2si_qi
13380                   = build_function_type_list (opaque_V2SI_type_node,
13381                                               opaque_V2SI_type_node,
13382                                               char_type_node,
13383                                               NULL_TREE);
13384             }
13385
13386           else if (mode0 == V2SImode && GET_MODE_CLASS (mode1) == MODE_INT
13387                    && mode2 == QImode)
13388             {
13389               if (! (type = v2si_ftype_int_qi))
13390                 type = v2si_ftype_int_qi
13391                   = build_function_type_list (opaque_V2SI_type_node,
13392                                               integer_type_node,
13393                                               char_type_node,
13394                                               NULL_TREE);
13395             }
13396
13397           else
13398             type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
13399                                           d->code, d->name);
13400         }
13401
13402       def_builtin (d->mask, d->name, type, d->code);
13403     }
13404
13405   /* Add the simple unary operators.  */
13406   d = (struct builtin_description *) bdesc_1arg;
13407   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13408     {
13409       enum machine_mode mode0, mode1;
13410       tree type;
13411       int mask = d->mask;
13412
13413       if ((mask != 0 && (mask & target_flags) == 0)
13414           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13415         continue;
13416
13417       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13418            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13419           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13420               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13421         {
13422           if (! (type = opaque_ftype_opaque))
13423             type = opaque_ftype_opaque
13424               = build_function_type_list (opaque_V4SI_type_node,
13425                                           opaque_V4SI_type_node,
13426                                           NULL_TREE);
13427         }
13428       else
13429         {
13430           enum insn_code icode = d->icode;
13431           if (d->name == 0 || icode == CODE_FOR_nothing)
13432             continue;
13433
13434           mode0 = insn_data[icode].operand[0].mode;
13435           mode1 = insn_data[icode].operand[1].mode;
13436
13437           if (mode0 == V2SImode && mode1 == QImode)
13438             {
13439               if (! (type = v2si_ftype_qi))
13440                 type = v2si_ftype_qi
13441                   = build_function_type_list (opaque_V2SI_type_node,
13442                                               char_type_node,
13443                                               NULL_TREE);
13444             }
13445
13446           else
13447             type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
13448                                           d->code, d->name);
13449         }
13450
13451       def_builtin (d->mask, d->name, type, d->code);
13452     }
13453 }
13454
13455 static void
13456 rs6000_init_libfuncs (void)
13457 {
13458   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
13459       && !TARGET_POWER2 && !TARGET_POWERPC)
13460     {
13461       /* AIX library routines for float->int conversion.  */
13462       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
13463       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
13464       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
13465       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
13466     }
13467
13468   if (!TARGET_IEEEQUAD)
13469       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
13470     if (!TARGET_XL_COMPAT)
13471       {
13472         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
13473         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
13474         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
13475         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
13476
13477         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
13478           {
13479             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
13480             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
13481             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
13482             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
13483             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
13484             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
13485             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
13486
13487             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
13488             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
13489             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
13490             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
13491             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
13492             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
13493             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
13494             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
13495           }
13496
13497         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
13498           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
13499       }
13500     else
13501       {
13502         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
13503         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
13504         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
13505         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
13506       }
13507   else
13508     {
13509       /* 32-bit SVR4 quad floating point routines.  */
13510
13511       set_optab_libfunc (add_optab, TFmode, "_q_add");
13512       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
13513       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
13514       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
13515       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
13516       if (TARGET_PPC_GPOPT || TARGET_POWER2)
13517         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
13518
13519       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
13520       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
13521       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
13522       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
13523       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
13524       set_optab_libfunc (le_optab, TFmode, "_q_fle");
13525
13526       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
13527       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
13528       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
13529       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
13530       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
13531       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
13532       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
13533       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
13534     }
13535 }
13536
13537 \f
13538 /* Expand a block clear operation, and return 1 if successful.  Return 0
13539    if we should let the compiler generate normal code.
13540
13541    operands[0] is the destination
13542    operands[1] is the length
13543    operands[3] is the alignment */
13544
13545 int
13546 expand_block_clear (rtx operands[])
13547 {
13548   rtx orig_dest = operands[0];
13549   rtx bytes_rtx = operands[1];
13550   rtx align_rtx = operands[3];
13551   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
13552   HOST_WIDE_INT align;
13553   HOST_WIDE_INT bytes;
13554   int offset;
13555   int clear_bytes;
13556   int clear_step;
13557
13558   /* If this is not a fixed size move, just call memcpy */
13559   if (! constp)
13560     return 0;
13561
13562   /* This must be a fixed size alignment  */
13563   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13564   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13565
13566   /* Anything to clear? */
13567   bytes = INTVAL (bytes_rtx);
13568   if (bytes <= 0)
13569     return 1;
13570
13571   /* Use the builtin memset after a point, to avoid huge code bloat.
13572      When optimize_size, avoid any significant code bloat; calling
13573      memset is about 4 instructions, so allow for one instruction to
13574      load zero and three to do clearing.  */
13575   if (TARGET_ALTIVEC && align >= 128)
13576     clear_step = 16;
13577   else if (TARGET_POWERPC64 && align >= 32)
13578     clear_step = 8;
13579   else if (TARGET_SPE && align >= 64)
13580     clear_step = 8;
13581   else
13582     clear_step = 4;
13583
13584   if (optimize_size && bytes > 3 * clear_step)
13585     return 0;
13586   if (! optimize_size && bytes > 8 * clear_step)
13587     return 0;
13588
13589   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
13590     {
13591       enum machine_mode mode = BLKmode;
13592       rtx dest;
13593
13594       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
13595         {
13596           clear_bytes = 16;
13597           mode = V4SImode;
13598         }
13599       else if (bytes >= 8 && TARGET_SPE && align >= 64)
13600         {
13601           clear_bytes = 8;
13602           mode = V2SImode;
13603         }
13604       else if (bytes >= 8 && TARGET_POWERPC64
13605                /* 64-bit loads and stores require word-aligned
13606                   displacements.  */
13607                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13608         {
13609           clear_bytes = 8;
13610           mode = DImode;
13611         }
13612       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13613         {                       /* move 4 bytes */
13614           clear_bytes = 4;
13615           mode = SImode;
13616         }
13617       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13618         {                       /* move 2 bytes */
13619           clear_bytes = 2;
13620           mode = HImode;
13621         }
13622       else /* move 1 byte at a time */
13623         {
13624           clear_bytes = 1;
13625           mode = QImode;
13626         }
13627
13628       dest = adjust_address (orig_dest, mode, offset);
13629
13630       emit_move_insn (dest, CONST0_RTX (mode));
13631     }
13632
13633   return 1;
13634 }
13635
13636 \f
13637 /* Expand a block move operation, and return 1 if successful.  Return 0
13638    if we should let the compiler generate normal code.
13639
13640    operands[0] is the destination
13641    operands[1] is the source
13642    operands[2] is the length
13643    operands[3] is the alignment */
13644
13645 #define MAX_MOVE_REG 4
13646
13647 int
13648 expand_block_move (rtx operands[])
13649 {
13650   rtx orig_dest = operands[0];
13651   rtx orig_src  = operands[1];
13652   rtx bytes_rtx = operands[2];
13653   rtx align_rtx = operands[3];
13654   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
13655   int align;
13656   int bytes;
13657   int offset;
13658   int move_bytes;
13659   rtx stores[MAX_MOVE_REG];
13660   int num_reg = 0;
13661
13662   /* If this is not a fixed size move, just call memcpy */
13663   if (! constp)
13664     return 0;
13665
13666   /* This must be a fixed size alignment */
13667   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13668   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13669
13670   /* Anything to move? */
13671   bytes = INTVAL (bytes_rtx);
13672   if (bytes <= 0)
13673     return 1;
13674
13675   if (bytes > rs6000_block_move_inline_limit)
13676     return 0;
13677
13678   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
13679     {
13680       union {
13681         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
13682         rtx (*mov) (rtx, rtx);
13683       } gen_func;
13684       enum machine_mode mode = BLKmode;
13685       rtx src, dest;
13686
13687       /* Altivec first, since it will be faster than a string move
13688          when it applies, and usually not significantly larger.  */
13689       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
13690         {
13691           move_bytes = 16;
13692           mode = V4SImode;
13693           gen_func.mov = gen_movv4si;
13694         }
13695       else if (TARGET_SPE && bytes >= 8 && align >= 64)
13696         {
13697           move_bytes = 8;
13698           mode = V2SImode;
13699           gen_func.mov = gen_movv2si;
13700         }
13701       else if (TARGET_STRING
13702           && bytes > 24         /* move up to 32 bytes at a time */
13703           && ! fixed_regs[5]
13704           && ! fixed_regs[6]
13705           && ! fixed_regs[7]
13706           && ! fixed_regs[8]
13707           && ! fixed_regs[9]
13708           && ! fixed_regs[10]
13709           && ! fixed_regs[11]
13710           && ! fixed_regs[12])
13711         {
13712           move_bytes = (bytes > 32) ? 32 : bytes;
13713           gen_func.movmemsi = gen_movmemsi_8reg;
13714         }
13715       else if (TARGET_STRING
13716                && bytes > 16    /* move up to 24 bytes at a time */
13717                && ! fixed_regs[5]
13718                && ! fixed_regs[6]
13719                && ! fixed_regs[7]
13720                && ! fixed_regs[8]
13721                && ! fixed_regs[9]
13722                && ! fixed_regs[10])
13723         {
13724           move_bytes = (bytes > 24) ? 24 : bytes;
13725           gen_func.movmemsi = gen_movmemsi_6reg;
13726         }
13727       else if (TARGET_STRING
13728                && bytes > 8     /* move up to 16 bytes at a time */
13729                && ! fixed_regs[5]
13730                && ! fixed_regs[6]
13731                && ! fixed_regs[7]
13732                && ! fixed_regs[8])
13733         {
13734           move_bytes = (bytes > 16) ? 16 : bytes;
13735           gen_func.movmemsi = gen_movmemsi_4reg;
13736         }
13737       else if (bytes >= 8 && TARGET_POWERPC64
13738                /* 64-bit loads and stores require word-aligned
13739                   displacements.  */
13740                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13741         {
13742           move_bytes = 8;
13743           mode = DImode;
13744           gen_func.mov = gen_movdi;
13745         }
13746       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
13747         {                       /* move up to 8 bytes at a time */
13748           move_bytes = (bytes > 8) ? 8 : bytes;
13749           gen_func.movmemsi = gen_movmemsi_2reg;
13750         }
13751       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13752         {                       /* move 4 bytes */
13753           move_bytes = 4;
13754           mode = SImode;
13755           gen_func.mov = gen_movsi;
13756         }
13757       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13758         {                       /* move 2 bytes */
13759           move_bytes = 2;
13760           mode = HImode;
13761           gen_func.mov = gen_movhi;
13762         }
13763       else if (TARGET_STRING && bytes > 1)
13764         {                       /* move up to 4 bytes at a time */
13765           move_bytes = (bytes > 4) ? 4 : bytes;
13766           gen_func.movmemsi = gen_movmemsi_1reg;
13767         }
13768       else /* move 1 byte at a time */
13769         {
13770           move_bytes = 1;
13771           mode = QImode;
13772           gen_func.mov = gen_movqi;
13773         }
13774
13775       src = adjust_address (orig_src, mode, offset);
13776       dest = adjust_address (orig_dest, mode, offset);
13777
13778       if (mode != BLKmode)
13779         {
13780           rtx tmp_reg = gen_reg_rtx (mode);
13781
13782           emit_insn ((*gen_func.mov) (tmp_reg, src));
13783           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
13784         }
13785
13786       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
13787         {
13788           int i;
13789           for (i = 0; i < num_reg; i++)
13790             emit_insn (stores[i]);
13791           num_reg = 0;
13792         }
13793
13794       if (mode == BLKmode)
13795         {
13796           /* Move the address into scratch registers.  The movmemsi
13797              patterns require zero offset.  */
13798           if (!REG_P (XEXP (src, 0)))
13799             {
13800               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
13801               src = replace_equiv_address (src, src_reg);
13802             }
13803           set_mem_size (src, GEN_INT (move_bytes));
13804
13805           if (!REG_P (XEXP (dest, 0)))
13806             {
13807               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
13808               dest = replace_equiv_address (dest, dest_reg);
13809             }
13810           set_mem_size (dest, GEN_INT (move_bytes));
13811
13812           emit_insn ((*gen_func.movmemsi) (dest, src,
13813                                            GEN_INT (move_bytes & 31),
13814                                            align_rtx));
13815         }
13816     }
13817
13818   return 1;
13819 }
13820
13821 \f
13822 /* Return a string to perform a load_multiple operation.
13823    operands[0] is the vector.
13824    operands[1] is the source address.
13825    operands[2] is the first destination register.  */
13826
13827 const char *
13828 rs6000_output_load_multiple (rtx operands[3])
13829 {
13830   /* We have to handle the case where the pseudo used to contain the address
13831      is assigned to one of the output registers.  */
13832   int i, j;
13833   int words = XVECLEN (operands[0], 0);
13834   rtx xop[10];
13835
13836   if (XVECLEN (operands[0], 0) == 1)
13837     return "{l|lwz} %2,0(%1)";
13838
13839   for (i = 0; i < words; i++)
13840     if (refers_to_regno_p (REGNO (operands[2]) + i,
13841                            REGNO (operands[2]) + i + 1, operands[1], 0))
13842       {
13843         if (i == words-1)
13844           {
13845             xop[0] = GEN_INT (4 * (words-1));
13846             xop[1] = operands[1];
13847             xop[2] = operands[2];
13848             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
13849             return "";
13850           }
13851         else if (i == 0)
13852           {
13853             xop[0] = GEN_INT (4 * (words-1));
13854             xop[1] = operands[1];
13855             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
13856             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);
13857             return "";
13858           }
13859         else
13860           {
13861             for (j = 0; j < words; j++)
13862               if (j != i)
13863                 {
13864                   xop[0] = GEN_INT (j * 4);
13865                   xop[1] = operands[1];
13866                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
13867                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
13868                 }
13869             xop[0] = GEN_INT (i * 4);
13870             xop[1] = operands[1];
13871             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
13872             return "";
13873           }
13874       }
13875
13876   return "{lsi|lswi} %2,%1,%N0";
13877 }
13878
13879 \f
13880 /* A validation routine: say whether CODE, a condition code, and MODE
13881    match.  The other alternatives either don't make sense or should
13882    never be generated.  */
13883
13884 void
13885 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
13886 {
13887   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
13888                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
13889               && GET_MODE_CLASS (mode) == MODE_CC);
13890
13891   /* These don't make sense.  */
13892   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
13893               || mode != CCUNSmode);
13894
13895   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
13896               || mode == CCUNSmode);
13897
13898   gcc_assert (mode == CCFPmode
13899               || (code != ORDERED && code != UNORDERED
13900                   && code != UNEQ && code != LTGT
13901                   && code != UNGT && code != UNLT
13902                   && code != UNGE && code != UNLE));
13903
13904   /* These should never be generated except for
13905      flag_finite_math_only.  */
13906   gcc_assert (mode != CCFPmode
13907               || flag_finite_math_only
13908               || (code != LE && code != GE
13909                   && code != UNEQ && code != LTGT
13910                   && code != UNGT && code != UNLT));
13911
13912   /* These are invalid; the information is not there.  */
13913   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
13914 }
13915
13916 \f
13917 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
13918    mask required to convert the result of a rotate insn into a shift
13919    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
13920
13921 int
13922 includes_lshift_p (rtx shiftop, rtx andop)
13923 {
13924   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13925
13926   shift_mask <<= INTVAL (shiftop);
13927
13928   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13929 }
13930
13931 /* Similar, but for right shift.  */
13932
13933 int
13934 includes_rshift_p (rtx shiftop, rtx andop)
13935 {
13936   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13937
13938   shift_mask >>= INTVAL (shiftop);
13939
13940   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13941 }
13942
13943 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
13944    to perform a left shift.  It must have exactly SHIFTOP least
13945    significant 0's, then one or more 1's, then zero or more 0's.  */
13946
13947 int
13948 includes_rldic_lshift_p (rtx shiftop, rtx andop)
13949 {
13950   if (GET_CODE (andop) == CONST_INT)
13951     {
13952       HOST_WIDE_INT c, lsb, shift_mask;
13953
13954       c = INTVAL (andop);
13955       if (c == 0 || c == ~0)
13956         return 0;
13957
13958       shift_mask = ~0;
13959       shift_mask <<= INTVAL (shiftop);
13960
13961       /* Find the least significant one bit.  */
13962       lsb = c & -c;
13963
13964       /* It must coincide with the LSB of the shift mask.  */
13965       if (-lsb != shift_mask)
13966         return 0;
13967
13968       /* Invert to look for the next transition (if any).  */
13969       c = ~c;
13970
13971       /* Remove the low group of ones (originally low group of zeros).  */
13972       c &= -lsb;
13973
13974       /* Again find the lsb, and check we have all 1's above.  */
13975       lsb = c & -c;
13976       return c == -lsb;
13977     }
13978   else if (GET_CODE (andop) == CONST_DOUBLE
13979            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13980     {
13981       HOST_WIDE_INT low, high, lsb;
13982       HOST_WIDE_INT shift_mask_low, shift_mask_high;
13983
13984       low = CONST_DOUBLE_LOW (andop);
13985       if (HOST_BITS_PER_WIDE_INT < 64)
13986         high = CONST_DOUBLE_HIGH (andop);
13987
13988       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
13989           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
13990         return 0;
13991
13992       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13993         {
13994           shift_mask_high = ~0;
13995           if (INTVAL (shiftop) > 32)
13996             shift_mask_high <<= INTVAL (shiftop) - 32;
13997
13998           lsb = high & -high;
13999
14000           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
14001             return 0;
14002
14003           high = ~high;
14004           high &= -lsb;
14005
14006           lsb = high & -high;
14007           return high == -lsb;
14008         }
14009
14010       shift_mask_low = ~0;
14011       shift_mask_low <<= INTVAL (shiftop);
14012
14013       lsb = low & -low;
14014
14015       if (-lsb != shift_mask_low)
14016         return 0;
14017
14018       if (HOST_BITS_PER_WIDE_INT < 64)
14019         high = ~high;
14020       low = ~low;
14021       low &= -lsb;
14022
14023       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
14024         {
14025           lsb = high & -high;
14026           return high == -lsb;
14027         }
14028
14029       lsb = low & -low;
14030       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
14031     }
14032   else
14033     return 0;
14034 }
14035
14036 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
14037    to perform a left shift.  It must have SHIFTOP or more least
14038    significant 0's, with the remainder of the word 1's.  */
14039
14040 int
14041 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
14042 {
14043   if (GET_CODE (andop) == CONST_INT)
14044     {
14045       HOST_WIDE_INT c, lsb, shift_mask;
14046
14047       shift_mask = ~0;
14048       shift_mask <<= INTVAL (shiftop);
14049       c = INTVAL (andop);
14050
14051       /* Find the least significant one bit.  */
14052       lsb = c & -c;
14053
14054       /* It must be covered by the shift mask.
14055          This test also rejects c == 0.  */
14056       if ((lsb & shift_mask) == 0)
14057         return 0;
14058
14059       /* Check we have all 1's above the transition, and reject all 1's.  */
14060       return c == -lsb && lsb != 1;
14061     }
14062   else if (GET_CODE (andop) == CONST_DOUBLE
14063            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
14064     {
14065       HOST_WIDE_INT low, lsb, shift_mask_low;
14066
14067       low = CONST_DOUBLE_LOW (andop);
14068
14069       if (HOST_BITS_PER_WIDE_INT < 64)
14070         {
14071           HOST_WIDE_INT high, shift_mask_high;
14072
14073           high = CONST_DOUBLE_HIGH (andop);
14074
14075           if (low == 0)
14076             {
14077               shift_mask_high = ~0;
14078               if (INTVAL (shiftop) > 32)
14079                 shift_mask_high <<= INTVAL (shiftop) - 32;
14080
14081               lsb = high & -high;
14082
14083               if ((lsb & shift_mask_high) == 0)
14084                 return 0;
14085
14086               return high == -lsb;
14087             }
14088           if (high != ~0)
14089             return 0;
14090         }
14091
14092       shift_mask_low = ~0;
14093       shift_mask_low <<= INTVAL (shiftop);
14094
14095       lsb = low & -low;
14096
14097       if ((lsb & shift_mask_low) == 0)
14098         return 0;
14099
14100       return low == -lsb && lsb != 1;
14101     }
14102   else
14103     return 0;
14104 }
14105
14106 /* Return 1 if operands will generate a valid arguments to rlwimi
14107 instruction for insert with right shift in 64-bit mode.  The mask may
14108 not start on the first bit or stop on the last bit because wrap-around
14109 effects of instruction do not correspond to semantics of RTL insn.  */
14110
14111 int
14112 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
14113 {
14114   if (INTVAL (startop) > 32
14115       && INTVAL (startop) < 64
14116       && INTVAL (sizeop) > 1
14117       && INTVAL (sizeop) + INTVAL (startop) < 64
14118       && INTVAL (shiftop) > 0
14119       && INTVAL (sizeop) + INTVAL (shiftop) < 32
14120       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
14121     return 1;
14122
14123   return 0;
14124 }
14125
14126 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
14127    for lfq and stfq insns iff the registers are hard registers.   */
14128
14129 int
14130 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
14131 {
14132   /* We might have been passed a SUBREG.  */
14133   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
14134     return 0;
14135
14136   /* We might have been passed non floating point registers.  */
14137   if (!FP_REGNO_P (REGNO (reg1))
14138       || !FP_REGNO_P (REGNO (reg2)))
14139     return 0;
14140
14141   return (REGNO (reg1) == REGNO (reg2) - 1);
14142 }
14143
14144 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
14145    addr1 and addr2 must be in consecutive memory locations
14146    (addr2 == addr1 + 8).  */
14147
14148 int
14149 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
14150 {
14151   rtx addr1, addr2;
14152   unsigned int reg1, reg2;
14153   int offset1, offset2;
14154
14155   /* The mems cannot be volatile.  */
14156   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
14157     return 0;
14158
14159   addr1 = XEXP (mem1, 0);
14160   addr2 = XEXP (mem2, 0);
14161
14162   /* Extract an offset (if used) from the first addr.  */
14163   if (GET_CODE (addr1) == PLUS)
14164     {
14165       /* If not a REG, return zero.  */
14166       if (GET_CODE (XEXP (addr1, 0)) != REG)
14167         return 0;
14168       else
14169         {
14170           reg1 = REGNO (XEXP (addr1, 0));
14171           /* The offset must be constant!  */
14172           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
14173             return 0;
14174           offset1 = INTVAL (XEXP (addr1, 1));
14175         }
14176     }
14177   else if (GET_CODE (addr1) != REG)
14178     return 0;
14179   else
14180     {
14181       reg1 = REGNO (addr1);
14182       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14183       offset1 = 0;
14184     }
14185
14186   /* And now for the second addr.  */
14187   if (GET_CODE (addr2) == PLUS)
14188     {
14189       /* If not a REG, return zero.  */
14190       if (GET_CODE (XEXP (addr2, 0)) != REG)
14191         return 0;
14192       else
14193         {
14194           reg2 = REGNO (XEXP (addr2, 0));
14195           /* The offset must be constant. */
14196           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
14197             return 0;
14198           offset2 = INTVAL (XEXP (addr2, 1));
14199         }
14200     }
14201   else if (GET_CODE (addr2) != REG)
14202     return 0;
14203   else
14204     {
14205       reg2 = REGNO (addr2);
14206       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14207       offset2 = 0;
14208     }
14209
14210   /* Both of these must have the same base register.  */
14211   if (reg1 != reg2)
14212     return 0;
14213
14214   /* The offset for the second addr must be 8 more than the first addr.  */
14215   if (offset2 != offset1 + 8)
14216     return 0;
14217
14218   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
14219      instructions.  */
14220   return 1;
14221 }
14222 \f
14223
14224 rtx
14225 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
14226 {
14227   static bool eliminated = false;
14228   rtx ret;
14229
14230   if (mode != SDmode)
14231     ret = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
14232   else
14233     {
14234       rtx mem = cfun->machine->sdmode_stack_slot;
14235       gcc_assert (mem != NULL_RTX);
14236
14237       if (!eliminated)
14238         {
14239           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
14240           cfun->machine->sdmode_stack_slot = mem;
14241           eliminated = true;
14242         }
14243       ret = mem;
14244     }
14245
14246   if (TARGET_DEBUG_ADDR)
14247     {
14248       fprintf (stderr, "\nrs6000_secondary_memory_needed_rtx, mode %s, rtx:\n",
14249                GET_MODE_NAME (mode));
14250       if (!ret)
14251         fprintf (stderr, "\tNULL_RTX\n");
14252       else
14253         debug_rtx (ret);
14254     }
14255
14256   return ret;
14257 }
14258
14259 static tree
14260 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
14261 {
14262   /* Don't walk into types.  */
14263   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
14264     {
14265       *walk_subtrees = 0;
14266       return NULL_TREE;
14267     }
14268
14269   switch (TREE_CODE (*tp))
14270     {
14271     case VAR_DECL:
14272     case PARM_DECL:
14273     case FIELD_DECL:
14274     case RESULT_DECL:
14275     case SSA_NAME:
14276     case REAL_CST:
14277     case MEM_REF:
14278     case VIEW_CONVERT_EXPR:
14279       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
14280         return *tp;
14281       break;
14282     default:
14283       break;
14284     }
14285
14286   return NULL_TREE;
14287 }
14288
14289 enum reload_reg_type {
14290   GPR_REGISTER_TYPE,
14291   VECTOR_REGISTER_TYPE,
14292   OTHER_REGISTER_TYPE
14293 };
14294
14295 static enum reload_reg_type
14296 rs6000_reload_register_type (enum reg_class rclass)
14297 {
14298   switch (rclass)
14299     {
14300     case GENERAL_REGS:
14301     case BASE_REGS:
14302       return GPR_REGISTER_TYPE;
14303
14304     case FLOAT_REGS:
14305     case ALTIVEC_REGS:
14306     case VSX_REGS:
14307       return VECTOR_REGISTER_TYPE;
14308
14309     default:
14310       return OTHER_REGISTER_TYPE;
14311     }
14312 }
14313
14314 /* Inform reload about cases where moving X with a mode MODE to a register in
14315    RCLASS requires an extra scratch or immediate register.  Return the class
14316    needed for the immediate register.
14317
14318    For VSX and Altivec, we may need a register to convert sp+offset into
14319    reg+sp.  */
14320
14321 static reg_class_t
14322 rs6000_secondary_reload (bool in_p,
14323                          rtx x,
14324                          reg_class_t rclass_i,
14325                          enum machine_mode mode,
14326                          secondary_reload_info *sri)
14327 {
14328   enum reg_class rclass = (enum reg_class) rclass_i;
14329   reg_class_t ret = ALL_REGS;
14330   enum insn_code icode;
14331   bool default_p = false;
14332
14333   sri->icode = CODE_FOR_nothing;
14334
14335   /* Convert vector loads and stores into gprs to use an additional base
14336      register.  */
14337   icode = rs6000_vector_reload[mode][in_p != false];
14338   if (icode != CODE_FOR_nothing)
14339     {
14340       ret = NO_REGS;
14341       sri->icode = CODE_FOR_nothing;
14342       sri->extra_cost = 0;
14343
14344       if (GET_CODE (x) == MEM)
14345         {
14346           rtx addr = XEXP (x, 0);
14347
14348           /* Loads to and stores from gprs can do reg+offset, and wouldn't need
14349              an extra register in that case, but it would need an extra
14350              register if the addressing is reg+reg or (reg+reg)&(-16).  */
14351           if (rclass == GENERAL_REGS || rclass == BASE_REGS)
14352             {
14353               if (!legitimate_indirect_address_p (addr, false)
14354                   && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14355                 {
14356                   sri->icode = icode;
14357                   /* account for splitting the loads, and converting the
14358                      address from reg+reg to reg.  */
14359                   sri->extra_cost = (((TARGET_64BIT) ? 3 : 5)
14360                                      + ((GET_CODE (addr) == AND) ? 1 : 0));
14361                 }
14362             }
14363           /* Loads to and stores from vector registers can only do reg+reg
14364              addressing.  Altivec registers can also do (reg+reg)&(-16).  */
14365           else if (rclass == VSX_REGS || rclass == ALTIVEC_REGS
14366                    || rclass == FLOAT_REGS || rclass == NO_REGS)
14367             {
14368               if (!VECTOR_MEM_ALTIVEC_P (mode)
14369                   && GET_CODE (addr) == AND
14370                   && GET_CODE (XEXP (addr, 1)) == CONST_INT
14371                   && INTVAL (XEXP (addr, 1)) == -16
14372                   && (legitimate_indirect_address_p (XEXP (addr, 0), false)
14373                       || legitimate_indexed_address_p (XEXP (addr, 0), false)))
14374                 {
14375                   sri->icode = icode;
14376                   sri->extra_cost = ((GET_CODE (XEXP (addr, 0)) == PLUS)
14377                                      ? 2 : 1);
14378                 }
14379               else if (!legitimate_indirect_address_p (addr, false)
14380                        && (rclass == NO_REGS
14381                            || !legitimate_indexed_address_p (addr, false)))
14382                 {
14383                   sri->icode = icode;
14384                   sri->extra_cost = 1;
14385                 }
14386               else
14387                 icode = CODE_FOR_nothing;
14388             }
14389           /* Any other loads, including to pseudo registers which haven't been
14390              assigned to a register yet, default to require a scratch
14391              register.  */
14392           else
14393             {
14394               sri->icode = icode;
14395               sri->extra_cost = 2;
14396             }
14397         }
14398       else if (REG_P (x))
14399         {
14400           int regno = true_regnum (x);
14401
14402           icode = CODE_FOR_nothing;
14403           if (regno < 0 || regno >= FIRST_PSEUDO_REGISTER)
14404             default_p = true;
14405           else
14406             {
14407               enum reg_class xclass = REGNO_REG_CLASS (regno);
14408               enum reload_reg_type rtype1 = rs6000_reload_register_type (rclass);
14409               enum reload_reg_type rtype2 = rs6000_reload_register_type (xclass);
14410
14411               /* If memory is needed, use default_secondary_reload to create the
14412                  stack slot.  */
14413               if (rtype1 != rtype2 || rtype1 == OTHER_REGISTER_TYPE)
14414                 default_p = true;
14415               else
14416                 ret = NO_REGS;
14417             }
14418         }
14419       else
14420         default_p = true;
14421     }
14422   else
14423     default_p = true;
14424
14425   if (default_p)
14426     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
14427
14428   gcc_assert (ret != ALL_REGS);
14429
14430   if (TARGET_DEBUG_ADDR)
14431     {
14432       fprintf (stderr,
14433                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
14434                "mode = %s",
14435                reg_class_names[ret],
14436                in_p ? "true" : "false",
14437                reg_class_names[rclass],
14438                GET_MODE_NAME (mode));
14439
14440       if (default_p)
14441         fprintf (stderr, ", default secondary reload");
14442
14443       if (sri->icode != CODE_FOR_nothing)
14444         fprintf (stderr, ", reload func = %s, extra cost = %d\n",
14445                  insn_data[sri->icode].name, sri->extra_cost);
14446       else
14447         fprintf (stderr, "\n");
14448
14449       debug_rtx (x);
14450     }
14451
14452   return ret;
14453 }
14454
14455 /* Fixup reload addresses for Altivec or VSX loads/stores to change SP+offset
14456    to SP+reg addressing.  */
14457
14458 void
14459 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
14460 {
14461   int regno = true_regnum (reg);
14462   enum machine_mode mode = GET_MODE (reg);
14463   enum reg_class rclass;
14464   rtx addr;
14465   rtx and_op2 = NULL_RTX;
14466   rtx addr_op1;
14467   rtx addr_op2;
14468   rtx scratch_or_premodify = scratch;
14469   rtx and_rtx;
14470   rtx cc_clobber;
14471
14472   if (TARGET_DEBUG_ADDR)
14473     {
14474       fprintf (stderr, "\nrs6000_secondary_reload_inner, type = %s\n",
14475                store_p ? "store" : "load");
14476       fprintf (stderr, "reg:\n");
14477       debug_rtx (reg);
14478       fprintf (stderr, "mem:\n");
14479       debug_rtx (mem);
14480       fprintf (stderr, "scratch:\n");
14481       debug_rtx (scratch);
14482     }
14483
14484   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14485   gcc_assert (GET_CODE (mem) == MEM);
14486   rclass = REGNO_REG_CLASS (regno);
14487   addr = XEXP (mem, 0);
14488
14489   switch (rclass)
14490     {
14491       /* GPRs can handle reg + small constant, all other addresses need to use
14492          the scratch register.  */
14493     case GENERAL_REGS:
14494     case BASE_REGS:
14495       if (GET_CODE (addr) == AND)
14496         {
14497           and_op2 = XEXP (addr, 1);
14498           addr = XEXP (addr, 0);
14499         }
14500
14501       if (GET_CODE (addr) == PRE_MODIFY)
14502         {
14503           scratch_or_premodify = XEXP (addr, 0);
14504           gcc_assert (REG_P (scratch_or_premodify));
14505           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14506           addr = XEXP (addr, 1);
14507         }
14508
14509       if (GET_CODE (addr) == PLUS
14510           && (!rs6000_legitimate_offset_address_p (TImode, addr, false)
14511               || and_op2 != NULL_RTX))
14512         {
14513           addr_op1 = XEXP (addr, 0);
14514           addr_op2 = XEXP (addr, 1);
14515           gcc_assert (legitimate_indirect_address_p (addr_op1, false));
14516
14517           if (!REG_P (addr_op2)
14518               && (GET_CODE (addr_op2) != CONST_INT
14519                   || !satisfies_constraint_I (addr_op2)))
14520             {
14521               if (TARGET_DEBUG_ADDR)
14522                 {
14523                   fprintf (stderr,
14524                            "\nMove plus addr to register %s, mode = %s: ",
14525                            rs6000_reg_names[REGNO (scratch)],
14526                            GET_MODE_NAME (mode));
14527                   debug_rtx (addr_op2);
14528                 }
14529               rs6000_emit_move (scratch, addr_op2, Pmode);
14530               addr_op2 = scratch;
14531             }
14532
14533           emit_insn (gen_rtx_SET (VOIDmode,
14534                                   scratch_or_premodify,
14535                                   gen_rtx_PLUS (Pmode,
14536                                                 addr_op1,
14537                                                 addr_op2)));
14538
14539           addr = scratch_or_premodify;
14540           scratch_or_premodify = scratch;
14541         }
14542       else if (!legitimate_indirect_address_p (addr, false)
14543                && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14544         {
14545           if (TARGET_DEBUG_ADDR)
14546             {
14547               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14548                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14549                        GET_MODE_NAME (mode));
14550               debug_rtx (addr);
14551             }
14552           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14553           addr = scratch_or_premodify;
14554           scratch_or_premodify = scratch;
14555         }
14556       break;
14557
14558       /* Float/Altivec registers can only handle reg+reg addressing.  Move
14559          other addresses into a scratch register.  */
14560     case FLOAT_REGS:
14561     case VSX_REGS:
14562     case ALTIVEC_REGS:
14563
14564       /* With float regs, we need to handle the AND ourselves, since we can't
14565          use the Altivec instruction with an implicit AND -16.  Allow scalar
14566          loads to float registers to use reg+offset even if VSX.  */
14567       if (GET_CODE (addr) == AND
14568           && (rclass != ALTIVEC_REGS || GET_MODE_SIZE (mode) != 16
14569               || GET_CODE (XEXP (addr, 1)) != CONST_INT
14570               || INTVAL (XEXP (addr, 1)) != -16
14571               || !VECTOR_MEM_ALTIVEC_P (mode)))
14572         {
14573           and_op2 = XEXP (addr, 1);
14574           addr = XEXP (addr, 0);
14575         }
14576
14577       /* If we aren't using a VSX load, save the PRE_MODIFY register and use it
14578          as the address later.  */
14579       if (GET_CODE (addr) == PRE_MODIFY
14580           && (!VECTOR_MEM_VSX_P (mode)
14581               || and_op2 != NULL_RTX
14582               || !legitimate_indexed_address_p (XEXP (addr, 1), false)))
14583         {
14584           scratch_or_premodify = XEXP (addr, 0);
14585           gcc_assert (legitimate_indirect_address_p (scratch_or_premodify,
14586                                                      false));
14587           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14588           addr = XEXP (addr, 1);
14589         }
14590
14591       if (legitimate_indirect_address_p (addr, false)   /* reg */
14592           || legitimate_indexed_address_p (addr, false) /* reg+reg */
14593           || GET_CODE (addr) == PRE_MODIFY              /* VSX pre-modify */
14594           || (GET_CODE (addr) == AND                    /* Altivec memory */
14595               && GET_CODE (XEXP (addr, 1)) == CONST_INT
14596               && INTVAL (XEXP (addr, 1)) == -16
14597               && VECTOR_MEM_ALTIVEC_P (mode))
14598           || (rclass == FLOAT_REGS                      /* legacy float mem */
14599               && GET_MODE_SIZE (mode) == 8
14600               && and_op2 == NULL_RTX
14601               && scratch_or_premodify == scratch
14602               && rs6000_legitimate_offset_address_p (mode, addr, false)))
14603         ;
14604
14605       else if (GET_CODE (addr) == PLUS)
14606         {
14607           addr_op1 = XEXP (addr, 0);
14608           addr_op2 = XEXP (addr, 1);
14609           gcc_assert (REG_P (addr_op1));
14610
14611           if (TARGET_DEBUG_ADDR)
14612             {
14613               fprintf (stderr, "\nMove plus addr to register %s, mode = %s: ",
14614                        rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14615               debug_rtx (addr_op2);
14616             }
14617           rs6000_emit_move (scratch, addr_op2, Pmode);
14618           emit_insn (gen_rtx_SET (VOIDmode,
14619                                   scratch_or_premodify,
14620                                   gen_rtx_PLUS (Pmode,
14621                                                 addr_op1,
14622                                                 scratch)));
14623           addr = scratch_or_premodify;
14624           scratch_or_premodify = scratch;
14625         }
14626
14627       else if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == CONST
14628                || GET_CODE (addr) == CONST_INT || REG_P (addr))
14629         {
14630           if (TARGET_DEBUG_ADDR)
14631             {
14632               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14633                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14634                        GET_MODE_NAME (mode));
14635               debug_rtx (addr);
14636             }
14637
14638           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14639           addr = scratch_or_premodify;
14640           scratch_or_premodify = scratch;
14641         }
14642
14643       else
14644         gcc_unreachable ();
14645
14646       break;
14647
14648     default:
14649       gcc_unreachable ();
14650     }
14651
14652   /* If the original address involved a pre-modify that we couldn't use the VSX
14653      memory instruction with update, and we haven't taken care of already,
14654      store the address in the pre-modify register and use that as the
14655      address.  */
14656   if (scratch_or_premodify != scratch && scratch_or_premodify != addr)
14657     {
14658       emit_insn (gen_rtx_SET (VOIDmode, scratch_or_premodify, addr));
14659       addr = scratch_or_premodify;
14660     }
14661
14662   /* If the original address involved an AND -16 and we couldn't use an ALTIVEC
14663      memory instruction, recreate the AND now, including the clobber which is
14664      generated by the general ANDSI3/ANDDI3 patterns for the
14665      andi. instruction.  */
14666   if (and_op2 != NULL_RTX)
14667     {
14668       if (! legitimate_indirect_address_p (addr, false))
14669         {
14670           emit_insn (gen_rtx_SET (VOIDmode, scratch, addr));
14671           addr = scratch;
14672         }
14673
14674       if (TARGET_DEBUG_ADDR)
14675         {
14676           fprintf (stderr, "\nAnd addr to register %s, mode = %s: ",
14677                    rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14678           debug_rtx (and_op2);
14679         }
14680
14681       and_rtx = gen_rtx_SET (VOIDmode,
14682                              scratch,
14683                              gen_rtx_AND (Pmode,
14684                                           addr,
14685                                           and_op2));
14686
14687       cc_clobber = gen_rtx_CLOBBER (CCmode, gen_rtx_SCRATCH (CCmode));
14688       emit_insn (gen_rtx_PARALLEL (VOIDmode,
14689                                    gen_rtvec (2, and_rtx, cc_clobber)));
14690       addr = scratch;
14691     }
14692
14693   /* Adjust the address if it changed.  */
14694   if (addr != XEXP (mem, 0))
14695     {
14696       mem = change_address (mem, mode, addr);
14697       if (TARGET_DEBUG_ADDR)
14698         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
14699     }
14700
14701   /* Now create the move.  */
14702   if (store_p)
14703     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
14704   else
14705     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
14706
14707   return;
14708 }
14709
14710 /* Target hook to return the cover classes for Integrated Register Allocator.
14711    Cover classes is a set of non-intersected register classes covering all hard
14712    registers used for register allocation purpose.  Any move between two
14713    registers of a cover class should be cheaper than load or store of the
14714    registers.  The value is array of register classes with LIM_REG_CLASSES used
14715    as the end marker.
14716
14717    We need two IRA_COVER_CLASSES, one for pre-VSX, and the other for VSX to
14718    account for the Altivec and Floating registers being subsets of the VSX
14719    register set under VSX, but distinct register sets on pre-VSX machines.  */
14720
14721 static const reg_class_t *
14722 rs6000_ira_cover_classes (void)
14723 {
14724   static const reg_class_t cover_pre_vsx[] = IRA_COVER_CLASSES_PRE_VSX;
14725   static const reg_class_t cover_vsx[]     = IRA_COVER_CLASSES_VSX;
14726
14727   return (TARGET_VSX) ? cover_vsx : cover_pre_vsx;
14728 }
14729
14730 /* Allocate a 64-bit stack slot to be used for copying SDmode
14731    values through if this function has any SDmode references.  */
14732
14733 static void
14734 rs6000_alloc_sdmode_stack_slot (void)
14735 {
14736   tree t;
14737   basic_block bb;
14738   gimple_stmt_iterator gsi;
14739
14740   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
14741
14742   FOR_EACH_BB (bb)
14743     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
14744       {
14745         tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
14746         if (ret)
14747           {
14748             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14749             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14750                                                                   SDmode, 0);
14751             return;
14752           }
14753       }
14754
14755   /* Check for any SDmode parameters of the function.  */
14756   for (t = DECL_ARGUMENTS (cfun->decl); t; t = DECL_CHAIN (t))
14757     {
14758       if (TREE_TYPE (t) == error_mark_node)
14759         continue;
14760
14761       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
14762           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
14763         {
14764           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14765           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14766                                                                 SDmode, 0);
14767           return;
14768         }
14769     }
14770 }
14771
14772 static void
14773 rs6000_instantiate_decls (void)
14774 {
14775   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
14776     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
14777 }
14778
14779 /* Given an rtx X being reloaded into a reg required to be
14780    in class CLASS, return the class of reg to actually use.
14781    In general this is just CLASS; but on some machines
14782    in some cases it is preferable to use a more restrictive class.
14783
14784    On the RS/6000, we have to return NO_REGS when we want to reload a
14785    floating-point CONST_DOUBLE to force it to be copied to memory.
14786
14787    We also don't want to reload integer values into floating-point
14788    registers if we can at all help it.  In fact, this can
14789    cause reload to die, if it tries to generate a reload of CTR
14790    into a FP register and discovers it doesn't have the memory location
14791    required.
14792
14793    ??? Would it be a good idea to have reload do the converse, that is
14794    try to reload floating modes into FP registers if possible?
14795  */
14796
14797 static enum reg_class
14798 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
14799 {
14800   enum machine_mode mode = GET_MODE (x);
14801
14802   if (VECTOR_UNIT_VSX_P (mode)
14803       && x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
14804     return rclass;
14805
14806   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
14807       && (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
14808       && easy_vector_constant (x, mode))
14809     return ALTIVEC_REGS;
14810
14811   if (CONSTANT_P (x) && reg_classes_intersect_p (rclass, FLOAT_REGS))
14812     return NO_REGS;
14813
14814   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
14815     return GENERAL_REGS;
14816
14817   /* For VSX, prefer the traditional registers for 64-bit values because we can
14818      use the non-VSX loads.  Prefer the Altivec registers if Altivec is
14819      handling the vector operations (i.e. V16QI, V8HI, and V4SI), or if we
14820      prefer Altivec loads..  */
14821   if (rclass == VSX_REGS)
14822     {
14823       if (GET_MODE_SIZE (mode) <= 8)
14824         return FLOAT_REGS;
14825
14826       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode))
14827         return ALTIVEC_REGS;
14828
14829       return rclass;
14830     }
14831
14832   return rclass;
14833 }
14834
14835 /* Debug version of rs6000_preferred_reload_class.  */
14836 static enum reg_class
14837 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
14838 {
14839   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
14840
14841   fprintf (stderr,
14842            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
14843            "mode = %s, x:\n",
14844            reg_class_names[ret], reg_class_names[rclass],
14845            GET_MODE_NAME (GET_MODE (x)));
14846   debug_rtx (x);
14847
14848   return ret;
14849 }
14850
14851 /* If we are copying between FP or AltiVec registers and anything else, we need
14852    a memory location.  The exception is when we are targeting ppc64 and the
14853    move to/from fpr to gpr instructions are available.  Also, under VSX, you
14854    can copy vector registers from the FP register set to the Altivec register
14855    set and vice versa.  */
14856
14857 static bool
14858 rs6000_secondary_memory_needed (enum reg_class class1,
14859                                 enum reg_class class2,
14860                                 enum machine_mode mode)
14861 {
14862   if (class1 == class2)
14863     return false;
14864
14865   /* Under VSX, there are 3 register classes that values could be in (VSX_REGS,
14866      ALTIVEC_REGS, and FLOAT_REGS).  We don't need to use memory to copy
14867      between these classes.  But we need memory for other things that can go in
14868      FLOAT_REGS like SFmode.  */
14869   if (TARGET_VSX
14870       && (VECTOR_MEM_VSX_P (mode) || VECTOR_UNIT_VSX_P (mode))
14871       && (class1 == VSX_REGS || class1 == ALTIVEC_REGS
14872           || class1 == FLOAT_REGS))
14873     return (class2 != VSX_REGS && class2 != ALTIVEC_REGS
14874             && class2 != FLOAT_REGS);
14875
14876   if (class1 == VSX_REGS || class2 == VSX_REGS)
14877     return true;
14878
14879   if (class1 == FLOAT_REGS
14880       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14881           || ((mode != DFmode)
14882               && (mode != DDmode)
14883               && (mode != DImode))))
14884     return true;
14885
14886   if (class2 == FLOAT_REGS
14887       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14888           || ((mode != DFmode)
14889               && (mode != DDmode)
14890               && (mode != DImode))))
14891     return true;
14892
14893   if (class1 == ALTIVEC_REGS || class2 == ALTIVEC_REGS)
14894     return true;
14895
14896   return false;
14897 }
14898
14899 /* Debug version of rs6000_secondary_memory_needed.  */
14900 static bool
14901 rs6000_debug_secondary_memory_needed (enum reg_class class1,
14902                                       enum reg_class class2,
14903                                       enum machine_mode mode)
14904 {
14905   bool ret = rs6000_secondary_memory_needed (class1, class2, mode);
14906
14907   fprintf (stderr,
14908            "rs6000_secondary_memory_needed, return: %s, class1 = %s, "
14909            "class2 = %s, mode = %s\n",
14910            ret ? "true" : "false", reg_class_names[class1],
14911            reg_class_names[class2], GET_MODE_NAME (mode));
14912
14913   return ret;
14914 }
14915
14916 /* Return the register class of a scratch register needed to copy IN into
14917    or out of a register in RCLASS in MODE.  If it can be done directly,
14918    NO_REGS is returned.  */
14919
14920 static enum reg_class
14921 rs6000_secondary_reload_class (enum reg_class rclass, enum machine_mode mode,
14922                                rtx in)
14923 {
14924   int regno;
14925
14926   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
14927 #if TARGET_MACHO
14928                      && MACHOPIC_INDIRECT
14929 #endif
14930                      ))
14931     {
14932       /* We cannot copy a symbolic operand directly into anything
14933          other than BASE_REGS for TARGET_ELF.  So indicate that a
14934          register from BASE_REGS is needed as an intermediate
14935          register.
14936
14937          On Darwin, pic addresses require a load from memory, which
14938          needs a base register.  */
14939       if (rclass != BASE_REGS
14940           && (GET_CODE (in) == SYMBOL_REF
14941               || GET_CODE (in) == HIGH
14942               || GET_CODE (in) == LABEL_REF
14943               || GET_CODE (in) == CONST))
14944         return BASE_REGS;
14945     }
14946
14947   if (GET_CODE (in) == REG)
14948     {
14949       regno = REGNO (in);
14950       if (regno >= FIRST_PSEUDO_REGISTER)
14951         {
14952           regno = true_regnum (in);
14953           if (regno >= FIRST_PSEUDO_REGISTER)
14954             regno = -1;
14955         }
14956     }
14957   else if (GET_CODE (in) == SUBREG)
14958     {
14959       regno = true_regnum (in);
14960       if (regno >= FIRST_PSEUDO_REGISTER)
14961         regno = -1;
14962     }
14963   else
14964     regno = -1;
14965
14966   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
14967      into anything.  */
14968   if (rclass == GENERAL_REGS || rclass == BASE_REGS
14969       || (regno >= 0 && INT_REGNO_P (regno)))
14970     return NO_REGS;
14971
14972   /* Constants, memory, and FP registers can go into FP registers.  */
14973   if ((regno == -1 || FP_REGNO_P (regno))
14974       && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
14975     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
14976
14977   /* Memory, and FP/altivec registers can go into fp/altivec registers under
14978      VSX.  */
14979   if (TARGET_VSX
14980       && (regno == -1 || VSX_REGNO_P (regno))
14981       && VSX_REG_CLASS_P (rclass))
14982     return NO_REGS;
14983
14984   /* Memory, and AltiVec registers can go into AltiVec registers.  */
14985   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
14986       && rclass == ALTIVEC_REGS)
14987     return NO_REGS;
14988
14989   /* We can copy among the CR registers.  */
14990   if ((rclass == CR_REGS || rclass == CR0_REGS)
14991       && regno >= 0 && CR_REGNO_P (regno))
14992     return NO_REGS;
14993
14994   /* Otherwise, we need GENERAL_REGS.  */
14995   return GENERAL_REGS;
14996 }
14997
14998 /* Debug version of rs6000_secondary_reload_class.  */
14999 static enum reg_class
15000 rs6000_debug_secondary_reload_class (enum reg_class rclass,
15001                                      enum machine_mode mode, rtx in)
15002 {
15003   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
15004   fprintf (stderr,
15005            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
15006            "mode = %s, input rtx:\n",
15007            reg_class_names[ret], reg_class_names[rclass],
15008            GET_MODE_NAME (mode));
15009   debug_rtx (in);
15010
15011   return ret;
15012 }
15013
15014 /* Return nonzero if for CLASS a mode change from FROM to TO is invalid.  */
15015
15016 static bool
15017 rs6000_cannot_change_mode_class (enum machine_mode from,
15018                                  enum machine_mode to,
15019                                  enum reg_class rclass)
15020 {
15021   unsigned from_size = GET_MODE_SIZE (from);
15022   unsigned to_size = GET_MODE_SIZE (to);
15023
15024   if (from_size != to_size)
15025     {
15026       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
15027       return ((from_size < 8 || to_size < 8 || TARGET_IEEEQUAD)
15028               && reg_classes_intersect_p (xclass, rclass));
15029     }
15030
15031   if (TARGET_E500_DOUBLE
15032       && ((((to) == DFmode) + ((from) == DFmode)) == 1
15033           || (((to) == TFmode) + ((from) == TFmode)) == 1
15034           || (((to) == DDmode) + ((from) == DDmode)) == 1
15035           || (((to) == TDmode) + ((from) == TDmode)) == 1
15036           || (((to) == DImode) + ((from) == DImode)) == 1))
15037     return true;
15038
15039   /* Since the VSX register set includes traditional floating point registers
15040      and altivec registers, just check for the size being different instead of
15041      trying to check whether the modes are vector modes.  Otherwise it won't
15042      allow say DF and DI to change classes.  */
15043   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
15044     return (from_size != 8 && from_size != 16);
15045
15046   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
15047       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
15048     return true;
15049
15050   if (TARGET_SPE && (SPE_VECTOR_MODE (from) + SPE_VECTOR_MODE (to)) == 1
15051       && reg_classes_intersect_p (GENERAL_REGS, rclass))
15052     return true;
15053
15054   return false;
15055 }
15056
15057 /* Debug version of rs6000_cannot_change_mode_class.  */
15058 static bool
15059 rs6000_debug_cannot_change_mode_class (enum machine_mode from,
15060                                        enum machine_mode to,
15061                                        enum reg_class rclass)
15062 {
15063   bool ret = rs6000_cannot_change_mode_class (from, to, rclass);
15064
15065   fprintf (stderr,
15066            "rs6000_cannot_change_mode_class, return %s, from = %s, "
15067            "to = %s, rclass = %s\n",
15068            ret ? "true" : "false",
15069            GET_MODE_NAME (from), GET_MODE_NAME (to),
15070            reg_class_names[rclass]);
15071
15072   return ret;
15073 }
15074 \f
15075 /* Given a comparison operation, return the bit number in CCR to test.  We
15076    know this is a valid comparison.
15077
15078    SCC_P is 1 if this is for an scc.  That means that %D will have been
15079    used instead of %C, so the bits will be in different places.
15080
15081    Return -1 if OP isn't a valid comparison for some reason.  */
15082
15083 int
15084 ccr_bit (rtx op, int scc_p)
15085 {
15086   enum rtx_code code = GET_CODE (op);
15087   enum machine_mode cc_mode;
15088   int cc_regnum;
15089   int base_bit;
15090   rtx reg;
15091
15092   if (!COMPARISON_P (op))
15093     return -1;
15094
15095   reg = XEXP (op, 0);
15096
15097   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
15098
15099   cc_mode = GET_MODE (reg);
15100   cc_regnum = REGNO (reg);
15101   base_bit = 4 * (cc_regnum - CR0_REGNO);
15102
15103   validate_condition_mode (code, cc_mode);
15104
15105   /* When generating a sCOND operation, only positive conditions are
15106      allowed.  */
15107   gcc_assert (!scc_p
15108               || code == EQ || code == GT || code == LT || code == UNORDERED
15109               || code == GTU || code == LTU);
15110
15111   switch (code)
15112     {
15113     case NE:
15114       return scc_p ? base_bit + 3 : base_bit + 2;
15115     case EQ:
15116       return base_bit + 2;
15117     case GT:  case GTU:  case UNLE:
15118       return base_bit + 1;
15119     case LT:  case LTU:  case UNGE:
15120       return base_bit;
15121     case ORDERED:  case UNORDERED:
15122       return base_bit + 3;
15123
15124     case GE:  case GEU:
15125       /* If scc, we will have done a cror to put the bit in the
15126          unordered position.  So test that bit.  For integer, this is ! LT
15127          unless this is an scc insn.  */
15128       return scc_p ? base_bit + 3 : base_bit;
15129
15130     case LE:  case LEU:
15131       return scc_p ? base_bit + 3 : base_bit + 1;
15132
15133     default:
15134       gcc_unreachable ();
15135     }
15136 }
15137 \f
15138 /* Return the GOT register.  */
15139
15140 rtx
15141 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
15142 {
15143   /* The second flow pass currently (June 1999) can't update
15144      regs_ever_live without disturbing other parts of the compiler, so
15145      update it here to make the prolog/epilogue code happy.  */
15146   if (!can_create_pseudo_p ()
15147       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
15148     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
15149
15150   crtl->uses_pic_offset_table = 1;
15151
15152   return pic_offset_table_rtx;
15153 }
15154 \f
15155 static rs6000_stack_t stack_info;
15156
15157 /* Function to init struct machine_function.
15158    This will be called, via a pointer variable,
15159    from push_function_context.  */
15160
15161 static struct machine_function *
15162 rs6000_init_machine_status (void)
15163 {
15164   stack_info.reload_completed = 0;
15165   return ggc_alloc_cleared_machine_function ();
15166 }
15167 \f
15168 /* These macros test for integers and extract the low-order bits.  */
15169 #define INT_P(X)  \
15170 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
15171  && GET_MODE (X) == VOIDmode)
15172
15173 #define INT_LOWPART(X) \
15174   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
15175
15176 int
15177 extract_MB (rtx op)
15178 {
15179   int i;
15180   unsigned long val = INT_LOWPART (op);
15181
15182   /* If the high bit is zero, the value is the first 1 bit we find
15183      from the left.  */
15184   if ((val & 0x80000000) == 0)
15185     {
15186       gcc_assert (val & 0xffffffff);
15187
15188       i = 1;
15189       while (((val <<= 1) & 0x80000000) == 0)
15190         ++i;
15191       return i;
15192     }
15193
15194   /* If the high bit is set and the low bit is not, or the mask is all
15195      1's, the value is zero.  */
15196   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
15197     return 0;
15198
15199   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15200      from the right.  */
15201   i = 31;
15202   while (((val >>= 1) & 1) != 0)
15203     --i;
15204
15205   return i;
15206 }
15207
15208 int
15209 extract_ME (rtx op)
15210 {
15211   int i;
15212   unsigned long val = INT_LOWPART (op);
15213
15214   /* If the low bit is zero, the value is the first 1 bit we find from
15215      the right.  */
15216   if ((val & 1) == 0)
15217     {
15218       gcc_assert (val & 0xffffffff);
15219
15220       i = 30;
15221       while (((val >>= 1) & 1) == 0)
15222         --i;
15223
15224       return i;
15225     }
15226
15227   /* If the low bit is set and the high bit is not, or the mask is all
15228      1's, the value is 31.  */
15229   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
15230     return 31;
15231
15232   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15233      from the left.  */
15234   i = 0;
15235   while (((val <<= 1) & 0x80000000) != 0)
15236     ++i;
15237
15238   return i;
15239 }
15240
15241 /* Locate some local-dynamic symbol still in use by this function
15242    so that we can print its name in some tls_ld pattern.  */
15243
15244 static const char *
15245 rs6000_get_some_local_dynamic_name (void)
15246 {
15247   rtx insn;
15248
15249   if (cfun->machine->some_ld_name)
15250     return cfun->machine->some_ld_name;
15251
15252   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
15253     if (INSN_P (insn)
15254         && for_each_rtx (&PATTERN (insn),
15255                          rs6000_get_some_local_dynamic_name_1, 0))
15256       return cfun->machine->some_ld_name;
15257
15258   gcc_unreachable ();
15259 }
15260
15261 /* Helper function for rs6000_get_some_local_dynamic_name.  */
15262
15263 static int
15264 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
15265 {
15266   rtx x = *px;
15267
15268   if (GET_CODE (x) == SYMBOL_REF)
15269     {
15270       const char *str = XSTR (x, 0);
15271       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
15272         {
15273           cfun->machine->some_ld_name = str;
15274           return 1;
15275         }
15276     }
15277
15278   return 0;
15279 }
15280
15281 /* Write out a function code label.  */
15282
15283 void
15284 rs6000_output_function_entry (FILE *file, const char *fname)
15285 {
15286   if (fname[0] != '.')
15287     {
15288       switch (DEFAULT_ABI)
15289         {
15290         default:
15291           gcc_unreachable ();
15292
15293         case ABI_AIX:
15294           if (DOT_SYMBOLS)
15295             putc ('.', file);
15296           else
15297             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
15298           break;
15299
15300         case ABI_V4:
15301         case ABI_DARWIN:
15302           break;
15303         }
15304     }
15305
15306   RS6000_OUTPUT_BASENAME (file, fname);
15307 }
15308
15309 /* Print an operand.  Recognize special options, documented below.  */
15310
15311 #if TARGET_ELF
15312 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
15313 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
15314 #else
15315 #define SMALL_DATA_RELOC "sda21"
15316 #define SMALL_DATA_REG 0
15317 #endif
15318
15319 void
15320 print_operand (FILE *file, rtx x, int code)
15321 {
15322   int i;
15323   HOST_WIDE_INT val;
15324   unsigned HOST_WIDE_INT uval;
15325
15326   switch (code)
15327     {
15328     case '.':
15329       /* Write out an instruction after the call which may be replaced
15330          with glue code by the loader.  This depends on the AIX version.  */
15331       asm_fprintf (file, RS6000_CALL_GLUE);
15332       return;
15333
15334       /* %a is output_address.  */
15335
15336     case 'A':
15337       /* If X is a constant integer whose low-order 5 bits are zero,
15338          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
15339          in the AIX assembler where "sri" with a zero shift count
15340          writes a trash instruction.  */
15341       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
15342         putc ('l', file);
15343       else
15344         putc ('r', file);
15345       return;
15346
15347     case 'b':
15348       /* If constant, low-order 16 bits of constant, unsigned.
15349          Otherwise, write normally.  */
15350       if (INT_P (x))
15351         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
15352       else
15353         print_operand (file, x, 0);
15354       return;
15355
15356     case 'B':
15357       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
15358          for 64-bit mask direction.  */
15359       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
15360       return;
15361
15362       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
15363          output_operand.  */
15364
15365     case 'c':
15366       /* X is a CR register.  Print the number of the GT bit of the CR.  */
15367       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15368         output_operand_lossage ("invalid %%c value");
15369       else
15370         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
15371       return;
15372
15373     case 'D':
15374       /* Like 'J' but get to the GT bit only.  */
15375       gcc_assert (GET_CODE (x) == REG);
15376
15377       /* Bit 1 is GT bit.  */
15378       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
15379
15380       /* Add one for shift count in rlinm for scc.  */
15381       fprintf (file, "%d", i + 1);
15382       return;
15383
15384     case 'E':
15385       /* X is a CR register.  Print the number of the EQ bit of the CR */
15386       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15387         output_operand_lossage ("invalid %%E value");
15388       else
15389         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
15390       return;
15391
15392     case 'f':
15393       /* X is a CR register.  Print the shift count needed to move it
15394          to the high-order four bits.  */
15395       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15396         output_operand_lossage ("invalid %%f value");
15397       else
15398         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
15399       return;
15400
15401     case 'F':
15402       /* Similar, but print the count for the rotate in the opposite
15403          direction.  */
15404       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15405         output_operand_lossage ("invalid %%F value");
15406       else
15407         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
15408       return;
15409
15410     case 'G':
15411       /* X is a constant integer.  If it is negative, print "m",
15412          otherwise print "z".  This is to make an aze or ame insn.  */
15413       if (GET_CODE (x) != CONST_INT)
15414         output_operand_lossage ("invalid %%G value");
15415       else if (INTVAL (x) >= 0)
15416         putc ('z', file);
15417       else
15418         putc ('m', file);
15419       return;
15420
15421     case 'h':
15422       /* If constant, output low-order five bits.  Otherwise, write
15423          normally.  */
15424       if (INT_P (x))
15425         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
15426       else
15427         print_operand (file, x, 0);
15428       return;
15429
15430     case 'H':
15431       /* If constant, output low-order six bits.  Otherwise, write
15432          normally.  */
15433       if (INT_P (x))
15434         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
15435       else
15436         print_operand (file, x, 0);
15437       return;
15438
15439     case 'I':
15440       /* Print `i' if this is a constant, else nothing.  */
15441       if (INT_P (x))
15442         putc ('i', file);
15443       return;
15444
15445     case 'j':
15446       /* Write the bit number in CCR for jump.  */
15447       i = ccr_bit (x, 0);
15448       if (i == -1)
15449         output_operand_lossage ("invalid %%j code");
15450       else
15451         fprintf (file, "%d", i);
15452       return;
15453
15454     case 'J':
15455       /* Similar, but add one for shift count in rlinm for scc and pass
15456          scc flag to `ccr_bit'.  */
15457       i = ccr_bit (x, 1);
15458       if (i == -1)
15459         output_operand_lossage ("invalid %%J code");
15460       else
15461         /* If we want bit 31, write a shift count of zero, not 32.  */
15462         fprintf (file, "%d", i == 31 ? 0 : i + 1);
15463       return;
15464
15465     case 'k':
15466       /* X must be a constant.  Write the 1's complement of the
15467          constant.  */
15468       if (! INT_P (x))
15469         output_operand_lossage ("invalid %%k value");
15470       else
15471         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
15472       return;
15473
15474     case 'K':
15475       /* X must be a symbolic constant on ELF.  Write an
15476          expression suitable for an 'addi' that adds in the low 16
15477          bits of the MEM.  */
15478       if (GET_CODE (x) == CONST)
15479         {
15480           if (GET_CODE (XEXP (x, 0)) != PLUS
15481               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
15482                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
15483               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
15484             output_operand_lossage ("invalid %%K value");
15485         }
15486       print_operand_address (file, x);
15487       fputs ("@l", file);
15488       return;
15489
15490       /* %l is output_asm_label.  */
15491
15492     case 'L':
15493       /* Write second word of DImode or DFmode reference.  Works on register
15494          or non-indexed memory only.  */
15495       if (GET_CODE (x) == REG)
15496         fputs (reg_names[REGNO (x) + 1], file);
15497       else if (GET_CODE (x) == MEM)
15498         {
15499           /* Handle possible auto-increment.  Since it is pre-increment and
15500              we have already done it, we can just use an offset of word.  */
15501           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15502               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15503             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15504                                            UNITS_PER_WORD));
15505           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15506             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15507                                            UNITS_PER_WORD));
15508           else
15509             output_address (XEXP (adjust_address_nv (x, SImode,
15510                                                      UNITS_PER_WORD),
15511                                   0));
15512
15513           if (small_data_operand (x, GET_MODE (x)))
15514             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15515                      reg_names[SMALL_DATA_REG]);
15516         }
15517       return;
15518
15519     case 'm':
15520       /* MB value for a mask operand.  */
15521       if (! mask_operand (x, SImode))
15522         output_operand_lossage ("invalid %%m value");
15523
15524       fprintf (file, "%d", extract_MB (x));
15525       return;
15526
15527     case 'M':
15528       /* ME value for a mask operand.  */
15529       if (! mask_operand (x, SImode))
15530         output_operand_lossage ("invalid %%M value");
15531
15532       fprintf (file, "%d", extract_ME (x));
15533       return;
15534
15535       /* %n outputs the negative of its operand.  */
15536
15537     case 'N':
15538       /* Write the number of elements in the vector times 4.  */
15539       if (GET_CODE (x) != PARALLEL)
15540         output_operand_lossage ("invalid %%N value");
15541       else
15542         fprintf (file, "%d", XVECLEN (x, 0) * 4);
15543       return;
15544
15545     case 'O':
15546       /* Similar, but subtract 1 first.  */
15547       if (GET_CODE (x) != PARALLEL)
15548         output_operand_lossage ("invalid %%O value");
15549       else
15550         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
15551       return;
15552
15553     case 'p':
15554       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
15555       if (! INT_P (x)
15556           || INT_LOWPART (x) < 0
15557           || (i = exact_log2 (INT_LOWPART (x))) < 0)
15558         output_operand_lossage ("invalid %%p value");
15559       else
15560         fprintf (file, "%d", i);
15561       return;
15562
15563     case 'P':
15564       /* The operand must be an indirect memory reference.  The result
15565          is the register name.  */
15566       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
15567           || REGNO (XEXP (x, 0)) >= 32)
15568         output_operand_lossage ("invalid %%P value");
15569       else
15570         fputs (reg_names[REGNO (XEXP (x, 0))], file);
15571       return;
15572
15573     case 'q':
15574       /* This outputs the logical code corresponding to a boolean
15575          expression.  The expression may have one or both operands
15576          negated (if one, only the first one).  For condition register
15577          logical operations, it will also treat the negated
15578          CR codes as NOTs, but not handle NOTs of them.  */
15579       {
15580         const char *const *t = 0;
15581         const char *s;
15582         enum rtx_code code = GET_CODE (x);
15583         static const char * const tbl[3][3] = {
15584           { "and", "andc", "nor" },
15585           { "or", "orc", "nand" },
15586           { "xor", "eqv", "xor" } };
15587
15588         if (code == AND)
15589           t = tbl[0];
15590         else if (code == IOR)
15591           t = tbl[1];
15592         else if (code == XOR)
15593           t = tbl[2];
15594         else
15595           output_operand_lossage ("invalid %%q value");
15596
15597         if (GET_CODE (XEXP (x, 0)) != NOT)
15598           s = t[0];
15599         else
15600           {
15601             if (GET_CODE (XEXP (x, 1)) == NOT)
15602               s = t[2];
15603             else
15604               s = t[1];
15605           }
15606
15607         fputs (s, file);
15608       }
15609       return;
15610
15611     case 'Q':
15612       if (TARGET_MFCRF)
15613         fputc (',', file);
15614         /* FALLTHRU */
15615       else
15616         return;
15617
15618     case 'R':
15619       /* X is a CR register.  Print the mask for `mtcrf'.  */
15620       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15621         output_operand_lossage ("invalid %%R value");
15622       else
15623         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
15624       return;
15625
15626     case 's':
15627       /* Low 5 bits of 32 - value */
15628       if (! INT_P (x))
15629         output_operand_lossage ("invalid %%s value");
15630       else
15631         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
15632       return;
15633
15634     case 'S':
15635       /* PowerPC64 mask position.  All 0's is excluded.
15636          CONST_INT 32-bit mask is considered sign-extended so any
15637          transition must occur within the CONST_INT, not on the boundary.  */
15638       if (! mask64_operand (x, DImode))
15639         output_operand_lossage ("invalid %%S value");
15640
15641       uval = INT_LOWPART (x);
15642
15643       if (uval & 1)     /* Clear Left */
15644         {
15645 #if HOST_BITS_PER_WIDE_INT > 64
15646           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15647 #endif
15648           i = 64;
15649         }
15650       else              /* Clear Right */
15651         {
15652           uval = ~uval;
15653 #if HOST_BITS_PER_WIDE_INT > 64
15654           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15655 #endif
15656           i = 63;
15657         }
15658       while (uval != 0)
15659         --i, uval >>= 1;
15660       gcc_assert (i >= 0);
15661       fprintf (file, "%d", i);
15662       return;
15663
15664     case 't':
15665       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
15666       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
15667
15668       /* Bit 3 is OV bit.  */
15669       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
15670
15671       /* If we want bit 31, write a shift count of zero, not 32.  */
15672       fprintf (file, "%d", i == 31 ? 0 : i + 1);
15673       return;
15674
15675     case 'T':
15676       /* Print the symbolic name of a branch target register.  */
15677       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
15678                                   && REGNO (x) != CTR_REGNO))
15679         output_operand_lossage ("invalid %%T value");
15680       else if (REGNO (x) == LR_REGNO)
15681         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
15682       else
15683         fputs ("ctr", file);
15684       return;
15685
15686     case 'u':
15687       /* High-order 16 bits of constant for use in unsigned operand.  */
15688       if (! INT_P (x))
15689         output_operand_lossage ("invalid %%u value");
15690       else
15691         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15692                  (INT_LOWPART (x) >> 16) & 0xffff);
15693       return;
15694
15695     case 'v':
15696       /* High-order 16 bits of constant for use in signed operand.  */
15697       if (! INT_P (x))
15698         output_operand_lossage ("invalid %%v value");
15699       else
15700         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15701                  (INT_LOWPART (x) >> 16) & 0xffff);
15702       return;
15703
15704     case 'U':
15705       /* Print `u' if this has an auto-increment or auto-decrement.  */
15706       if (GET_CODE (x) == MEM
15707           && (GET_CODE (XEXP (x, 0)) == PRE_INC
15708               || GET_CODE (XEXP (x, 0)) == PRE_DEC
15709               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
15710         putc ('u', file);
15711       return;
15712
15713     case 'V':
15714       /* Print the trap code for this operand.  */
15715       switch (GET_CODE (x))
15716         {
15717         case EQ:
15718           fputs ("eq", file);   /* 4 */
15719           break;
15720         case NE:
15721           fputs ("ne", file);   /* 24 */
15722           break;
15723         case LT:
15724           fputs ("lt", file);   /* 16 */
15725           break;
15726         case LE:
15727           fputs ("le", file);   /* 20 */
15728           break;
15729         case GT:
15730           fputs ("gt", file);   /* 8 */
15731           break;
15732         case GE:
15733           fputs ("ge", file);   /* 12 */
15734           break;
15735         case LTU:
15736           fputs ("llt", file);  /* 2 */
15737           break;
15738         case LEU:
15739           fputs ("lle", file);  /* 6 */
15740           break;
15741         case GTU:
15742           fputs ("lgt", file);  /* 1 */
15743           break;
15744         case GEU:
15745           fputs ("lge", file);  /* 5 */
15746           break;
15747         default:
15748           gcc_unreachable ();
15749         }
15750       break;
15751
15752     case 'w':
15753       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
15754          normally.  */
15755       if (INT_P (x))
15756         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
15757                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
15758       else
15759         print_operand (file, x, 0);
15760       return;
15761
15762     case 'W':
15763       /* MB value for a PowerPC64 rldic operand.  */
15764       val = (GET_CODE (x) == CONST_INT
15765              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
15766
15767       if (val < 0)
15768         i = -1;
15769       else
15770         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
15771           if ((val <<= 1) < 0)
15772             break;
15773
15774 #if HOST_BITS_PER_WIDE_INT == 32
15775       if (GET_CODE (x) == CONST_INT && i >= 0)
15776         i += 32;  /* zero-extend high-part was all 0's */
15777       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
15778         {
15779           val = CONST_DOUBLE_LOW (x);
15780
15781           gcc_assert (val);
15782           if (val < 0)
15783             --i;
15784           else
15785             for ( ; i < 64; i++)
15786               if ((val <<= 1) < 0)
15787                 break;
15788         }
15789 #endif
15790
15791       fprintf (file, "%d", i + 1);
15792       return;
15793
15794     case 'x':
15795       /* X is a FPR or Altivec register used in a VSX context.  */
15796       if (GET_CODE (x) != REG || !VSX_REGNO_P (REGNO (x)))
15797         output_operand_lossage ("invalid %%x value");
15798       else
15799         {
15800           int reg = REGNO (x);
15801           int vsx_reg = (FP_REGNO_P (reg)
15802                          ? reg - 32
15803                          : reg - FIRST_ALTIVEC_REGNO + 32);
15804
15805 #ifdef TARGET_REGNAMES      
15806           if (TARGET_REGNAMES)
15807             fprintf (file, "%%vs%d", vsx_reg);
15808           else
15809 #endif
15810             fprintf (file, "%d", vsx_reg);
15811         }
15812       return;
15813
15814     case 'X':
15815       if (GET_CODE (x) == MEM
15816           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
15817               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
15818                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
15819         putc ('x', file);
15820       return;
15821
15822     case 'Y':
15823       /* Like 'L', for third word of TImode  */
15824       if (GET_CODE (x) == REG)
15825         fputs (reg_names[REGNO (x) + 2], file);
15826       else if (GET_CODE (x) == MEM)
15827         {
15828           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15829               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15830             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15831           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15832             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15833           else
15834             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
15835           if (small_data_operand (x, GET_MODE (x)))
15836             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15837                      reg_names[SMALL_DATA_REG]);
15838         }
15839       return;
15840
15841     case 'z':
15842       /* X is a SYMBOL_REF.  Write out the name preceded by a
15843          period and without any trailing data in brackets.  Used for function
15844          names.  If we are configured for System V (or the embedded ABI) on
15845          the PowerPC, do not emit the period, since those systems do not use
15846          TOCs and the like.  */
15847       gcc_assert (GET_CODE (x) == SYMBOL_REF);
15848
15849       /* Mark the decl as referenced so that cgraph will output the
15850          function.  */
15851       if (SYMBOL_REF_DECL (x))
15852         mark_decl_referenced (SYMBOL_REF_DECL (x));
15853
15854       /* For macho, check to see if we need a stub.  */
15855       if (TARGET_MACHO)
15856         {
15857           const char *name = XSTR (x, 0);
15858 #if TARGET_MACHO
15859           if (darwin_emit_branch_islands
15860               && MACHOPIC_INDIRECT
15861               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
15862             name = machopic_indirection_name (x, /*stub_p=*/true);
15863 #endif
15864           assemble_name (file, name);
15865         }
15866       else if (!DOT_SYMBOLS)
15867         assemble_name (file, XSTR (x, 0));
15868       else
15869         rs6000_output_function_entry (file, XSTR (x, 0));
15870       return;
15871
15872     case 'Z':
15873       /* Like 'L', for last word of TImode.  */
15874       if (GET_CODE (x) == REG)
15875         fputs (reg_names[REGNO (x) + 3], file);
15876       else if (GET_CODE (x) == MEM)
15877         {
15878           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15879               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15880             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15881           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15882             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15883           else
15884             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
15885           if (small_data_operand (x, GET_MODE (x)))
15886             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15887                      reg_names[SMALL_DATA_REG]);
15888         }
15889       return;
15890
15891       /* Print AltiVec or SPE memory operand.  */
15892     case 'y':
15893       {
15894         rtx tmp;
15895
15896         gcc_assert (GET_CODE (x) == MEM);
15897
15898         tmp = XEXP (x, 0);
15899
15900         /* Ugly hack because %y is overloaded.  */
15901         if ((TARGET_SPE || TARGET_E500_DOUBLE)
15902             && (GET_MODE_SIZE (GET_MODE (x)) == 8
15903                 || GET_MODE (x) == TFmode
15904                 || GET_MODE (x) == TImode))
15905           {
15906             /* Handle [reg].  */
15907             if (GET_CODE (tmp) == REG)
15908               {
15909                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
15910                 break;
15911               }
15912             /* Handle [reg+UIMM].  */
15913             else if (GET_CODE (tmp) == PLUS &&
15914                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
15915               {
15916                 int x;
15917
15918                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
15919
15920                 x = INTVAL (XEXP (tmp, 1));
15921                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
15922                 break;
15923               }
15924
15925             /* Fall through.  Must be [reg+reg].  */
15926           }
15927         if (VECTOR_MEM_ALTIVEC_P (GET_MODE (x))
15928             && GET_CODE (tmp) == AND
15929             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
15930             && INTVAL (XEXP (tmp, 1)) == -16)
15931           tmp = XEXP (tmp, 0);
15932         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
15933                  && GET_CODE (tmp) == PRE_MODIFY)
15934           tmp = XEXP (tmp, 1);
15935         if (GET_CODE (tmp) == REG)
15936           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
15937         else
15938           {
15939             if (!GET_CODE (tmp) == PLUS
15940                 || !REG_P (XEXP (tmp, 0))
15941                 || !REG_P (XEXP (tmp, 1)))
15942               {
15943                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
15944                 break;
15945               }
15946
15947             if (REGNO (XEXP (tmp, 0)) == 0)
15948               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
15949                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
15950             else
15951               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
15952                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
15953           }
15954         break;
15955       }
15956
15957     case 0:
15958       if (GET_CODE (x) == REG)
15959         fprintf (file, "%s", reg_names[REGNO (x)]);
15960       else if (GET_CODE (x) == MEM)
15961         {
15962           /* We need to handle PRE_INC and PRE_DEC here, since we need to
15963              know the width from the mode.  */
15964           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
15965             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
15966                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15967           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
15968             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
15969                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15970           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15971             output_address (XEXP (XEXP (x, 0), 1));
15972           else
15973             output_address (XEXP (x, 0));
15974         }
15975       else
15976         output_addr_const (file, x);
15977       return;
15978
15979     case '&':
15980       assemble_name (file, rs6000_get_some_local_dynamic_name ());
15981       return;
15982
15983     default:
15984       output_operand_lossage ("invalid %%xn code");
15985     }
15986 }
15987 \f
15988 /* Print the address of an operand.  */
15989
15990 void
15991 print_operand_address (FILE *file, rtx x)
15992 {
15993   if (GET_CODE (x) == REG)
15994     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
15995   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
15996            || GET_CODE (x) == LABEL_REF)
15997     {
15998       output_addr_const (file, x);
15999       if (small_data_operand (x, GET_MODE (x)))
16000         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16001                  reg_names[SMALL_DATA_REG]);
16002       else
16003         gcc_assert (!TARGET_TOC);
16004     }
16005   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
16006     {
16007       gcc_assert (REG_P (XEXP (x, 0)));
16008       if (REGNO (XEXP (x, 0)) == 0)
16009         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
16010                  reg_names[ REGNO (XEXP (x, 0)) ]);
16011       else
16012         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
16013                  reg_names[ REGNO (XEXP (x, 1)) ]);
16014     }
16015   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
16016     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
16017              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
16018 #if TARGET_MACHO
16019   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
16020            && CONSTANT_P (XEXP (x, 1)))
16021     {
16022       fprintf (file, "lo16(");
16023       output_addr_const (file, XEXP (x, 1));
16024       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16025     }
16026 #endif
16027   else if (legitimate_constant_pool_address_p (x, true))
16028     {
16029       /* This hack along with a corresponding hack in
16030          rs6000_output_addr_const_extra arranges to output addends
16031          where the assembler expects to find them.  eg.
16032          (lo_sum (reg 9)
16033          .       (const (plus (unspec [symbol_ref ("x") tocrel]) 8)))
16034          without this hack would be output as "x@toc+8@l(9)".  We
16035          want "x+8@toc@l(9)".  */
16036       output_addr_const (file, tocrel_base);
16037       if (GET_CODE (x) == LO_SUM)
16038         fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16039       else
16040         fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
16041     }
16042 #if TARGET_ELF
16043   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
16044            && CONSTANT_P (XEXP (x, 1)))
16045     {
16046       output_addr_const (file, XEXP (x, 1));
16047       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16048     }
16049 #endif
16050   else
16051     gcc_unreachable ();
16052 }
16053 \f
16054 /* Implement TARGET_OUTPUT_ADDR_CONST_EXTRA.  */
16055
16056 static bool
16057 rs6000_output_addr_const_extra (FILE *file, rtx x)
16058 {
16059   if (GET_CODE (x) == UNSPEC)
16060     switch (XINT (x, 1))
16061       {
16062       case UNSPEC_TOCREL:
16063         gcc_assert (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF);
16064         output_addr_const (file, XVECEXP (x, 0, 0));
16065         if (x == tocrel_base && tocrel_offset != const0_rtx)
16066           {
16067             if (INTVAL (tocrel_offset) >= 0)
16068               fprintf (file, "+");
16069             output_addr_const (file, tocrel_offset);
16070           }
16071         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
16072           {
16073             putc ('-', file);
16074             assemble_name (file, toc_label_name);
16075           }
16076         else if (TARGET_ELF)
16077           fputs ("@toc", file);
16078         return true;
16079
16080 #if TARGET_MACHO
16081       case UNSPEC_MACHOPIC_OFFSET:
16082         output_addr_const (file, XVECEXP (x, 0, 0));
16083         putc ('-', file);
16084         machopic_output_function_base_name (file);
16085         return true;
16086 #endif
16087       }
16088   return false;
16089 }
16090 \f
16091 /* Target hook for assembling integer objects.  The PowerPC version has
16092    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
16093    is defined.  It also needs to handle DI-mode objects on 64-bit
16094    targets.  */
16095
16096 static bool
16097 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
16098 {
16099 #ifdef RELOCATABLE_NEEDS_FIXUP
16100   /* Special handling for SI values.  */
16101   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
16102     {
16103       static int recurse = 0;
16104
16105       /* For -mrelocatable, we mark all addresses that need to be fixed up
16106          in the .fixup section.  */
16107       if (TARGET_RELOCATABLE
16108           && in_section != toc_section
16109           && in_section != text_section
16110           && !unlikely_text_section_p (in_section)
16111           && !recurse
16112           && GET_CODE (x) != CONST_INT
16113           && GET_CODE (x) != CONST_DOUBLE
16114           && CONSTANT_P (x))
16115         {
16116           char buf[256];
16117
16118           recurse = 1;
16119           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
16120           fixuplabelno++;
16121           ASM_OUTPUT_LABEL (asm_out_file, buf);
16122           fprintf (asm_out_file, "\t.long\t(");
16123           output_addr_const (asm_out_file, x);
16124           fprintf (asm_out_file, ")@fixup\n");
16125           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
16126           ASM_OUTPUT_ALIGN (asm_out_file, 2);
16127           fprintf (asm_out_file, "\t.long\t");
16128           assemble_name (asm_out_file, buf);
16129           fprintf (asm_out_file, "\n\t.previous\n");
16130           recurse = 0;
16131           return true;
16132         }
16133       /* Remove initial .'s to turn a -mcall-aixdesc function
16134          address into the address of the descriptor, not the function
16135          itself.  */
16136       else if (GET_CODE (x) == SYMBOL_REF
16137                && XSTR (x, 0)[0] == '.'
16138                && DEFAULT_ABI == ABI_AIX)
16139         {
16140           const char *name = XSTR (x, 0);
16141           while (*name == '.')
16142             name++;
16143
16144           fprintf (asm_out_file, "\t.long\t%s\n", name);
16145           return true;
16146         }
16147     }
16148 #endif /* RELOCATABLE_NEEDS_FIXUP */
16149   return default_assemble_integer (x, size, aligned_p);
16150 }
16151
16152 #ifdef HAVE_GAS_HIDDEN
16153 /* Emit an assembler directive to set symbol visibility for DECL to
16154    VISIBILITY_TYPE.  */
16155
16156 static void
16157 rs6000_assemble_visibility (tree decl, int vis)
16158 {
16159   /* Functions need to have their entry point symbol visibility set as
16160      well as their descriptor symbol visibility.  */
16161   if (DEFAULT_ABI == ABI_AIX
16162       && DOT_SYMBOLS
16163       && TREE_CODE (decl) == FUNCTION_DECL)
16164     {
16165       static const char * const visibility_types[] = {
16166         NULL, "internal", "hidden", "protected"
16167       };
16168
16169       const char *name, *type;
16170
16171       name = ((* targetm.strip_name_encoding)
16172               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
16173       type = visibility_types[vis];
16174
16175       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
16176       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
16177     }
16178   else
16179     default_assemble_visibility (decl, vis);
16180 }
16181 #endif
16182 \f
16183 enum rtx_code
16184 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
16185 {
16186   /* Reversal of FP compares takes care -- an ordered compare
16187      becomes an unordered compare and vice versa.  */
16188   if (mode == CCFPmode
16189       && (!flag_finite_math_only
16190           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
16191           || code == UNEQ || code == LTGT))
16192     return reverse_condition_maybe_unordered (code);
16193   else
16194     return reverse_condition (code);
16195 }
16196
16197 /* Generate a compare for CODE.  Return a brand-new rtx that
16198    represents the result of the compare.  */
16199
16200 static rtx
16201 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
16202 {
16203   enum machine_mode comp_mode;
16204   rtx compare_result;
16205   enum rtx_code code = GET_CODE (cmp);
16206   rtx op0 = XEXP (cmp, 0);
16207   rtx op1 = XEXP (cmp, 1);
16208
16209   if (FLOAT_MODE_P (mode))
16210     comp_mode = CCFPmode;
16211   else if (code == GTU || code == LTU
16212            || code == GEU || code == LEU)
16213     comp_mode = CCUNSmode;
16214   else if ((code == EQ || code == NE)
16215            && GET_CODE (op0) == SUBREG
16216            && GET_CODE (op1) == SUBREG
16217            && SUBREG_PROMOTED_UNSIGNED_P (op0)
16218            && SUBREG_PROMOTED_UNSIGNED_P (op1))
16219     /* These are unsigned values, perhaps there will be a later
16220        ordering compare that can be shared with this one.
16221        Unfortunately we cannot detect the signedness of the operands
16222        for non-subregs.  */
16223     comp_mode = CCUNSmode;
16224   else
16225     comp_mode = CCmode;
16226
16227   /* First, the compare.  */
16228   compare_result = gen_reg_rtx (comp_mode);
16229
16230   /* E500 FP compare instructions on the GPRs.  Yuck!  */
16231   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
16232       && FLOAT_MODE_P (mode))
16233     {
16234       rtx cmp, or_result, compare_result2;
16235       enum machine_mode op_mode = GET_MODE (op0);
16236
16237       if (op_mode == VOIDmode)
16238         op_mode = GET_MODE (op1);
16239
16240       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
16241          This explains the following mess.  */
16242
16243       switch (code)
16244         {
16245         case EQ: case UNEQ: case NE: case LTGT:
16246           switch (op_mode)
16247             {
16248             case SFmode:
16249               cmp = (flag_finite_math_only && !flag_trapping_math)
16250                 ? gen_tstsfeq_gpr (compare_result, op0, op1)
16251                 : gen_cmpsfeq_gpr (compare_result, op0, op1);
16252               break;
16253
16254             case DFmode:
16255               cmp = (flag_finite_math_only && !flag_trapping_math)
16256                 ? gen_tstdfeq_gpr (compare_result, op0, op1)
16257                 : gen_cmpdfeq_gpr (compare_result, op0, op1);
16258               break;
16259
16260             case TFmode:
16261               cmp = (flag_finite_math_only && !flag_trapping_math)
16262                 ? gen_tsttfeq_gpr (compare_result, op0, op1)
16263                 : gen_cmptfeq_gpr (compare_result, op0, op1);
16264               break;
16265
16266             default:
16267               gcc_unreachable ();
16268             }
16269           break;
16270
16271         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
16272           switch (op_mode)
16273             {
16274             case SFmode:
16275               cmp = (flag_finite_math_only && !flag_trapping_math)
16276                 ? gen_tstsfgt_gpr (compare_result, op0, op1)
16277                 : gen_cmpsfgt_gpr (compare_result, op0, op1);
16278               break;
16279
16280             case DFmode:
16281               cmp = (flag_finite_math_only && !flag_trapping_math)
16282                 ? gen_tstdfgt_gpr (compare_result, op0, op1)
16283                 : gen_cmpdfgt_gpr (compare_result, op0, op1);
16284               break;
16285
16286             case TFmode:
16287               cmp = (flag_finite_math_only && !flag_trapping_math)
16288                 ? gen_tsttfgt_gpr (compare_result, op0, op1)
16289                 : gen_cmptfgt_gpr (compare_result, op0, op1);
16290               break;
16291
16292             default:
16293               gcc_unreachable ();
16294             }
16295           break;
16296
16297         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
16298           switch (op_mode)
16299             {
16300             case SFmode:
16301               cmp = (flag_finite_math_only && !flag_trapping_math)
16302                 ? gen_tstsflt_gpr (compare_result, op0, op1)
16303                 : gen_cmpsflt_gpr (compare_result, op0, op1);
16304               break;
16305
16306             case DFmode:
16307               cmp = (flag_finite_math_only && !flag_trapping_math)
16308                 ? gen_tstdflt_gpr (compare_result, op0, op1)
16309                 : gen_cmpdflt_gpr (compare_result, op0, op1);
16310               break;
16311
16312             case TFmode:
16313               cmp = (flag_finite_math_only && !flag_trapping_math)
16314                 ? gen_tsttflt_gpr (compare_result, op0, op1)
16315                 : gen_cmptflt_gpr (compare_result, op0, op1);
16316               break;
16317
16318             default:
16319               gcc_unreachable ();
16320             }
16321           break;
16322         default:
16323           gcc_unreachable ();
16324         }
16325
16326       /* Synthesize LE and GE from LT/GT || EQ.  */
16327       if (code == LE || code == GE || code == LEU || code == GEU)
16328         {
16329           emit_insn (cmp);
16330
16331           switch (code)
16332             {
16333             case LE: code = LT; break;
16334             case GE: code = GT; break;
16335             case LEU: code = LT; break;
16336             case GEU: code = GT; break;
16337             default: gcc_unreachable ();
16338             }
16339
16340           compare_result2 = gen_reg_rtx (CCFPmode);
16341
16342           /* Do the EQ.  */
16343           switch (op_mode)
16344             {
16345             case SFmode:
16346               cmp = (flag_finite_math_only && !flag_trapping_math)
16347                 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
16348                 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
16349               break;
16350
16351             case DFmode:
16352               cmp = (flag_finite_math_only && !flag_trapping_math)
16353                 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
16354                 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
16355               break;
16356
16357             case TFmode:
16358               cmp = (flag_finite_math_only && !flag_trapping_math)
16359                 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
16360                 : gen_cmptfeq_gpr (compare_result2, op0, op1);
16361               break;
16362
16363             default:
16364               gcc_unreachable ();
16365             }
16366           emit_insn (cmp);
16367
16368           /* OR them together.  */
16369           or_result = gen_reg_rtx (CCFPmode);
16370           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
16371                                            compare_result2);
16372           compare_result = or_result;
16373           code = EQ;
16374         }
16375       else
16376         {
16377           if (code == NE || code == LTGT)
16378             code = NE;
16379           else
16380             code = EQ;
16381         }
16382
16383       emit_insn (cmp);
16384     }
16385   else
16386     {
16387       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
16388          CLOBBERs to match cmptf_internal2 pattern.  */
16389       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
16390           && GET_MODE (op0) == TFmode
16391           && !TARGET_IEEEQUAD
16392           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
16393         emit_insn (gen_rtx_PARALLEL (VOIDmode,
16394           gen_rtvec (10,
16395                      gen_rtx_SET (VOIDmode,
16396                                   compare_result,
16397                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
16398                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16399                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16400                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16401                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16402                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16403                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16404                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16405                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16406                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
16407       else if (GET_CODE (op1) == UNSPEC
16408                && XINT (op1, 1) == UNSPEC_SP_TEST)
16409         {
16410           rtx op1b = XVECEXP (op1, 0, 0);
16411           comp_mode = CCEQmode;
16412           compare_result = gen_reg_rtx (CCEQmode);
16413           if (TARGET_64BIT)
16414             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
16415           else
16416             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
16417         }
16418       else
16419         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
16420                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
16421     }
16422
16423   /* Some kinds of FP comparisons need an OR operation;
16424      under flag_finite_math_only we don't bother.  */
16425   if (FLOAT_MODE_P (mode)
16426       && !flag_finite_math_only
16427       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
16428       && (code == LE || code == GE
16429           || code == UNEQ || code == LTGT
16430           || code == UNGT || code == UNLT))
16431     {
16432       enum rtx_code or1, or2;
16433       rtx or1_rtx, or2_rtx, compare2_rtx;
16434       rtx or_result = gen_reg_rtx (CCEQmode);
16435
16436       switch (code)
16437         {
16438         case LE: or1 = LT;  or2 = EQ;  break;
16439         case GE: or1 = GT;  or2 = EQ;  break;
16440         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
16441         case LTGT: or1 = LT;  or2 = GT;  break;
16442         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
16443         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
16444         default:  gcc_unreachable ();
16445         }
16446       validate_condition_mode (or1, comp_mode);
16447       validate_condition_mode (or2, comp_mode);
16448       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
16449       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
16450       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
16451                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
16452                                       const_true_rtx);
16453       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
16454
16455       compare_result = or_result;
16456       code = EQ;
16457     }
16458
16459   validate_condition_mode (code, GET_MODE (compare_result));
16460
16461   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
16462 }
16463
16464
16465 /* Emit the RTL for an sISEL pattern.  */
16466
16467 void
16468 rs6000_emit_sISEL (enum machine_mode mode ATTRIBUTE_UNUSED, rtx operands[])
16469 {
16470   rs6000_emit_int_cmove (operands[0], operands[1], const1_rtx, const0_rtx);
16471 }
16472
16473 void
16474 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
16475 {
16476   rtx condition_rtx;
16477   enum machine_mode op_mode;
16478   enum rtx_code cond_code;
16479   rtx result = operands[0];
16480
16481   if (TARGET_ISEL && (mode == SImode || mode == DImode))
16482     {
16483       rs6000_emit_sISEL (mode, operands);
16484       return;
16485     }
16486
16487   condition_rtx = rs6000_generate_compare (operands[1], mode);
16488   cond_code = GET_CODE (condition_rtx);
16489
16490   if (FLOAT_MODE_P (mode)
16491       && !TARGET_FPRS && TARGET_HARD_FLOAT)
16492     {
16493       rtx t;
16494
16495       PUT_MODE (condition_rtx, SImode);
16496       t = XEXP (condition_rtx, 0);
16497
16498       gcc_assert (cond_code == NE || cond_code == EQ);
16499
16500       if (cond_code == NE)
16501         emit_insn (gen_e500_flip_gt_bit (t, t));
16502
16503       emit_insn (gen_move_from_CR_gt_bit (result, t));
16504       return;
16505     }
16506
16507   if (cond_code == NE
16508       || cond_code == GE || cond_code == LE
16509       || cond_code == GEU || cond_code == LEU
16510       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
16511     {
16512       rtx not_result = gen_reg_rtx (CCEQmode);
16513       rtx not_op, rev_cond_rtx;
16514       enum machine_mode cc_mode;
16515
16516       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
16517
16518       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
16519                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
16520       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
16521       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
16522       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
16523     }
16524
16525   op_mode = GET_MODE (XEXP (operands[1], 0));
16526   if (op_mode == VOIDmode)
16527     op_mode = GET_MODE (XEXP (operands[1], 1));
16528
16529   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
16530     {
16531       PUT_MODE (condition_rtx, DImode);
16532       convert_move (result, condition_rtx, 0);
16533     }
16534   else
16535     {
16536       PUT_MODE (condition_rtx, SImode);
16537       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
16538     }
16539 }
16540
16541 /* Emit a branch of kind CODE to location LOC.  */
16542
16543 void
16544 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
16545 {
16546   rtx condition_rtx, loc_ref;
16547
16548   condition_rtx = rs6000_generate_compare (operands[0], mode);
16549   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
16550   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
16551                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
16552                                                      loc_ref, pc_rtx)));
16553 }
16554
16555 /* Return the string to output a conditional branch to LABEL, which is
16556    the operand number of the label, or -1 if the branch is really a
16557    conditional return.
16558
16559    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
16560    condition code register and its mode specifies what kind of
16561    comparison we made.
16562
16563    REVERSED is nonzero if we should reverse the sense of the comparison.
16564
16565    INSN is the insn.  */
16566
16567 char *
16568 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
16569 {
16570   static char string[64];
16571   enum rtx_code code = GET_CODE (op);
16572   rtx cc_reg = XEXP (op, 0);
16573   enum machine_mode mode = GET_MODE (cc_reg);
16574   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
16575   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
16576   int really_reversed = reversed ^ need_longbranch;
16577   char *s = string;
16578   const char *ccode;
16579   const char *pred;
16580   rtx note;
16581
16582   validate_condition_mode (code, mode);
16583
16584   /* Work out which way this really branches.  We could use
16585      reverse_condition_maybe_unordered here always but this
16586      makes the resulting assembler clearer.  */
16587   if (really_reversed)
16588     {
16589       /* Reversal of FP compares takes care -- an ordered compare
16590          becomes an unordered compare and vice versa.  */
16591       if (mode == CCFPmode)
16592         code = reverse_condition_maybe_unordered (code);
16593       else
16594         code = reverse_condition (code);
16595     }
16596
16597   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
16598     {
16599       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
16600          to the GT bit.  */
16601       switch (code)
16602         {
16603         case EQ:
16604           /* Opposite of GT.  */
16605           code = GT;
16606           break;
16607
16608         case NE:
16609           code = UNLE;
16610           break;
16611
16612         default:
16613           gcc_unreachable ();
16614         }
16615     }
16616
16617   switch (code)
16618     {
16619       /* Not all of these are actually distinct opcodes, but
16620          we distinguish them for clarity of the resulting assembler.  */
16621     case NE: case LTGT:
16622       ccode = "ne"; break;
16623     case EQ: case UNEQ:
16624       ccode = "eq"; break;
16625     case GE: case GEU:
16626       ccode = "ge"; break;
16627     case GT: case GTU: case UNGT:
16628       ccode = "gt"; break;
16629     case LE: case LEU:
16630       ccode = "le"; break;
16631     case LT: case LTU: case UNLT:
16632       ccode = "lt"; break;
16633     case UNORDERED: ccode = "un"; break;
16634     case ORDERED: ccode = "nu"; break;
16635     case UNGE: ccode = "nl"; break;
16636     case UNLE: ccode = "ng"; break;
16637     default:
16638       gcc_unreachable ();
16639     }
16640
16641   /* Maybe we have a guess as to how likely the branch is.
16642      The old mnemonics don't have a way to specify this information.  */
16643   pred = "";
16644   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
16645   if (note != NULL_RTX)
16646     {
16647       /* PROB is the difference from 50%.  */
16648       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
16649
16650       /* Only hint for highly probable/improbable branches on newer
16651          cpus as static prediction overrides processor dynamic
16652          prediction.  For older cpus we may as well always hint, but
16653          assume not taken for branches that are very close to 50% as a
16654          mispredicted taken branch is more expensive than a
16655          mispredicted not-taken branch.  */
16656       if (rs6000_always_hint
16657           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
16658               && br_prob_note_reliable_p (note)))
16659         {
16660           if (abs (prob) > REG_BR_PROB_BASE / 20
16661               && ((prob > 0) ^ need_longbranch))
16662             pred = "+";
16663           else
16664             pred = "-";
16665         }
16666     }
16667
16668   if (label == NULL)
16669     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
16670   else
16671     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
16672
16673   /* We need to escape any '%' characters in the reg_names string.
16674      Assume they'd only be the first character....  */
16675   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
16676     *s++ = '%';
16677   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
16678
16679   if (label != NULL)
16680     {
16681       /* If the branch distance was too far, we may have to use an
16682          unconditional branch to go the distance.  */
16683       if (need_longbranch)
16684         s += sprintf (s, ",$+8\n\tb %s", label);
16685       else
16686         s += sprintf (s, ",%s", label);
16687     }
16688
16689   return string;
16690 }
16691
16692 /* Return the string to flip the GT bit on a CR.  */
16693 char *
16694 output_e500_flip_gt_bit (rtx dst, rtx src)
16695 {
16696   static char string[64];
16697   int a, b;
16698
16699   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
16700               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
16701
16702   /* GT bit.  */
16703   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
16704   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
16705
16706   sprintf (string, "crnot %d,%d", a, b);
16707   return string;
16708 }
16709
16710 /* Return insn for VSX or Altivec comparisons.  */
16711
16712 static rtx
16713 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
16714 {
16715   rtx mask;
16716   enum machine_mode mode = GET_MODE (op0);
16717
16718   switch (code)
16719     {
16720     default:
16721       break;
16722
16723     case GE:
16724       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
16725         return NULL_RTX;
16726
16727     case EQ:
16728     case GT:
16729     case GTU:
16730       mask = gen_reg_rtx (mode);
16731       emit_insn (gen_rtx_SET (VOIDmode,
16732                               mask,
16733                               gen_rtx_fmt_ee (code, mode, op0, op1)));
16734       return mask;
16735     }
16736
16737   return NULL_RTX;
16738 }
16739
16740 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
16741    DMODE is expected destination mode. This is a recursive function.  */
16742
16743 static rtx
16744 rs6000_emit_vector_compare (enum rtx_code rcode,
16745                             rtx op0, rtx op1,
16746                             enum machine_mode dmode)
16747 {
16748   rtx mask;
16749   bool swap_operands = false;
16750   bool try_again = false;
16751
16752   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
16753   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
16754
16755   /* See if the comparison works as is.  */
16756   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16757   if (mask)
16758     return mask;
16759
16760   switch (rcode)
16761     {
16762     case LT:
16763       rcode = GT;
16764       swap_operands = true;
16765       try_again = true;
16766       break;
16767     case LTU:
16768       rcode = GTU;
16769       swap_operands = true;
16770       try_again = true;
16771       break;
16772     case NE:
16773     case UNLE:
16774     case UNLT:
16775     case UNGE:
16776     case UNGT:
16777       /* Invert condition and try again.
16778          e.g., A != B becomes ~(A==B).  */
16779       {
16780         enum rtx_code rev_code;
16781         enum insn_code nor_code;
16782         rtx mask2;
16783
16784         rev_code = reverse_condition_maybe_unordered (rcode);
16785         if (rev_code == UNKNOWN)
16786           return NULL_RTX;
16787
16788         nor_code = optab_handler (one_cmpl_optab, dmode);
16789         if (nor_code == CODE_FOR_nothing)
16790           return NULL_RTX;
16791
16792         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
16793         if (!mask2)
16794           return NULL_RTX;
16795
16796         mask = gen_reg_rtx (dmode);
16797         emit_insn (GEN_FCN (nor_code) (mask, mask2));
16798         return mask;
16799       }
16800       break;
16801     case GE:
16802     case GEU:
16803     case LE:
16804     case LEU:
16805       /* Try GT/GTU/LT/LTU OR EQ */
16806       {
16807         rtx c_rtx, eq_rtx;
16808         enum insn_code ior_code;
16809         enum rtx_code new_code;
16810
16811         switch (rcode)
16812           {
16813           case  GE:
16814             new_code = GT;
16815             break;
16816
16817           case GEU:
16818             new_code = GTU;
16819             break;
16820
16821           case LE:
16822             new_code = LT;
16823             break;
16824
16825           case LEU:
16826             new_code = LTU;
16827             break;
16828
16829           default:
16830             gcc_unreachable ();
16831           }
16832
16833         ior_code = optab_handler (ior_optab, dmode);
16834         if (ior_code == CODE_FOR_nothing)
16835           return NULL_RTX;
16836
16837         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
16838         if (!c_rtx)
16839           return NULL_RTX;
16840
16841         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
16842         if (!eq_rtx)
16843           return NULL_RTX;
16844
16845         mask = gen_reg_rtx (dmode);
16846         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
16847         return mask;
16848       }
16849       break;
16850     default:
16851       return NULL_RTX;
16852     }
16853
16854   if (try_again)
16855     {
16856       if (swap_operands)
16857         {
16858           rtx tmp;
16859           tmp = op0;
16860           op0 = op1;
16861           op1 = tmp;
16862         }
16863
16864       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16865       if (mask)
16866         return mask;
16867     }
16868
16869   /* You only get two chances.  */
16870   return NULL_RTX;
16871 }
16872
16873 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
16874    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
16875    operands for the relation operation COND.  */
16876
16877 int
16878 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
16879                               rtx cond, rtx cc_op0, rtx cc_op1)
16880 {
16881   enum machine_mode dest_mode = GET_MODE (dest);
16882   enum rtx_code rcode = GET_CODE (cond);
16883   enum machine_mode cc_mode = CCmode;
16884   rtx mask;
16885   rtx cond2;
16886   rtx tmp;
16887   bool invert_move = false;
16888
16889   if (VECTOR_UNIT_NONE_P (dest_mode))
16890     return 0;
16891
16892   switch (rcode)
16893     {
16894       /* Swap operands if we can, and fall back to doing the operation as
16895          specified, and doing a NOR to invert the test.  */
16896     case NE:
16897     case UNLE:
16898     case UNLT:
16899     case UNGE:
16900     case UNGT:
16901       /* Invert condition and try again.
16902          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
16903       invert_move = true;
16904       rcode = reverse_condition_maybe_unordered (rcode);
16905       if (rcode == UNKNOWN)
16906         return 0;
16907       break;
16908
16909       /* Mark unsigned tests with CCUNSmode.  */
16910     case GTU:
16911     case GEU:
16912     case LTU:
16913     case LEU:
16914       cc_mode = CCUNSmode;
16915       break;
16916
16917     default:
16918       break;
16919     }
16920
16921   /* Get the vector mask for the given relational operations.  */
16922   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
16923
16924   if (!mask)
16925     return 0;
16926
16927   if (invert_move)
16928     {
16929       tmp = op_true;
16930       op_true = op_false;
16931       op_false = tmp;
16932     }
16933
16934   cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, const0_rtx);
16935   emit_insn (gen_rtx_SET (VOIDmode,
16936                           dest,
16937                           gen_rtx_IF_THEN_ELSE (dest_mode,
16938                                                 cond2,
16939                                                 op_true,
16940                                                 op_false)));
16941   return 1;
16942 }
16943
16944 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
16945    operands of the last comparison is nonzero/true, FALSE_COND if it
16946    is zero/false.  Return 0 if the hardware has no such operation.  */
16947
16948 int
16949 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
16950 {
16951   enum rtx_code code = GET_CODE (op);
16952   rtx op0 = XEXP (op, 0);
16953   rtx op1 = XEXP (op, 1);
16954   REAL_VALUE_TYPE c1;
16955   enum machine_mode compare_mode = GET_MODE (op0);
16956   enum machine_mode result_mode = GET_MODE (dest);
16957   rtx temp;
16958   bool is_against_zero;
16959
16960   /* These modes should always match.  */
16961   if (GET_MODE (op1) != compare_mode
16962       /* In the isel case however, we can use a compare immediate, so
16963          op1 may be a small constant.  */
16964       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
16965     return 0;
16966   if (GET_MODE (true_cond) != result_mode)
16967     return 0;
16968   if (GET_MODE (false_cond) != result_mode)
16969     return 0;
16970
16971   /* First, work out if the hardware can do this at all, or
16972      if it's too slow....  */
16973   if (!FLOAT_MODE_P (compare_mode))
16974     {
16975       if (TARGET_ISEL)
16976         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
16977       return 0;
16978     }
16979   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
16980            && SCALAR_FLOAT_MODE_P (compare_mode))
16981     return 0;
16982
16983   is_against_zero = op1 == CONST0_RTX (compare_mode);
16984
16985   /* A floating-point subtract might overflow, underflow, or produce
16986      an inexact result, thus changing the floating-point flags, so it
16987      can't be generated if we care about that.  It's safe if one side
16988      of the construct is zero, since then no subtract will be
16989      generated.  */
16990   if (SCALAR_FLOAT_MODE_P (compare_mode)
16991       && flag_trapping_math && ! is_against_zero)
16992     return 0;
16993
16994   /* Eliminate half of the comparisons by switching operands, this
16995      makes the remaining code simpler.  */
16996   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
16997       || code == LTGT || code == LT || code == UNLE)
16998     {
16999       code = reverse_condition_maybe_unordered (code);
17000       temp = true_cond;
17001       true_cond = false_cond;
17002       false_cond = temp;
17003     }
17004
17005   /* UNEQ and LTGT take four instructions for a comparison with zero,
17006      it'll probably be faster to use a branch here too.  */
17007   if (code == UNEQ && HONOR_NANS (compare_mode))
17008     return 0;
17009
17010   if (GET_CODE (op1) == CONST_DOUBLE)
17011     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
17012
17013   /* We're going to try to implement comparisons by performing
17014      a subtract, then comparing against zero.  Unfortunately,
17015      Inf - Inf is NaN which is not zero, and so if we don't
17016      know that the operand is finite and the comparison
17017      would treat EQ different to UNORDERED, we can't do it.  */
17018   if (HONOR_INFINITIES (compare_mode)
17019       && code != GT && code != UNGE
17020       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
17021       /* Constructs of the form (a OP b ? a : b) are safe.  */
17022       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
17023           || (! rtx_equal_p (op0, true_cond)
17024               && ! rtx_equal_p (op1, true_cond))))
17025     return 0;
17026
17027   /* At this point we know we can use fsel.  */
17028
17029   /* Reduce the comparison to a comparison against zero.  */
17030   if (! is_against_zero)
17031     {
17032       temp = gen_reg_rtx (compare_mode);
17033       emit_insn (gen_rtx_SET (VOIDmode, temp,
17034                               gen_rtx_MINUS (compare_mode, op0, op1)));
17035       op0 = temp;
17036       op1 = CONST0_RTX (compare_mode);
17037     }
17038
17039   /* If we don't care about NaNs we can reduce some of the comparisons
17040      down to faster ones.  */
17041   if (! HONOR_NANS (compare_mode))
17042     switch (code)
17043       {
17044       case GT:
17045         code = LE;
17046         temp = true_cond;
17047         true_cond = false_cond;
17048         false_cond = temp;
17049         break;
17050       case UNGE:
17051         code = GE;
17052         break;
17053       case UNEQ:
17054         code = EQ;
17055         break;
17056       default:
17057         break;
17058       }
17059
17060   /* Now, reduce everything down to a GE.  */
17061   switch (code)
17062     {
17063     case GE:
17064       break;
17065
17066     case LE:
17067       temp = gen_reg_rtx (compare_mode);
17068       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17069       op0 = temp;
17070       break;
17071
17072     case ORDERED:
17073       temp = gen_reg_rtx (compare_mode);
17074       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
17075       op0 = temp;
17076       break;
17077
17078     case EQ:
17079       temp = gen_reg_rtx (compare_mode);
17080       emit_insn (gen_rtx_SET (VOIDmode, temp,
17081                               gen_rtx_NEG (compare_mode,
17082                                            gen_rtx_ABS (compare_mode, op0))));
17083       op0 = temp;
17084       break;
17085
17086     case UNGE:
17087       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
17088       temp = gen_reg_rtx (result_mode);
17089       emit_insn (gen_rtx_SET (VOIDmode, temp,
17090                               gen_rtx_IF_THEN_ELSE (result_mode,
17091                                                     gen_rtx_GE (VOIDmode,
17092                                                                 op0, op1),
17093                                                     true_cond, false_cond)));
17094       false_cond = true_cond;
17095       true_cond = temp;
17096
17097       temp = gen_reg_rtx (compare_mode);
17098       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17099       op0 = temp;
17100       break;
17101
17102     case GT:
17103       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
17104       temp = gen_reg_rtx (result_mode);
17105       emit_insn (gen_rtx_SET (VOIDmode, temp,
17106                               gen_rtx_IF_THEN_ELSE (result_mode,
17107                                                     gen_rtx_GE (VOIDmode,
17108                                                                 op0, op1),
17109                                                     true_cond, false_cond)));
17110       true_cond = false_cond;
17111       false_cond = temp;
17112
17113       temp = gen_reg_rtx (compare_mode);
17114       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17115       op0 = temp;
17116       break;
17117
17118     default:
17119       gcc_unreachable ();
17120     }
17121
17122   emit_insn (gen_rtx_SET (VOIDmode, dest,
17123                           gen_rtx_IF_THEN_ELSE (result_mode,
17124                                                 gen_rtx_GE (VOIDmode,
17125                                                             op0, op1),
17126                                                 true_cond, false_cond)));
17127   return 1;
17128 }
17129
17130 /* Same as above, but for ints (isel).  */
17131
17132 static int
17133 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17134 {
17135   rtx condition_rtx, cr;
17136   enum machine_mode mode = GET_MODE (dest);
17137   enum rtx_code cond_code;
17138   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
17139   bool signedp;
17140
17141   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
17142     return 0;
17143
17144   /* We still have to do the compare, because isel doesn't do a
17145      compare, it just looks at the CRx bits set by a previous compare
17146      instruction.  */
17147   condition_rtx = rs6000_generate_compare (op, mode);
17148   cond_code = GET_CODE (condition_rtx);
17149   cr = XEXP (condition_rtx, 0);
17150   signedp = GET_MODE (cr) == CCmode;
17151
17152   isel_func = (mode == SImode
17153                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
17154                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
17155
17156   switch (cond_code)
17157     {
17158     case LT: case GT: case LTU: case GTU: case EQ:
17159       /* isel handles these directly.  */
17160       break;
17161
17162     default:
17163       /* We need to swap the sense of the comparison.  */
17164       {
17165         rtx t = true_cond;
17166         true_cond = false_cond;
17167         false_cond = t;
17168         PUT_CODE (condition_rtx, reverse_condition (cond_code));
17169       }
17170       break;
17171     }
17172
17173   false_cond = force_reg (mode, false_cond);
17174   if (true_cond != const0_rtx)
17175     true_cond = force_reg (mode, true_cond);
17176
17177   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
17178
17179   return 1;
17180 }
17181
17182 const char *
17183 output_isel (rtx *operands)
17184 {
17185   enum rtx_code code;
17186
17187   code = GET_CODE (operands[1]);
17188
17189   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
17190     {
17191       gcc_assert (GET_CODE (operands[2]) == REG
17192                   && GET_CODE (operands[3]) == REG);
17193       PUT_CODE (operands[1], reverse_condition (code));
17194       return "isel %0,%3,%2,%j1";
17195     }
17196
17197   return "isel %0,%2,%3,%j1";
17198 }
17199
17200 void
17201 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
17202 {
17203   enum machine_mode mode = GET_MODE (op0);
17204   enum rtx_code c;
17205   rtx target;
17206
17207   /* VSX/altivec have direct min/max insns.  */
17208   if ((code == SMAX || code == SMIN) && VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode))
17209     {
17210       emit_insn (gen_rtx_SET (VOIDmode,
17211                               dest,
17212                               gen_rtx_fmt_ee (code, mode, op0, op1)));
17213       return;
17214     }
17215
17216   if (code == SMAX || code == SMIN)
17217     c = GE;
17218   else
17219     c = GEU;
17220
17221   if (code == SMAX || code == UMAX)
17222     target = emit_conditional_move (dest, c, op0, op1, mode,
17223                                     op0, op1, mode, 0);
17224   else
17225     target = emit_conditional_move (dest, c, op0, op1, mode,
17226                                     op1, op0, mode, 0);
17227   gcc_assert (target);
17228   if (target != dest)
17229     emit_move_insn (dest, target);
17230 }
17231
17232 /* Emit instructions to perform a load-reserved/store-conditional operation.
17233    The operation performed is an atomic
17234    (set M (CODE:MODE M OP))
17235    If not NULL, BEFORE is atomically set to M before the operation, and
17236    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
17237    If SYNC_P then a memory barrier is emitted before the operation.
17238    Either OP or M may be wrapped in a NOT operation.  */
17239
17240 void
17241 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
17242                   rtx m, rtx op, rtx before_param, rtx after_param,
17243                   bool sync_p)
17244 {
17245   enum machine_mode used_mode;
17246   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
17247   rtx used_m;
17248   rtvec vec;
17249   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17250   rtx shift = NULL_RTX;
17251
17252   if (sync_p)
17253     emit_insn (gen_lwsync ());
17254
17255     used_m = m;
17256
17257   /* If this is smaller than SImode, we'll have to use SImode with
17258      adjustments.  */
17259   if (mode == QImode || mode == HImode)
17260     {
17261       rtx newop, oldop;
17262
17263       if (MEM_ALIGN (used_m) >= 32)
17264         {
17265           int ishift = 0;
17266           if (BYTES_BIG_ENDIAN)
17267             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
17268
17269           shift = GEN_INT (ishift);
17270           used_m = change_address (used_m, SImode, 0);
17271         }
17272       else
17273         {
17274           rtx addrSI, aligned_addr;
17275           int shift_mask = mode == QImode ? 0x18 : 0x10;
17276
17277           addrSI = gen_lowpart_common (SImode,
17278                                        force_reg (Pmode, XEXP (used_m, 0)));
17279           addrSI = force_reg (SImode, addrSI);
17280           shift = gen_reg_rtx (SImode);
17281
17282           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17283                                  GEN_INT (shift_mask)));
17284           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17285
17286           aligned_addr = expand_binop (Pmode, and_optab,
17287                                        XEXP (used_m, 0),
17288                                        GEN_INT (-4), NULL_RTX,
17289                                        1, OPTAB_LIB_WIDEN);
17290           used_m = change_address (used_m, SImode, aligned_addr);
17291           set_mem_align (used_m, 32);
17292         }
17293       /* It's safe to keep the old alias set of USED_M, because
17294          the operation is atomic and only affects the original
17295          USED_M.  */
17296       m = used_m;
17297
17298       if (GET_CODE (op) == NOT)
17299         {
17300           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
17301           oldop = gen_rtx_NOT (SImode, oldop);
17302         }
17303       else
17304         oldop = lowpart_subreg (SImode, op, mode);
17305
17306       switch (code)
17307         {
17308         case IOR:
17309         case XOR:
17310           newop = expand_binop (SImode, and_optab,
17311                                 oldop, GEN_INT (imask), NULL_RTX,
17312                                 1, OPTAB_LIB_WIDEN);
17313           emit_insn (gen_ashlsi3 (newop, newop, shift));
17314           break;
17315
17316         case NOT: /* NAND */
17317           newop = expand_binop (SImode, ior_optab,
17318                                 oldop, GEN_INT (~imask), NULL_RTX,
17319                                 1, OPTAB_LIB_WIDEN);
17320           emit_insn (gen_rotlsi3 (newop, newop, shift));
17321           break;
17322
17323         case AND:
17324           newop = expand_binop (SImode, ior_optab,
17325                                 oldop, GEN_INT (~imask), NULL_RTX,
17326                                 1, OPTAB_LIB_WIDEN);
17327           emit_insn (gen_rotlsi3 (newop, newop, shift));
17328           break;
17329
17330         case PLUS:
17331         case MINUS:
17332           {
17333             rtx mask;
17334
17335             newop = expand_binop (SImode, and_optab,
17336                                   oldop, GEN_INT (imask), NULL_RTX,
17337                                   1, OPTAB_LIB_WIDEN);
17338             emit_insn (gen_ashlsi3 (newop, newop, shift));
17339
17340             mask = gen_reg_rtx (SImode);
17341             emit_move_insn (mask, GEN_INT (imask));
17342             emit_insn (gen_ashlsi3 (mask, mask, shift));
17343
17344             if (code == PLUS)
17345               newop = gen_rtx_PLUS (SImode, m, newop);
17346             else
17347               newop = gen_rtx_MINUS (SImode, m, newop);
17348             newop = gen_rtx_AND (SImode, newop, mask);
17349             newop = gen_rtx_IOR (SImode, newop,
17350                                  gen_rtx_AND (SImode,
17351                                               gen_rtx_NOT (SImode, mask),
17352                                               m));
17353             break;
17354           }
17355
17356         default:
17357           gcc_unreachable ();
17358         }
17359
17360       op = newop;
17361       used_mode = SImode;
17362       before = gen_reg_rtx (used_mode);
17363       after = gen_reg_rtx (used_mode);
17364     }
17365   else
17366     {
17367       used_mode = mode;
17368       before = before_param;
17369       after = after_param;
17370
17371       if (before == NULL_RTX)
17372         before = gen_reg_rtx (used_mode);
17373       if (after == NULL_RTX)
17374         after = gen_reg_rtx (used_mode);
17375     }
17376
17377   if ((code == PLUS || code == MINUS)
17378       && used_mode != mode)
17379     the_op = op;  /* Computed above.  */
17380   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
17381     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
17382   else if (code == NOT)
17383     the_op = gen_rtx_fmt_ee (IOR, used_mode,
17384                              gen_rtx_NOT (used_mode, m),
17385                              gen_rtx_NOT (used_mode, op));
17386   else
17387     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
17388
17389   set_after = gen_rtx_SET (VOIDmode, after, the_op);
17390   set_before = gen_rtx_SET (VOIDmode, before, used_m);
17391   set_atomic = gen_rtx_SET (VOIDmode, used_m,
17392                             gen_rtx_UNSPEC (used_mode,
17393                                             gen_rtvec (1, the_op),
17394                                             UNSPEC_SYNC_OP));
17395   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
17396
17397   if ((code == PLUS || code == MINUS) && used_mode != mode)
17398     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
17399                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
17400   else
17401     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
17402   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
17403
17404   /* Shift and mask the return values properly.  */
17405   if (used_mode != mode && before_param)
17406     {
17407       emit_insn (gen_lshrsi3 (before, before, shift));
17408       convert_move (before_param, before, 1);
17409     }
17410
17411   if (used_mode != mode && after_param)
17412     {
17413       emit_insn (gen_lshrsi3 (after, after, shift));
17414       convert_move (after_param, after, 1);
17415     }
17416
17417   /* The previous sequence will end with a branch that's dependent on
17418      the conditional store, so placing an isync will ensure that no
17419      other instructions (especially, no load or store instructions)
17420      can start before the atomic operation completes.  */
17421   if (sync_p)
17422     emit_insn (gen_isync ());
17423 }
17424
17425 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
17426    COND is true.  Mark the jump as unlikely to be taken.  */
17427
17428 static void
17429 emit_unlikely_jump (rtx cond, rtx label)
17430 {
17431   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
17432   rtx x;
17433
17434   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
17435   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
17436   add_reg_note (x, REG_BR_PROB, very_unlikely);
17437 }
17438
17439 /* A subroutine of the atomic operation splitters.  Emit a load-locked
17440    instruction in MODE.  */
17441
17442 static void
17443 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
17444 {
17445   rtx (*fn) (rtx, rtx) = NULL;
17446   if (mode == SImode)
17447     fn = gen_load_locked_si;
17448   else if (mode == DImode)
17449     fn = gen_load_locked_di;
17450   emit_insn (fn (reg, mem));
17451 }
17452
17453 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
17454    instruction in MODE.  */
17455
17456 static void
17457 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
17458 {
17459   rtx (*fn) (rtx, rtx, rtx) = NULL;
17460   if (mode == SImode)
17461     fn = gen_store_conditional_si;
17462   else if (mode == DImode)
17463     fn = gen_store_conditional_di;
17464
17465   /* Emit sync before stwcx. to address PPC405 Erratum.  */
17466   if (PPC405_ERRATUM77)
17467     emit_insn (gen_memory_barrier ());
17468
17469   emit_insn (fn (res, mem, val));
17470 }
17471
17472 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
17473    to perform.  MEM is the memory on which to operate.  VAL is the second
17474    operand of the binary operator.  BEFORE and AFTER are optional locations to
17475    return the value of MEM either before of after the operation.  SCRATCH is
17476    a scratch register.  */
17477
17478 void
17479 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
17480                        rtx before, rtx after, rtx scratch)
17481 {
17482   enum machine_mode mode = GET_MODE (mem);
17483   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17484
17485   emit_insn (gen_lwsync ());
17486
17487   label = gen_label_rtx ();
17488   emit_label (label);
17489   label = gen_rtx_LABEL_REF (VOIDmode, label);
17490
17491   if (before == NULL_RTX)
17492     before = scratch;
17493   emit_load_locked (mode, before, mem);
17494
17495   if (code == NOT)
17496     x = gen_rtx_IOR (mode,
17497                      gen_rtx_NOT (mode, before),
17498                      gen_rtx_NOT (mode, val));
17499   else if (code == AND)
17500     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
17501   else
17502     x = gen_rtx_fmt_ee (code, mode, before, val);
17503
17504   if (after != NULL_RTX)
17505     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
17506   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17507
17508   emit_store_conditional (mode, cond, mem, scratch);
17509
17510   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17511   emit_unlikely_jump (x, label);
17512
17513   emit_insn (gen_isync ());
17514 }
17515
17516 /* Expand an atomic compare and swap operation.  MEM is the memory on which
17517    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
17518    value to be stored.  SCRATCH is a scratch GPR.  */
17519
17520 void
17521 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
17522                                rtx scratch)
17523 {
17524   enum machine_mode mode = GET_MODE (mem);
17525   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17526
17527   emit_insn (gen_lwsync ());
17528
17529   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17530   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17531   emit_label (XEXP (label1, 0));
17532
17533   emit_load_locked (mode, retval, mem);
17534
17535   x = gen_rtx_COMPARE (CCmode, retval, oldval);
17536   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17537
17538   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17539   emit_unlikely_jump (x, label2);
17540
17541   emit_move_insn (scratch, newval);
17542   emit_store_conditional (mode, cond, mem, scratch);
17543
17544   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17545   emit_unlikely_jump (x, label1);
17546
17547   emit_insn (gen_isync ());
17548   emit_label (XEXP (label2, 0));
17549 }
17550
17551 /* Expand an atomic test and set operation.  MEM is the memory on which
17552    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
17553
17554 void
17555 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
17556 {
17557   enum machine_mode mode = GET_MODE (mem);
17558   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17559
17560   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17561   emit_label (XEXP (label, 0));
17562
17563   emit_load_locked (mode, retval, mem);
17564   emit_move_insn (scratch, val);
17565   emit_store_conditional (mode, cond, mem, scratch);
17566
17567   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17568   emit_unlikely_jump (x, label);
17569
17570   emit_insn (gen_isync ());
17571 }
17572
17573 void
17574 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
17575 {
17576   enum machine_mode mode = GET_MODE (mem);
17577   rtx addrSI, align, wdst, shift, mask;
17578   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
17579   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17580
17581   /* Shift amount for subword relative to aligned word.  */
17582   addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
17583   addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
17584   shift = gen_reg_rtx (SImode);
17585   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17586                          GEN_INT (shift_mask)));
17587   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17588
17589   /* Shift and mask old value into position within word.  */
17590   oldval = convert_modes (SImode, mode, oldval, 1);
17591   oldval = expand_binop (SImode, and_optab,
17592                          oldval, GEN_INT (imask), NULL_RTX,
17593                          1, OPTAB_LIB_WIDEN);
17594   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
17595
17596   /* Shift and mask new value into position within word.  */
17597   newval = convert_modes (SImode, mode, newval, 1);
17598   newval = expand_binop (SImode, and_optab,
17599                          newval, GEN_INT (imask), NULL_RTX,
17600                          1, OPTAB_LIB_WIDEN);
17601   emit_insn (gen_ashlsi3 (newval, newval, shift));
17602
17603   /* Mask for insertion.  */
17604   mask = gen_reg_rtx (SImode);
17605   emit_move_insn (mask, GEN_INT (imask));
17606   emit_insn (gen_ashlsi3 (mask, mask, shift));
17607
17608   /* Address of aligned word containing subword.  */
17609   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
17610                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
17611   mem = change_address (mem, SImode, align);
17612   set_mem_align (mem, 32);
17613   MEM_VOLATILE_P (mem) = 1;
17614
17615   wdst = gen_reg_rtx (SImode);
17616   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
17617                                                     oldval, newval, mem));
17618
17619   /* Shift the result back.  */
17620   emit_insn (gen_lshrsi3 (wdst, wdst, shift));
17621
17622   emit_move_insn (dst, gen_lowpart (mode, wdst));
17623 }
17624
17625 void
17626 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
17627                                   rtx oldval, rtx newval, rtx mem,
17628                                   rtx scratch)
17629 {
17630   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17631
17632   emit_insn (gen_lwsync ());
17633   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17634   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17635   emit_label (XEXP (label1, 0));
17636
17637   emit_load_locked (SImode, scratch, mem);
17638
17639   /* Mask subword within loaded value for comparison with oldval.
17640      Use UNSPEC_AND to avoid clobber.*/
17641   emit_insn (gen_rtx_SET (SImode, dest,
17642                           gen_rtx_UNSPEC (SImode,
17643                                           gen_rtvec (2, scratch, mask),
17644                                           UNSPEC_AND)));
17645
17646   x = gen_rtx_COMPARE (CCmode, dest, oldval);
17647   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17648
17649   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17650   emit_unlikely_jump (x, label2);
17651
17652   /* Clear subword within loaded value for insertion of new value.  */
17653   emit_insn (gen_rtx_SET (SImode, scratch,
17654                           gen_rtx_AND (SImode,
17655                                        gen_rtx_NOT (SImode, mask), scratch)));
17656   emit_insn (gen_iorsi3 (scratch, scratch, newval));
17657   emit_store_conditional (SImode, cond, mem, scratch);
17658
17659   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17660   emit_unlikely_jump (x, label1);
17661
17662   emit_insn (gen_isync ());
17663   emit_label (XEXP (label2, 0));
17664 }
17665
17666
17667   /* Emit instructions to move SRC to DST.  Called by splitters for
17668    multi-register moves.  It will emit at most one instruction for
17669    each register that is accessed; that is, it won't emit li/lis pairs
17670    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
17671    register.  */
17672
17673 void
17674 rs6000_split_multireg_move (rtx dst, rtx src)
17675 {
17676   /* The register number of the first register being moved.  */
17677   int reg;
17678   /* The mode that is to be moved.  */
17679   enum machine_mode mode;
17680   /* The mode that the move is being done in, and its size.  */
17681   enum machine_mode reg_mode;
17682   int reg_mode_size;
17683   /* The number of registers that will be moved.  */
17684   int nregs;
17685
17686   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
17687   mode = GET_MODE (dst);
17688   nregs = hard_regno_nregs[reg][mode];
17689   if (FP_REGNO_P (reg))
17690     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : 
17691         ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
17692   else if (ALTIVEC_REGNO_P (reg))
17693     reg_mode = V16QImode;
17694   else if (TARGET_E500_DOUBLE && mode == TFmode)
17695     reg_mode = DFmode;
17696   else
17697     reg_mode = word_mode;
17698   reg_mode_size = GET_MODE_SIZE (reg_mode);
17699
17700   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
17701
17702   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
17703     {
17704       /* Move register range backwards, if we might have destructive
17705          overlap.  */
17706       int i;
17707       for (i = nregs - 1; i >= 0; i--)
17708         emit_insn (gen_rtx_SET (VOIDmode,
17709                                 simplify_gen_subreg (reg_mode, dst, mode,
17710                                                      i * reg_mode_size),
17711                                 simplify_gen_subreg (reg_mode, src, mode,
17712                                                      i * reg_mode_size)));
17713     }
17714   else
17715     {
17716       int i;
17717       int j = -1;
17718       bool used_update = false;
17719       rtx restore_basereg = NULL_RTX;
17720
17721       if (MEM_P (src) && INT_REGNO_P (reg))
17722         {
17723           rtx breg;
17724
17725           if (GET_CODE (XEXP (src, 0)) == PRE_INC
17726               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
17727             {
17728               rtx delta_rtx;
17729               breg = XEXP (XEXP (src, 0), 0);
17730               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
17731                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
17732                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
17733               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17734               src = replace_equiv_address (src, breg);
17735             }
17736           else if (! rs6000_offsettable_memref_p (src))
17737             {
17738               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
17739                 {
17740                   rtx basereg = XEXP (XEXP (src, 0), 0);
17741                   if (TARGET_UPDATE)
17742                     {
17743                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
17744                       emit_insn (gen_rtx_SET (VOIDmode, ndst,
17745                                  gen_rtx_MEM (reg_mode, XEXP (src, 0))));
17746                       used_update = true;
17747                     }
17748                   else
17749                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17750                                XEXP (XEXP (src, 0), 1)));
17751                   src = replace_equiv_address (src, basereg);
17752                 }
17753               else
17754                 {
17755                   rtx basereg = gen_rtx_REG (Pmode, reg);
17756                   emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
17757                   src = replace_equiv_address (src, basereg);
17758                 }
17759             }
17760
17761           breg = XEXP (src, 0);
17762           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
17763             breg = XEXP (breg, 0);
17764
17765           /* If the base register we are using to address memory is
17766              also a destination reg, then change that register last.  */
17767           if (REG_P (breg)
17768               && REGNO (breg) >= REGNO (dst)
17769               && REGNO (breg) < REGNO (dst) + nregs)
17770             j = REGNO (breg) - REGNO (dst);
17771         }
17772       else if (MEM_P (dst) && INT_REGNO_P (reg))
17773         {
17774           rtx breg;
17775
17776           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
17777               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
17778             {
17779               rtx delta_rtx;
17780               breg = XEXP (XEXP (dst, 0), 0);
17781               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
17782                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
17783                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
17784
17785               /* We have to update the breg before doing the store.
17786                  Use store with update, if available.  */
17787
17788               if (TARGET_UPDATE)
17789                 {
17790                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17791                   emit_insn (TARGET_32BIT
17792                              ? (TARGET_POWERPC64
17793                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
17794                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
17795                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
17796                   used_update = true;
17797                 }
17798               else
17799                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17800               dst = replace_equiv_address (dst, breg);
17801             }
17802           else if (!rs6000_offsettable_memref_p (dst)
17803                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
17804             {
17805               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
17806                 {
17807                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17808                   if (TARGET_UPDATE)
17809                     {
17810                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17811                       emit_insn (gen_rtx_SET (VOIDmode,
17812                                  gen_rtx_MEM (reg_mode, XEXP (dst, 0)), nsrc));
17813                       used_update = true;
17814                     }
17815                   else
17816                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17817                                XEXP (XEXP (dst, 0), 1)));
17818                   dst = replace_equiv_address (dst, basereg);
17819                 }
17820               else
17821                 {
17822                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17823                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
17824                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
17825                               && REG_P (basereg)
17826                               && REG_P (offsetreg)
17827                               && REGNO (basereg) != REGNO (offsetreg));
17828                   if (REGNO (basereg) == 0)
17829                     {
17830                       rtx tmp = offsetreg;
17831                       offsetreg = basereg;
17832                       basereg = tmp;
17833                     }
17834                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
17835                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
17836                   dst = replace_equiv_address (dst, basereg);
17837                 }
17838             }
17839           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
17840             gcc_assert (rs6000_offsettable_memref_p (dst));
17841         }
17842
17843       for (i = 0; i < nregs; i++)
17844         {
17845           /* Calculate index to next subword.  */
17846           ++j;
17847           if (j == nregs)
17848             j = 0;
17849
17850           /* If compiler already emitted move of first word by
17851              store with update, no need to do anything.  */
17852           if (j == 0 && used_update)
17853             continue;
17854
17855           emit_insn (gen_rtx_SET (VOIDmode,
17856                                   simplify_gen_subreg (reg_mode, dst, mode,
17857                                                        j * reg_mode_size),
17858                                   simplify_gen_subreg (reg_mode, src, mode,
17859                                                        j * reg_mode_size)));
17860         }
17861       if (restore_basereg != NULL_RTX)
17862         emit_insn (restore_basereg);
17863     }
17864 }
17865
17866 \f
17867 /* This page contains routines that are used to determine what the
17868    function prologue and epilogue code will do and write them out.  */
17869
17870 /* Return the first fixed-point register that is required to be
17871    saved. 32 if none.  */
17872
17873 int
17874 first_reg_to_save (void)
17875 {
17876   int first_reg;
17877
17878   /* Find lowest numbered live register.  */
17879   for (first_reg = 13; first_reg <= 31; first_reg++)
17880     if (df_regs_ever_live_p (first_reg)
17881         && (! call_used_regs[first_reg]
17882             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
17883                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
17884                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
17885                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
17886       break;
17887
17888 #if TARGET_MACHO
17889   if (flag_pic
17890       && crtl->uses_pic_offset_table
17891       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
17892     return RS6000_PIC_OFFSET_TABLE_REGNUM;
17893 #endif
17894
17895   return first_reg;
17896 }
17897
17898 /* Similar, for FP regs.  */
17899
17900 int
17901 first_fp_reg_to_save (void)
17902 {
17903   int first_reg;
17904
17905   /* Find lowest numbered live register.  */
17906   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
17907     if (df_regs_ever_live_p (first_reg))
17908       break;
17909
17910   return first_reg;
17911 }
17912
17913 /* Similar, for AltiVec regs.  */
17914
17915 static int
17916 first_altivec_reg_to_save (void)
17917 {
17918   int i;
17919
17920   /* Stack frame remains as is unless we are in AltiVec ABI.  */
17921   if (! TARGET_ALTIVEC_ABI)
17922     return LAST_ALTIVEC_REGNO + 1;
17923
17924   /* On Darwin, the unwind routines are compiled without
17925      TARGET_ALTIVEC, and use save_world to save/restore the
17926      altivec registers when necessary.  */
17927   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17928       && ! TARGET_ALTIVEC)
17929     return FIRST_ALTIVEC_REGNO + 20;
17930
17931   /* Find lowest numbered live register.  */
17932   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
17933     if (df_regs_ever_live_p (i))
17934       break;
17935
17936   return i;
17937 }
17938
17939 /* Return a 32-bit mask of the AltiVec registers we need to set in
17940    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
17941    the 32-bit word is 0.  */
17942
17943 static unsigned int
17944 compute_vrsave_mask (void)
17945 {
17946   unsigned int i, mask = 0;
17947
17948   /* On Darwin, the unwind routines are compiled without
17949      TARGET_ALTIVEC, and use save_world to save/restore the
17950      call-saved altivec registers when necessary.  */
17951   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17952       && ! TARGET_ALTIVEC)
17953     mask |= 0xFFF;
17954
17955   /* First, find out if we use _any_ altivec registers.  */
17956   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
17957     if (df_regs_ever_live_p (i))
17958       mask |= ALTIVEC_REG_BIT (i);
17959
17960   if (mask == 0)
17961     return mask;
17962
17963   /* Next, remove the argument registers from the set.  These must
17964      be in the VRSAVE mask set by the caller, so we don't need to add
17965      them in again.  More importantly, the mask we compute here is
17966      used to generate CLOBBERs in the set_vrsave insn, and we do not
17967      wish the argument registers to die.  */
17968   for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
17969     mask &= ~ALTIVEC_REG_BIT (i);
17970
17971   /* Similarly, remove the return value from the set.  */
17972   {
17973     bool yes = false;
17974     diddle_return_value (is_altivec_return_reg, &yes);
17975     if (yes)
17976       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
17977   }
17978
17979   return mask;
17980 }
17981
17982 /* For a very restricted set of circumstances, we can cut down the
17983    size of prologues/epilogues by calling our own save/restore-the-world
17984    routines.  */
17985
17986 static void
17987 compute_save_world_info (rs6000_stack_t *info_ptr)
17988 {
17989   info_ptr->world_save_p = 1;
17990   info_ptr->world_save_p
17991     = (WORLD_SAVE_P (info_ptr)
17992        && DEFAULT_ABI == ABI_DARWIN
17993        && ! (cfun->calls_setjmp && flag_exceptions)
17994        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
17995        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
17996        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
17997        && info_ptr->cr_save_p);
17998
17999   /* This will not work in conjunction with sibcalls.  Make sure there
18000      are none.  (This check is expensive, but seldom executed.) */
18001   if (WORLD_SAVE_P (info_ptr))
18002     {
18003       rtx insn;
18004       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
18005         if ( GET_CODE (insn) == CALL_INSN
18006              && SIBLING_CALL_P (insn))
18007           {
18008             info_ptr->world_save_p = 0;
18009             break;
18010           }
18011     }
18012
18013   if (WORLD_SAVE_P (info_ptr))
18014     {
18015       /* Even if we're not touching VRsave, make sure there's room on the
18016          stack for it, if it looks like we're calling SAVE_WORLD, which
18017          will attempt to save it. */
18018       info_ptr->vrsave_size  = 4;
18019
18020       /* If we are going to save the world, we need to save the link register too.  */
18021       info_ptr->lr_save_p = 1;
18022
18023       /* "Save" the VRsave register too if we're saving the world.  */
18024       if (info_ptr->vrsave_mask == 0)
18025         info_ptr->vrsave_mask = compute_vrsave_mask ();
18026
18027       /* Because the Darwin register save/restore routines only handle
18028          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
18029          check.  */
18030       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
18031                   && (info_ptr->first_altivec_reg_save
18032                       >= FIRST_SAVED_ALTIVEC_REGNO));
18033     }
18034   return;
18035 }
18036
18037
18038 static void
18039 is_altivec_return_reg (rtx reg, void *xyes)
18040 {
18041   bool *yes = (bool *) xyes;
18042   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
18043     *yes = true;
18044 }
18045
18046 \f
18047 /* Determine the strategy for savings/restoring registers.  */
18048
18049 enum {
18050   SAVRES_MULTIPLE = 0x1,
18051   SAVE_INLINE_FPRS = 0x2,
18052   SAVE_INLINE_GPRS = 0x4,
18053   REST_INLINE_FPRS = 0x8,
18054   REST_INLINE_GPRS = 0x10,
18055   SAVE_NOINLINE_GPRS_SAVES_LR = 0x20,
18056   SAVE_NOINLINE_FPRS_SAVES_LR = 0x40,
18057   REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x80
18058 };
18059
18060 static int
18061 rs6000_savres_strategy (rs6000_stack_t *info,
18062                         bool using_static_chain_p)
18063 {
18064   int strategy = 0;
18065
18066   if (TARGET_MULTIPLE
18067       && !TARGET_POWERPC64
18068       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
18069       && info->first_gp_reg_save < 31
18070       && no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true))
18071     strategy |= SAVRES_MULTIPLE;
18072
18073   if (crtl->calls_eh_return
18074       || cfun->machine->ra_need_lr
18075       || info->total_size > 32767)
18076     strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
18077                  | SAVE_INLINE_GPRS | REST_INLINE_GPRS);
18078
18079   if (info->first_fp_reg_save == 64
18080       || FP_SAVE_INLINE (info->first_fp_reg_save)
18081       /* The out-of-line FP routines use double-precision stores;
18082          we can't use those routines if we don't have such stores.  */
18083       || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT)
18084       || !no_global_regs_above (info->first_fp_reg_save, /*gpr=*/false))
18085     strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
18086
18087   if (info->first_gp_reg_save == 32
18088       || GP_SAVE_INLINE (info->first_gp_reg_save)
18089       || !((strategy & SAVRES_MULTIPLE)
18090            || no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true)))
18091     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
18092
18093   /* Don't bother to try to save things out-of-line if r11 is occupied
18094      by the static chain.  It would require too much fiddling and the
18095      static chain is rarely used anyway.  */
18096   if (using_static_chain_p)
18097     strategy |= SAVE_INLINE_FPRS | SAVE_INLINE_GPRS;
18098
18099   /* If we are going to use store multiple, then don't even bother
18100      with the out-of-line routines, since the store-multiple
18101      instruction will always be smaller.  */
18102   if ((strategy & SAVRES_MULTIPLE))
18103     strategy |= SAVE_INLINE_GPRS;
18104
18105   /* The situation is more complicated with load multiple.  We'd
18106      prefer to use the out-of-line routines for restores, since the
18107      "exit" out-of-line routines can handle the restore of LR and the
18108      frame teardown.  However if doesn't make sense to use the
18109      out-of-line routine if that is the only reason we'd need to save
18110      LR, and we can't use the "exit" out-of-line gpr restore if we
18111      have saved some fprs; In those cases it is advantageous to use
18112      load multiple when available.  */
18113   if ((strategy & SAVRES_MULTIPLE)
18114       && (!info->lr_save_p
18115           || info->first_fp_reg_save != 64))
18116     strategy |= REST_INLINE_GPRS;
18117
18118   /* We can only use load multiple or the out-of-line routines to
18119      restore if we've used store multiple or out-of-line routines
18120      in the prologue, i.e. if we've saved all the registers from
18121      first_gp_reg_save.  Otherwise, we risk loading garbage.  */
18122   if ((strategy & (SAVE_INLINE_GPRS | SAVRES_MULTIPLE)) == SAVE_INLINE_GPRS)
18123     strategy |= REST_INLINE_GPRS;
18124
18125   /* Saving CR interferes with the exit routines used on the SPE, so
18126      just punt here.  */
18127   if (TARGET_SPE_ABI
18128       && info->spe_64bit_regs_used
18129       && info->cr_save_p)
18130     strategy |= REST_INLINE_GPRS;
18131
18132 #ifdef POWERPC_LINUX
18133   if (TARGET_64BIT)
18134     {
18135       if (!(strategy & SAVE_INLINE_FPRS))
18136         strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
18137       else if (!(strategy & SAVE_INLINE_GPRS)
18138                && info->first_fp_reg_save == 64)
18139         strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
18140     }
18141 #else
18142   if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
18143     strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
18144 #endif
18145   return strategy;
18146 }
18147
18148 /* Calculate the stack information for the current function.  This is
18149    complicated by having two separate calling sequences, the AIX calling
18150    sequence and the V.4 calling sequence.
18151
18152    AIX (and Darwin/Mac OS X) stack frames look like:
18153                                                           32-bit  64-bit
18154         SP----> +---------------------------------------+
18155                 | back chain to caller                  | 0       0
18156                 +---------------------------------------+
18157                 | saved CR                              | 4       8 (8-11)
18158                 +---------------------------------------+
18159                 | saved LR                              | 8       16
18160                 +---------------------------------------+
18161                 | reserved for compilers                | 12      24
18162                 +---------------------------------------+
18163                 | reserved for binders                  | 16      32
18164                 +---------------------------------------+
18165                 | saved TOC pointer                     | 20      40
18166                 +---------------------------------------+
18167                 | Parameter save area (P)               | 24      48
18168                 +---------------------------------------+
18169                 | Alloca space (A)                      | 24+P    etc.
18170                 +---------------------------------------+
18171                 | Local variable space (L)              | 24+P+A
18172                 +---------------------------------------+
18173                 | Float/int conversion temporary (X)    | 24+P+A+L
18174                 +---------------------------------------+
18175                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
18176                 +---------------------------------------+
18177                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
18178                 +---------------------------------------+
18179                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
18180                 +---------------------------------------+
18181                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
18182                 +---------------------------------------+
18183                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
18184                 +---------------------------------------+
18185         old SP->| back chain to caller's caller         |
18186                 +---------------------------------------+
18187
18188    The required alignment for AIX configurations is two words (i.e., 8
18189    or 16 bytes).
18190
18191
18192    V.4 stack frames look like:
18193
18194         SP----> +---------------------------------------+
18195                 | back chain to caller                  | 0
18196                 +---------------------------------------+
18197                 | caller's saved LR                     | 4
18198                 +---------------------------------------+
18199                 | Parameter save area (P)               | 8
18200                 +---------------------------------------+
18201                 | Alloca space (A)                      | 8+P
18202                 +---------------------------------------+
18203                 | Varargs save area (V)                 | 8+P+A
18204                 +---------------------------------------+
18205                 | Local variable space (L)              | 8+P+A+V
18206                 +---------------------------------------+
18207                 | Float/int conversion temporary (X)    | 8+P+A+V+L
18208                 +---------------------------------------+
18209                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
18210                 +---------------------------------------+
18211                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
18212                 +---------------------------------------+
18213                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
18214                 +---------------------------------------+
18215                 | SPE: area for 64-bit GP registers     |
18216                 +---------------------------------------+
18217                 | SPE alignment padding                 |
18218                 +---------------------------------------+
18219                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
18220                 +---------------------------------------+
18221                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
18222                 +---------------------------------------+
18223                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
18224                 +---------------------------------------+
18225         old SP->| back chain to caller's caller         |
18226                 +---------------------------------------+
18227
18228    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
18229    given.  (But note below and in sysv4.h that we require only 8 and
18230    may round up the size of our stack frame anyways.  The historical
18231    reason is early versions of powerpc-linux which didn't properly
18232    align the stack at program startup.  A happy side-effect is that
18233    -mno-eabi libraries can be used with -meabi programs.)
18234
18235    The EABI configuration defaults to the V.4 layout.  However,
18236    the stack alignment requirements may differ.  If -mno-eabi is not
18237    given, the required stack alignment is 8 bytes; if -mno-eabi is
18238    given, the required alignment is 16 bytes.  (But see V.4 comment
18239    above.)  */
18240
18241 #ifndef ABI_STACK_BOUNDARY
18242 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
18243 #endif
18244
18245 static rs6000_stack_t *
18246 rs6000_stack_info (void)
18247 {
18248 #ifdef ENABLE_CHECKING
18249   static rs6000_stack_t info_save;
18250 #endif
18251   rs6000_stack_t *info_ptr = &stack_info;
18252   int reg_size = TARGET_32BIT ? 4 : 8;
18253   int ehrd_size;
18254   int save_align;
18255   int first_gp;
18256   HOST_WIDE_INT non_fixed_size;
18257   bool using_static_chain_p;
18258
18259 #ifdef ENABLE_CHECKING
18260   memcpy (&info_save, &stack_info, sizeof stack_info);
18261 #else
18262   if (reload_completed && info_ptr->reload_completed)
18263     return info_ptr;
18264 #endif
18265
18266   memset (&stack_info, 0, sizeof (stack_info));
18267   info_ptr->reload_completed = reload_completed;
18268
18269   if (TARGET_SPE)
18270     {
18271       /* Cache value so we don't rescan instruction chain over and over.  */
18272       if (cfun->machine->insn_chain_scanned_p == 0)
18273         cfun->machine->insn_chain_scanned_p
18274           = spe_func_has_64bit_regs_p () + 1;
18275       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
18276     }
18277
18278   /* Select which calling sequence.  */
18279   info_ptr->abi = DEFAULT_ABI;
18280
18281   /* Calculate which registers need to be saved & save area size.  */
18282   info_ptr->first_gp_reg_save = first_reg_to_save ();
18283   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
18284      even if it currently looks like we won't.  Reload may need it to
18285      get at a constant; if so, it will have already created a constant
18286      pool entry for it.  */
18287   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
18288        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
18289        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
18290       && crtl->uses_const_pool
18291       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
18292     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
18293   else
18294     first_gp = info_ptr->first_gp_reg_save;
18295
18296   info_ptr->gp_size = reg_size * (32 - first_gp);
18297
18298   /* For the SPE, we have an additional upper 32-bits on each GPR.
18299      Ideally we should save the entire 64-bits only when the upper
18300      half is used in SIMD instructions.  Since we only record
18301      registers live (not the size they are used in), this proves
18302      difficult because we'd have to traverse the instruction chain at
18303      the right time, taking reload into account.  This is a real pain,
18304      so we opt to save the GPRs in 64-bits always if but one register
18305      gets used in 64-bits.  Otherwise, all the registers in the frame
18306      get saved in 32-bits.
18307
18308      So... since when we save all GPRs (except the SP) in 64-bits, the
18309      traditional GP save area will be empty.  */
18310   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18311     info_ptr->gp_size = 0;
18312
18313   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
18314   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
18315
18316   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
18317   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
18318                                  - info_ptr->first_altivec_reg_save);
18319
18320   /* Does this function call anything?  */
18321   info_ptr->calls_p = (! current_function_is_leaf
18322                        || cfun->machine->ra_needs_full_frame);
18323
18324   /* Determine if we need to save the condition code registers.  */
18325   if (df_regs_ever_live_p (CR2_REGNO)
18326       || df_regs_ever_live_p (CR3_REGNO)
18327       || df_regs_ever_live_p (CR4_REGNO))
18328     {
18329       info_ptr->cr_save_p = 1;
18330       if (DEFAULT_ABI == ABI_V4)
18331         info_ptr->cr_size = reg_size;
18332     }
18333
18334   /* If the current function calls __builtin_eh_return, then we need
18335      to allocate stack space for registers that will hold data for
18336      the exception handler.  */
18337   if (crtl->calls_eh_return)
18338     {
18339       unsigned int i;
18340       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
18341         continue;
18342
18343       /* SPE saves EH registers in 64-bits.  */
18344       ehrd_size = i * (TARGET_SPE_ABI
18345                        && info_ptr->spe_64bit_regs_used != 0
18346                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
18347     }
18348   else
18349     ehrd_size = 0;
18350
18351   /* Determine various sizes.  */
18352   info_ptr->reg_size     = reg_size;
18353   info_ptr->fixed_size   = RS6000_SAVE_AREA;
18354   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
18355   info_ptr->parm_size    = RS6000_ALIGN (crtl->outgoing_args_size,
18356                                          TARGET_ALTIVEC ? 16 : 8);
18357   if (FRAME_GROWS_DOWNWARD)
18358     info_ptr->vars_size
18359       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
18360                        + info_ptr->parm_size,
18361                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
18362          - (info_ptr->fixed_size + info_ptr->vars_size
18363             + info_ptr->parm_size);
18364
18365   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18366     info_ptr->spe_gp_size = 8 * (32 - first_gp);
18367   else
18368     info_ptr->spe_gp_size = 0;
18369
18370   if (TARGET_ALTIVEC_ABI)
18371     info_ptr->vrsave_mask = compute_vrsave_mask ();
18372   else
18373     info_ptr->vrsave_mask = 0;
18374
18375   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
18376     info_ptr->vrsave_size  = 4;
18377   else
18378     info_ptr->vrsave_size  = 0;
18379
18380   compute_save_world_info (info_ptr);
18381
18382   /* Calculate the offsets.  */
18383   switch (DEFAULT_ABI)
18384     {
18385     case ABI_NONE:
18386     default:
18387       gcc_unreachable ();
18388
18389     case ABI_AIX:
18390     case ABI_DARWIN:
18391       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18392       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18393
18394       if (TARGET_ALTIVEC_ABI)
18395         {
18396           info_ptr->vrsave_save_offset
18397             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
18398
18399           /* Align stack so vector save area is on a quadword boundary.
18400              The padding goes above the vectors.  */
18401           if (info_ptr->altivec_size != 0)
18402             info_ptr->altivec_padding_size
18403               = info_ptr->vrsave_save_offset & 0xF;
18404           else
18405             info_ptr->altivec_padding_size = 0;
18406
18407           info_ptr->altivec_save_offset
18408             = info_ptr->vrsave_save_offset
18409             - info_ptr->altivec_padding_size
18410             - info_ptr->altivec_size;
18411           gcc_assert (info_ptr->altivec_size == 0
18412                       || info_ptr->altivec_save_offset % 16 == 0);
18413
18414           /* Adjust for AltiVec case.  */
18415           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
18416         }
18417       else
18418         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
18419       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
18420       info_ptr->lr_save_offset   = 2*reg_size;
18421       break;
18422
18423     case ABI_V4:
18424       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18425       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18426       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
18427
18428       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18429         {
18430           /* Align stack so SPE GPR save area is aligned on a
18431              double-word boundary.  */
18432           if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
18433             info_ptr->spe_padding_size
18434               = 8 - (-info_ptr->cr_save_offset % 8);
18435           else
18436             info_ptr->spe_padding_size = 0;
18437
18438           info_ptr->spe_gp_save_offset
18439             = info_ptr->cr_save_offset
18440             - info_ptr->spe_padding_size
18441             - info_ptr->spe_gp_size;
18442
18443           /* Adjust for SPE case.  */
18444           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
18445         }
18446       else if (TARGET_ALTIVEC_ABI)
18447         {
18448           info_ptr->vrsave_save_offset
18449             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
18450
18451           /* Align stack so vector save area is on a quadword boundary.  */
18452           if (info_ptr->altivec_size != 0)
18453             info_ptr->altivec_padding_size
18454               = 16 - (-info_ptr->vrsave_save_offset % 16);
18455           else
18456             info_ptr->altivec_padding_size = 0;
18457
18458           info_ptr->altivec_save_offset
18459             = info_ptr->vrsave_save_offset
18460             - info_ptr->altivec_padding_size
18461             - info_ptr->altivec_size;
18462
18463           /* Adjust for AltiVec case.  */
18464           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
18465         }
18466       else
18467         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
18468       info_ptr->ehrd_offset      -= ehrd_size;
18469       info_ptr->lr_save_offset   = reg_size;
18470       break;
18471     }
18472
18473   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
18474   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
18475                                          + info_ptr->gp_size
18476                                          + info_ptr->altivec_size
18477                                          + info_ptr->altivec_padding_size
18478                                          + info_ptr->spe_gp_size
18479                                          + info_ptr->spe_padding_size
18480                                          + ehrd_size
18481                                          + info_ptr->cr_size
18482                                          + info_ptr->vrsave_size,
18483                                          save_align);
18484
18485   non_fixed_size         = (info_ptr->vars_size
18486                             + info_ptr->parm_size
18487                             + info_ptr->save_size);
18488
18489   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
18490                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
18491
18492   /* Determine if we need to save the link register.  */
18493   if (info_ptr->calls_p
18494       || (DEFAULT_ABI == ABI_AIX
18495           && crtl->profile
18496           && !TARGET_PROFILE_KERNEL)
18497       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
18498 #ifdef TARGET_RELOCATABLE
18499       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
18500 #endif
18501       || rs6000_ra_ever_killed ())
18502     info_ptr->lr_save_p = 1;
18503
18504   using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
18505                           && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
18506                           && call_used_regs[STATIC_CHAIN_REGNUM]);
18507   info_ptr->savres_strategy = rs6000_savres_strategy (info_ptr,
18508                                                       using_static_chain_p);
18509
18510   if (!(info_ptr->savres_strategy & SAVE_INLINE_GPRS)
18511       || !(info_ptr->savres_strategy & SAVE_INLINE_FPRS)
18512       || !(info_ptr->savres_strategy & REST_INLINE_GPRS)
18513       || !(info_ptr->savres_strategy & REST_INLINE_FPRS))
18514     info_ptr->lr_save_p = 1;
18515
18516   if (info_ptr->lr_save_p)
18517     df_set_regs_ever_live (LR_REGNO, true);
18518
18519   /* Determine if we need to allocate any stack frame:
18520
18521      For AIX we need to push the stack if a frame pointer is needed
18522      (because the stack might be dynamically adjusted), if we are
18523      debugging, if we make calls, or if the sum of fp_save, gp_save,
18524      and local variables are more than the space needed to save all
18525      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
18526      + 18*8 = 288 (GPR13 reserved).
18527
18528      For V.4 we don't have the stack cushion that AIX uses, but assume
18529      that the debugger can handle stackless frames.  */
18530
18531   if (info_ptr->calls_p)
18532     info_ptr->push_p = 1;
18533
18534   else if (DEFAULT_ABI == ABI_V4)
18535     info_ptr->push_p = non_fixed_size != 0;
18536
18537   else if (frame_pointer_needed)
18538     info_ptr->push_p = 1;
18539
18540   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
18541     info_ptr->push_p = 1;
18542
18543   else
18544     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
18545
18546   /* Zero offsets if we're not saving those registers.  */
18547   if (info_ptr->fp_size == 0)
18548     info_ptr->fp_save_offset = 0;
18549
18550   if (info_ptr->gp_size == 0)
18551     info_ptr->gp_save_offset = 0;
18552
18553   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
18554     info_ptr->altivec_save_offset = 0;
18555
18556   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
18557     info_ptr->vrsave_save_offset = 0;
18558
18559   if (! TARGET_SPE_ABI
18560       || info_ptr->spe_64bit_regs_used == 0
18561       || info_ptr->spe_gp_size == 0)
18562     info_ptr->spe_gp_save_offset = 0;
18563
18564   if (! info_ptr->lr_save_p)
18565     info_ptr->lr_save_offset = 0;
18566
18567   if (! info_ptr->cr_save_p)
18568     info_ptr->cr_save_offset = 0;
18569
18570 #ifdef ENABLE_CHECKING
18571   gcc_assert (!(reload_completed && info_save.reload_completed)
18572               || memcmp (&info_save, &stack_info, sizeof stack_info) == 0);
18573 #endif
18574   return info_ptr;
18575 }
18576
18577 /* Return true if the current function uses any GPRs in 64-bit SIMD
18578    mode.  */
18579
18580 static bool
18581 spe_func_has_64bit_regs_p (void)
18582 {
18583   rtx insns, insn;
18584
18585   /* Functions that save and restore all the call-saved registers will
18586      need to save/restore the registers in 64-bits.  */
18587   if (crtl->calls_eh_return
18588       || cfun->calls_setjmp
18589       || crtl->has_nonlocal_goto)
18590     return true;
18591
18592   insns = get_insns ();
18593
18594   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
18595     {
18596       if (INSN_P (insn))
18597         {
18598           rtx i;
18599
18600           /* FIXME: This should be implemented with attributes...
18601
18602                  (set_attr "spe64" "true")....then,
18603                  if (get_spe64(insn)) return true;
18604
18605              It's the only reliable way to do the stuff below.  */
18606
18607           i = PATTERN (insn);
18608           if (GET_CODE (i) == SET)
18609             {
18610               enum machine_mode mode = GET_MODE (SET_SRC (i));
18611
18612               if (SPE_VECTOR_MODE (mode))
18613                 return true;
18614               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
18615                 return true;
18616             }
18617         }
18618     }
18619
18620   return false;
18621 }
18622
18623 static void
18624 debug_stack_info (rs6000_stack_t *info)
18625 {
18626   const char *abi_string;
18627
18628   if (! info)
18629     info = rs6000_stack_info ();
18630
18631   fprintf (stderr, "\nStack information for function %s:\n",
18632            ((current_function_decl && DECL_NAME (current_function_decl))
18633             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
18634             : "<unknown>"));
18635
18636   switch (info->abi)
18637     {
18638     default:             abi_string = "Unknown";        break;
18639     case ABI_NONE:       abi_string = "NONE";           break;
18640     case ABI_AIX:        abi_string = "AIX";            break;
18641     case ABI_DARWIN:     abi_string = "Darwin";         break;
18642     case ABI_V4:         abi_string = "V.4";            break;
18643     }
18644
18645   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
18646
18647   if (TARGET_ALTIVEC_ABI)
18648     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
18649
18650   if (TARGET_SPE_ABI)
18651     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
18652
18653   if (info->first_gp_reg_save != 32)
18654     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
18655
18656   if (info->first_fp_reg_save != 64)
18657     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
18658
18659   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
18660     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
18661              info->first_altivec_reg_save);
18662
18663   if (info->lr_save_p)
18664     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
18665
18666   if (info->cr_save_p)
18667     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
18668
18669   if (info->vrsave_mask)
18670     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
18671
18672   if (info->push_p)
18673     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
18674
18675   if (info->calls_p)
18676     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
18677
18678   if (info->gp_save_offset)
18679     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
18680
18681   if (info->fp_save_offset)
18682     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
18683
18684   if (info->altivec_save_offset)
18685     fprintf (stderr, "\taltivec_save_offset = %5d\n",
18686              info->altivec_save_offset);
18687
18688   if (info->spe_gp_save_offset)
18689     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
18690              info->spe_gp_save_offset);
18691
18692   if (info->vrsave_save_offset)
18693     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
18694              info->vrsave_save_offset);
18695
18696   if (info->lr_save_offset)
18697     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
18698
18699   if (info->cr_save_offset)
18700     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
18701
18702   if (info->varargs_save_offset)
18703     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
18704
18705   if (info->total_size)
18706     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
18707              info->total_size);
18708
18709   if (info->vars_size)
18710     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
18711              info->vars_size);
18712
18713   if (info->parm_size)
18714     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
18715
18716   if (info->fixed_size)
18717     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
18718
18719   if (info->gp_size)
18720     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
18721
18722   if (info->spe_gp_size)
18723     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
18724
18725   if (info->fp_size)
18726     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
18727
18728   if (info->altivec_size)
18729     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
18730
18731   if (info->vrsave_size)
18732     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
18733
18734   if (info->altivec_padding_size)
18735     fprintf (stderr, "\taltivec_padding_size= %5d\n",
18736              info->altivec_padding_size);
18737
18738   if (info->spe_padding_size)
18739     fprintf (stderr, "\tspe_padding_size    = %5d\n",
18740              info->spe_padding_size);
18741
18742   if (info->cr_size)
18743     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
18744
18745   if (info->save_size)
18746     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
18747
18748   if (info->reg_size != 4)
18749     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
18750
18751   fprintf (stderr, "\n");
18752 }
18753
18754 rtx
18755 rs6000_return_addr (int count, rtx frame)
18756 {
18757   /* Currently we don't optimize very well between prolog and body
18758      code and for PIC code the code can be actually quite bad, so
18759      don't try to be too clever here.  */
18760   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
18761     {
18762       cfun->machine->ra_needs_full_frame = 1;
18763
18764       return
18765         gen_rtx_MEM
18766           (Pmode,
18767            memory_address
18768            (Pmode,
18769             plus_constant (copy_to_reg
18770                            (gen_rtx_MEM (Pmode,
18771                                          memory_address (Pmode, frame))),
18772                            RETURN_ADDRESS_OFFSET)));
18773     }
18774
18775   cfun->machine->ra_need_lr = 1;
18776   return get_hard_reg_initial_val (Pmode, LR_REGNO);
18777 }
18778
18779 /* Say whether a function is a candidate for sibcall handling or not.
18780    We do not allow indirect calls to be optimized into sibling calls.
18781    Also, we can't do it if there are any vector parameters; there's
18782    nowhere to put the VRsave code so it works; note that functions with
18783    vector parameters are required to have a prototype, so the argument
18784    type info must be available here.  (The tail recursion case can work
18785    with vector parameters, but there's no way to distinguish here.) */
18786 static bool
18787 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
18788 {
18789   tree type;
18790   if (decl)
18791     {
18792       if (TARGET_ALTIVEC_VRSAVE)
18793         {
18794           for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
18795                type; type = TREE_CHAIN (type))
18796             {
18797               if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
18798                 return false;
18799             }
18800         }
18801       if (DEFAULT_ABI == ABI_DARWIN
18802           || ((*targetm.binds_local_p) (decl)
18803               && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
18804         {
18805           tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
18806
18807           if (!lookup_attribute ("longcall", attr_list)
18808               || lookup_attribute ("shortcall", attr_list))
18809             return true;
18810         }
18811     }
18812   return false;
18813 }
18814
18815 /* NULL if INSN insn is valid within a low-overhead loop.
18816    Otherwise return why doloop cannot be applied.
18817    PowerPC uses the COUNT register for branch on table instructions.  */
18818
18819 static const char *
18820 rs6000_invalid_within_doloop (const_rtx insn)
18821 {
18822   if (CALL_P (insn))
18823     return "Function call in the loop.";
18824
18825   if (JUMP_P (insn)
18826       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
18827           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
18828     return "Computed branch in the loop.";
18829
18830   return NULL;
18831 }
18832
18833 static int
18834 rs6000_ra_ever_killed (void)
18835 {
18836   rtx top;
18837   rtx reg;
18838   rtx insn;
18839
18840   if (cfun->is_thunk)
18841     return 0;
18842
18843   if (cfun->machine->lr_save_state)
18844     return cfun->machine->lr_save_state - 1;
18845
18846   /* regs_ever_live has LR marked as used if any sibcalls are present,
18847      but this should not force saving and restoring in the
18848      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
18849      clobbers LR, so that is inappropriate.  */
18850
18851   /* Also, the prologue can generate a store into LR that
18852      doesn't really count, like this:
18853
18854         move LR->R0
18855         bcl to set PIC register
18856         move LR->R31
18857         move R0->LR
18858
18859      When we're called from the epilogue, we need to avoid counting
18860      this as a store.  */
18861
18862   push_topmost_sequence ();
18863   top = get_insns ();
18864   pop_topmost_sequence ();
18865   reg = gen_rtx_REG (Pmode, LR_REGNO);
18866
18867   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
18868     {
18869       if (INSN_P (insn))
18870         {
18871           if (CALL_P (insn))
18872             {
18873               if (!SIBLING_CALL_P (insn))
18874                 return 1;
18875             }
18876           else if (find_regno_note (insn, REG_INC, LR_REGNO))
18877             return 1;
18878           else if (set_of (reg, insn) != NULL_RTX
18879                    && !prologue_epilogue_contains (insn))
18880             return 1;
18881         }
18882     }
18883   return 0;
18884 }
18885 \f
18886 /* Emit instructions needed to load the TOC register.
18887    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
18888    a constant pool; or for SVR4 -fpic.  */
18889
18890 void
18891 rs6000_emit_load_toc_table (int fromprolog)
18892 {
18893   rtx dest;
18894   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
18895
18896   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
18897     {
18898       char buf[30];
18899       rtx lab, tmp1, tmp2, got;
18900
18901       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18902       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18903       if (flag_pic == 2)
18904         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18905       else
18906         got = rs6000_got_sym ();
18907       tmp1 = tmp2 = dest;
18908       if (!fromprolog)
18909         {
18910           tmp1 = gen_reg_rtx (Pmode);
18911           tmp2 = gen_reg_rtx (Pmode);
18912         }
18913       emit_insn (gen_load_toc_v4_PIC_1 (lab));
18914       emit_move_insn (tmp1,
18915                              gen_rtx_REG (Pmode, LR_REGNO));
18916       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
18917       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
18918     }
18919   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
18920     {
18921       emit_insn (gen_load_toc_v4_pic_si ());
18922       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18923     }
18924   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
18925     {
18926       char buf[30];
18927       rtx temp0 = (fromprolog
18928                    ? gen_rtx_REG (Pmode, 0)
18929                    : gen_reg_rtx (Pmode));
18930
18931       if (fromprolog)
18932         {
18933           rtx symF, symL;
18934
18935           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18936           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18937
18938           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
18939           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18940
18941           emit_insn (gen_load_toc_v4_PIC_1 (symF));
18942           emit_move_insn (dest,
18943                           gen_rtx_REG (Pmode, LR_REGNO));
18944           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
18945         }
18946       else
18947         {
18948           rtx tocsym, lab;
18949
18950           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18951           lab = gen_label_rtx ();
18952           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
18953           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18954           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
18955         }
18956       emit_insn (gen_addsi3 (dest, temp0, dest));
18957     }
18958   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
18959     {
18960       /* This is for AIX code running in non-PIC ELF32.  */
18961       char buf[30];
18962       rtx realsym;
18963       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
18964       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18965
18966       emit_insn (gen_elf_high (dest, realsym));
18967       emit_insn (gen_elf_low (dest, dest, realsym));
18968     }
18969   else
18970     {
18971       gcc_assert (DEFAULT_ABI == ABI_AIX);
18972
18973       if (TARGET_32BIT)
18974         emit_insn (gen_load_toc_aix_si (dest));
18975       else
18976         emit_insn (gen_load_toc_aix_di (dest));
18977     }
18978 }
18979
18980 /* Emit instructions to restore the link register after determining where
18981    its value has been stored.  */
18982
18983 void
18984 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
18985 {
18986   rs6000_stack_t *info = rs6000_stack_info ();
18987   rtx operands[2];
18988
18989   operands[0] = source;
18990   operands[1] = scratch;
18991
18992   if (info->lr_save_p)
18993     {
18994       rtx frame_rtx = stack_pointer_rtx;
18995       HOST_WIDE_INT sp_offset = 0;
18996       rtx tmp;
18997
18998       if (frame_pointer_needed
18999           || cfun->calls_alloca
19000           || info->total_size > 32767)
19001         {
19002           tmp = gen_frame_mem (Pmode, frame_rtx);
19003           emit_move_insn (operands[1], tmp);
19004           frame_rtx = operands[1];
19005         }
19006       else if (info->push_p)
19007         sp_offset = info->total_size;
19008
19009       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
19010       tmp = gen_frame_mem (Pmode, tmp);
19011       emit_move_insn (tmp, operands[0]);
19012     }
19013   else
19014     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
19015
19016   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
19017      state of lr_save_p so any change from here on would be a bug.  In
19018      particular, stop rs6000_ra_ever_killed from considering the SET
19019      of lr we may have added just above.  */ 
19020   cfun->machine->lr_save_state = info->lr_save_p + 1;
19021 }
19022
19023 static GTY(()) alias_set_type set = -1;
19024
19025 alias_set_type
19026 get_TOC_alias_set (void)
19027 {
19028   if (set == -1)
19029     set = new_alias_set ();
19030   return set;
19031 }
19032
19033 /* This returns nonzero if the current function uses the TOC.  This is
19034    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
19035    is generated by the ABI_V4 load_toc_* patterns.  */
19036 #if TARGET_ELF
19037 static int
19038 uses_TOC (void)
19039 {
19040   rtx insn;
19041
19042   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
19043     if (INSN_P (insn))
19044       {
19045         rtx pat = PATTERN (insn);
19046         int i;
19047
19048         if (GET_CODE (pat) == PARALLEL)
19049           for (i = 0; i < XVECLEN (pat, 0); i++)
19050             {
19051               rtx sub = XVECEXP (pat, 0, i);
19052               if (GET_CODE (sub) == USE)
19053                 {
19054                   sub = XEXP (sub, 0);
19055                   if (GET_CODE (sub) == UNSPEC
19056                       && XINT (sub, 1) == UNSPEC_TOC)
19057                     return 1;
19058                 }
19059             }
19060       }
19061   return 0;
19062 }
19063 #endif
19064
19065 rtx
19066 create_TOC_reference (rtx symbol, rtx largetoc_reg)
19067 {
19068   rtx tocrel, tocreg;
19069
19070   if (TARGET_DEBUG_ADDR)
19071     {
19072       if (GET_CODE (symbol) == SYMBOL_REF)
19073         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
19074                  XSTR (symbol, 0));
19075       else
19076         {
19077           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
19078                    GET_RTX_NAME (GET_CODE (symbol)));
19079           debug_rtx (symbol);
19080         }
19081     }
19082
19083   if (!can_create_pseudo_p ())
19084     df_set_regs_ever_live (TOC_REGISTER, true);
19085
19086   tocrel = gen_rtx_CONST (Pmode,
19087                           gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol),
19088                                           UNSPEC_TOCREL));
19089   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
19090   if (TARGET_CMODEL != CMODEL_SMALL)
19091     {
19092       rtx hi = gen_rtx_PLUS (Pmode, tocreg, gen_rtx_HIGH (Pmode, tocrel));
19093       if (largetoc_reg != NULL)
19094         {
19095           emit_move_insn (largetoc_reg, hi);
19096           hi = largetoc_reg;
19097         }
19098       return gen_rtx_LO_SUM (Pmode, hi, copy_rtx (tocrel));
19099     }
19100   else
19101     return gen_rtx_PLUS (Pmode, tocreg, tocrel);
19102 }
19103
19104 /* Issue assembly directives that create a reference to the given DWARF
19105    FRAME_TABLE_LABEL from the current function section.  */
19106 void
19107 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
19108 {
19109   fprintf (asm_out_file, "\t.ref %s\n",
19110            TARGET_STRIP_NAME_ENCODING (frame_table_label));
19111 }
19112 \f
19113 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
19114    and the change to the stack pointer.  */
19115
19116 static void
19117 rs6000_emit_stack_tie (void)
19118 {
19119   rtx mem = gen_frame_mem (BLKmode,
19120                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
19121
19122   emit_insn (gen_stack_tie (mem));
19123 }
19124
19125 /* Emit the correct code for allocating stack space, as insns.
19126    If COPY_REG, make sure a copy of the old frame is left there.
19127    The generated code may use hard register 0 as a temporary.  */
19128
19129 static void
19130 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg)
19131 {
19132   rtx insn;
19133   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19134   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
19135   rtx todec = gen_int_mode (-size, Pmode);
19136   rtx par, set, mem;
19137
19138   if (INTVAL (todec) != -size)
19139     {
19140       warning (0, "stack frame too large");
19141       emit_insn (gen_trap ());
19142       return;
19143     }
19144
19145   if (crtl->limit_stack)
19146     {
19147       if (REG_P (stack_limit_rtx)
19148           && REGNO (stack_limit_rtx) > 1
19149           && REGNO (stack_limit_rtx) <= 31)
19150         {
19151           emit_insn (gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size)));
19152           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19153                                     const0_rtx));
19154         }
19155       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
19156                && TARGET_32BIT
19157                && DEFAULT_ABI == ABI_V4)
19158         {
19159           rtx toload = gen_rtx_CONST (VOIDmode,
19160                                       gen_rtx_PLUS (Pmode,
19161                                                     stack_limit_rtx,
19162                                                     GEN_INT (size)));
19163
19164           emit_insn (gen_elf_high (tmp_reg, toload));
19165           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
19166           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19167                                     const0_rtx));
19168         }
19169       else
19170         warning (0, "stack limit expression is not supported");
19171     }
19172
19173   if (copy_reg)
19174     emit_move_insn (copy_reg, stack_reg);
19175
19176   if (size > 32767)
19177     {
19178       /* Need a note here so that try_split doesn't get confused.  */
19179       if (get_last_insn () == NULL_RTX)
19180         emit_note (NOTE_INSN_DELETED);
19181       insn = emit_move_insn (tmp_reg, todec);
19182       try_split (PATTERN (insn), insn, 0);
19183       todec = tmp_reg;
19184     }
19185   
19186   insn = emit_insn (TARGET_32BIT
19187                     ? gen_movsi_update_stack (stack_reg, stack_reg,
19188                                         todec, stack_reg)
19189                     : gen_movdi_di_update_stack (stack_reg, stack_reg,
19190                                            todec, stack_reg));
19191   /* Since we didn't use gen_frame_mem to generate the MEM, grab
19192      it now and set the alias set/attributes. The above gen_*_update
19193      calls will generate a PARALLEL with the MEM set being the first
19194      operation. */
19195   par = PATTERN (insn);
19196   gcc_assert (GET_CODE (par) == PARALLEL);
19197   set = XVECEXP (par, 0, 0);
19198   gcc_assert (GET_CODE (set) == SET);
19199   mem = SET_DEST (set);
19200   gcc_assert (MEM_P (mem));
19201   MEM_NOTRAP_P (mem) = 1;
19202   set_mem_alias_set (mem, get_frame_alias_set ());
19203
19204   RTX_FRAME_RELATED_P (insn) = 1;
19205   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
19206                 gen_rtx_SET (VOIDmode, stack_reg,
19207                              gen_rtx_PLUS (Pmode, stack_reg,
19208                                            GEN_INT (-size))));
19209 }
19210
19211 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
19212
19213 #if PROBE_INTERVAL > 32768
19214 #error Cannot use indexed addressing mode for stack probing
19215 #endif
19216
19217 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
19218    inclusive.  These are offsets from the current stack pointer.  */
19219
19220 static void
19221 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
19222 {
19223   /* See if we have a constant small number of probes to generate.  If so,
19224      that's the easy case.  */
19225   if (first + size <= 32768)
19226     {
19227       HOST_WIDE_INT i;
19228
19229       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
19230          it exceeds SIZE.  If only one probe is needed, this will not
19231          generate any code.  Then probe at FIRST + SIZE.  */
19232       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
19233         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
19234
19235       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
19236     }
19237
19238   /* Otherwise, do the same as above, but in a loop.  Note that we must be
19239      extra careful with variables wrapping around because we might be at
19240      the very top (or the very bottom) of the address space and we have
19241      to be able to handle this case properly; in particular, we use an
19242      equality test for the loop condition.  */
19243   else
19244     {
19245       HOST_WIDE_INT rounded_size;
19246       rtx r12 = gen_rtx_REG (Pmode, 12);
19247       rtx r0 = gen_rtx_REG (Pmode, 0);
19248
19249       /* Sanity check for the addressing mode we're going to use.  */
19250       gcc_assert (first <= 32768);
19251
19252       /* Step 1: round SIZE to the previous multiple of the interval.  */
19253
19254       rounded_size = size & -PROBE_INTERVAL;
19255
19256
19257       /* Step 2: compute initial and final value of the loop counter.  */
19258
19259       /* TEST_ADDR = SP + FIRST.  */
19260       emit_insn (gen_rtx_SET (VOIDmode, r12,
19261                               plus_constant (stack_pointer_rtx, -first)));
19262
19263       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
19264       if (rounded_size > 32768)
19265         {
19266           emit_move_insn (r0, GEN_INT (-rounded_size));
19267           emit_insn (gen_rtx_SET (VOIDmode, r0,
19268                                   gen_rtx_PLUS (Pmode, r12, r0)));
19269         }
19270       else
19271         emit_insn (gen_rtx_SET (VOIDmode, r0,
19272                                 plus_constant (r12, -rounded_size)));
19273
19274
19275       /* Step 3: the loop
19276
19277          while (TEST_ADDR != LAST_ADDR)
19278            {
19279              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
19280              probe at TEST_ADDR
19281            }
19282
19283          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
19284          until it is equal to ROUNDED_SIZE.  */
19285
19286       if (TARGET_64BIT)
19287         emit_insn (gen_probe_stack_rangedi (r12, r12, r0));
19288       else
19289         emit_insn (gen_probe_stack_rangesi (r12, r12, r0));
19290
19291
19292       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
19293          that SIZE is equal to ROUNDED_SIZE.  */
19294
19295       if (size != rounded_size)
19296         emit_stack_probe (plus_constant (r12, rounded_size - size));
19297     }
19298 }
19299
19300 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
19301    absolute addresses.  */
19302
19303 const char *
19304 output_probe_stack_range (rtx reg1, rtx reg2)
19305 {
19306   static int labelno = 0;
19307   char loop_lab[32], end_lab[32];
19308   rtx xops[2];
19309
19310   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
19311   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
19312
19313   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
19314
19315   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
19316   xops[0] = reg1;
19317   xops[1] = reg2;
19318   if (TARGET_64BIT)
19319     output_asm_insn ("{cmp|cmpd} 0,%0,%1", xops);
19320   else
19321     output_asm_insn ("{cmp|cmpw} 0,%0,%1", xops);
19322
19323   fputs ("\tbeq 0,", asm_out_file);
19324   assemble_name_raw (asm_out_file, end_lab);
19325   fputc ('\n', asm_out_file);
19326
19327   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
19328   xops[1] = GEN_INT (-PROBE_INTERVAL);
19329   output_asm_insn ("{cal %0,%1(%0)|addi %0,%0,%1}", xops);
19330
19331   /* Probe at TEST_ADDR and branch.  */
19332   output_asm_insn ("{st|stw} 0,0(%0)", xops);
19333   fprintf (asm_out_file, "\tb ");
19334   assemble_name_raw (asm_out_file, loop_lab);
19335   fputc ('\n', asm_out_file);
19336
19337   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
19338
19339   return "";
19340 }
19341
19342 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
19343    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
19344    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
19345    deduce these equivalences by itself so it wasn't necessary to hold
19346    its hand so much.  */
19347
19348 static void
19349 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
19350                       rtx reg2, rtx rreg)
19351 {
19352   rtx real, temp;
19353
19354   /* copy_rtx will not make unique copies of registers, so we need to
19355      ensure we don't have unwanted sharing here.  */
19356   if (reg == reg2)
19357     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19358
19359   if (reg == rreg)
19360     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19361
19362   real = copy_rtx (PATTERN (insn));
19363
19364   if (reg2 != NULL_RTX)
19365     real = replace_rtx (real, reg2, rreg);
19366
19367   real = replace_rtx (real, reg,
19368                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
19369                                                         STACK_POINTER_REGNUM),
19370                                     GEN_INT (val)));
19371
19372   /* We expect that 'real' is either a SET or a PARALLEL containing
19373      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
19374      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
19375
19376   if (GET_CODE (real) == SET)
19377     {
19378       rtx set = real;
19379
19380       temp = simplify_rtx (SET_SRC (set));
19381       if (temp)
19382         SET_SRC (set) = temp;
19383       temp = simplify_rtx (SET_DEST (set));
19384       if (temp)
19385         SET_DEST (set) = temp;
19386       if (GET_CODE (SET_DEST (set)) == MEM)
19387         {
19388           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19389           if (temp)
19390             XEXP (SET_DEST (set), 0) = temp;
19391         }
19392     }
19393   else
19394     {
19395       int i;
19396
19397       gcc_assert (GET_CODE (real) == PARALLEL);
19398       for (i = 0; i < XVECLEN (real, 0); i++)
19399         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
19400           {
19401             rtx set = XVECEXP (real, 0, i);
19402
19403             temp = simplify_rtx (SET_SRC (set));
19404             if (temp)
19405               SET_SRC (set) = temp;
19406             temp = simplify_rtx (SET_DEST (set));
19407             if (temp)
19408               SET_DEST (set) = temp;
19409             if (GET_CODE (SET_DEST (set)) == MEM)
19410               {
19411                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19412                 if (temp)
19413                   XEXP (SET_DEST (set), 0) = temp;
19414               }
19415             RTX_FRAME_RELATED_P (set) = 1;
19416           }
19417     }
19418
19419   RTX_FRAME_RELATED_P (insn) = 1;
19420   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
19421 }
19422
19423 /* Returns an insn that has a vrsave set operation with the
19424    appropriate CLOBBERs.  */
19425
19426 static rtx
19427 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
19428 {
19429   int nclobs, i;
19430   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
19431   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
19432
19433   clobs[0]
19434     = gen_rtx_SET (VOIDmode,
19435                    vrsave,
19436                    gen_rtx_UNSPEC_VOLATILE (SImode,
19437                                             gen_rtvec (2, reg, vrsave),
19438                                             UNSPECV_SET_VRSAVE));
19439
19440   nclobs = 1;
19441
19442   /* We need to clobber the registers in the mask so the scheduler
19443      does not move sets to VRSAVE before sets of AltiVec registers.
19444
19445      However, if the function receives nonlocal gotos, reload will set
19446      all call saved registers live.  We will end up with:
19447
19448         (set (reg 999) (mem))
19449         (parallel [ (set (reg vrsave) (unspec blah))
19450                     (clobber (reg 999))])
19451
19452      The clobber will cause the store into reg 999 to be dead, and
19453      flow will attempt to delete an epilogue insn.  In this case, we
19454      need an unspec use/set of the register.  */
19455
19456   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
19457     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
19458       {
19459         if (!epiloguep || call_used_regs [i])
19460           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
19461                                              gen_rtx_REG (V4SImode, i));
19462         else
19463           {
19464             rtx reg = gen_rtx_REG (V4SImode, i);
19465
19466             clobs[nclobs++]
19467               = gen_rtx_SET (VOIDmode,
19468                              reg,
19469                              gen_rtx_UNSPEC (V4SImode,
19470                                              gen_rtvec (1, reg), 27));
19471           }
19472       }
19473
19474   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
19475
19476   for (i = 0; i < nclobs; ++i)
19477     XVECEXP (insn, 0, i) = clobs[i];
19478
19479   return insn;
19480 }
19481
19482 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
19483    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
19484
19485 static void
19486 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
19487                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
19488 {
19489   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
19490   rtx replacea, replaceb;
19491
19492   int_rtx = GEN_INT (offset);
19493
19494   /* Some cases that need register indexed addressing.  */
19495   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
19496       || (TARGET_VSX && VSX_VECTOR_MODE (mode))
19497       || (TARGET_E500_DOUBLE && mode == DFmode)
19498       || (TARGET_SPE_ABI
19499           && SPE_VECTOR_MODE (mode)
19500           && !SPE_CONST_OFFSET_OK (offset)))
19501     {
19502       /* Whomever calls us must make sure r11 is available in the
19503          flow path of instructions in the prologue.  */
19504       offset_rtx = gen_rtx_REG (Pmode, 11);
19505       emit_move_insn (offset_rtx, int_rtx);
19506
19507       replacea = offset_rtx;
19508       replaceb = int_rtx;
19509     }
19510   else
19511     {
19512       offset_rtx = int_rtx;
19513       replacea = NULL_RTX;
19514       replaceb = NULL_RTX;
19515     }
19516
19517   reg = gen_rtx_REG (mode, regno);
19518   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
19519   mem = gen_frame_mem (mode, addr);
19520
19521   insn = emit_move_insn (mem, reg);
19522
19523   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
19524 }
19525
19526 /* Emit an offset memory reference suitable for a frame store, while
19527    converting to a valid addressing mode.  */
19528
19529 static rtx
19530 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
19531 {
19532   rtx int_rtx, offset_rtx;
19533
19534   int_rtx = GEN_INT (offset);
19535
19536   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
19537       || (TARGET_E500_DOUBLE && mode == DFmode))
19538     {
19539       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
19540       emit_move_insn (offset_rtx, int_rtx);
19541     }
19542   else
19543     offset_rtx = int_rtx;
19544
19545   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
19546 }
19547
19548 /* Look for user-defined global regs.  We should not save and restore these,
19549    and cannot use stmw/lmw if there are any in its range.  */
19550
19551 static bool
19552 no_global_regs_above (int first, bool gpr)
19553 {
19554   int i;
19555   int last = gpr ? 32 : 64;
19556   for (i = first; i < last; i++)
19557     if (global_regs[i])
19558       return false;
19559   return true;
19560 }
19561
19562 #ifndef TARGET_FIX_AND_CONTINUE
19563 #define TARGET_FIX_AND_CONTINUE 0
19564 #endif
19565
19566 /* It's really GPR 13 and FPR 14, but we need the smaller of the two.  */
19567 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
19568 #define LAST_SAVRES_REGISTER 31
19569 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
19570
19571 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
19572
19573 /* Temporary holding space for an out-of-line register save/restore
19574    routine name.  */
19575 static char savres_routine_name[30];
19576
19577 /* Return the name for an out-of-line register save/restore routine.
19578    We are saving/restoring GPRs if GPR is true.  */
19579
19580 static char *
19581 rs6000_savres_routine_name (rs6000_stack_t *info, int regno,
19582                             bool savep, bool gpr, bool lr)
19583 {
19584   const char *prefix = "";
19585   const char *suffix = "";
19586
19587   /* Different targets are supposed to define
19588      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
19589      routine name could be defined with:
19590
19591      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
19592
19593      This is a nice idea in practice, but in reality, things are
19594      complicated in several ways:
19595
19596      - ELF targets have save/restore routines for GPRs.
19597
19598      - SPE targets use different prefixes for 32/64-bit registers, and
19599        neither of them fit neatly in the FOO_{PREFIX,SUFFIX} regimen.
19600
19601      - PPC64 ELF targets have routines for save/restore of GPRs that
19602        differ in what they do with the link register, so having a set
19603        prefix doesn't work.  (We only use one of the save routines at
19604        the moment, though.)
19605
19606      - PPC32 elf targets have "exit" versions of the restore routines
19607        that restore the link register and can save some extra space.
19608        These require an extra suffix.  (There are also "tail" versions
19609        of the restore routines and "GOT" versions of the save routines,
19610        but we don't generate those at present.  Same problems apply,
19611        though.)
19612
19613      We deal with all this by synthesizing our own prefix/suffix and
19614      using that for the simple sprintf call shown above.  */
19615   if (TARGET_SPE)
19616     {
19617       /* No floating point saves on the SPE.  */
19618       gcc_assert (gpr);
19619
19620       if (savep)
19621         prefix = info->spe_64bit_regs_used ? "_save64gpr_" : "_save32gpr_";
19622       else
19623         prefix = info->spe_64bit_regs_used ? "_rest64gpr_" : "_rest32gpr_";
19624
19625       if (lr)
19626         suffix = "_x";
19627     }
19628   else if (DEFAULT_ABI == ABI_V4)
19629     {
19630       if (TARGET_64BIT)
19631         goto aix_names;
19632
19633       if (gpr)
19634         prefix = savep ? "_savegpr_" : "_restgpr_";
19635       else
19636         prefix = savep ? "_savefpr_" : "_restfpr_";
19637
19638       if (lr)
19639         suffix = "_x";
19640     }
19641   else if (DEFAULT_ABI == ABI_AIX)
19642     {
19643 #ifndef POWERPC_LINUX
19644       /* No out-of-line save/restore routines for GPRs on AIX.  */
19645       gcc_assert (!TARGET_AIX || !gpr);
19646 #endif
19647
19648     aix_names:
19649       if (gpr)
19650         prefix = (savep
19651                   ? (lr ? "_savegpr0_" : "_savegpr1_")
19652                   : (lr ? "_restgpr0_" : "_restgpr1_"));
19653 #ifdef POWERPC_LINUX
19654       else if (lr)
19655         prefix = (savep ? "_savefpr_" : "_restfpr_");
19656 #endif
19657       else
19658         {
19659           prefix = savep ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
19660           suffix = savep ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
19661         }
19662     }
19663   else if (DEFAULT_ABI == ABI_DARWIN)
19664     sorry ("Out-of-line save/restore routines not supported on Darwin");
19665
19666   sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
19667
19668   return savres_routine_name;
19669 }
19670
19671 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
19672    We are saving/restoring GPRs if GPR is true.  */
19673
19674 static rtx
19675 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep,
19676                            bool gpr, bool lr)
19677 {
19678   int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
19679   rtx sym;
19680   int select = ((savep ? 1 : 0) << 2
19681                 | ((TARGET_SPE_ABI
19682                     /* On the SPE, we never have any FPRs, but we do have
19683                        32/64-bit versions of the routines.  */
19684                     ? (info->spe_64bit_regs_used ? 1 : 0)
19685                     : (gpr ? 1 : 0)) << 1)
19686                 | (lr ? 1: 0));
19687
19688   /* Don't generate bogus routine names.  */
19689   gcc_assert (FIRST_SAVRES_REGISTER <= regno
19690               && regno <= LAST_SAVRES_REGISTER);
19691
19692   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
19693
19694   if (sym == NULL)
19695     {
19696       char *name;
19697
19698       name = rs6000_savres_routine_name (info, regno, savep, gpr, lr);
19699
19700       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
19701         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
19702       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
19703     }
19704
19705   return sym;
19706 }
19707
19708 /* Emit a sequence of insns, including a stack tie if needed, for
19709    resetting the stack pointer.  If SAVRES is true, then don't reset the
19710    stack pointer, but move the base of the frame into r11 for use by
19711    out-of-line register restore routines.  */
19712
19713 static rtx
19714 rs6000_emit_stack_reset (rs6000_stack_t *info,
19715                          rtx sp_reg_rtx, rtx frame_reg_rtx,
19716                          int sp_offset, bool savres)
19717 {
19718   /* This blockage is needed so that sched doesn't decide to move
19719      the sp change before the register restores.  */
19720   if (frame_reg_rtx != sp_reg_rtx
19721       || (TARGET_SPE_ABI
19722           && info->spe_64bit_regs_used != 0
19723           && info->first_gp_reg_save != 32))
19724     rs6000_emit_stack_tie ();
19725   
19726   if (frame_reg_rtx != sp_reg_rtx)
19727     {
19728       if (sp_offset != 0)
19729         {
19730           rtx dest_reg = savres ? gen_rtx_REG (Pmode, 11) : sp_reg_rtx;
19731           return emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx,
19732                                            GEN_INT (sp_offset)));
19733         }
19734       else if (!savres)
19735         return emit_move_insn (sp_reg_rtx, frame_reg_rtx);
19736     }
19737   else if (sp_offset != 0)
19738     {
19739       /* If we are restoring registers out-of-line, we will be using the
19740          "exit" variants of the restore routines, which will reset the
19741          stack for us.  But we do need to point r11 into the right place
19742          for those routines.  */
19743       rtx dest_reg = (savres
19744                       ? gen_rtx_REG (Pmode, 11)
19745                       : sp_reg_rtx);
19746
19747       rtx insn = emit_insn (gen_add3_insn (dest_reg, sp_reg_rtx,
19748                                            GEN_INT (sp_offset)));
19749       if (!savres)
19750         return insn;
19751     }
19752   return NULL_RTX;
19753 }
19754
19755 /* Construct a parallel rtx describing the effect of a call to an
19756    out-of-line register save/restore routine.  */
19757
19758 static rtx
19759 rs6000_make_savres_rtx (rs6000_stack_t *info,
19760                         rtx frame_reg_rtx, int save_area_offset,
19761                         enum machine_mode reg_mode,
19762                         bool savep, bool gpr, bool lr)
19763 {
19764   int i;
19765   int offset, start_reg, end_reg, n_regs;
19766   int reg_size = GET_MODE_SIZE (reg_mode);
19767   rtx sym;
19768   rtvec p;
19769
19770   offset = 0;
19771   start_reg = (gpr
19772                ? info->first_gp_reg_save
19773                : info->first_fp_reg_save);
19774   end_reg = gpr ? 32 : 64;
19775   n_regs = end_reg - start_reg;
19776   p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
19777
19778   if (!savep && lr)
19779     RTVEC_ELT (p, offset++) = gen_rtx_RETURN (VOIDmode);
19780
19781   RTVEC_ELT (p, offset++)
19782     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
19783
19784   sym = rs6000_savres_routine_sym (info, savep, gpr, lr);
19785   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
19786   RTVEC_ELT (p, offset++)
19787     = gen_rtx_USE (VOIDmode,
19788                    gen_rtx_REG (Pmode, DEFAULT_ABI != ABI_AIX ? 11
19789                                        : gpr && !lr ? 12
19790                                        : 1));
19791
19792   for (i = 0; i < end_reg - start_reg; i++)
19793     {
19794       rtx addr, reg, mem;
19795       reg = gen_rtx_REG (reg_mode, start_reg + i);
19796       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19797                            GEN_INT (save_area_offset + reg_size*i));
19798       mem = gen_frame_mem (reg_mode, addr);
19799
19800       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
19801                                                savep ? mem : reg,
19802                                                savep ? reg : mem);
19803     }
19804
19805   if (savep && lr)
19806     {
19807       rtx addr, reg, mem;
19808       reg = gen_rtx_REG (Pmode, 0);
19809       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19810                            GEN_INT (info->lr_save_offset));
19811       mem = gen_frame_mem (Pmode, addr);
19812       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode, mem, reg);
19813     }
19814
19815   return gen_rtx_PARALLEL (VOIDmode, p);
19816 }
19817
19818 /* Determine whether the gp REG is really used.  */
19819
19820 static bool
19821 rs6000_reg_live_or_pic_offset_p (int reg)
19822 {
19823   /* If the function calls eh_return, claim used all the registers that would
19824      be checked for liveness otherwise.  This is required for the PIC offset
19825      register with -mminimal-toc on AIX, as it is advertised as "fixed" for
19826      register allocation purposes in this case.  */
19827
19828   return (((crtl->calls_eh_return || df_regs_ever_live_p (reg))
19829            && (!call_used_regs[reg]
19830                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19831                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
19832           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19833               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
19834                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
19835 }
19836
19837 /* Emit function prologue as insns.  */
19838
19839 void
19840 rs6000_emit_prologue (void)
19841 {
19842   rs6000_stack_t *info = rs6000_stack_info ();
19843   enum machine_mode reg_mode = Pmode;
19844   int reg_size = TARGET_32BIT ? 4 : 8;
19845   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19846   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
19847   rtx frame_reg_rtx = sp_reg_rtx;
19848   rtx cr_save_rtx = NULL_RTX;
19849   rtx insn;
19850   int strategy;
19851   int saving_FPRs_inline;
19852   int saving_GPRs_inline;
19853   int using_store_multiple;
19854   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
19855                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
19856                               && call_used_regs[STATIC_CHAIN_REGNUM]);
19857   HOST_WIDE_INT sp_offset = 0;
19858
19859   if (flag_stack_usage)
19860     current_function_static_stack_size = info->total_size;
19861
19862   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && info->total_size)
19863     rs6000_emit_probe_stack_range (STACK_CHECK_PROTECT, info->total_size);
19864
19865   if (TARGET_FIX_AND_CONTINUE)
19866     {
19867       /* gdb on darwin arranges to forward a function from the old
19868          address by modifying the first 5 instructions of the function
19869          to branch to the overriding function.  This is necessary to
19870          permit function pointers that point to the old function to
19871          actually forward to the new function.  */
19872       emit_insn (gen_nop ());
19873       emit_insn (gen_nop ());
19874       emit_insn (gen_nop ());
19875       emit_insn (gen_nop ());
19876       emit_insn (gen_nop ());
19877     }
19878
19879   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
19880     {
19881       reg_mode = V2SImode;
19882       reg_size = 8;
19883     }
19884
19885   strategy = info->savres_strategy;
19886   using_store_multiple = strategy & SAVRES_MULTIPLE;
19887   saving_FPRs_inline = strategy & SAVE_INLINE_FPRS;
19888   saving_GPRs_inline = strategy & SAVE_INLINE_GPRS;
19889
19890   /* For V.4, update stack before we do any saving and set back pointer.  */
19891   if (! WORLD_SAVE_P (info)
19892       && info->push_p
19893       && (DEFAULT_ABI == ABI_V4
19894           || crtl->calls_eh_return))
19895     {
19896       bool need_r11 = (TARGET_SPE
19897                        ? (!saving_GPRs_inline
19898                           && info->spe_64bit_regs_used == 0)
19899                        : (!saving_FPRs_inline || !saving_GPRs_inline));
19900       rtx copy_reg = need_r11 ? gen_rtx_REG (Pmode, 11) : NULL;
19901
19902       if (info->total_size < 32767)
19903         sp_offset = info->total_size;
19904       else if (need_r11)
19905         frame_reg_rtx = copy_reg;
19906       else if (info->cr_save_p
19907                || info->lr_save_p
19908                || info->first_fp_reg_save < 64
19909                || info->first_gp_reg_save < 32
19910                || info->altivec_size != 0
19911                || info->vrsave_mask != 0
19912                || crtl->calls_eh_return)
19913         {
19914           copy_reg = frame_ptr_rtx;
19915           frame_reg_rtx = copy_reg;
19916         }
19917       else
19918         {
19919           /* The prologue won't be saving any regs so there is no need
19920              to set up a frame register to access any frame save area.
19921              We also won't be using sp_offset anywhere below, but set
19922              the correct value anyway to protect against future
19923              changes to this function.  */
19924           sp_offset = info->total_size;
19925         }
19926       rs6000_emit_allocate_stack (info->total_size, copy_reg);
19927       if (frame_reg_rtx != sp_reg_rtx)
19928         rs6000_emit_stack_tie ();
19929     }
19930
19931   /* Handle world saves specially here.  */
19932   if (WORLD_SAVE_P (info))
19933     {
19934       int i, j, sz;
19935       rtx treg;
19936       rtvec p;
19937       rtx reg0;
19938
19939       /* save_world expects lr in r0. */
19940       reg0 = gen_rtx_REG (Pmode, 0);
19941       if (info->lr_save_p)
19942         {
19943           insn = emit_move_insn (reg0,
19944                                  gen_rtx_REG (Pmode, LR_REGNO));
19945           RTX_FRAME_RELATED_P (insn) = 1;
19946         }
19947
19948       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
19949          assumptions about the offsets of various bits of the stack
19950          frame.  */
19951       gcc_assert (info->gp_save_offset == -220
19952                   && info->fp_save_offset == -144
19953                   && info->lr_save_offset == 8
19954                   && info->cr_save_offset == 4
19955                   && info->push_p
19956                   && info->lr_save_p
19957                   && (!crtl->calls_eh_return
19958                        || info->ehrd_offset == -432)
19959                   && info->vrsave_save_offset == -224
19960                   && info->altivec_save_offset == -416);
19961
19962       treg = gen_rtx_REG (SImode, 11);
19963       emit_move_insn (treg, GEN_INT (-info->total_size));
19964
19965       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
19966          in R11.  It also clobbers R12, so beware!  */
19967
19968       /* Preserve CR2 for save_world prologues */
19969       sz = 5;
19970       sz += 32 - info->first_gp_reg_save;
19971       sz += 64 - info->first_fp_reg_save;
19972       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
19973       p = rtvec_alloc (sz);
19974       j = 0;
19975       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
19976                                             gen_rtx_REG (SImode,
19977                                                          LR_REGNO));
19978       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
19979                                         gen_rtx_SYMBOL_REF (Pmode,
19980                                                             "*save_world"));
19981       /* We do floats first so that the instruction pattern matches
19982          properly.  */
19983       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
19984         {
19985           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19986                                    ? DFmode : SFmode), 
19987                                  info->first_fp_reg_save + i);
19988           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19989                                    GEN_INT (info->fp_save_offset
19990                                             + sp_offset + 8 * i));
19991           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19992                                      ? DFmode : SFmode), addr);
19993
19994           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19995         }
19996       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
19997         {
19998           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
19999           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20000                                    GEN_INT (info->altivec_save_offset
20001                                             + sp_offset + 16 * i));
20002           rtx mem = gen_frame_mem (V4SImode, addr);
20003
20004           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20005         }
20006       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20007         {
20008           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20009           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20010                                    GEN_INT (info->gp_save_offset
20011                                             + sp_offset + reg_size * i));
20012           rtx mem = gen_frame_mem (reg_mode, addr);
20013
20014           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20015         }
20016
20017       {
20018         /* CR register traditionally saved as CR2.  */
20019         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20020         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20021                                  GEN_INT (info->cr_save_offset
20022                                           + sp_offset));
20023         rtx mem = gen_frame_mem (reg_mode, addr);
20024
20025         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20026       }
20027       /* Explain about use of R0.  */
20028       if (info->lr_save_p)
20029         {
20030           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20031                                    GEN_INT (info->lr_save_offset
20032                                             + sp_offset));
20033           rtx mem = gen_frame_mem (reg_mode, addr);
20034
20035           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
20036         }
20037       /* Explain what happens to the stack pointer.  */
20038       {
20039         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
20040         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
20041       }
20042
20043       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20044       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20045                             treg, GEN_INT (-info->total_size));
20046       sp_offset = info->total_size;
20047     }
20048
20049   /* If we use the link register, get it into r0.  */
20050   if (!WORLD_SAVE_P (info) && info->lr_save_p)
20051     {
20052       rtx addr, reg, mem;
20053
20054       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
20055                              gen_rtx_REG (Pmode, LR_REGNO));
20056       RTX_FRAME_RELATED_P (insn) = 1;
20057
20058       if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
20059                         | SAVE_NOINLINE_FPRS_SAVES_LR)))
20060         {
20061           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20062                                GEN_INT (info->lr_save_offset + sp_offset));
20063           reg = gen_rtx_REG (Pmode, 0);
20064           mem = gen_rtx_MEM (Pmode, addr);
20065           /* This should not be of rs6000_sr_alias_set, because of
20066              __builtin_return_address.  */
20067
20068           insn = emit_move_insn (mem, reg);
20069           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20070                                 NULL_RTX, NULL_RTX);
20071         }
20072     }
20073
20074   /* If we need to save CR, put it into r12 or r11.  */
20075   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
20076     {
20077       rtx set;
20078
20079       cr_save_rtx
20080         = gen_rtx_REG (SImode, DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline
20081                        ? 11 : 12);
20082       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20083       RTX_FRAME_RELATED_P (insn) = 1;
20084       /* Now, there's no way that dwarf2out_frame_debug_expr is going
20085          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
20086          But that's OK.  All we have to do is specify that _one_ condition
20087          code register is saved in this stack slot.  The thrower's epilogue
20088          will then restore all the call-saved registers.
20089          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
20090       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
20091                          gen_rtx_REG (SImode, CR2_REGNO));
20092       add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20093     }
20094
20095   /* Do any required saving of fpr's.  If only one or two to save, do
20096      it ourselves.  Otherwise, call function.  */
20097   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
20098     {
20099       int i;
20100       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20101         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
20102              && ! call_used_regs[info->first_fp_reg_save+i]))
20103           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, 
20104                            (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20105                             ? DFmode : SFmode,
20106                            info->first_fp_reg_save + i,
20107                            info->fp_save_offset + sp_offset + 8 * i,
20108                            info->total_size);
20109     }
20110   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
20111     {
20112       rtx par;
20113
20114       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20115                                     info->fp_save_offset + sp_offset,
20116                                     DFmode,
20117                                     /*savep=*/true, /*gpr=*/false,
20118                                     /*lr=*/(strategy
20119                                             & SAVE_NOINLINE_FPRS_SAVES_LR)
20120                                            != 0);
20121       insn = emit_insn (par);
20122       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20123                             NULL_RTX, NULL_RTX);
20124     }
20125
20126   /* Save GPRs.  This is done as a PARALLEL if we are using
20127      the store-multiple instructions.  */
20128   if (!WORLD_SAVE_P (info)
20129       && TARGET_SPE_ABI
20130       && info->spe_64bit_regs_used != 0
20131       && info->first_gp_reg_save != 32)
20132     {
20133       int i;
20134       rtx spe_save_area_ptr;
20135  
20136       /* Determine whether we can address all of the registers that need
20137          to be saved with an offset from the stack pointer that fits in
20138          the small const field for SPE memory instructions.  */
20139       int spe_regs_addressable_via_sp
20140         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
20141                                + (32 - info->first_gp_reg_save - 1) * reg_size)
20142            && saving_GPRs_inline);
20143       int spe_offset;
20144  
20145       if (spe_regs_addressable_via_sp)
20146         {
20147           spe_save_area_ptr = frame_reg_rtx;
20148           spe_offset = info->spe_gp_save_offset + sp_offset;
20149         }
20150       else
20151         {
20152           /* Make r11 point to the start of the SPE save area.  We need
20153              to be careful here if r11 is holding the static chain.  If
20154              it is, then temporarily save it in r0.  We would use r0 as
20155              our base register here, but using r0 as a base register in
20156              loads and stores means something different from what we
20157              would like.  */
20158           int ool_adjust = (saving_GPRs_inline
20159                             ? 0
20160                             : (info->first_gp_reg_save
20161                                - (FIRST_SAVRES_REGISTER+1))*8);
20162           HOST_WIDE_INT offset = (info->spe_gp_save_offset
20163                                   + sp_offset - ool_adjust);
20164
20165           if (using_static_chain_p)
20166             {
20167               rtx r0 = gen_rtx_REG (Pmode, 0);
20168               gcc_assert (info->first_gp_reg_save > 11);
20169  
20170               emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
20171             }
20172  
20173           spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
20174           insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
20175                                         frame_reg_rtx,
20176                                         GEN_INT (offset)));
20177           /* We need to make sure the move to r11 gets noted for
20178              properly outputting unwind information.  */
20179           if (!saving_GPRs_inline)
20180             rs6000_frame_related (insn, frame_reg_rtx, offset,
20181                                   NULL_RTX, NULL_RTX);
20182           spe_offset = 0;
20183         }
20184  
20185       if (saving_GPRs_inline)
20186         {
20187           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20188             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20189               {
20190                 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20191                 rtx offset, addr, mem;
20192
20193                 /* We're doing all this to ensure that the offset fits into
20194                    the immediate offset of 'evstdd'.  */
20195                 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
20196  
20197                 offset = GEN_INT (reg_size * i + spe_offset);
20198                 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
20199                 mem = gen_rtx_MEM (V2SImode, addr);
20200   
20201                 insn = emit_move_insn (mem, reg);
20202            
20203                 rs6000_frame_related (insn, spe_save_area_ptr,
20204                                       info->spe_gp_save_offset
20205                                       + sp_offset + reg_size * i,
20206                                       offset, const0_rtx);
20207               }
20208         }
20209       else
20210         {
20211           rtx par;
20212
20213           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
20214                                         0, reg_mode,
20215                                         /*savep=*/true, /*gpr=*/true,
20216                                         /*lr=*/false);
20217           insn = emit_insn (par);
20218           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20219                                 NULL_RTX, NULL_RTX);
20220         }
20221                                         
20222  
20223       /* Move the static chain pointer back.  */
20224       if (using_static_chain_p && !spe_regs_addressable_via_sp)
20225         emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
20226     }
20227   else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
20228     {
20229       rtx par;
20230
20231       /* Need to adjust r11 (r12) if we saved any FPRs.  */
20232       if (info->first_fp_reg_save != 64)
20233         {
20234           rtx dest_reg = gen_rtx_REG (reg_mode, DEFAULT_ABI == ABI_AIX
20235                                       ? 12 : 11);
20236           rtx offset = GEN_INT (sp_offset
20237                                 + (-8 * (64-info->first_fp_reg_save)));
20238           emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx, offset));
20239         }
20240
20241       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20242                                     info->gp_save_offset + sp_offset,
20243                                     reg_mode,
20244                                     /*savep=*/true, /*gpr=*/true,
20245                                     /*lr=*/(strategy
20246                                             & SAVE_NOINLINE_GPRS_SAVES_LR)
20247                                            != 0);
20248       insn = emit_insn (par);
20249       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20250                             NULL_RTX, NULL_RTX);
20251     }
20252   else if (!WORLD_SAVE_P (info) && using_store_multiple)
20253     {
20254       rtvec p;
20255       int i;
20256       p = rtvec_alloc (32 - info->first_gp_reg_save);
20257       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20258         {
20259           rtx addr, reg, mem;
20260           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20261           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20262                                GEN_INT (info->gp_save_offset
20263                                         + sp_offset
20264                                         + reg_size * i));
20265           mem = gen_frame_mem (reg_mode, addr);
20266
20267           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
20268         }
20269       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20270       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20271                             NULL_RTX, NULL_RTX);
20272     }
20273   else if (!WORLD_SAVE_P (info))
20274     {
20275       int i;
20276       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20277         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20278           {
20279             rtx addr, reg, mem;
20280             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20281
20282             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20283                                  GEN_INT (info->gp_save_offset
20284                                           + sp_offset
20285                                           + reg_size * i));
20286             mem = gen_frame_mem (reg_mode, addr);
20287
20288             insn = emit_move_insn (mem, reg);
20289             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20290                                   NULL_RTX, NULL_RTX);
20291           }
20292     }
20293
20294   /* ??? There's no need to emit actual instructions here, but it's the
20295      easiest way to get the frame unwind information emitted.  */
20296   if (crtl->calls_eh_return)
20297     {
20298       unsigned int i, regno;
20299
20300       for (i = 0; ; ++i)
20301         {
20302           regno = EH_RETURN_DATA_REGNO (i);
20303           if (regno == INVALID_REGNUM)
20304             break;
20305
20306           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
20307                            info->ehrd_offset + sp_offset
20308                            + reg_size * (int) i,
20309                            info->total_size);
20310         }
20311     }
20312
20313   /* In AIX ABI we need to make sure r2 is really saved.  */
20314   if (TARGET_AIX && crtl->calls_eh_return)
20315     {
20316       rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
20317       long toc_restore_insn;
20318
20319       gcc_assert (frame_reg_rtx == frame_ptr_rtx
20320                   || frame_reg_rtx == sp_reg_rtx);
20321       tmp_reg = gen_rtx_REG (Pmode, 11);
20322       tmp_reg_si = gen_rtx_REG (SImode, 11);
20323       if (using_static_chain_p)
20324         emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
20325       gcc_assert (saving_GPRs_inline && saving_FPRs_inline);
20326       emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
20327       /* Peek at instruction to which this function returns.  If it's
20328          restoring r2, then we know we've already saved r2.  We can't
20329          unconditionally save r2 because the value we have will already
20330          be updated if we arrived at this function via a plt call or
20331          toc adjusting stub.  */
20332       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
20333       toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
20334       hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
20335       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
20336       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
20337       validate_condition_mode (EQ, CCUNSmode);
20338       lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
20339       emit_insn (gen_rtx_SET (VOIDmode, compare_result,
20340                               gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
20341       toc_save_done = gen_label_rtx ();
20342       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
20343                                    gen_rtx_EQ (VOIDmode, compare_result,
20344                                                const0_rtx),
20345                                    gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
20346                                    pc_rtx);
20347       jump = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, jump));
20348       JUMP_LABEL (jump) = toc_save_done;
20349       LABEL_NUSES (toc_save_done) += 1;
20350
20351       emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, 2,
20352                        sp_offset + 5 * reg_size, info->total_size);
20353       emit_label (toc_save_done);
20354       if (using_static_chain_p)
20355         emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
20356     }
20357
20358   /* Save CR if we use any that must be preserved.  */
20359   if (!WORLD_SAVE_P (info) && info->cr_save_p)
20360     {
20361       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20362                                GEN_INT (info->cr_save_offset + sp_offset));
20363       rtx mem = gen_frame_mem (SImode, addr);
20364       /* See the large comment above about why CR2_REGNO is used.  */
20365       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
20366
20367       /* If r12 was used to hold the original sp, copy cr into r0 now
20368          that it's free.  */
20369       if (REGNO (frame_reg_rtx) == 12)
20370         {
20371           rtx set;
20372
20373           cr_save_rtx = gen_rtx_REG (SImode, 0);
20374           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20375           RTX_FRAME_RELATED_P (insn) = 1;
20376           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
20377           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20378         }
20379       insn = emit_move_insn (mem, cr_save_rtx);
20380
20381       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20382                             NULL_RTX, NULL_RTX);
20383     }
20384
20385   /* Update stack and set back pointer unless this is V.4,
20386      for which it was done previously.  */
20387   if (!WORLD_SAVE_P (info) && info->push_p
20388       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
20389     {
20390       rtx copy_reg = NULL;
20391
20392       if (info->total_size < 32767)
20393         sp_offset = info->total_size;
20394       else if (info->altivec_size != 0
20395                || info->vrsave_mask != 0)
20396         {
20397           copy_reg = frame_ptr_rtx;
20398           frame_reg_rtx = copy_reg;
20399         }
20400       else
20401         sp_offset = info->total_size;
20402       rs6000_emit_allocate_stack (info->total_size, copy_reg);
20403       if (frame_reg_rtx != sp_reg_rtx)
20404         rs6000_emit_stack_tie ();
20405     }
20406
20407   /* Set frame pointer, if needed.  */
20408   if (frame_pointer_needed)
20409     {
20410       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
20411                              sp_reg_rtx);
20412       RTX_FRAME_RELATED_P (insn) = 1;
20413     }
20414
20415   /* Save AltiVec registers if needed.  Save here because the red zone does
20416      not include AltiVec registers.  */
20417   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
20418     {
20419       int i;
20420
20421       /* There should be a non inline version of this, for when we
20422          are saving lots of vector registers.  */
20423       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20424         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20425           {
20426             rtx areg, savereg, mem;
20427             int offset;
20428
20429             offset = info->altivec_save_offset + sp_offset
20430               + 16 * (i - info->first_altivec_reg_save);
20431
20432             savereg = gen_rtx_REG (V4SImode, i);
20433
20434             areg = gen_rtx_REG (Pmode, 0);
20435             emit_move_insn (areg, GEN_INT (offset));
20436
20437             /* AltiVec addressing mode is [reg+reg].  */
20438             mem = gen_frame_mem (V4SImode,
20439                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
20440
20441             insn = emit_move_insn (mem, savereg);
20442
20443             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20444                                   areg, GEN_INT (offset));
20445           }
20446     }
20447
20448   /* VRSAVE is a bit vector representing which AltiVec registers
20449      are used.  The OS uses this to determine which vector
20450      registers to save on a context switch.  We need to save
20451      VRSAVE on the stack frame, add whatever AltiVec registers we
20452      used in this function, and do the corresponding magic in the
20453      epilogue.  */
20454
20455   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
20456       && info->vrsave_mask != 0)
20457     {
20458       rtx reg, mem, vrsave;
20459       int offset;
20460
20461       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
20462          as frame_reg_rtx and r11 as the static chain pointer for
20463          nested functions.  */
20464       reg = gen_rtx_REG (SImode, 0);
20465       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
20466       if (TARGET_MACHO)
20467         emit_insn (gen_get_vrsave_internal (reg));
20468       else
20469         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
20470
20471       if (!WORLD_SAVE_P (info))
20472         {
20473           /* Save VRSAVE.  */
20474           offset = info->vrsave_save_offset + sp_offset;
20475           mem = gen_frame_mem (SImode,
20476                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
20477                                              GEN_INT (offset)));
20478           insn = emit_move_insn (mem, reg);
20479         }
20480
20481       /* Include the registers in the mask.  */
20482       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
20483
20484       insn = emit_insn (generate_set_vrsave (reg, info, 0));
20485     }
20486
20487   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
20488   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
20489       || (DEFAULT_ABI == ABI_V4
20490           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
20491           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
20492     {
20493       /* If emit_load_toc_table will use the link register, we need to save
20494          it.  We use R12 for this purpose because emit_load_toc_table
20495          can use register 0.  This allows us to use a plain 'blr' to return
20496          from the procedure more often.  */
20497       int save_LR_around_toc_setup = (TARGET_ELF
20498                                       && DEFAULT_ABI != ABI_AIX
20499                                       && flag_pic
20500                                       && ! info->lr_save_p
20501                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
20502       if (save_LR_around_toc_setup)
20503         {
20504           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20505
20506           insn = emit_move_insn (frame_ptr_rtx, lr);
20507           RTX_FRAME_RELATED_P (insn) = 1;
20508
20509           rs6000_emit_load_toc_table (TRUE);
20510
20511           insn = emit_move_insn (lr, frame_ptr_rtx);
20512           RTX_FRAME_RELATED_P (insn) = 1;
20513         }
20514       else
20515         rs6000_emit_load_toc_table (TRUE);
20516     }
20517
20518 #if TARGET_MACHO
20519   if (DEFAULT_ABI == ABI_DARWIN
20520       && flag_pic && crtl->uses_pic_offset_table)
20521     {
20522       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20523       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
20524
20525       /* Save and restore LR locally around this call (in R0).  */
20526       if (!info->lr_save_p)
20527         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
20528
20529       emit_insn (gen_load_macho_picbase (src));
20530
20531       emit_move_insn (gen_rtx_REG (Pmode,
20532                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
20533                       lr);
20534
20535       if (!info->lr_save_p)
20536         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
20537     }
20538 #endif
20539 }
20540
20541 /* Write function prologue.  */
20542
20543 static void
20544 rs6000_output_function_prologue (FILE *file,
20545                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
20546 {
20547   rs6000_stack_t *info = rs6000_stack_info ();
20548
20549   if (TARGET_DEBUG_STACK)
20550     debug_stack_info (info);
20551
20552   /* Write .extern for any function we will call to save and restore
20553      fp values.  */
20554   if (info->first_fp_reg_save < 64)
20555     {
20556       char *name;
20557       int regno = info->first_fp_reg_save - 32;
20558
20559       if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
20560         {
20561           name = rs6000_savres_routine_name (info, regno, /*savep=*/true,
20562                                              /*gpr=*/false, /*lr=*/false);
20563           fprintf (file, "\t.extern %s\n", name);
20564         }
20565       if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
20566         {
20567           name = rs6000_savres_routine_name (info, regno, /*savep=*/false,
20568                                              /*gpr=*/false, /*lr=*/true);
20569           fprintf (file, "\t.extern %s\n", name);
20570         }
20571     }
20572
20573   /* Write .extern for AIX common mode routines, if needed.  */
20574   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
20575     {
20576       fputs ("\t.extern __mulh\n", file);
20577       fputs ("\t.extern __mull\n", file);
20578       fputs ("\t.extern __divss\n", file);
20579       fputs ("\t.extern __divus\n", file);
20580       fputs ("\t.extern __quoss\n", file);
20581       fputs ("\t.extern __quous\n", file);
20582       common_mode_defined = 1;
20583     }
20584
20585   if (! HAVE_prologue)
20586     {
20587       rtx prologue;
20588
20589       start_sequence ();
20590
20591       /* A NOTE_INSN_DELETED is supposed to be at the start and end of
20592          the "toplevel" insn chain.  */
20593       emit_note (NOTE_INSN_DELETED);
20594       rs6000_emit_prologue ();
20595       emit_note (NOTE_INSN_DELETED);
20596
20597       /* Expand INSN_ADDRESSES so final() doesn't crash.  */
20598       {
20599         rtx insn;
20600         unsigned addr = 0;
20601         for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
20602           {
20603             INSN_ADDRESSES_NEW (insn, addr);
20604             addr += 4;
20605           }
20606       }
20607
20608       prologue = get_insns ();
20609       end_sequence ();
20610
20611       if (TARGET_DEBUG_STACK)
20612         debug_rtx_list (prologue, 100);
20613
20614       emit_insn_before_noloc (prologue, BB_HEAD (ENTRY_BLOCK_PTR->next_bb),
20615                               ENTRY_BLOCK_PTR);
20616     }
20617
20618   rs6000_pic_labelno++;
20619 }
20620
20621 /* Non-zero if vmx regs are restored before the frame pop, zero if
20622    we restore after the pop when possible.  */
20623 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
20624
20625 /* Reload CR from REG.  */
20626
20627 static void
20628 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
20629 {
20630   int count = 0;
20631   int i;
20632
20633   if (using_mfcr_multiple)
20634     {
20635       for (i = 0; i < 8; i++)
20636         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20637           count++;
20638       gcc_assert (count);
20639     }
20640
20641   if (using_mfcr_multiple && count > 1)
20642     {
20643       rtvec p;
20644       int ndx;
20645
20646       p = rtvec_alloc (count);
20647
20648       ndx = 0;
20649       for (i = 0; i < 8; i++)
20650         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20651           {
20652             rtvec r = rtvec_alloc (2);
20653             RTVEC_ELT (r, 0) = reg;
20654             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
20655             RTVEC_ELT (p, ndx) =
20656               gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
20657                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
20658             ndx++;
20659           }
20660       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20661       gcc_assert (ndx == count);
20662     }
20663   else
20664     for (i = 0; i < 8; i++)
20665       if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20666         {
20667           emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
20668                                                        CR0_REGNO+i),
20669                                           reg));
20670         }
20671 }
20672
20673 /* Return true if OFFSET from stack pointer can be clobbered by signals.
20674    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
20675    below stack pointer not cloberred by signals.  */
20676
20677 static inline bool
20678 offset_below_red_zone_p (HOST_WIDE_INT offset)
20679 {
20680   return offset < (DEFAULT_ABI == ABI_V4
20681                    ? 0
20682                    : TARGET_32BIT ? -220 : -288);
20683 }
20684
20685 /* Emit function epilogue as insns.  */
20686
20687 void
20688 rs6000_emit_epilogue (int sibcall)
20689 {
20690   rs6000_stack_t *info;
20691   int restoring_GPRs_inline;
20692   int restoring_FPRs_inline;
20693   int using_load_multiple;
20694   int using_mtcr_multiple;
20695   int use_backchain_to_restore_sp;
20696   int restore_lr;
20697   int strategy;
20698   int sp_offset = 0;
20699   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
20700   rtx frame_reg_rtx = sp_reg_rtx;
20701   rtx cfa_restores = NULL_RTX;
20702   rtx insn;
20703   rtx cr_save_reg = NULL_RTX;
20704   enum machine_mode reg_mode = Pmode;
20705   int reg_size = TARGET_32BIT ? 4 : 8;
20706   int i;
20707
20708   info = rs6000_stack_info ();
20709
20710   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
20711     {
20712       reg_mode = V2SImode;
20713       reg_size = 8;
20714     }
20715
20716   strategy = info->savres_strategy;
20717   using_load_multiple = strategy & SAVRES_MULTIPLE;
20718   restoring_FPRs_inline = sibcall || (strategy & REST_INLINE_FPRS);
20719   restoring_GPRs_inline = sibcall || (strategy & REST_INLINE_GPRS);
20720   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
20721                          || rs6000_cpu == PROCESSOR_PPC603
20722                          || rs6000_cpu == PROCESSOR_PPC750
20723                          || optimize_size);
20724   /* Restore via the backchain when we have a large frame, since this
20725      is more efficient than an addis, addi pair.  The second condition
20726      here will not trigger at the moment;  We don't actually need a
20727      frame pointer for alloca, but the generic parts of the compiler
20728      give us one anyway.  */
20729   use_backchain_to_restore_sp = (info->total_size > 32767
20730                                  || info->total_size
20731                                      + (info->lr_save_p ? info->lr_save_offset : 0)
20732                                        > 32767
20733                                  || (cfun->calls_alloca
20734                                      && !frame_pointer_needed));
20735   restore_lr = (info->lr_save_p
20736                 && (restoring_FPRs_inline
20737                     || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
20738                 && (restoring_GPRs_inline
20739                     || info->first_fp_reg_save < 64));
20740
20741   if (WORLD_SAVE_P (info))
20742     {
20743       int i, j;
20744       char rname[30];
20745       const char *alloc_rname;
20746       rtvec p;
20747
20748       /* eh_rest_world_r10 will return to the location saved in the LR
20749          stack slot (which is not likely to be our caller.)
20750          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
20751          rest_world is similar, except any R10 parameter is ignored.
20752          The exception-handling stuff that was here in 2.95 is no
20753          longer necessary.  */
20754
20755       p = rtvec_alloc (9
20756                        + 1
20757                        + 32 - info->first_gp_reg_save
20758                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
20759                        + 63 + 1 - info->first_fp_reg_save);
20760
20761       strcpy (rname, ((crtl->calls_eh_return) ?
20762                       "*eh_rest_world_r10" : "*rest_world"));
20763       alloc_rname = ggc_strdup (rname);
20764
20765       j = 0;
20766       RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
20767       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
20768                                         gen_rtx_REG (Pmode,
20769                                                      LR_REGNO));
20770       RTVEC_ELT (p, j++)
20771         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
20772       /* The instruction pattern requires a clobber here;
20773          it is shared with the restVEC helper. */
20774       RTVEC_ELT (p, j++)
20775         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
20776
20777       {
20778         /* CR register traditionally saved as CR2.  */
20779         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20780         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20781                                  GEN_INT (info->cr_save_offset));
20782         rtx mem = gen_frame_mem (reg_mode, addr);
20783
20784         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20785       }
20786
20787       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20788         {
20789           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20790           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20791                                    GEN_INT (info->gp_save_offset
20792                                             + reg_size * i));
20793           rtx mem = gen_frame_mem (reg_mode, addr);
20794
20795           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20796         }
20797       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
20798         {
20799           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
20800           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20801                                    GEN_INT (info->altivec_save_offset
20802                                             + 16 * i));
20803           rtx mem = gen_frame_mem (V4SImode, addr);
20804
20805           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20806         }
20807       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
20808         {
20809           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20810                                    ? DFmode : SFmode), 
20811                                  info->first_fp_reg_save + i);
20812           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20813                                    GEN_INT (info->fp_save_offset
20814                                             + 8 * i));
20815           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20816                                      ? DFmode : SFmode), addr);
20817
20818           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20819         }
20820       RTVEC_ELT (p, j++)
20821         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
20822       RTVEC_ELT (p, j++)
20823         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
20824       RTVEC_ELT (p, j++)
20825         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
20826       RTVEC_ELT (p, j++)
20827         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
20828       RTVEC_ELT (p, j++)
20829         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
20830       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
20831
20832       return;
20833     }
20834
20835   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
20836   if (info->push_p)
20837     sp_offset = info->total_size;
20838
20839   /* Restore AltiVec registers if we must do so before adjusting the
20840      stack.  */
20841   if (TARGET_ALTIVEC_ABI
20842       && info->altivec_size != 0
20843       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20844           || (DEFAULT_ABI != ABI_V4
20845               && offset_below_red_zone_p (info->altivec_save_offset))))
20846     {
20847       int i;
20848
20849       if (use_backchain_to_restore_sp)
20850         {
20851           frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20852           emit_move_insn (frame_reg_rtx,
20853                           gen_rtx_MEM (Pmode, sp_reg_rtx));
20854           sp_offset = 0;
20855         }
20856       else if (frame_pointer_needed)
20857         frame_reg_rtx = hard_frame_pointer_rtx;
20858
20859       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20860         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20861           {
20862             rtx addr, areg, mem, reg;
20863
20864             areg = gen_rtx_REG (Pmode, 0);
20865             emit_move_insn
20866               (areg, GEN_INT (info->altivec_save_offset
20867                               + sp_offset
20868                               + 16 * (i - info->first_altivec_reg_save)));
20869
20870             /* AltiVec addressing mode is [reg+reg].  */
20871             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20872             mem = gen_frame_mem (V4SImode, addr);
20873
20874             reg = gen_rtx_REG (V4SImode, i);
20875             emit_move_insn (reg, mem);
20876             if (offset_below_red_zone_p (info->altivec_save_offset
20877                                          + (i - info->first_altivec_reg_save)
20878                                            * 16))
20879               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20880                                              cfa_restores);
20881           }
20882     }
20883
20884   /* Restore VRSAVE if we must do so before adjusting the stack.  */
20885   if (TARGET_ALTIVEC
20886       && TARGET_ALTIVEC_VRSAVE
20887       && info->vrsave_mask != 0
20888       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20889           || (DEFAULT_ABI != ABI_V4
20890               && offset_below_red_zone_p (info->vrsave_save_offset))))
20891     {
20892       rtx addr, mem, reg;
20893
20894       if (frame_reg_rtx == sp_reg_rtx)
20895         {
20896           if (use_backchain_to_restore_sp)
20897             {
20898               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20899               emit_move_insn (frame_reg_rtx,
20900                               gen_rtx_MEM (Pmode, sp_reg_rtx));
20901               sp_offset = 0;
20902             }
20903           else if (frame_pointer_needed)
20904             frame_reg_rtx = hard_frame_pointer_rtx;
20905         }
20906
20907       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20908                            GEN_INT (info->vrsave_save_offset + sp_offset));
20909       mem = gen_frame_mem (SImode, addr);
20910       reg = gen_rtx_REG (SImode, 12);
20911       emit_move_insn (reg, mem);
20912
20913       emit_insn (generate_set_vrsave (reg, info, 1));
20914     }
20915
20916   insn = NULL_RTX;
20917   /* If we have a large stack frame, restore the old stack pointer
20918      using the backchain.  */
20919   if (use_backchain_to_restore_sp)
20920     {
20921       if (frame_reg_rtx == sp_reg_rtx)
20922         {
20923           /* Under V.4, don't reset the stack pointer until after we're done
20924              loading the saved registers.  */
20925           if (DEFAULT_ABI == ABI_V4)
20926             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20927
20928           insn = emit_move_insn (frame_reg_rtx,
20929                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
20930           sp_offset = 0;
20931         }
20932       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20933                && DEFAULT_ABI == ABI_V4)
20934         /* frame_reg_rtx has been set up by the altivec restore.  */
20935         ;
20936       else
20937         {
20938           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
20939           frame_reg_rtx = sp_reg_rtx;
20940         }
20941     }
20942   /* If we have a frame pointer, we can restore the old stack pointer
20943      from it.  */
20944   else if (frame_pointer_needed)
20945     {
20946       frame_reg_rtx = sp_reg_rtx;
20947       if (DEFAULT_ABI == ABI_V4)
20948         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20949       /* Prevent reordering memory accesses against stack pointer restore.  */
20950       else if (cfun->calls_alloca
20951                || offset_below_red_zone_p (-info->total_size))
20952         {
20953           rtx mem1 = gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx);
20954           rtx mem2 = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20955           MEM_NOTRAP_P (mem1) = 1;
20956           MEM_NOTRAP_P (mem2) = 1;
20957           emit_insn (gen_frame_tie (mem1, mem2));
20958         }
20959
20960       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
20961                                        GEN_INT (info->total_size)));
20962       sp_offset = 0;
20963     }
20964   else if (info->push_p
20965            && DEFAULT_ABI != ABI_V4
20966            && !crtl->calls_eh_return)
20967     {
20968       /* Prevent reordering memory accesses against stack pointer restore.  */
20969       if (cfun->calls_alloca
20970           || offset_below_red_zone_p (-info->total_size))
20971         {
20972           rtx mem = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20973           MEM_NOTRAP_P (mem) = 1;
20974           emit_insn (gen_stack_tie (mem));
20975         }
20976       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
20977                                        GEN_INT (info->total_size)));
20978       sp_offset = 0;
20979     }
20980   if (insn && frame_reg_rtx == sp_reg_rtx)
20981     {
20982       if (cfa_restores)
20983         {
20984           REG_NOTES (insn) = cfa_restores;
20985           cfa_restores = NULL_RTX;
20986         }
20987       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
20988       RTX_FRAME_RELATED_P (insn) = 1;
20989     }
20990
20991   /* Restore AltiVec registers if we have not done so already.  */
20992   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20993       && TARGET_ALTIVEC_ABI
20994       && info->altivec_size != 0
20995       && (DEFAULT_ABI == ABI_V4
20996           || !offset_below_red_zone_p (info->altivec_save_offset)))
20997     {
20998       int i;
20999
21000       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
21001         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
21002           {
21003             rtx addr, areg, mem, reg;
21004
21005             areg = gen_rtx_REG (Pmode, 0);
21006             emit_move_insn
21007               (areg, GEN_INT (info->altivec_save_offset
21008                               + sp_offset
21009                               + 16 * (i - info->first_altivec_reg_save)));
21010
21011             /* AltiVec addressing mode is [reg+reg].  */
21012             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
21013             mem = gen_frame_mem (V4SImode, addr);
21014
21015             reg = gen_rtx_REG (V4SImode, i);
21016             emit_move_insn (reg, mem);
21017             if (DEFAULT_ABI == ABI_V4)
21018               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21019                                              cfa_restores);
21020           }
21021     }
21022
21023   /* Restore VRSAVE if we have not done so already.  */
21024   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21025       && TARGET_ALTIVEC
21026       && TARGET_ALTIVEC_VRSAVE
21027       && info->vrsave_mask != 0
21028       && (DEFAULT_ABI == ABI_V4
21029           || !offset_below_red_zone_p (info->vrsave_save_offset)))
21030     {
21031       rtx addr, mem, reg;
21032
21033       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21034                            GEN_INT (info->vrsave_save_offset + sp_offset));
21035       mem = gen_frame_mem (SImode, addr);
21036       reg = gen_rtx_REG (SImode, 12);
21037       emit_move_insn (reg, mem);
21038
21039       emit_insn (generate_set_vrsave (reg, info, 1));
21040     }
21041
21042   /* Get the old lr if we saved it.  If we are restoring registers
21043      out-of-line, then the out-of-line routines can do this for us.  */
21044   if (restore_lr && restoring_GPRs_inline)
21045     {
21046       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21047                                       info->lr_save_offset + sp_offset);
21048
21049       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21050     }
21051
21052   /* Get the old cr if we saved it.  */
21053   if (info->cr_save_p)
21054     {
21055       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21056                                GEN_INT (info->cr_save_offset + sp_offset));
21057       rtx mem = gen_frame_mem (SImode, addr);
21058
21059       cr_save_reg = gen_rtx_REG (SImode,
21060                                  DEFAULT_ABI == ABI_AIX
21061                                  && !restoring_GPRs_inline
21062                                  && info->first_fp_reg_save < 64
21063                                  ? 11 : 12);
21064       emit_move_insn (cr_save_reg, mem);
21065     }
21066
21067   /* Set LR here to try to overlap restores below.  LR is always saved
21068      above incoming stack, so it never needs REG_CFA_RESTORE.  */
21069   if (restore_lr && restoring_GPRs_inline)
21070     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21071                     gen_rtx_REG (Pmode, 0));
21072
21073   /* Load exception handler data registers, if needed.  */
21074   if (crtl->calls_eh_return)
21075     {
21076       unsigned int i, regno;
21077
21078       if (TARGET_AIX)
21079         {
21080           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21081                                    GEN_INT (sp_offset + 5 * reg_size));
21082           rtx mem = gen_frame_mem (reg_mode, addr);
21083
21084           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
21085         }
21086
21087       for (i = 0; ; ++i)
21088         {
21089           rtx mem;
21090
21091           regno = EH_RETURN_DATA_REGNO (i);
21092           if (regno == INVALID_REGNUM)
21093             break;
21094
21095           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
21096                                       info->ehrd_offset + sp_offset
21097                                       + reg_size * (int) i);
21098
21099           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
21100         }
21101     }
21102
21103   /* Restore GPRs.  This is done as a PARALLEL if we are using
21104      the load-multiple instructions.  */
21105   if (TARGET_SPE_ABI
21106       && info->spe_64bit_regs_used != 0
21107       && info->first_gp_reg_save != 32)
21108     {
21109       /* Determine whether we can address all of the registers that need
21110          to be saved with an offset from the stack pointer that fits in
21111          the small const field for SPE memory instructions.  */
21112       int spe_regs_addressable_via_sp
21113         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
21114                                + (32 - info->first_gp_reg_save - 1) * reg_size)
21115            && restoring_GPRs_inline);
21116       int spe_offset;
21117
21118       if (spe_regs_addressable_via_sp)
21119         spe_offset = info->spe_gp_save_offset + sp_offset;
21120       else
21121         {
21122           rtx old_frame_reg_rtx = frame_reg_rtx;
21123           /* Make r11 point to the start of the SPE save area.  We worried about
21124              not clobbering it when we were saving registers in the prologue.
21125              There's no need to worry here because the static chain is passed
21126              anew to every function.  */
21127           int ool_adjust = (restoring_GPRs_inline
21128                             ? 0
21129                             : (info->first_gp_reg_save
21130                                - (FIRST_SAVRES_REGISTER+1))*8);
21131
21132           if (frame_reg_rtx == sp_reg_rtx)
21133             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21134           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
21135                                  GEN_INT (info->spe_gp_save_offset
21136                                           + sp_offset
21137                                           - ool_adjust)));
21138           /* Keep the invariant that frame_reg_rtx + sp_offset points
21139              at the top of the stack frame.  */
21140           sp_offset = -info->spe_gp_save_offset;
21141
21142           spe_offset = 0;
21143         }
21144
21145       if (restoring_GPRs_inline)
21146         {
21147           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21148             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21149               {
21150                 rtx offset, addr, mem, reg;
21151
21152                 /* We're doing all this to ensure that the immediate offset
21153                    fits into the immediate field of 'evldd'.  */
21154                 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
21155
21156                 offset = GEN_INT (spe_offset + reg_size * i);
21157                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
21158                 mem = gen_rtx_MEM (V2SImode, addr);
21159                 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21160
21161                 insn = emit_move_insn (reg, mem);
21162                 if (DEFAULT_ABI == ABI_V4)
21163                   {
21164                     if (frame_pointer_needed
21165                         && info->first_gp_reg_save + i
21166                            == HARD_FRAME_POINTER_REGNUM)
21167                       {
21168                         add_reg_note (insn, REG_CFA_DEF_CFA,
21169                                       plus_constant (frame_reg_rtx,
21170                                                      sp_offset));
21171                         RTX_FRAME_RELATED_P (insn) = 1;
21172                       }
21173
21174                     cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21175                                                    cfa_restores);
21176                   }
21177               }
21178         }
21179       else
21180         {
21181           rtx par;
21182
21183           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
21184                                         0, reg_mode,
21185                                         /*savep=*/false, /*gpr=*/true,
21186                                         /*lr=*/true);
21187           emit_jump_insn (par);
21188           /* We don't want anybody else emitting things after we jumped
21189              back.  */
21190           return;
21191         }
21192     }
21193   else if (!restoring_GPRs_inline)
21194     {
21195       /* We are jumping to an out-of-line function.  */
21196       bool can_use_exit = info->first_fp_reg_save == 64;
21197       rtx par;
21198
21199       /* Emit stack reset code if we need it.  */
21200       if (can_use_exit)
21201         rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21202                                  sp_offset, can_use_exit);
21203       else
21204         {
21205           emit_insn (gen_add3_insn (gen_rtx_REG (Pmode, DEFAULT_ABI == ABI_AIX
21206                                                         ? 12 : 11),
21207                                     frame_reg_rtx,
21208                                     GEN_INT (sp_offset - info->fp_size)));
21209           if (REGNO (frame_reg_rtx) == 11)
21210             sp_offset += info->fp_size;
21211         }
21212
21213       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
21214                                     info->gp_save_offset, reg_mode,
21215                                     /*savep=*/false, /*gpr=*/true,
21216                                     /*lr=*/can_use_exit);
21217
21218       if (can_use_exit)
21219         {
21220           if (info->cr_save_p)
21221             {
21222               rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21223               if (DEFAULT_ABI == ABI_V4)
21224                 cfa_restores
21225                   = alloc_reg_note (REG_CFA_RESTORE,
21226                                     gen_rtx_REG (SImode, CR2_REGNO),
21227                                     cfa_restores);
21228             }
21229
21230           emit_jump_insn (par);
21231
21232           /* We don't want anybody else emitting things after we jumped
21233              back.  */
21234           return;
21235         }
21236
21237       insn = emit_insn (par);
21238       if (DEFAULT_ABI == ABI_V4)
21239         {
21240           if (frame_pointer_needed)
21241             {
21242               add_reg_note (insn, REG_CFA_DEF_CFA,
21243                             plus_constant (frame_reg_rtx, sp_offset));
21244               RTX_FRAME_RELATED_P (insn) = 1;
21245             }
21246
21247           for (i = info->first_gp_reg_save; i < 32; i++)
21248             cfa_restores
21249               = alloc_reg_note (REG_CFA_RESTORE,
21250                                 gen_rtx_REG (reg_mode, i), cfa_restores);
21251         }
21252     }
21253   else if (using_load_multiple)
21254     {
21255       rtvec p;
21256       p = rtvec_alloc (32 - info->first_gp_reg_save);
21257       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21258         {
21259           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21260                                    GEN_INT (info->gp_save_offset
21261                                             + sp_offset
21262                                             + reg_size * i));
21263           rtx mem = gen_frame_mem (reg_mode, addr);
21264           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21265
21266           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, reg, mem);
21267           if (DEFAULT_ABI == ABI_V4)
21268             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21269                                            cfa_restores);
21270         }
21271       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21272       if (DEFAULT_ABI == ABI_V4 && frame_pointer_needed)
21273         {
21274           add_reg_note (insn, REG_CFA_DEF_CFA,
21275                         plus_constant (frame_reg_rtx, sp_offset));
21276           RTX_FRAME_RELATED_P (insn) = 1;
21277         }
21278     }
21279   else
21280     {
21281       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21282         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21283           {
21284             rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21285                                      GEN_INT (info->gp_save_offset
21286                                               + sp_offset
21287                                               + reg_size * i));
21288             rtx mem = gen_frame_mem (reg_mode, addr);
21289             rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21290
21291             insn = emit_move_insn (reg, mem);
21292             if (DEFAULT_ABI == ABI_V4)
21293               {
21294                 if (frame_pointer_needed
21295                     && info->first_gp_reg_save + i
21296                        == HARD_FRAME_POINTER_REGNUM)
21297                   {
21298                     add_reg_note (insn, REG_CFA_DEF_CFA,
21299                                   plus_constant (frame_reg_rtx, sp_offset));
21300                     RTX_FRAME_RELATED_P (insn) = 1;
21301                   }
21302
21303                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21304                                                cfa_restores);
21305               }
21306           }
21307     }
21308
21309   if (restore_lr && !restoring_GPRs_inline)
21310     {
21311       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21312                                      info->lr_save_offset + sp_offset);
21313
21314       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21315       emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21316                       gen_rtx_REG (Pmode, 0));
21317     }
21318
21319   /* Restore fpr's if we need to do it without calling a function.  */
21320   if (restoring_FPRs_inline)
21321     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21322       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
21323            && ! call_used_regs[info->first_fp_reg_save+i]))
21324         {
21325           rtx addr, mem, reg;
21326           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21327                                GEN_INT (info->fp_save_offset
21328                                         + sp_offset
21329                                         + 8 * i));
21330           mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21331                                  ? DFmode : SFmode), addr);
21332           reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21333                                ? DFmode : SFmode),
21334                              info->first_fp_reg_save + i);
21335
21336           emit_move_insn (reg, mem);
21337           if (DEFAULT_ABI == ABI_V4)
21338             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21339                                            cfa_restores);
21340         }
21341
21342   /* If we saved cr, restore it here.  Just those that were used.  */
21343   if (info->cr_save_p)
21344     {
21345       rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21346       if (DEFAULT_ABI == ABI_V4)
21347         cfa_restores
21348           = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, CR2_REGNO),
21349                             cfa_restores);
21350     }
21351
21352   /* If this is V.4, unwind the stack pointer after all of the loads
21353      have been done.  */
21354   insn = rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21355                                   sp_offset, !restoring_FPRs_inline);
21356   if (insn)
21357     {
21358       if (cfa_restores)
21359         {
21360           REG_NOTES (insn) = cfa_restores;
21361           cfa_restores = NULL_RTX;
21362         }
21363       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21364       RTX_FRAME_RELATED_P (insn) = 1;
21365     }
21366
21367   if (crtl->calls_eh_return)
21368     {
21369       rtx sa = EH_RETURN_STACKADJ_RTX;
21370       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
21371     }
21372
21373   if (!sibcall)
21374     {
21375       rtvec p;
21376       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
21377       if (! restoring_FPRs_inline)
21378         p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
21379       else
21380         p = rtvec_alloc (2);
21381
21382       RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
21383       RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
21384                           ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
21385                           : gen_rtx_CLOBBER (VOIDmode,
21386                                              gen_rtx_REG (Pmode, 65)));
21387
21388       /* If we have to restore more than two FP registers, branch to the
21389          restore function.  It will return to our caller.  */
21390       if (! restoring_FPRs_inline)
21391         {
21392           int i;
21393           rtx sym;
21394
21395           sym = rs6000_savres_routine_sym (info,
21396                                            /*savep=*/false,
21397                                            /*gpr=*/false,
21398                                            /*lr=*/lr);
21399           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
21400           RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
21401                                           gen_rtx_REG (Pmode,
21402                                                        DEFAULT_ABI == ABI_AIX
21403                                                        ? 1 : 11));
21404           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21405             {
21406               rtx addr, mem;
21407               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
21408                                    GEN_INT (info->fp_save_offset + 8*i));
21409               mem = gen_frame_mem (DFmode, addr);
21410
21411               RTVEC_ELT (p, i+4) =
21412                 gen_rtx_SET (VOIDmode,
21413                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
21414                              mem);
21415             }
21416         }
21417
21418       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21419     }
21420 }
21421
21422 /* Write function epilogue.  */
21423
21424 static void
21425 rs6000_output_function_epilogue (FILE *file,
21426                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21427 {
21428   if (! HAVE_epilogue)
21429     {
21430       rtx insn = get_last_insn ();
21431       /* If the last insn was a BARRIER, we don't have to write anything except
21432          the trace table.  */
21433       if (GET_CODE (insn) == NOTE)
21434         insn = prev_nonnote_insn (insn);
21435       if (insn == 0 ||  GET_CODE (insn) != BARRIER)
21436         {
21437           /* This is slightly ugly, but at least we don't have two
21438              copies of the epilogue-emitting code.  */
21439           start_sequence ();
21440
21441           /* A NOTE_INSN_DELETED is supposed to be at the start
21442              and end of the "toplevel" insn chain.  */
21443           emit_note (NOTE_INSN_DELETED);
21444           rs6000_emit_epilogue (FALSE);
21445           emit_note (NOTE_INSN_DELETED);
21446
21447           /* Expand INSN_ADDRESSES so final() doesn't crash.  */
21448           {
21449             rtx insn;
21450             unsigned addr = 0;
21451             for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
21452               {
21453                 INSN_ADDRESSES_NEW (insn, addr);
21454                 addr += 4;
21455               }
21456           }
21457
21458           if (TARGET_DEBUG_STACK)
21459             debug_rtx_list (get_insns (), 100);
21460           final (get_insns (), file, FALSE);
21461           end_sequence ();
21462         }
21463     }
21464
21465 #if TARGET_MACHO
21466   macho_branch_islands ();
21467   /* Mach-O doesn't support labels at the end of objects, so if
21468      it looks like we might want one, insert a NOP.  */
21469   {
21470     rtx insn = get_last_insn ();
21471     while (insn
21472            && NOTE_P (insn)
21473            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
21474       insn = PREV_INSN (insn);
21475     if (insn
21476         && (LABEL_P (insn)
21477             || (NOTE_P (insn)
21478                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
21479       fputs ("\tnop\n", file);
21480   }
21481 #endif
21482
21483   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
21484      on its format.
21485
21486      We don't output a traceback table if -finhibit-size-directive was
21487      used.  The documentation for -finhibit-size-directive reads
21488      ``don't output a @code{.size} assembler directive, or anything
21489      else that would cause trouble if the function is split in the
21490      middle, and the two halves are placed at locations far apart in
21491      memory.''  The traceback table has this property, since it
21492      includes the offset from the start of the function to the
21493      traceback table itself.
21494
21495      System V.4 Powerpc's (and the embedded ABI derived from it) use a
21496      different traceback table.  */
21497   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
21498       && rs6000_traceback != traceback_none && !cfun->is_thunk)
21499     {
21500       const char *fname = NULL;
21501       const char *language_string = lang_hooks.name;
21502       int fixed_parms = 0, float_parms = 0, parm_info = 0;
21503       int i;
21504       int optional_tbtab;
21505       rs6000_stack_t *info = rs6000_stack_info ();
21506
21507       if (rs6000_traceback == traceback_full)
21508         optional_tbtab = 1;
21509       else if (rs6000_traceback == traceback_part)
21510         optional_tbtab = 0;
21511       else
21512         optional_tbtab = !optimize_size && !TARGET_ELF;
21513
21514       if (optional_tbtab)
21515         {
21516           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
21517           while (*fname == '.') /* V.4 encodes . in the name */
21518             fname++;
21519
21520           /* Need label immediately before tbtab, so we can compute
21521              its offset from the function start.  */
21522           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21523           ASM_OUTPUT_LABEL (file, fname);
21524         }
21525
21526       /* The .tbtab pseudo-op can only be used for the first eight
21527          expressions, since it can't handle the possibly variable
21528          length fields that follow.  However, if you omit the optional
21529          fields, the assembler outputs zeros for all optional fields
21530          anyways, giving each variable length field is minimum length
21531          (as defined in sys/debug.h).  Thus we can not use the .tbtab
21532          pseudo-op at all.  */
21533
21534       /* An all-zero word flags the start of the tbtab, for debuggers
21535          that have to find it by searching forward from the entry
21536          point or from the current pc.  */
21537       fputs ("\t.long 0\n", file);
21538
21539       /* Tbtab format type.  Use format type 0.  */
21540       fputs ("\t.byte 0,", file);
21541
21542       /* Language type.  Unfortunately, there does not seem to be any
21543          official way to discover the language being compiled, so we
21544          use language_string.
21545          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
21546          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
21547          a number, so for now use 9.  LTO isn't assigned a number either,
21548          so for now use 0.  */
21549       if (! strcmp (language_string, "GNU C")
21550           || ! strcmp (language_string, "GNU GIMPLE"))
21551         i = 0;
21552       else if (! strcmp (language_string, "GNU F77")
21553                || ! strcmp (language_string, "GNU Fortran"))
21554         i = 1;
21555       else if (! strcmp (language_string, "GNU Pascal"))
21556         i = 2;
21557       else if (! strcmp (language_string, "GNU Ada"))
21558         i = 3;
21559       else if (! strcmp (language_string, "GNU C++")
21560                || ! strcmp (language_string, "GNU Objective-C++"))
21561         i = 9;
21562       else if (! strcmp (language_string, "GNU Java"))
21563         i = 13;
21564       else if (! strcmp (language_string, "GNU Objective-C"))
21565         i = 14;
21566       else
21567         gcc_unreachable ();
21568       fprintf (file, "%d,", i);
21569
21570       /* 8 single bit fields: global linkage (not set for C extern linkage,
21571          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
21572          from start of procedure stored in tbtab, internal function, function
21573          has controlled storage, function has no toc, function uses fp,
21574          function logs/aborts fp operations.  */
21575       /* Assume that fp operations are used if any fp reg must be saved.  */
21576       fprintf (file, "%d,",
21577                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
21578
21579       /* 6 bitfields: function is interrupt handler, name present in
21580          proc table, function calls alloca, on condition directives
21581          (controls stack walks, 3 bits), saves condition reg, saves
21582          link reg.  */
21583       /* The `function calls alloca' bit seems to be set whenever reg 31 is
21584          set up as a frame pointer, even when there is no alloca call.  */
21585       fprintf (file, "%d,",
21586                ((optional_tbtab << 6)
21587                 | ((optional_tbtab & frame_pointer_needed) << 5)
21588                 | (info->cr_save_p << 1)
21589                 | (info->lr_save_p)));
21590
21591       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
21592          (6 bits).  */
21593       fprintf (file, "%d,",
21594                (info->push_p << 7) | (64 - info->first_fp_reg_save));
21595
21596       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
21597       fprintf (file, "%d,", (32 - first_reg_to_save ()));
21598
21599       if (optional_tbtab)
21600         {
21601           /* Compute the parameter info from the function decl argument
21602              list.  */
21603           tree decl;
21604           int next_parm_info_bit = 31;
21605
21606           for (decl = DECL_ARGUMENTS (current_function_decl);
21607                decl; decl = DECL_CHAIN (decl))
21608             {
21609               rtx parameter = DECL_INCOMING_RTL (decl);
21610               enum machine_mode mode = GET_MODE (parameter);
21611
21612               if (GET_CODE (parameter) == REG)
21613                 {
21614                   if (SCALAR_FLOAT_MODE_P (mode))
21615                     {
21616                       int bits;
21617
21618                       float_parms++;
21619
21620                       switch (mode)
21621                         {
21622                         case SFmode:
21623                         case SDmode:
21624                           bits = 0x2;
21625                           break;
21626
21627                         case DFmode:
21628                         case DDmode:
21629                         case TFmode:
21630                         case TDmode:
21631                           bits = 0x3;
21632                           break;
21633
21634                         default:
21635                           gcc_unreachable ();
21636                         }
21637
21638                       /* If only one bit will fit, don't or in this entry.  */
21639                       if (next_parm_info_bit > 0)
21640                         parm_info |= (bits << (next_parm_info_bit - 1));
21641                       next_parm_info_bit -= 2;
21642                     }
21643                   else
21644                     {
21645                       fixed_parms += ((GET_MODE_SIZE (mode)
21646                                        + (UNITS_PER_WORD - 1))
21647                                       / UNITS_PER_WORD);
21648                       next_parm_info_bit -= 1;
21649                     }
21650                 }
21651             }
21652         }
21653
21654       /* Number of fixed point parameters.  */
21655       /* This is actually the number of words of fixed point parameters; thus
21656          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
21657       fprintf (file, "%d,", fixed_parms);
21658
21659       /* 2 bitfields: number of floating point parameters (7 bits), parameters
21660          all on stack.  */
21661       /* This is actually the number of fp registers that hold parameters;
21662          and thus the maximum value is 13.  */
21663       /* Set parameters on stack bit if parameters are not in their original
21664          registers, regardless of whether they are on the stack?  Xlc
21665          seems to set the bit when not optimizing.  */
21666       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
21667
21668       if (! optional_tbtab)
21669         return;
21670
21671       /* Optional fields follow.  Some are variable length.  */
21672
21673       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
21674          11 double float.  */
21675       /* There is an entry for each parameter in a register, in the order that
21676          they occur in the parameter list.  Any intervening arguments on the
21677          stack are ignored.  If the list overflows a long (max possible length
21678          34 bits) then completely leave off all elements that don't fit.  */
21679       /* Only emit this long if there was at least one parameter.  */
21680       if (fixed_parms || float_parms)
21681         fprintf (file, "\t.long %d\n", parm_info);
21682
21683       /* Offset from start of code to tb table.  */
21684       fputs ("\t.long ", file);
21685       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21686       RS6000_OUTPUT_BASENAME (file, fname);
21687       putc ('-', file);
21688       rs6000_output_function_entry (file, fname);
21689       putc ('\n', file);
21690
21691       /* Interrupt handler mask.  */
21692       /* Omit this long, since we never set the interrupt handler bit
21693          above.  */
21694
21695       /* Number of CTL (controlled storage) anchors.  */
21696       /* Omit this long, since the has_ctl bit is never set above.  */
21697
21698       /* Displacement into stack of each CTL anchor.  */
21699       /* Omit this list of longs, because there are no CTL anchors.  */
21700
21701       /* Length of function name.  */
21702       if (*fname == '*')
21703         ++fname;
21704       fprintf (file, "\t.short %d\n", (int) strlen (fname));
21705
21706       /* Function name.  */
21707       assemble_string (fname, strlen (fname));
21708
21709       /* Register for alloca automatic storage; this is always reg 31.
21710          Only emit this if the alloca bit was set above.  */
21711       if (frame_pointer_needed)
21712         fputs ("\t.byte 31\n", file);
21713
21714       fputs ("\t.align 2\n", file);
21715     }
21716 }
21717 \f
21718 /* A C compound statement that outputs the assembler code for a thunk
21719    function, used to implement C++ virtual function calls with
21720    multiple inheritance.  The thunk acts as a wrapper around a virtual
21721    function, adjusting the implicit object parameter before handing
21722    control off to the real function.
21723
21724    First, emit code to add the integer DELTA to the location that
21725    contains the incoming first argument.  Assume that this argument
21726    contains a pointer, and is the one used to pass the `this' pointer
21727    in C++.  This is the incoming argument *before* the function
21728    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
21729    values of all other incoming arguments.
21730
21731    After the addition, emit code to jump to FUNCTION, which is a
21732    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
21733    not touch the return address.  Hence returning from FUNCTION will
21734    return to whoever called the current `thunk'.
21735
21736    The effect must be as if FUNCTION had been called directly with the
21737    adjusted first argument.  This macro is responsible for emitting
21738    all of the code for a thunk function; output_function_prologue()
21739    and output_function_epilogue() are not invoked.
21740
21741    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
21742    been extracted from it.)  It might possibly be useful on some
21743    targets, but probably not.
21744
21745    If you do not define this macro, the target-independent code in the
21746    C++ frontend will generate a less efficient heavyweight thunk that
21747    calls FUNCTION instead of jumping to it.  The generic approach does
21748    not support varargs.  */
21749
21750 static void
21751 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
21752                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
21753                         tree function)
21754 {
21755   rtx this_rtx, insn, funexp;
21756
21757   reload_completed = 1;
21758   epilogue_completed = 1;
21759
21760   /* Mark the end of the (empty) prologue.  */
21761   emit_note (NOTE_INSN_PROLOGUE_END);
21762
21763   /* Find the "this" pointer.  If the function returns a structure,
21764      the structure return pointer is in r3.  */
21765   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
21766     this_rtx = gen_rtx_REG (Pmode, 4);
21767   else
21768     this_rtx = gen_rtx_REG (Pmode, 3);
21769
21770   /* Apply the constant offset, if required.  */
21771   if (delta)
21772     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
21773
21774   /* Apply the offset from the vtable, if required.  */
21775   if (vcall_offset)
21776     {
21777       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
21778       rtx tmp = gen_rtx_REG (Pmode, 12);
21779
21780       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
21781       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
21782         {
21783           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
21784           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
21785         }
21786       else
21787         {
21788           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
21789
21790           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
21791         }
21792       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
21793     }
21794
21795   /* Generate a tail call to the target function.  */
21796   if (!TREE_USED (function))
21797     {
21798       assemble_external (function);
21799       TREE_USED (function) = 1;
21800     }
21801   funexp = XEXP (DECL_RTL (function), 0);
21802   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
21803
21804 #if TARGET_MACHO
21805   if (MACHOPIC_INDIRECT)
21806     funexp = machopic_indirect_call_target (funexp);
21807 #endif
21808
21809   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
21810      generate sibcall RTL explicitly.  */
21811   insn = emit_call_insn (
21812            gen_rtx_PARALLEL (VOIDmode,
21813              gen_rtvec (4,
21814                         gen_rtx_CALL (VOIDmode,
21815                                       funexp, const0_rtx),
21816                         gen_rtx_USE (VOIDmode, const0_rtx),
21817                         gen_rtx_USE (VOIDmode,
21818                                      gen_rtx_REG (SImode,
21819                                                   LR_REGNO)),
21820                         gen_rtx_RETURN (VOIDmode))));
21821   SIBLING_CALL_P (insn) = 1;
21822   emit_barrier ();
21823
21824   /* Run just enough of rest_of_compilation to get the insns emitted.
21825      There's not really enough bulk here to make other passes such as
21826      instruction scheduling worth while.  Note that use_thunk calls
21827      assemble_start_function and assemble_end_function.  */
21828   insn = get_insns ();
21829   insn_locators_alloc ();
21830   shorten_branches (insn);
21831   final_start_function (insn, file, 1);
21832   final (insn, file, 1);
21833   final_end_function ();
21834
21835   reload_completed = 0;
21836   epilogue_completed = 0;
21837 }
21838 \f
21839 /* A quick summary of the various types of 'constant-pool tables'
21840    under PowerPC:
21841
21842    Target       Flags           Name            One table per
21843    AIX          (none)          AIX TOC         object file
21844    AIX          -mfull-toc      AIX TOC         object file
21845    AIX          -mminimal-toc   AIX minimal TOC translation unit
21846    SVR4/EABI    (none)          SVR4 SDATA      object file
21847    SVR4/EABI    -fpic           SVR4 pic        object file
21848    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
21849    SVR4/EABI    -mrelocatable   EABI TOC        function
21850    SVR4/EABI    -maix           AIX TOC         object file
21851    SVR4/EABI    -maix -mminimal-toc
21852                                 AIX minimal TOC translation unit
21853
21854    Name                 Reg.    Set by  entries       contains:
21855                                         made by  addrs? fp?     sum?
21856
21857    AIX TOC              2       crt0    as       Y      option  option
21858    AIX minimal TOC      30      prolog  gcc      Y      Y       option
21859    SVR4 SDATA           13      crt0    gcc      N      Y       N
21860    SVR4 pic             30      prolog  ld       Y      not yet N
21861    SVR4 PIC             30      prolog  gcc      Y      option  option
21862    EABI TOC             30      prolog  gcc      Y      option  option
21863
21864 */
21865
21866 /* Hash functions for the hash table.  */
21867
21868 static unsigned
21869 rs6000_hash_constant (rtx k)
21870 {
21871   enum rtx_code code = GET_CODE (k);
21872   enum machine_mode mode = GET_MODE (k);
21873   unsigned result = (code << 3) ^ mode;
21874   const char *format;
21875   int flen, fidx;
21876
21877   format = GET_RTX_FORMAT (code);
21878   flen = strlen (format);
21879   fidx = 0;
21880
21881   switch (code)
21882     {
21883     case LABEL_REF:
21884       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
21885
21886     case CONST_DOUBLE:
21887       if (mode != VOIDmode)
21888         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
21889       flen = 2;
21890       break;
21891
21892     case CODE_LABEL:
21893       fidx = 3;
21894       break;
21895
21896     default:
21897       break;
21898     }
21899
21900   for (; fidx < flen; fidx++)
21901     switch (format[fidx])
21902       {
21903       case 's':
21904         {
21905           unsigned i, len;
21906           const char *str = XSTR (k, fidx);
21907           len = strlen (str);
21908           result = result * 613 + len;
21909           for (i = 0; i < len; i++)
21910             result = result * 613 + (unsigned) str[i];
21911           break;
21912         }
21913       case 'u':
21914       case 'e':
21915         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
21916         break;
21917       case 'i':
21918       case 'n':
21919         result = result * 613 + (unsigned) XINT (k, fidx);
21920         break;
21921       case 'w':
21922         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
21923           result = result * 613 + (unsigned) XWINT (k, fidx);
21924         else
21925           {
21926             size_t i;
21927             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
21928               result = result * 613 + (unsigned) (XWINT (k, fidx)
21929                                                   >> CHAR_BIT * i);
21930           }
21931         break;
21932       case '0':
21933         break;
21934       default:
21935         gcc_unreachable ();
21936       }
21937
21938   return result;
21939 }
21940
21941 static unsigned
21942 toc_hash_function (const void *hash_entry)
21943 {
21944   const struct toc_hash_struct *thc =
21945     (const struct toc_hash_struct *) hash_entry;
21946   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
21947 }
21948
21949 /* Compare H1 and H2 for equivalence.  */
21950
21951 static int
21952 toc_hash_eq (const void *h1, const void *h2)
21953 {
21954   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
21955   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
21956
21957   if (((const struct toc_hash_struct *) h1)->key_mode
21958       != ((const struct toc_hash_struct *) h2)->key_mode)
21959     return 0;
21960
21961   return rtx_equal_p (r1, r2);
21962 }
21963
21964 /* These are the names given by the C++ front-end to vtables, and
21965    vtable-like objects.  Ideally, this logic should not be here;
21966    instead, there should be some programmatic way of inquiring as
21967    to whether or not an object is a vtable.  */
21968
21969 #define VTABLE_NAME_P(NAME)                             \
21970   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
21971   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
21972   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
21973   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
21974   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
21975
21976 #ifdef NO_DOLLAR_IN_LABEL
21977 /* Return a GGC-allocated character string translating dollar signs in
21978    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
21979
21980 const char *
21981 rs6000_xcoff_strip_dollar (const char *name)
21982 {
21983   char *strip, *p;
21984   int len;
21985
21986   p = strchr (name, '$');
21987
21988   if (p == 0 || p == name)
21989     return name;
21990
21991   len = strlen (name);
21992   strip = (char *) alloca (len + 1);
21993   strcpy (strip, name);
21994   p = strchr (strip, '$');
21995   while (p)
21996     {
21997       *p = '_';
21998       p = strchr (p + 1, '$');
21999     }
22000
22001   return ggc_alloc_string (strip, len);
22002 }
22003 #endif
22004
22005 void
22006 rs6000_output_symbol_ref (FILE *file, rtx x)
22007 {
22008   /* Currently C++ toc references to vtables can be emitted before it
22009      is decided whether the vtable is public or private.  If this is
22010      the case, then the linker will eventually complain that there is
22011      a reference to an unknown section.  Thus, for vtables only,
22012      we emit the TOC reference to reference the symbol and not the
22013      section.  */
22014   const char *name = XSTR (x, 0);
22015
22016   if (VTABLE_NAME_P (name))
22017     {
22018       RS6000_OUTPUT_BASENAME (file, name);
22019     }
22020   else
22021     assemble_name (file, name);
22022 }
22023
22024 /* Output a TOC entry.  We derive the entry name from what is being
22025    written.  */
22026
22027 void
22028 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
22029 {
22030   char buf[256];
22031   const char *name = buf;
22032   rtx base = x;
22033   HOST_WIDE_INT offset = 0;
22034
22035   gcc_assert (!TARGET_NO_TOC);
22036
22037   /* When the linker won't eliminate them, don't output duplicate
22038      TOC entries (this happens on AIX if there is any kind of TOC,
22039      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
22040      CODE_LABELs.  */
22041   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
22042     {
22043       struct toc_hash_struct *h;
22044       void * * found;
22045
22046       /* Create toc_hash_table.  This can't be done at TARGET_OPTION_OVERRIDE
22047          time because GGC is not initialized at that point.  */
22048       if (toc_hash_table == NULL)
22049         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
22050                                           toc_hash_eq, NULL);
22051
22052       h = ggc_alloc_toc_hash_struct ();
22053       h->key = x;
22054       h->key_mode = mode;
22055       h->labelno = labelno;
22056
22057       found = htab_find_slot (toc_hash_table, h, INSERT);
22058       if (*found == NULL)
22059         *found = h;
22060       else  /* This is indeed a duplicate.
22061                Set this label equal to that label.  */
22062         {
22063           fputs ("\t.set ", file);
22064           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22065           fprintf (file, "%d,", labelno);
22066           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22067           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
22068                                               found)->labelno));
22069           return;
22070         }
22071     }
22072
22073   /* If we're going to put a double constant in the TOC, make sure it's
22074      aligned properly when strict alignment is on.  */
22075   if (GET_CODE (x) == CONST_DOUBLE
22076       && STRICT_ALIGNMENT
22077       && GET_MODE_BITSIZE (mode) >= 64
22078       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
22079     ASM_OUTPUT_ALIGN (file, 3);
22080   }
22081
22082   (*targetm.asm_out.internal_label) (file, "LC", labelno);
22083
22084   /* Handle FP constants specially.  Note that if we have a minimal
22085      TOC, things we put here aren't actually in the TOC, so we can allow
22086      FP constants.  */
22087   if (GET_CODE (x) == CONST_DOUBLE &&
22088       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
22089     {
22090       REAL_VALUE_TYPE rv;
22091       long k[4];
22092
22093       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22094       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22095         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
22096       else
22097         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
22098
22099       if (TARGET_64BIT)
22100         {
22101           if (TARGET_MINIMAL_TOC)
22102             fputs (DOUBLE_INT_ASM_OP, file);
22103           else
22104             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22105                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22106                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22107           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
22108                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22109                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22110           return;
22111         }
22112       else
22113         {
22114           if (TARGET_MINIMAL_TOC)
22115             fputs ("\t.long ", file);
22116           else
22117             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22118                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22119                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22120           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
22121                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22122                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22123           return;
22124         }
22125     }
22126   else if (GET_CODE (x) == CONST_DOUBLE &&
22127            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
22128     {
22129       REAL_VALUE_TYPE rv;
22130       long k[2];
22131
22132       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22133
22134       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22135         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
22136       else
22137         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
22138
22139       if (TARGET_64BIT)
22140         {
22141           if (TARGET_MINIMAL_TOC)
22142             fputs (DOUBLE_INT_ASM_OP, file);
22143           else
22144             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22145                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22146           fprintf (file, "0x%lx%08lx\n",
22147                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22148           return;
22149         }
22150       else
22151         {
22152           if (TARGET_MINIMAL_TOC)
22153             fputs ("\t.long ", file);
22154           else
22155             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22156                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22157           fprintf (file, "0x%lx,0x%lx\n",
22158                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22159           return;
22160         }
22161     }
22162   else if (GET_CODE (x) == CONST_DOUBLE &&
22163            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
22164     {
22165       REAL_VALUE_TYPE rv;
22166       long l;
22167
22168       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22169       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22170         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
22171       else
22172         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
22173
22174       if (TARGET_64BIT)
22175         {
22176           if (TARGET_MINIMAL_TOC)
22177             fputs (DOUBLE_INT_ASM_OP, file);
22178           else
22179             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22180           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
22181           return;
22182         }
22183       else
22184         {
22185           if (TARGET_MINIMAL_TOC)
22186             fputs ("\t.long ", file);
22187           else
22188             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22189           fprintf (file, "0x%lx\n", l & 0xffffffff);
22190           return;
22191         }
22192     }
22193   else if (GET_MODE (x) == VOIDmode
22194            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
22195     {
22196       unsigned HOST_WIDE_INT low;
22197       HOST_WIDE_INT high;
22198
22199       if (GET_CODE (x) == CONST_DOUBLE)
22200         {
22201           low = CONST_DOUBLE_LOW (x);
22202           high = CONST_DOUBLE_HIGH (x);
22203         }
22204       else
22205 #if HOST_BITS_PER_WIDE_INT == 32
22206         {
22207           low = INTVAL (x);
22208           high = (low & 0x80000000) ? ~0 : 0;
22209         }
22210 #else
22211         {
22212           low = INTVAL (x) & 0xffffffff;
22213           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
22214         }
22215 #endif
22216
22217       /* TOC entries are always Pmode-sized, but since this
22218          is a bigendian machine then if we're putting smaller
22219          integer constants in the TOC we have to pad them.
22220          (This is still a win over putting the constants in
22221          a separate constant pool, because then we'd have
22222          to have both a TOC entry _and_ the actual constant.)
22223
22224          For a 32-bit target, CONST_INT values are loaded and shifted
22225          entirely within `low' and can be stored in one TOC entry.  */
22226
22227       /* It would be easy to make this work, but it doesn't now.  */
22228       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
22229
22230       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
22231         {
22232 #if HOST_BITS_PER_WIDE_INT == 32
22233           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
22234                          POINTER_SIZE, &low, &high, 0);
22235 #else
22236           low |= high << 32;
22237           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
22238           high = (HOST_WIDE_INT) low >> 32;
22239           low &= 0xffffffff;
22240 #endif
22241         }
22242
22243       if (TARGET_64BIT)
22244         {
22245           if (TARGET_MINIMAL_TOC)
22246             fputs (DOUBLE_INT_ASM_OP, file);
22247           else
22248             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22249                      (long) high & 0xffffffff, (long) low & 0xffffffff);
22250           fprintf (file, "0x%lx%08lx\n",
22251                    (long) high & 0xffffffff, (long) low & 0xffffffff);
22252           return;
22253         }
22254       else
22255         {
22256           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
22257             {
22258               if (TARGET_MINIMAL_TOC)
22259                 fputs ("\t.long ", file);
22260               else
22261                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22262                          (long) high & 0xffffffff, (long) low & 0xffffffff);
22263               fprintf (file, "0x%lx,0x%lx\n",
22264                        (long) high & 0xffffffff, (long) low & 0xffffffff);
22265             }
22266           else
22267             {
22268               if (TARGET_MINIMAL_TOC)
22269                 fputs ("\t.long ", file);
22270               else
22271                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
22272               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
22273             }
22274           return;
22275         }
22276     }
22277
22278   if (GET_CODE (x) == CONST)
22279     {
22280       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
22281                   && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
22282
22283       base = XEXP (XEXP (x, 0), 0);
22284       offset = INTVAL (XEXP (XEXP (x, 0), 1));
22285     }
22286
22287   switch (GET_CODE (base))
22288     {
22289     case SYMBOL_REF:
22290       name = XSTR (base, 0);
22291       break;
22292
22293     case LABEL_REF:
22294       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
22295                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
22296       break;
22297
22298     case CODE_LABEL:
22299       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
22300       break;
22301
22302     default:
22303       gcc_unreachable ();
22304     }
22305
22306   if (TARGET_MINIMAL_TOC)
22307     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
22308   else
22309     {
22310       fputs ("\t.tc ", file);
22311       RS6000_OUTPUT_BASENAME (file, name);
22312
22313       if (offset < 0)
22314         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
22315       else if (offset)
22316         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
22317
22318       fputs ("[TC],", file);
22319     }
22320
22321   /* Currently C++ toc references to vtables can be emitted before it
22322      is decided whether the vtable is public or private.  If this is
22323      the case, then the linker will eventually complain that there is
22324      a TOC reference to an unknown section.  Thus, for vtables only,
22325      we emit the TOC reference to reference the symbol and not the
22326      section.  */
22327   if (VTABLE_NAME_P (name))
22328     {
22329       RS6000_OUTPUT_BASENAME (file, name);
22330       if (offset < 0)
22331         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
22332       else if (offset > 0)
22333         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
22334     }
22335   else
22336     output_addr_const (file, x);
22337   putc ('\n', file);
22338 }
22339 \f
22340 /* Output an assembler pseudo-op to write an ASCII string of N characters
22341    starting at P to FILE.
22342
22343    On the RS/6000, we have to do this using the .byte operation and
22344    write out special characters outside the quoted string.
22345    Also, the assembler is broken; very long strings are truncated,
22346    so we must artificially break them up early.  */
22347
22348 void
22349 output_ascii (FILE *file, const char *p, int n)
22350 {
22351   char c;
22352   int i, count_string;
22353   const char *for_string = "\t.byte \"";
22354   const char *for_decimal = "\t.byte ";
22355   const char *to_close = NULL;
22356
22357   count_string = 0;
22358   for (i = 0; i < n; i++)
22359     {
22360       c = *p++;
22361       if (c >= ' ' && c < 0177)
22362         {
22363           if (for_string)
22364             fputs (for_string, file);
22365           putc (c, file);
22366
22367           /* Write two quotes to get one.  */
22368           if (c == '"')
22369             {
22370               putc (c, file);
22371               ++count_string;
22372             }
22373
22374           for_string = NULL;
22375           for_decimal = "\"\n\t.byte ";
22376           to_close = "\"\n";
22377           ++count_string;
22378
22379           if (count_string >= 512)
22380             {
22381               fputs (to_close, file);
22382
22383               for_string = "\t.byte \"";
22384               for_decimal = "\t.byte ";
22385               to_close = NULL;
22386               count_string = 0;
22387             }
22388         }
22389       else
22390         {
22391           if (for_decimal)
22392             fputs (for_decimal, file);
22393           fprintf (file, "%d", c);
22394
22395           for_string = "\n\t.byte \"";
22396           for_decimal = ", ";
22397           to_close = "\n";
22398           count_string = 0;
22399         }
22400     }
22401
22402   /* Now close the string if we have written one.  Then end the line.  */
22403   if (to_close)
22404     fputs (to_close, file);
22405 }
22406 \f
22407 /* Generate a unique section name for FILENAME for a section type
22408    represented by SECTION_DESC.  Output goes into BUF.
22409
22410    SECTION_DESC can be any string, as long as it is different for each
22411    possible section type.
22412
22413    We name the section in the same manner as xlc.  The name begins with an
22414    underscore followed by the filename (after stripping any leading directory
22415    names) with the last period replaced by the string SECTION_DESC.  If
22416    FILENAME does not contain a period, SECTION_DESC is appended to the end of
22417    the name.  */
22418
22419 void
22420 rs6000_gen_section_name (char **buf, const char *filename,
22421                          const char *section_desc)
22422 {
22423   const char *q, *after_last_slash, *last_period = 0;
22424   char *p;
22425   int len;
22426
22427   after_last_slash = filename;
22428   for (q = filename; *q; q++)
22429     {
22430       if (*q == '/')
22431         after_last_slash = q + 1;
22432       else if (*q == '.')
22433         last_period = q;
22434     }
22435
22436   len = strlen (after_last_slash) + strlen (section_desc) + 2;
22437   *buf = (char *) xmalloc (len);
22438
22439   p = *buf;
22440   *p++ = '_';
22441
22442   for (q = after_last_slash; *q; q++)
22443     {
22444       if (q == last_period)
22445         {
22446           strcpy (p, section_desc);
22447           p += strlen (section_desc);
22448           break;
22449         }
22450
22451       else if (ISALNUM (*q))
22452         *p++ = *q;
22453     }
22454
22455   if (last_period == 0)
22456     strcpy (p, section_desc);
22457   else
22458     *p = '\0';
22459 }
22460 \f
22461 /* Emit profile function.  */
22462
22463 void
22464 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
22465 {
22466   /* Non-standard profiling for kernels, which just saves LR then calls
22467      _mcount without worrying about arg saves.  The idea is to change
22468      the function prologue as little as possible as it isn't easy to
22469      account for arg save/restore code added just for _mcount.  */
22470   if (TARGET_PROFILE_KERNEL)
22471     return;
22472
22473   if (DEFAULT_ABI == ABI_AIX)
22474     {
22475 #ifndef NO_PROFILE_COUNTERS
22476 # define NO_PROFILE_COUNTERS 0
22477 #endif
22478       if (NO_PROFILE_COUNTERS)
22479         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22480                            LCT_NORMAL, VOIDmode, 0);
22481       else
22482         {
22483           char buf[30];
22484           const char *label_name;
22485           rtx fun;
22486
22487           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22488           label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
22489           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
22490
22491           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22492                              LCT_NORMAL, VOIDmode, 1, fun, Pmode);
22493         }
22494     }
22495   else if (DEFAULT_ABI == ABI_DARWIN)
22496     {
22497       const char *mcount_name = RS6000_MCOUNT;
22498       int caller_addr_regno = LR_REGNO;
22499
22500       /* Be conservative and always set this, at least for now.  */
22501       crtl->uses_pic_offset_table = 1;
22502
22503 #if TARGET_MACHO
22504       /* For PIC code, set up a stub and collect the caller's address
22505          from r0, which is where the prologue puts it.  */
22506       if (MACHOPIC_INDIRECT
22507           && crtl->uses_pic_offset_table)
22508         caller_addr_regno = 0;
22509 #endif
22510       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
22511                          LCT_NORMAL, VOIDmode, 1,
22512                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
22513     }
22514 }
22515
22516 /* Write function profiler code.  */
22517
22518 void
22519 output_function_profiler (FILE *file, int labelno)
22520 {
22521   char buf[100];
22522
22523   switch (DEFAULT_ABI)
22524     {
22525     default:
22526       gcc_unreachable ();
22527
22528     case ABI_V4:
22529       if (!TARGET_32BIT)
22530         {
22531           warning (0, "no profiling of 64-bit code for this ABI");
22532           return;
22533         }
22534       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22535       fprintf (file, "\tmflr %s\n", reg_names[0]);
22536       if (NO_PROFILE_COUNTERS)
22537         {
22538           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22539                        reg_names[0], reg_names[1]);
22540         }
22541       else if (TARGET_SECURE_PLT && flag_pic)
22542         {
22543           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
22544                        reg_names[0], reg_names[1]);
22545           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22546           asm_fprintf (file, "\t{cau|addis} %s,%s,",
22547                        reg_names[12], reg_names[12]);
22548           assemble_name (file, buf);
22549           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
22550           assemble_name (file, buf);
22551           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
22552         }
22553       else if (flag_pic == 1)
22554         {
22555           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
22556           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22557                        reg_names[0], reg_names[1]);
22558           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22559           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
22560           assemble_name (file, buf);
22561           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
22562         }
22563       else if (flag_pic > 1)
22564         {
22565           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22566                        reg_names[0], reg_names[1]);
22567           /* Now, we need to get the address of the label.  */
22568           fputs ("\tbcl 20,31,1f\n\t.long ", file);
22569           assemble_name (file, buf);
22570           fputs ("-.\n1:", file);
22571           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
22572           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
22573                        reg_names[0], reg_names[11]);
22574           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
22575                        reg_names[0], reg_names[0], reg_names[11]);
22576         }
22577       else
22578         {
22579           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
22580           assemble_name (file, buf);
22581           fputs ("@ha\n", file);
22582           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22583                        reg_names[0], reg_names[1]);
22584           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
22585           assemble_name (file, buf);
22586           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
22587         }
22588
22589       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
22590       fprintf (file, "\tbl %s%s\n",
22591                RS6000_MCOUNT, flag_pic ? "@plt" : "");
22592       break;
22593
22594     case ABI_AIX:
22595     case ABI_DARWIN:
22596       if (!TARGET_PROFILE_KERNEL)
22597         {
22598           /* Don't do anything, done in output_profile_hook ().  */
22599         }
22600       else
22601         {
22602           gcc_assert (!TARGET_32BIT);
22603
22604           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
22605           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
22606
22607           if (cfun->static_chain_decl != NULL)
22608             {
22609               asm_fprintf (file, "\tstd %s,24(%s)\n",
22610                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22611               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22612               asm_fprintf (file, "\tld %s,24(%s)\n",
22613                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22614             }
22615           else
22616             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22617         }
22618       break;
22619     }
22620 }
22621
22622 \f
22623
22624 /* The following variable value is the last issued insn.  */
22625
22626 static rtx last_scheduled_insn;
22627
22628 /* The following variable helps to balance issuing of load and
22629    store instructions */
22630
22631 static int load_store_pendulum;
22632
22633 /* Power4 load update and store update instructions are cracked into a
22634    load or store and an integer insn which are executed in the same cycle.
22635    Branches have their own dispatch slot which does not count against the
22636    GCC issue rate, but it changes the program flow so there are no other
22637    instructions to issue in this cycle.  */
22638
22639 static int
22640 rs6000_variable_issue_1 (rtx insn, int more)
22641 {
22642   last_scheduled_insn = insn;
22643   if (GET_CODE (PATTERN (insn)) == USE
22644       || GET_CODE (PATTERN (insn)) == CLOBBER)
22645     {
22646       cached_can_issue_more = more;
22647       return cached_can_issue_more;
22648     }
22649
22650   if (insn_terminates_group_p (insn, current_group))
22651     {
22652       cached_can_issue_more = 0;
22653       return cached_can_issue_more;
22654     }
22655
22656   /* If no reservation, but reach here */
22657   if (recog_memoized (insn) < 0)
22658     return more;
22659
22660   if (rs6000_sched_groups)
22661     {
22662       if (is_microcoded_insn (insn))
22663         cached_can_issue_more = 0;
22664       else if (is_cracked_insn (insn))
22665         cached_can_issue_more = more > 2 ? more - 2 : 0;
22666       else
22667         cached_can_issue_more = more - 1;
22668
22669       return cached_can_issue_more;
22670     }
22671
22672   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
22673     return 0;
22674
22675   cached_can_issue_more = more - 1;
22676   return cached_can_issue_more;
22677 }
22678
22679 static int
22680 rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
22681 {
22682   int r = rs6000_variable_issue_1 (insn, more);
22683   if (verbose)
22684     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
22685   return r;
22686 }
22687
22688 /* Adjust the cost of a scheduling dependency.  Return the new cost of
22689    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
22690
22691 static int
22692 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22693 {
22694   enum attr_type attr_type;
22695
22696   if (! recog_memoized (insn))
22697     return 0;
22698
22699   switch (REG_NOTE_KIND (link))
22700     {
22701     case REG_DEP_TRUE:
22702       {
22703         /* Data dependency; DEP_INSN writes a register that INSN reads
22704            some cycles later.  */
22705
22706         /* Separate a load from a narrower, dependent store.  */
22707         if (rs6000_sched_groups
22708             && GET_CODE (PATTERN (insn)) == SET
22709             && GET_CODE (PATTERN (dep_insn)) == SET
22710             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
22711             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
22712             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
22713                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
22714           return cost + 14;
22715
22716         attr_type = get_attr_type (insn);
22717
22718         switch (attr_type)
22719           {
22720           case TYPE_JMPREG:
22721             /* Tell the first scheduling pass about the latency between
22722                a mtctr and bctr (and mtlr and br/blr).  The first
22723                scheduling pass will not know about this latency since
22724                the mtctr instruction, which has the latency associated
22725                to it, will be generated by reload.  */
22726             return TARGET_POWER ? 5 : 4;
22727           case TYPE_BRANCH:
22728             /* Leave some extra cycles between a compare and its
22729                dependent branch, to inhibit expensive mispredicts.  */
22730             if ((rs6000_cpu_attr == CPU_PPC603
22731                  || rs6000_cpu_attr == CPU_PPC604
22732                  || rs6000_cpu_attr == CPU_PPC604E
22733                  || rs6000_cpu_attr == CPU_PPC620
22734                  || rs6000_cpu_attr == CPU_PPC630
22735                  || rs6000_cpu_attr == CPU_PPC750
22736                  || rs6000_cpu_attr == CPU_PPC7400
22737                  || rs6000_cpu_attr == CPU_PPC7450
22738                  || rs6000_cpu_attr == CPU_POWER4
22739                  || rs6000_cpu_attr == CPU_POWER5
22740                  || rs6000_cpu_attr == CPU_POWER7
22741                  || rs6000_cpu_attr == CPU_CELL)
22742                 && recog_memoized (dep_insn)
22743                 && (INSN_CODE (dep_insn) >= 0))
22744
22745               switch (get_attr_type (dep_insn))
22746                 {
22747                 case TYPE_CMP:
22748                 case TYPE_COMPARE:
22749                 case TYPE_DELAYED_COMPARE:
22750                 case TYPE_IMUL_COMPARE:
22751                 case TYPE_LMUL_COMPARE:
22752                 case TYPE_FPCOMPARE:
22753                 case TYPE_CR_LOGICAL:
22754                 case TYPE_DELAYED_CR:
22755                   return cost + 2;
22756                 default:
22757                   break;
22758                 }
22759             break;
22760
22761           case TYPE_STORE:
22762           case TYPE_STORE_U:
22763           case TYPE_STORE_UX:
22764           case TYPE_FPSTORE:
22765           case TYPE_FPSTORE_U:
22766           case TYPE_FPSTORE_UX:
22767             if ((rs6000_cpu == PROCESSOR_POWER6)
22768                 && recog_memoized (dep_insn)
22769                 && (INSN_CODE (dep_insn) >= 0))
22770               {
22771
22772                 if (GET_CODE (PATTERN (insn)) != SET)
22773                   /* If this happens, we have to extend this to schedule
22774                      optimally.  Return default for now.  */
22775                   return cost;
22776
22777                 /* Adjust the cost for the case where the value written
22778                    by a fixed point operation is used as the address
22779                    gen value on a store. */
22780                 switch (get_attr_type (dep_insn))
22781                   {
22782                   case TYPE_LOAD:
22783                   case TYPE_LOAD_U:
22784                   case TYPE_LOAD_UX:
22785                   case TYPE_CNTLZ:
22786                     {
22787                       if (! store_data_bypass_p (dep_insn, insn))
22788                         return 4;
22789                       break;
22790                     }
22791                   case TYPE_LOAD_EXT:
22792                   case TYPE_LOAD_EXT_U:
22793                   case TYPE_LOAD_EXT_UX:
22794                   case TYPE_VAR_SHIFT_ROTATE:
22795                   case TYPE_VAR_DELAYED_COMPARE:
22796                     {
22797                       if (! store_data_bypass_p (dep_insn, insn))
22798                         return 6;
22799                       break;
22800                     }
22801                   case TYPE_INTEGER:
22802                   case TYPE_COMPARE:
22803                   case TYPE_FAST_COMPARE:
22804                   case TYPE_EXTS:
22805                   case TYPE_SHIFT:
22806                   case TYPE_INSERT_WORD:
22807                   case TYPE_INSERT_DWORD:
22808                   case TYPE_FPLOAD_U:
22809                   case TYPE_FPLOAD_UX:
22810                   case TYPE_STORE_U:
22811                   case TYPE_STORE_UX:
22812                   case TYPE_FPSTORE_U:
22813                   case TYPE_FPSTORE_UX:
22814                     {
22815                       if (! store_data_bypass_p (dep_insn, insn))
22816                         return 3;
22817                       break;
22818                     }
22819                   case TYPE_IMUL:
22820                   case TYPE_IMUL2:
22821                   case TYPE_IMUL3:
22822                   case TYPE_LMUL:
22823                   case TYPE_IMUL_COMPARE:
22824                   case TYPE_LMUL_COMPARE:
22825                     {
22826                       if (! store_data_bypass_p (dep_insn, insn))
22827                         return 17;
22828                       break;
22829                     }
22830                   case TYPE_IDIV:
22831                     {
22832                       if (! store_data_bypass_p (dep_insn, insn))
22833                         return 45;
22834                       break;
22835                     }
22836                   case TYPE_LDIV:
22837                     {
22838                       if (! store_data_bypass_p (dep_insn, insn))
22839                         return 57;
22840                       break;
22841                     }
22842                   default:
22843                     break;
22844                   }
22845               }
22846             break;
22847
22848           case TYPE_LOAD:
22849           case TYPE_LOAD_U:
22850           case TYPE_LOAD_UX:
22851           case TYPE_LOAD_EXT:
22852           case TYPE_LOAD_EXT_U:
22853           case TYPE_LOAD_EXT_UX:
22854             if ((rs6000_cpu == PROCESSOR_POWER6)
22855                 && recog_memoized (dep_insn)
22856                 && (INSN_CODE (dep_insn) >= 0))
22857               {
22858
22859                 /* Adjust the cost for the case where the value written
22860                    by a fixed point instruction is used within the address
22861                    gen portion of a subsequent load(u)(x) */
22862                 switch (get_attr_type (dep_insn))
22863                   {
22864                   case TYPE_LOAD:
22865                   case TYPE_LOAD_U:
22866                   case TYPE_LOAD_UX:
22867                   case TYPE_CNTLZ:
22868                     {
22869                       if (set_to_load_agen (dep_insn, insn))
22870                         return 4;
22871                       break;
22872                     }
22873                   case TYPE_LOAD_EXT:
22874                   case TYPE_LOAD_EXT_U:
22875                   case TYPE_LOAD_EXT_UX:
22876                   case TYPE_VAR_SHIFT_ROTATE:
22877                   case TYPE_VAR_DELAYED_COMPARE:
22878                     {
22879                       if (set_to_load_agen (dep_insn, insn))
22880                         return 6;
22881                       break;
22882                     }
22883                   case TYPE_INTEGER:
22884                   case TYPE_COMPARE:
22885                   case TYPE_FAST_COMPARE:
22886                   case TYPE_EXTS:
22887                   case TYPE_SHIFT:
22888                   case TYPE_INSERT_WORD:
22889                   case TYPE_INSERT_DWORD:
22890                   case TYPE_FPLOAD_U:
22891                   case TYPE_FPLOAD_UX:
22892                   case TYPE_STORE_U:
22893                   case TYPE_STORE_UX:
22894                   case TYPE_FPSTORE_U:
22895                   case TYPE_FPSTORE_UX:
22896                     {
22897                       if (set_to_load_agen (dep_insn, insn))
22898                         return 3;
22899                       break;
22900                     }
22901                   case TYPE_IMUL:
22902                   case TYPE_IMUL2:
22903                   case TYPE_IMUL3:
22904                   case TYPE_LMUL:
22905                   case TYPE_IMUL_COMPARE:
22906                   case TYPE_LMUL_COMPARE:
22907                     {
22908                       if (set_to_load_agen (dep_insn, insn))
22909                         return 17;
22910                       break;
22911                     }
22912                   case TYPE_IDIV:
22913                     {
22914                       if (set_to_load_agen (dep_insn, insn))
22915                         return 45;
22916                       break;
22917                     }
22918                   case TYPE_LDIV:
22919                     {
22920                       if (set_to_load_agen (dep_insn, insn))
22921                         return 57;
22922                       break;
22923                     }
22924                   default:
22925                     break;
22926                   }
22927               }
22928             break;
22929
22930           case TYPE_FPLOAD:
22931             if ((rs6000_cpu == PROCESSOR_POWER6)
22932                 && recog_memoized (dep_insn)
22933                 && (INSN_CODE (dep_insn) >= 0)
22934                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
22935               return 2;
22936
22937           default:
22938             break;
22939           }
22940
22941         /* Fall out to return default cost.  */
22942       }
22943       break;
22944
22945     case REG_DEP_OUTPUT:
22946       /* Output dependency; DEP_INSN writes a register that INSN writes some
22947          cycles later.  */
22948       if ((rs6000_cpu == PROCESSOR_POWER6)
22949           && recog_memoized (dep_insn)
22950           && (INSN_CODE (dep_insn) >= 0))
22951         {
22952           attr_type = get_attr_type (insn);
22953
22954           switch (attr_type)
22955             {
22956             case TYPE_FP:
22957               if (get_attr_type (dep_insn) == TYPE_FP)
22958                 return 1;
22959               break;
22960             case TYPE_FPLOAD:
22961               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
22962                 return 2;
22963               break;
22964             default:
22965               break;
22966             }
22967         }
22968     case REG_DEP_ANTI:
22969       /* Anti dependency; DEP_INSN reads a register that INSN writes some
22970          cycles later.  */
22971       return 0;
22972
22973     default:
22974       gcc_unreachable ();
22975     }
22976
22977   return cost;
22978 }
22979
22980 /* Debug version of rs6000_adjust_cost.  */
22981
22982 static int
22983 rs6000_debug_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22984 {
22985   int ret = rs6000_adjust_cost (insn, link, dep_insn, cost);
22986
22987   if (ret != cost)
22988     {
22989       const char *dep;
22990
22991       switch (REG_NOTE_KIND (link))
22992         {
22993         default:             dep = "unknown depencency"; break;
22994         case REG_DEP_TRUE:   dep = "data dependency";    break;
22995         case REG_DEP_OUTPUT: dep = "output dependency";  break;
22996         case REG_DEP_ANTI:   dep = "anti depencency";    break;
22997         }
22998
22999       fprintf (stderr,
23000                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
23001                "%s, insn:\n", ret, cost, dep);
23002
23003       debug_rtx (insn);
23004     }
23005
23006   return ret;
23007 }
23008
23009 /* The function returns a true if INSN is microcoded.
23010    Return false otherwise.  */
23011
23012 static bool
23013 is_microcoded_insn (rtx insn)
23014 {
23015   if (!insn || !NONDEBUG_INSN_P (insn)
23016       || GET_CODE (PATTERN (insn)) == USE
23017       || GET_CODE (PATTERN (insn)) == CLOBBER)
23018     return false;
23019
23020   if (rs6000_cpu_attr == CPU_CELL)
23021     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
23022
23023   if (rs6000_sched_groups)
23024     {
23025       enum attr_type type = get_attr_type (insn);
23026       if (type == TYPE_LOAD_EXT_U
23027           || type == TYPE_LOAD_EXT_UX
23028           || type == TYPE_LOAD_UX
23029           || type == TYPE_STORE_UX
23030           || type == TYPE_MFCR)
23031         return true;
23032     }
23033
23034   return false;
23035 }
23036
23037 /* The function returns true if INSN is cracked into 2 instructions
23038    by the processor (and therefore occupies 2 issue slots).  */
23039
23040 static bool
23041 is_cracked_insn (rtx insn)
23042 {
23043   if (!insn || !NONDEBUG_INSN_P (insn)
23044       || GET_CODE (PATTERN (insn)) == USE
23045       || GET_CODE (PATTERN (insn)) == CLOBBER)
23046     return false;
23047
23048   if (rs6000_sched_groups)
23049     {
23050       enum attr_type type = get_attr_type (insn);
23051       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
23052           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
23053           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
23054           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
23055           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
23056           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
23057           || type == TYPE_IDIV || type == TYPE_LDIV
23058           || type == TYPE_INSERT_WORD)
23059         return true;
23060     }
23061
23062   return false;
23063 }
23064
23065 /* The function returns true if INSN can be issued only from
23066    the branch slot.  */
23067
23068 static bool
23069 is_branch_slot_insn (rtx insn)
23070 {
23071   if (!insn || !NONDEBUG_INSN_P (insn)
23072       || GET_CODE (PATTERN (insn)) == USE
23073       || GET_CODE (PATTERN (insn)) == CLOBBER)
23074     return false;
23075
23076   if (rs6000_sched_groups)
23077     {
23078       enum attr_type type = get_attr_type (insn);
23079       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
23080         return true;
23081       return false;
23082     }
23083
23084   return false;
23085 }
23086
23087 /* The function returns true if out_inst sets a value that is
23088    used in the address generation computation of in_insn */
23089 static bool
23090 set_to_load_agen (rtx out_insn, rtx in_insn)
23091 {
23092   rtx out_set, in_set;
23093
23094   /* For performance reasons, only handle the simple case where
23095      both loads are a single_set. */
23096   out_set = single_set (out_insn);
23097   if (out_set)
23098     {
23099       in_set = single_set (in_insn);
23100       if (in_set)
23101         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
23102     }
23103
23104   return false;
23105 }
23106
23107 /* The function returns true if the target storage location of
23108    out_insn is adjacent to the target storage location of in_insn */
23109 /* Return 1 if memory locations are adjacent.  */
23110
23111 static bool
23112 adjacent_mem_locations (rtx insn1, rtx insn2)
23113 {
23114
23115   rtx a = get_store_dest (PATTERN (insn1));
23116   rtx b = get_store_dest (PATTERN (insn2));
23117
23118   if ((GET_CODE (XEXP (a, 0)) == REG
23119        || (GET_CODE (XEXP (a, 0)) == PLUS
23120            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
23121       && (GET_CODE (XEXP (b, 0)) == REG
23122           || (GET_CODE (XEXP (b, 0)) == PLUS
23123               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
23124     {
23125       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
23126       rtx reg0, reg1;
23127
23128       if (GET_CODE (XEXP (a, 0)) == PLUS)
23129         {
23130           reg0 = XEXP (XEXP (a, 0), 0);
23131           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
23132         }
23133       else
23134         reg0 = XEXP (a, 0);
23135
23136       if (GET_CODE (XEXP (b, 0)) == PLUS)
23137         {
23138           reg1 = XEXP (XEXP (b, 0), 0);
23139           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
23140         }
23141       else
23142         reg1 = XEXP (b, 0);
23143
23144       val_diff = val1 - val0;
23145
23146       return ((REGNO (reg0) == REGNO (reg1))
23147               && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
23148                   || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
23149     }
23150
23151   return false;
23152 }
23153
23154 /* A C statement (sans semicolon) to update the integer scheduling
23155    priority INSN_PRIORITY (INSN). Increase the priority to execute the
23156    INSN earlier, reduce the priority to execute INSN later.  Do not
23157    define this macro if you do not need to adjust the scheduling
23158    priorities of insns.  */
23159
23160 static int
23161 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
23162 {
23163   /* On machines (like the 750) which have asymmetric integer units,
23164      where one integer unit can do multiply and divides and the other
23165      can't, reduce the priority of multiply/divide so it is scheduled
23166      before other integer operations.  */
23167
23168 #if 0
23169   if (! INSN_P (insn))
23170     return priority;
23171
23172   if (GET_CODE (PATTERN (insn)) == USE)
23173     return priority;
23174
23175   switch (rs6000_cpu_attr) {
23176   case CPU_PPC750:
23177     switch (get_attr_type (insn))
23178       {
23179       default:
23180         break;
23181
23182       case TYPE_IMUL:
23183       case TYPE_IDIV:
23184         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
23185                  priority, priority);
23186         if (priority >= 0 && priority < 0x01000000)
23187           priority >>= 3;
23188         break;
23189       }
23190   }
23191 #endif
23192
23193   if (insn_must_be_first_in_group (insn)
23194       && reload_completed
23195       && current_sched_info->sched_max_insns_priority
23196       && rs6000_sched_restricted_insns_priority)
23197     {
23198
23199       /* Prioritize insns that can be dispatched only in the first
23200          dispatch slot.  */
23201       if (rs6000_sched_restricted_insns_priority == 1)
23202         /* Attach highest priority to insn. This means that in
23203            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
23204            precede 'priority' (critical path) considerations.  */
23205         return current_sched_info->sched_max_insns_priority;
23206       else if (rs6000_sched_restricted_insns_priority == 2)
23207         /* Increase priority of insn by a minimal amount. This means that in
23208            haifa-sched.c:ready_sort(), only 'priority' (critical path)
23209            considerations precede dispatch-slot restriction considerations.  */
23210         return (priority + 1);
23211     }
23212
23213   if (rs6000_cpu == PROCESSOR_POWER6
23214       && ((load_store_pendulum == -2 && is_load_insn (insn))
23215           || (load_store_pendulum == 2 && is_store_insn (insn))))
23216     /* Attach highest priority to insn if the scheduler has just issued two
23217        stores and this instruction is a load, or two loads and this instruction
23218        is a store. Power6 wants loads and stores scheduled alternately
23219        when possible */
23220     return current_sched_info->sched_max_insns_priority;
23221
23222   return priority;
23223 }
23224
23225 /* Return true if the instruction is nonpipelined on the Cell. */
23226 static bool
23227 is_nonpipeline_insn (rtx insn)
23228 {
23229   enum attr_type type;
23230   if (!insn || !NONDEBUG_INSN_P (insn)
23231       || GET_CODE (PATTERN (insn)) == USE
23232       || GET_CODE (PATTERN (insn)) == CLOBBER)
23233     return false;
23234
23235   type = get_attr_type (insn);
23236   if (type == TYPE_IMUL
23237       || type == TYPE_IMUL2
23238       || type == TYPE_IMUL3
23239       || type == TYPE_LMUL
23240       || type == TYPE_IDIV
23241       || type == TYPE_LDIV
23242       || type == TYPE_SDIV
23243       || type == TYPE_DDIV
23244       || type == TYPE_SSQRT
23245       || type == TYPE_DSQRT
23246       || type == TYPE_MFCR
23247       || type == TYPE_MFCRF
23248       || type == TYPE_MFJMPR)
23249     {
23250       return true;
23251     }
23252   return false;
23253 }
23254
23255
23256 /* Return how many instructions the machine can issue per cycle.  */
23257
23258 static int
23259 rs6000_issue_rate (void)
23260 {
23261   /* Unless scheduling for register pressure, use issue rate of 1 for
23262      first scheduling pass to decrease degradation.  */
23263   if (!reload_completed && !flag_sched_pressure)
23264     return 1;
23265
23266   switch (rs6000_cpu_attr) {
23267   case CPU_RIOS1:  /* ? */
23268   case CPU_RS64A:
23269   case CPU_PPC601: /* ? */
23270   case CPU_PPC7450:
23271     return 3;
23272   case CPU_PPC440:
23273   case CPU_PPC603:
23274   case CPU_PPC750:
23275   case CPU_PPC7400:
23276   case CPU_PPC8540:
23277   case CPU_CELL:
23278   case CPU_PPCE300C2:
23279   case CPU_PPCE300C3:
23280   case CPU_PPCE500MC:
23281   case CPU_PPCE500MC64:
23282   case CPU_TITAN:
23283     return 2;
23284   case CPU_RIOS2:
23285   case CPU_PPC476:
23286   case CPU_PPC604:
23287   case CPU_PPC604E:
23288   case CPU_PPC620:
23289   case CPU_PPC630:
23290     return 4;
23291   case CPU_POWER4:
23292   case CPU_POWER5:
23293   case CPU_POWER6:
23294   case CPU_POWER7:
23295     return 5;
23296   default:
23297     return 1;
23298   }
23299 }
23300
23301 /* Return how many instructions to look ahead for better insn
23302    scheduling.  */
23303
23304 static int
23305 rs6000_use_sched_lookahead (void)
23306 {
23307   if (rs6000_cpu_attr == CPU_PPC8540)
23308     return 4;
23309   if (rs6000_cpu_attr == CPU_CELL)
23310     return (reload_completed ? 8 : 0);
23311   return 0;
23312 }
23313
23314 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
23315 static int
23316 rs6000_use_sched_lookahead_guard (rtx insn)
23317 {
23318   if (rs6000_cpu_attr != CPU_CELL)
23319     return 1;
23320
23321    if (insn == NULL_RTX || !INSN_P (insn))
23322      abort ();
23323
23324   if (!reload_completed
23325       || is_nonpipeline_insn (insn)
23326       || is_microcoded_insn (insn))
23327     return 0;
23328
23329   return 1;
23330 }
23331
23332 /* Determine is PAT refers to memory.  */
23333
23334 static bool
23335 is_mem_ref (rtx pat)
23336 {
23337   const char * fmt;
23338   int i, j;
23339   bool ret = false;
23340
23341   /* stack_tie does not produce any real memory traffic.  */
23342   if (GET_CODE (pat) == UNSPEC
23343       && XINT (pat, 1) == UNSPEC_TIE)
23344     return false;
23345
23346   if (GET_CODE (pat) == MEM)
23347     return true;
23348
23349   /* Recursively process the pattern.  */
23350   fmt = GET_RTX_FORMAT (GET_CODE (pat));
23351
23352   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
23353     {
23354       if (fmt[i] == 'e')
23355         ret |= is_mem_ref (XEXP (pat, i));
23356       else if (fmt[i] == 'E')
23357         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
23358           ret |= is_mem_ref (XVECEXP (pat, i, j));
23359     }
23360
23361   return ret;
23362 }
23363
23364 /* Determine if PAT is a PATTERN of a load insn.  */
23365
23366 static bool
23367 is_load_insn1 (rtx pat)
23368 {
23369   if (!pat || pat == NULL_RTX)
23370     return false;
23371
23372   if (GET_CODE (pat) == SET)
23373     return is_mem_ref (SET_SRC (pat));
23374
23375   if (GET_CODE (pat) == PARALLEL)
23376     {
23377       int i;
23378
23379       for (i = 0; i < XVECLEN (pat, 0); i++)
23380         if (is_load_insn1 (XVECEXP (pat, 0, i)))
23381           return true;
23382     }
23383
23384   return false;
23385 }
23386
23387 /* Determine if INSN loads from memory.  */
23388
23389 static bool
23390 is_load_insn (rtx insn)
23391 {
23392   if (!insn || !INSN_P (insn))
23393     return false;
23394
23395   if (GET_CODE (insn) == CALL_INSN)
23396     return false;
23397
23398   return is_load_insn1 (PATTERN (insn));
23399 }
23400
23401 /* Determine if PAT is a PATTERN of a store insn.  */
23402
23403 static bool
23404 is_store_insn1 (rtx pat)
23405 {
23406   if (!pat || pat == NULL_RTX)
23407     return false;
23408
23409   if (GET_CODE (pat) == SET)
23410     return is_mem_ref (SET_DEST (pat));
23411
23412   if (GET_CODE (pat) == PARALLEL)
23413     {
23414       int i;
23415
23416       for (i = 0; i < XVECLEN (pat, 0); i++)
23417         if (is_store_insn1 (XVECEXP (pat, 0, i)))
23418           return true;
23419     }
23420
23421   return false;
23422 }
23423
23424 /* Determine if INSN stores to memory.  */
23425
23426 static bool
23427 is_store_insn (rtx insn)
23428 {
23429   if (!insn || !INSN_P (insn))
23430     return false;
23431
23432   return is_store_insn1 (PATTERN (insn));
23433 }
23434
23435 /* Return the dest of a store insn.  */
23436
23437 static rtx
23438 get_store_dest (rtx pat)
23439 {
23440   gcc_assert (is_store_insn1 (pat));
23441
23442   if (GET_CODE (pat) == SET)
23443     return SET_DEST (pat);
23444   else if (GET_CODE (pat) == PARALLEL)
23445     {
23446       int i;
23447
23448       for (i = 0; i < XVECLEN (pat, 0); i++)
23449         {
23450           rtx inner_pat = XVECEXP (pat, 0, i);
23451           if (GET_CODE (inner_pat) == SET
23452               && is_mem_ref (SET_DEST (inner_pat)))
23453             return inner_pat;
23454         }
23455     }
23456   /* We shouldn't get here, because we should have either a simple
23457      store insn or a store with update which are covered above.  */
23458   gcc_unreachable();
23459 }
23460
23461 /* Returns whether the dependence between INSN and NEXT is considered
23462    costly by the given target.  */
23463
23464 static bool
23465 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
23466 {
23467   rtx insn;
23468   rtx next;
23469
23470   /* If the flag is not enabled - no dependence is considered costly;
23471      allow all dependent insns in the same group.
23472      This is the most aggressive option.  */
23473   if (rs6000_sched_costly_dep == no_dep_costly)
23474     return false;
23475
23476   /* If the flag is set to 1 - a dependence is always considered costly;
23477      do not allow dependent instructions in the same group.
23478      This is the most conservative option.  */
23479   if (rs6000_sched_costly_dep == all_deps_costly)
23480     return true;
23481
23482   insn = DEP_PRO (dep);
23483   next = DEP_CON (dep);
23484
23485   if (rs6000_sched_costly_dep == store_to_load_dep_costly
23486       && is_load_insn (next)
23487       && is_store_insn (insn))
23488     /* Prevent load after store in the same group.  */
23489     return true;
23490
23491   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
23492       && is_load_insn (next)
23493       && is_store_insn (insn)
23494       && DEP_TYPE (dep) == REG_DEP_TRUE)
23495      /* Prevent load after store in the same group if it is a true
23496         dependence.  */
23497      return true;
23498
23499   /* The flag is set to X; dependences with latency >= X are considered costly,
23500      and will not be scheduled in the same group.  */
23501   if (rs6000_sched_costly_dep <= max_dep_latency
23502       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
23503     return true;
23504
23505   return false;
23506 }
23507
23508 /* Return the next insn after INSN that is found before TAIL is reached,
23509    skipping any "non-active" insns - insns that will not actually occupy
23510    an issue slot.  Return NULL_RTX if such an insn is not found.  */
23511
23512 static rtx
23513 get_next_active_insn (rtx insn, rtx tail)
23514 {
23515   if (insn == NULL_RTX || insn == tail)
23516     return NULL_RTX;
23517
23518   while (1)
23519     {
23520       insn = NEXT_INSN (insn);
23521       if (insn == NULL_RTX || insn == tail)
23522         return NULL_RTX;
23523
23524       if (CALL_P (insn)
23525           || JUMP_P (insn)
23526           || (NONJUMP_INSN_P (insn)
23527               && GET_CODE (PATTERN (insn)) != USE
23528               && GET_CODE (PATTERN (insn)) != CLOBBER
23529               && INSN_CODE (insn) != CODE_FOR_stack_tie))
23530         break;
23531     }
23532   return insn;
23533 }
23534
23535 /* We are about to begin issuing insns for this clock cycle. */
23536
23537 static int
23538 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
23539                         rtx *ready ATTRIBUTE_UNUSED,
23540                         int *pn_ready ATTRIBUTE_UNUSED,
23541                         int clock_var ATTRIBUTE_UNUSED)
23542 {
23543   int n_ready = *pn_ready;
23544
23545   if (sched_verbose)
23546     fprintf (dump, "// rs6000_sched_reorder :\n");
23547
23548   /* Reorder the ready list, if the second to last ready insn
23549      is a nonepipeline insn.  */
23550   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
23551   {
23552     if (is_nonpipeline_insn (ready[n_ready - 1])
23553         && (recog_memoized (ready[n_ready - 2]) > 0))
23554       /* Simply swap first two insns.  */
23555       {
23556         rtx tmp = ready[n_ready - 1];
23557         ready[n_ready - 1] = ready[n_ready - 2];
23558         ready[n_ready - 2] = tmp;
23559       }
23560   }
23561
23562   if (rs6000_cpu == PROCESSOR_POWER6)
23563     load_store_pendulum = 0;
23564
23565   return rs6000_issue_rate ();
23566 }
23567
23568 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
23569
23570 static int
23571 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
23572                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
23573 {
23574   if (sched_verbose)
23575     fprintf (dump, "// rs6000_sched_reorder2 :\n");
23576
23577   /* For Power6, we need to handle some special cases to try and keep the
23578      store queue from overflowing and triggering expensive flushes.
23579
23580      This code monitors how load and store instructions are being issued
23581      and skews the ready list one way or the other to increase the likelihood
23582      that a desired instruction is issued at the proper time.
23583
23584      A couple of things are done.  First, we maintain a "load_store_pendulum"
23585      to track the current state of load/store issue.
23586
23587        - If the pendulum is at zero, then no loads or stores have been
23588          issued in the current cycle so we do nothing.
23589
23590        - If the pendulum is 1, then a single load has been issued in this
23591          cycle and we attempt to locate another load in the ready list to
23592          issue with it.
23593
23594        - If the pendulum is -2, then two stores have already been
23595          issued in this cycle, so we increase the priority of the first load
23596          in the ready list to increase it's likelihood of being chosen first
23597          in the next cycle.
23598
23599        - If the pendulum is -1, then a single store has been issued in this
23600          cycle and we attempt to locate another store in the ready list to
23601          issue with it, preferring a store to an adjacent memory location to
23602          facilitate store pairing in the store queue.
23603
23604        - If the pendulum is 2, then two loads have already been
23605          issued in this cycle, so we increase the priority of the first store
23606          in the ready list to increase it's likelihood of being chosen first
23607          in the next cycle.
23608
23609        - If the pendulum < -2 or > 2, then do nothing.
23610
23611        Note: This code covers the most common scenarios.  There exist non
23612              load/store instructions which make use of the LSU and which
23613              would need to be accounted for to strictly model the behavior
23614              of the machine.  Those instructions are currently unaccounted
23615              for to help minimize compile time overhead of this code.
23616    */
23617   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
23618     {
23619       int pos;
23620       int i;
23621       rtx tmp;
23622
23623       if (is_store_insn (last_scheduled_insn))
23624         /* Issuing a store, swing the load_store_pendulum to the left */
23625         load_store_pendulum--;
23626       else if (is_load_insn (last_scheduled_insn))
23627         /* Issuing a load, swing the load_store_pendulum to the right */
23628         load_store_pendulum++;
23629       else
23630         return cached_can_issue_more;
23631
23632       /* If the pendulum is balanced, or there is only one instruction on
23633          the ready list, then all is well, so return. */
23634       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
23635         return cached_can_issue_more;
23636
23637       if (load_store_pendulum == 1)
23638         {
23639           /* A load has been issued in this cycle.  Scan the ready list
23640              for another load to issue with it */
23641           pos = *pn_ready-1;
23642
23643           while (pos >= 0)
23644             {
23645               if (is_load_insn (ready[pos]))
23646                 {
23647                   /* Found a load.  Move it to the head of the ready list,
23648                      and adjust it's priority so that it is more likely to
23649                      stay there */
23650                   tmp = ready[pos];
23651                   for (i=pos; i<*pn_ready-1; i++)
23652                     ready[i] = ready[i + 1];
23653                   ready[*pn_ready-1] = tmp;
23654
23655                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23656                     INSN_PRIORITY (tmp)++;
23657                   break;
23658                 }
23659               pos--;
23660             }
23661         }
23662       else if (load_store_pendulum == -2)
23663         {
23664           /* Two stores have been issued in this cycle.  Increase the
23665              priority of the first load in the ready list to favor it for
23666              issuing in the next cycle. */
23667           pos = *pn_ready-1;
23668
23669           while (pos >= 0)
23670             {
23671               if (is_load_insn (ready[pos])
23672                   && !sel_sched_p ()
23673                   && INSN_PRIORITY_KNOWN (ready[pos]))
23674                 {
23675                   INSN_PRIORITY (ready[pos])++;
23676
23677                   /* Adjust the pendulum to account for the fact that a load
23678                      was found and increased in priority.  This is to prevent
23679                      increasing the priority of multiple loads */
23680                   load_store_pendulum--;
23681
23682                   break;
23683                 }
23684               pos--;
23685             }
23686         }
23687       else if (load_store_pendulum == -1)
23688         {
23689           /* A store has been issued in this cycle.  Scan the ready list for
23690              another store to issue with it, preferring a store to an adjacent
23691              memory location */
23692           int first_store_pos = -1;
23693
23694           pos = *pn_ready-1;
23695
23696           while (pos >= 0)
23697             {
23698               if (is_store_insn (ready[pos]))
23699                 {
23700                   /* Maintain the index of the first store found on the
23701                      list */
23702                   if (first_store_pos == -1)
23703                     first_store_pos = pos;
23704
23705                   if (is_store_insn (last_scheduled_insn)
23706                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
23707                     {
23708                       /* Found an adjacent store.  Move it to the head of the
23709                          ready list, and adjust it's priority so that it is
23710                          more likely to stay there */
23711                       tmp = ready[pos];
23712                       for (i=pos; i<*pn_ready-1; i++)
23713                         ready[i] = ready[i + 1];
23714                       ready[*pn_ready-1] = tmp;
23715
23716                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23717                         INSN_PRIORITY (tmp)++;
23718
23719                       first_store_pos = -1;
23720
23721                       break;
23722                     };
23723                 }
23724               pos--;
23725             }
23726
23727           if (first_store_pos >= 0)
23728             {
23729               /* An adjacent store wasn't found, but a non-adjacent store was,
23730                  so move the non-adjacent store to the front of the ready
23731                  list, and adjust its priority so that it is more likely to
23732                  stay there. */
23733               tmp = ready[first_store_pos];
23734               for (i=first_store_pos; i<*pn_ready-1; i++)
23735                 ready[i] = ready[i + 1];
23736               ready[*pn_ready-1] = tmp;
23737               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23738                 INSN_PRIORITY (tmp)++;
23739             }
23740         }
23741       else if (load_store_pendulum == 2)
23742        {
23743            /* Two loads have been issued in this cycle.  Increase the priority
23744               of the first store in the ready list to favor it for issuing in
23745               the next cycle. */
23746           pos = *pn_ready-1;
23747
23748           while (pos >= 0)
23749             {
23750               if (is_store_insn (ready[pos])
23751                   && !sel_sched_p ()
23752                   && INSN_PRIORITY_KNOWN (ready[pos]))
23753                 {
23754                   INSN_PRIORITY (ready[pos])++;
23755
23756                   /* Adjust the pendulum to account for the fact that a store
23757                      was found and increased in priority.  This is to prevent
23758                      increasing the priority of multiple stores */
23759                   load_store_pendulum++;
23760
23761                   break;
23762                 }
23763               pos--;
23764             }
23765         }
23766     }
23767
23768   return cached_can_issue_more;
23769 }
23770
23771 /* Return whether the presence of INSN causes a dispatch group termination
23772    of group WHICH_GROUP.
23773
23774    If WHICH_GROUP == current_group, this function will return true if INSN
23775    causes the termination of the current group (i.e, the dispatch group to
23776    which INSN belongs). This means that INSN will be the last insn in the
23777    group it belongs to.
23778
23779    If WHICH_GROUP == previous_group, this function will return true if INSN
23780    causes the termination of the previous group (i.e, the dispatch group that
23781    precedes the group to which INSN belongs).  This means that INSN will be
23782    the first insn in the group it belongs to).  */
23783
23784 static bool
23785 insn_terminates_group_p (rtx insn, enum group_termination which_group)
23786 {
23787   bool first, last;
23788
23789   if (! insn)
23790     return false;
23791
23792   first = insn_must_be_first_in_group (insn);
23793   last = insn_must_be_last_in_group (insn);
23794
23795   if (first && last)
23796     return true;
23797
23798   if (which_group == current_group)
23799     return last;
23800   else if (which_group == previous_group)
23801     return first;
23802
23803   return false;
23804 }
23805
23806
23807 static bool
23808 insn_must_be_first_in_group (rtx insn)
23809 {
23810   enum attr_type type;
23811
23812   if (!insn
23813       || GET_CODE (insn) == NOTE
23814       || DEBUG_INSN_P (insn)
23815       || GET_CODE (PATTERN (insn)) == USE
23816       || GET_CODE (PATTERN (insn)) == CLOBBER)
23817     return false;
23818
23819   switch (rs6000_cpu)
23820     {
23821     case PROCESSOR_POWER5:
23822       if (is_cracked_insn (insn))
23823         return true;
23824     case PROCESSOR_POWER4:
23825       if (is_microcoded_insn (insn))
23826         return true;
23827
23828       if (!rs6000_sched_groups)
23829         return false;
23830
23831       type = get_attr_type (insn);
23832
23833       switch (type)
23834         {
23835         case TYPE_MFCR:
23836         case TYPE_MFCRF:
23837         case TYPE_MTCR:
23838         case TYPE_DELAYED_CR:
23839         case TYPE_CR_LOGICAL:
23840         case TYPE_MTJMPR:
23841         case TYPE_MFJMPR:
23842         case TYPE_IDIV:
23843         case TYPE_LDIV:
23844         case TYPE_LOAD_L:
23845         case TYPE_STORE_C:
23846         case TYPE_ISYNC:
23847         case TYPE_SYNC:
23848           return true;
23849         default:
23850           break;
23851         }
23852       break;
23853     case PROCESSOR_POWER6:
23854       type = get_attr_type (insn);
23855
23856       switch (type)
23857         {
23858         case TYPE_INSERT_DWORD:
23859         case TYPE_EXTS:
23860         case TYPE_CNTLZ:
23861         case TYPE_SHIFT:
23862         case TYPE_VAR_SHIFT_ROTATE:
23863         case TYPE_TRAP:
23864         case TYPE_IMUL:
23865         case TYPE_IMUL2:
23866         case TYPE_IMUL3:
23867         case TYPE_LMUL:
23868         case TYPE_IDIV:
23869         case TYPE_INSERT_WORD:
23870         case TYPE_DELAYED_COMPARE:
23871         case TYPE_IMUL_COMPARE:
23872         case TYPE_LMUL_COMPARE:
23873         case TYPE_FPCOMPARE:
23874         case TYPE_MFCR:
23875         case TYPE_MTCR:
23876         case TYPE_MFJMPR:
23877         case TYPE_MTJMPR:
23878         case TYPE_ISYNC:
23879         case TYPE_SYNC:
23880         case TYPE_LOAD_L:
23881         case TYPE_STORE_C:
23882         case TYPE_LOAD_U:
23883         case TYPE_LOAD_UX:
23884         case TYPE_LOAD_EXT_UX:
23885         case TYPE_STORE_U:
23886         case TYPE_STORE_UX:
23887         case TYPE_FPLOAD_U:
23888         case TYPE_FPLOAD_UX:
23889         case TYPE_FPSTORE_U:
23890         case TYPE_FPSTORE_UX:
23891           return true;
23892         default:
23893           break;
23894         }
23895       break;
23896     case PROCESSOR_POWER7:
23897       type = get_attr_type (insn);
23898
23899       switch (type)
23900         {
23901         case TYPE_CR_LOGICAL:
23902         case TYPE_MFCR:
23903         case TYPE_MFCRF:
23904         case TYPE_MTCR:
23905         case TYPE_IDIV:
23906         case TYPE_LDIV:
23907         case TYPE_COMPARE:
23908         case TYPE_DELAYED_COMPARE:
23909         case TYPE_VAR_DELAYED_COMPARE:
23910         case TYPE_ISYNC:
23911         case TYPE_LOAD_L:
23912         case TYPE_STORE_C:
23913         case TYPE_LOAD_U:
23914         case TYPE_LOAD_UX:
23915         case TYPE_LOAD_EXT:
23916         case TYPE_LOAD_EXT_U:
23917         case TYPE_LOAD_EXT_UX:
23918         case TYPE_STORE_U:
23919         case TYPE_STORE_UX:
23920         case TYPE_FPLOAD_U:
23921         case TYPE_FPLOAD_UX:
23922         case TYPE_FPSTORE_U:
23923         case TYPE_FPSTORE_UX:
23924         case TYPE_MFJMPR:
23925         case TYPE_MTJMPR:
23926           return true;
23927         default:
23928           break;
23929         }
23930       break;
23931     default:
23932       break;
23933     }
23934
23935   return false;
23936 }
23937
23938 static bool
23939 insn_must_be_last_in_group (rtx insn)
23940 {
23941   enum attr_type type;
23942
23943   if (!insn
23944       || GET_CODE (insn) == NOTE
23945       || DEBUG_INSN_P (insn)
23946       || GET_CODE (PATTERN (insn)) == USE
23947       || GET_CODE (PATTERN (insn)) == CLOBBER)
23948     return false;
23949
23950   switch (rs6000_cpu) {
23951   case PROCESSOR_POWER4:
23952   case PROCESSOR_POWER5:
23953     if (is_microcoded_insn (insn))
23954       return true;
23955
23956     if (is_branch_slot_insn (insn))
23957       return true;
23958
23959     break;
23960   case PROCESSOR_POWER6:
23961     type = get_attr_type (insn);
23962
23963     switch (type)
23964       {
23965       case TYPE_EXTS:
23966       case TYPE_CNTLZ:
23967       case TYPE_SHIFT:
23968       case TYPE_VAR_SHIFT_ROTATE:
23969       case TYPE_TRAP:
23970       case TYPE_IMUL:
23971       case TYPE_IMUL2:
23972       case TYPE_IMUL3:
23973       case TYPE_LMUL:
23974       case TYPE_IDIV:
23975       case TYPE_DELAYED_COMPARE:
23976       case TYPE_IMUL_COMPARE:
23977       case TYPE_LMUL_COMPARE:
23978       case TYPE_FPCOMPARE:
23979       case TYPE_MFCR:
23980       case TYPE_MTCR:
23981       case TYPE_MFJMPR:
23982       case TYPE_MTJMPR:
23983       case TYPE_ISYNC:
23984       case TYPE_SYNC:
23985       case TYPE_LOAD_L:
23986       case TYPE_STORE_C:
23987         return true;
23988       default:
23989         break;
23990     }
23991     break;
23992   case PROCESSOR_POWER7:
23993     type = get_attr_type (insn);
23994
23995     switch (type)
23996       {
23997       case TYPE_ISYNC:
23998       case TYPE_SYNC:
23999       case TYPE_LOAD_L:
24000       case TYPE_STORE_C:
24001       case TYPE_LOAD_EXT_U:
24002       case TYPE_LOAD_EXT_UX:
24003       case TYPE_STORE_UX:
24004         return true;
24005       default:
24006         break;
24007     }
24008     break;
24009   default:
24010     break;
24011   }
24012
24013   return false;
24014 }
24015
24016 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
24017    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
24018
24019 static bool
24020 is_costly_group (rtx *group_insns, rtx next_insn)
24021 {
24022   int i;
24023   int issue_rate = rs6000_issue_rate ();
24024
24025   for (i = 0; i < issue_rate; i++)
24026     {
24027       sd_iterator_def sd_it;
24028       dep_t dep;
24029       rtx insn = group_insns[i];
24030
24031       if (!insn)
24032         continue;
24033
24034       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
24035         {
24036           rtx next = DEP_CON (dep);
24037
24038           if (next == next_insn
24039               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
24040             return true;
24041         }
24042     }
24043
24044   return false;
24045 }
24046
24047 /* Utility of the function redefine_groups.
24048    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
24049    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
24050    to keep it "far" (in a separate group) from GROUP_INSNS, following
24051    one of the following schemes, depending on the value of the flag
24052    -minsert_sched_nops = X:
24053    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
24054        in order to force NEXT_INSN into a separate group.
24055    (2) X < sched_finish_regroup_exact: insert exactly X nops.
24056    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
24057    insertion (has a group just ended, how many vacant issue slots remain in the
24058    last group, and how many dispatch groups were encountered so far).  */
24059
24060 static int
24061 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
24062                  rtx next_insn, bool *group_end, int can_issue_more,
24063                  int *group_count)
24064 {
24065   rtx nop;
24066   bool force;
24067   int issue_rate = rs6000_issue_rate ();
24068   bool end = *group_end;
24069   int i;
24070
24071   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
24072     return can_issue_more;
24073
24074   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
24075     return can_issue_more;
24076
24077   force = is_costly_group (group_insns, next_insn);
24078   if (!force)
24079     return can_issue_more;
24080
24081   if (sched_verbose > 6)
24082     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
24083              *group_count ,can_issue_more);
24084
24085   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
24086     {
24087       if (*group_end)
24088         can_issue_more = 0;
24089
24090       /* Since only a branch can be issued in the last issue_slot, it is
24091          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
24092          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
24093          in this case the last nop will start a new group and the branch
24094          will be forced to the new group.  */
24095       if (can_issue_more && !is_branch_slot_insn (next_insn))
24096         can_issue_more--;
24097
24098       while (can_issue_more > 0)
24099         {
24100           nop = gen_nop ();
24101           emit_insn_before (nop, next_insn);
24102           can_issue_more--;
24103         }
24104
24105       *group_end = true;
24106       return 0;
24107     }
24108
24109   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
24110     {
24111       int n_nops = rs6000_sched_insert_nops;
24112
24113       /* Nops can't be issued from the branch slot, so the effective
24114          issue_rate for nops is 'issue_rate - 1'.  */
24115       if (can_issue_more == 0)
24116         can_issue_more = issue_rate;
24117       can_issue_more--;
24118       if (can_issue_more == 0)
24119         {
24120           can_issue_more = issue_rate - 1;
24121           (*group_count)++;
24122           end = true;
24123           for (i = 0; i < issue_rate; i++)
24124             {
24125               group_insns[i] = 0;
24126             }
24127         }
24128
24129       while (n_nops > 0)
24130         {
24131           nop = gen_nop ();
24132           emit_insn_before (nop, next_insn);
24133           if (can_issue_more == issue_rate - 1) /* new group begins */
24134             end = false;
24135           can_issue_more--;
24136           if (can_issue_more == 0)
24137             {
24138               can_issue_more = issue_rate - 1;
24139               (*group_count)++;
24140               end = true;
24141               for (i = 0; i < issue_rate; i++)
24142                 {
24143                   group_insns[i] = 0;
24144                 }
24145             }
24146           n_nops--;
24147         }
24148
24149       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
24150       can_issue_more++;
24151
24152       /* Is next_insn going to start a new group?  */
24153       *group_end
24154         = (end
24155            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24156            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24157            || (can_issue_more < issue_rate &&
24158                insn_terminates_group_p (next_insn, previous_group)));
24159       if (*group_end && end)
24160         (*group_count)--;
24161
24162       if (sched_verbose > 6)
24163         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
24164                  *group_count, can_issue_more);
24165       return can_issue_more;
24166     }
24167
24168   return can_issue_more;
24169 }
24170
24171 /* This function tries to synch the dispatch groups that the compiler "sees"
24172    with the dispatch groups that the processor dispatcher is expected to
24173    form in practice.  It tries to achieve this synchronization by forcing the
24174    estimated processor grouping on the compiler (as opposed to the function
24175    'pad_goups' which tries to force the scheduler's grouping on the processor).
24176
24177    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
24178    examines the (estimated) dispatch groups that will be formed by the processor
24179    dispatcher.  It marks these group boundaries to reflect the estimated
24180    processor grouping, overriding the grouping that the scheduler had marked.
24181    Depending on the value of the flag '-minsert-sched-nops' this function can
24182    force certain insns into separate groups or force a certain distance between
24183    them by inserting nops, for example, if there exists a "costly dependence"
24184    between the insns.
24185
24186    The function estimates the group boundaries that the processor will form as
24187    follows:  It keeps track of how many vacant issue slots are available after
24188    each insn.  A subsequent insn will start a new group if one of the following
24189    4 cases applies:
24190    - no more vacant issue slots remain in the current dispatch group.
24191    - only the last issue slot, which is the branch slot, is vacant, but the next
24192      insn is not a branch.
24193    - only the last 2 or less issue slots, including the branch slot, are vacant,
24194      which means that a cracked insn (which occupies two issue slots) can't be
24195      issued in this group.
24196    - less than 'issue_rate' slots are vacant, and the next insn always needs to
24197      start a new group.  */
24198
24199 static int
24200 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24201 {
24202   rtx insn, next_insn;
24203   int issue_rate;
24204   int can_issue_more;
24205   int slot, i;
24206   bool group_end;
24207   int group_count = 0;
24208   rtx *group_insns;
24209
24210   /* Initialize.  */
24211   issue_rate = rs6000_issue_rate ();
24212   group_insns = XALLOCAVEC (rtx, issue_rate);
24213   for (i = 0; i < issue_rate; i++)
24214     {
24215       group_insns[i] = 0;
24216     }
24217   can_issue_more = issue_rate;
24218   slot = 0;
24219   insn = get_next_active_insn (prev_head_insn, tail);
24220   group_end = false;
24221
24222   while (insn != NULL_RTX)
24223     {
24224       slot = (issue_rate - can_issue_more);
24225       group_insns[slot] = insn;
24226       can_issue_more =
24227         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24228       if (insn_terminates_group_p (insn, current_group))
24229         can_issue_more = 0;
24230
24231       next_insn = get_next_active_insn (insn, tail);
24232       if (next_insn == NULL_RTX)
24233         return group_count + 1;
24234
24235       /* Is next_insn going to start a new group?  */
24236       group_end
24237         = (can_issue_more == 0
24238            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24239            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24240            || (can_issue_more < issue_rate &&
24241                insn_terminates_group_p (next_insn, previous_group)));
24242
24243       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
24244                                         next_insn, &group_end, can_issue_more,
24245                                         &group_count);
24246
24247       if (group_end)
24248         {
24249           group_count++;
24250           can_issue_more = 0;
24251           for (i = 0; i < issue_rate; i++)
24252             {
24253               group_insns[i] = 0;
24254             }
24255         }
24256
24257       if (GET_MODE (next_insn) == TImode && can_issue_more)
24258         PUT_MODE (next_insn, VOIDmode);
24259       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
24260         PUT_MODE (next_insn, TImode);
24261
24262       insn = next_insn;
24263       if (can_issue_more == 0)
24264         can_issue_more = issue_rate;
24265     } /* while */
24266
24267   return group_count;
24268 }
24269
24270 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
24271    dispatch group boundaries that the scheduler had marked.  Pad with nops
24272    any dispatch groups which have vacant issue slots, in order to force the
24273    scheduler's grouping on the processor dispatcher.  The function
24274    returns the number of dispatch groups found.  */
24275
24276 static int
24277 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24278 {
24279   rtx insn, next_insn;
24280   rtx nop;
24281   int issue_rate;
24282   int can_issue_more;
24283   int group_end;
24284   int group_count = 0;
24285
24286   /* Initialize issue_rate.  */
24287   issue_rate = rs6000_issue_rate ();
24288   can_issue_more = issue_rate;
24289
24290   insn = get_next_active_insn (prev_head_insn, tail);
24291   next_insn = get_next_active_insn (insn, tail);
24292
24293   while (insn != NULL_RTX)
24294     {
24295       can_issue_more =
24296         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24297
24298       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
24299
24300       if (next_insn == NULL_RTX)
24301         break;
24302
24303       if (group_end)
24304         {
24305           /* If the scheduler had marked group termination at this location
24306              (between insn and next_insn), and neither insn nor next_insn will
24307              force group termination, pad the group with nops to force group
24308              termination.  */
24309           if (can_issue_more
24310               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
24311               && !insn_terminates_group_p (insn, current_group)
24312               && !insn_terminates_group_p (next_insn, previous_group))
24313             {
24314               if (!is_branch_slot_insn (next_insn))
24315                 can_issue_more--;
24316
24317               while (can_issue_more)
24318                 {
24319                   nop = gen_nop ();
24320                   emit_insn_before (nop, next_insn);
24321                   can_issue_more--;
24322                 }
24323             }
24324
24325           can_issue_more = issue_rate;
24326           group_count++;
24327         }
24328
24329       insn = next_insn;
24330       next_insn = get_next_active_insn (insn, tail);
24331     }
24332
24333   return group_count;
24334 }
24335
24336 /* We're beginning a new block.  Initialize data structures as necessary.  */
24337
24338 static void
24339 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
24340                      int sched_verbose ATTRIBUTE_UNUSED,
24341                      int max_ready ATTRIBUTE_UNUSED)
24342 {
24343   last_scheduled_insn = NULL_RTX;
24344   load_store_pendulum = 0;
24345 }
24346
24347 /* The following function is called at the end of scheduling BB.
24348    After reload, it inserts nops at insn group bundling.  */
24349
24350 static void
24351 rs6000_sched_finish (FILE *dump, int sched_verbose)
24352 {
24353   int n_groups;
24354
24355   if (sched_verbose)
24356     fprintf (dump, "=== Finishing schedule.\n");
24357
24358   if (reload_completed && rs6000_sched_groups)
24359     {
24360       /* Do not run sched_finish hook when selective scheduling enabled.  */
24361       if (sel_sched_p ())
24362         return;
24363
24364       if (rs6000_sched_insert_nops == sched_finish_none)
24365         return;
24366
24367       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
24368         n_groups = pad_groups (dump, sched_verbose,
24369                                current_sched_info->prev_head,
24370                                current_sched_info->next_tail);
24371       else
24372         n_groups = redefine_groups (dump, sched_verbose,
24373                                     current_sched_info->prev_head,
24374                                     current_sched_info->next_tail);
24375
24376       if (sched_verbose >= 6)
24377         {
24378           fprintf (dump, "ngroups = %d\n", n_groups);
24379           print_rtl (dump, current_sched_info->prev_head);
24380           fprintf (dump, "Done finish_sched\n");
24381         }
24382     }
24383 }
24384
24385 struct _rs6000_sched_context
24386 {
24387   short cached_can_issue_more;
24388   rtx last_scheduled_insn;
24389   int load_store_pendulum;
24390 };
24391
24392 typedef struct _rs6000_sched_context rs6000_sched_context_def;
24393 typedef rs6000_sched_context_def *rs6000_sched_context_t;
24394
24395 /* Allocate store for new scheduling context.  */
24396 static void *
24397 rs6000_alloc_sched_context (void)
24398 {
24399   return xmalloc (sizeof (rs6000_sched_context_def));
24400 }
24401
24402 /* If CLEAN_P is true then initializes _SC with clean data,
24403    and from the global context otherwise.  */
24404 static void
24405 rs6000_init_sched_context (void *_sc, bool clean_p)
24406 {
24407   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24408
24409   if (clean_p)
24410     {
24411       sc->cached_can_issue_more = 0;
24412       sc->last_scheduled_insn = NULL_RTX;
24413       sc->load_store_pendulum = 0;
24414     }
24415   else
24416     {
24417       sc->cached_can_issue_more = cached_can_issue_more;
24418       sc->last_scheduled_insn = last_scheduled_insn;
24419       sc->load_store_pendulum = load_store_pendulum;
24420     }
24421 }
24422
24423 /* Sets the global scheduling context to the one pointed to by _SC.  */
24424 static void
24425 rs6000_set_sched_context (void *_sc)
24426 {
24427   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24428
24429   gcc_assert (sc != NULL);
24430
24431   cached_can_issue_more = sc->cached_can_issue_more;
24432   last_scheduled_insn = sc->last_scheduled_insn;
24433   load_store_pendulum = sc->load_store_pendulum;
24434 }
24435
24436 /* Free _SC.  */
24437 static void
24438 rs6000_free_sched_context (void *_sc)
24439 {
24440   gcc_assert (_sc != NULL);
24441
24442   free (_sc);
24443 }
24444
24445 \f
24446 /* Length in units of the trampoline for entering a nested function.  */
24447
24448 int
24449 rs6000_trampoline_size (void)
24450 {
24451   int ret = 0;
24452
24453   switch (DEFAULT_ABI)
24454     {
24455     default:
24456       gcc_unreachable ();
24457
24458     case ABI_AIX:
24459       ret = (TARGET_32BIT) ? 12 : 24;
24460       break;
24461
24462     case ABI_DARWIN:
24463     case ABI_V4:
24464       ret = (TARGET_32BIT) ? 40 : 48;
24465       break;
24466     }
24467
24468   return ret;
24469 }
24470
24471 /* Emit RTL insns to initialize the variable parts of a trampoline.
24472    FNADDR is an RTX for the address of the function's pure code.
24473    CXT is an RTX for the static chain value for the function.  */
24474
24475 static void
24476 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
24477 {
24478   int regsize = (TARGET_32BIT) ? 4 : 8;
24479   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
24480   rtx ctx_reg = force_reg (Pmode, cxt);
24481   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
24482
24483   switch (DEFAULT_ABI)
24484     {
24485     default:
24486       gcc_unreachable ();
24487
24488     /* Under AIX, just build the 3 word function descriptor */
24489     case ABI_AIX:
24490       {
24491         rtx fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
24492         rtx fn_reg = gen_reg_rtx (Pmode);
24493         rtx toc_reg = gen_reg_rtx (Pmode);
24494
24495   /* Macro to shorten the code expansions below.  */
24496 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
24497
24498         m_tramp = replace_equiv_address (m_tramp, addr);
24499
24500         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
24501         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
24502         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
24503         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
24504         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
24505
24506 # undef MEM_PLUS
24507       }
24508       break;
24509
24510     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
24511     case ABI_DARWIN:
24512     case ABI_V4:
24513       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
24514                          LCT_NORMAL, VOIDmode, 4,
24515                          addr, Pmode,
24516                          GEN_INT (rs6000_trampoline_size ()), SImode,
24517                          fnaddr, Pmode,
24518                          ctx_reg, Pmode);
24519       break;
24520     }
24521 }
24522
24523 \f
24524 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
24525    identifier as an argument, so the front end shouldn't look it up.  */
24526
24527 static bool
24528 rs6000_attribute_takes_identifier_p (const_tree attr_id)
24529 {
24530   return is_attribute_p ("altivec", attr_id);
24531 }
24532
24533 /* Handle the "altivec" attribute.  The attribute may have
24534    arguments as follows:
24535
24536         __attribute__((altivec(vector__)))
24537         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
24538         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
24539
24540   and may appear more than once (e.g., 'vector bool char') in a
24541   given declaration.  */
24542
24543 static tree
24544 rs6000_handle_altivec_attribute (tree *node,
24545                                  tree name ATTRIBUTE_UNUSED,
24546                                  tree args,
24547                                  int flags ATTRIBUTE_UNUSED,
24548                                  bool *no_add_attrs)
24549 {
24550   tree type = *node, result = NULL_TREE;
24551   enum machine_mode mode;
24552   int unsigned_p;
24553   char altivec_type
24554     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
24555         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
24556        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
24557        : '?');
24558
24559   while (POINTER_TYPE_P (type)
24560          || TREE_CODE (type) == FUNCTION_TYPE
24561          || TREE_CODE (type) == METHOD_TYPE
24562          || TREE_CODE (type) == ARRAY_TYPE)
24563     type = TREE_TYPE (type);
24564
24565   mode = TYPE_MODE (type);
24566
24567   /* Check for invalid AltiVec type qualifiers.  */
24568   if (type == long_double_type_node)
24569     error ("use of %<long double%> in AltiVec types is invalid");
24570   else if (type == boolean_type_node)
24571     error ("use of boolean types in AltiVec types is invalid");
24572   else if (TREE_CODE (type) == COMPLEX_TYPE)
24573     error ("use of %<complex%> in AltiVec types is invalid");
24574   else if (DECIMAL_FLOAT_MODE_P (mode))
24575     error ("use of decimal floating point types in AltiVec types is invalid");
24576   else if (!TARGET_VSX)
24577     {
24578       if (type == long_unsigned_type_node || type == long_integer_type_node)
24579         {
24580           if (TARGET_64BIT)
24581             error ("use of %<long%> in AltiVec types is invalid for "
24582                    "64-bit code without -mvsx");
24583           else if (rs6000_warn_altivec_long)
24584             warning (0, "use of %<long%> in AltiVec types is deprecated; "
24585                      "use %<int%>");
24586         }
24587       else if (type == long_long_unsigned_type_node
24588                || type == long_long_integer_type_node)
24589         error ("use of %<long long%> in AltiVec types is invalid without "
24590                "-mvsx");
24591       else if (type == double_type_node)
24592         error ("use of %<double%> in AltiVec types is invalid without -mvsx");
24593     }
24594
24595   switch (altivec_type)
24596     {
24597     case 'v':
24598       unsigned_p = TYPE_UNSIGNED (type);
24599       switch (mode)
24600         {
24601         case DImode:
24602           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
24603           break;
24604         case SImode:
24605           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
24606           break;
24607         case HImode:
24608           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
24609           break;
24610         case QImode:
24611           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
24612           break;
24613         case SFmode: result = V4SF_type_node; break;
24614         case DFmode: result = V2DF_type_node; break;
24615           /* If the user says 'vector int bool', we may be handed the 'bool'
24616              attribute _before_ the 'vector' attribute, and so select the
24617              proper type in the 'b' case below.  */
24618         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
24619         case V2DImode: case V2DFmode:
24620           result = type;
24621         default: break;
24622         }
24623       break;
24624     case 'b':
24625       switch (mode)
24626         {
24627         case DImode: case V2DImode: result = bool_V2DI_type_node; break;
24628         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
24629         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
24630         case QImode: case V16QImode: result = bool_V16QI_type_node;
24631         default: break;
24632         }
24633       break;
24634     case 'p':
24635       switch (mode)
24636         {
24637         case V8HImode: result = pixel_V8HI_type_node;
24638         default: break;
24639         }
24640     default: break;
24641     }
24642
24643   /* Propagate qualifiers attached to the element type
24644      onto the vector type.  */
24645   if (result && result != type && TYPE_QUALS (type))
24646     result = build_qualified_type (result, TYPE_QUALS (type));
24647
24648   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
24649
24650   if (result)
24651     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
24652
24653   return NULL_TREE;
24654 }
24655
24656 /* AltiVec defines four built-in scalar types that serve as vector
24657    elements; we must teach the compiler how to mangle them.  */
24658
24659 static const char *
24660 rs6000_mangle_type (const_tree type)
24661 {
24662   type = TYPE_MAIN_VARIANT (type);
24663
24664   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
24665       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
24666     return NULL;
24667
24668   if (type == bool_char_type_node) return "U6__boolc";
24669   if (type == bool_short_type_node) return "U6__bools";
24670   if (type == pixel_type_node) return "u7__pixel";
24671   if (type == bool_int_type_node) return "U6__booli";
24672   if (type == bool_long_type_node) return "U6__booll";
24673
24674   /* Mangle IBM extended float long double as `g' (__float128) on
24675      powerpc*-linux where long-double-64 previously was the default.  */
24676   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
24677       && TARGET_ELF
24678       && TARGET_LONG_DOUBLE_128
24679       && !TARGET_IEEEQUAD)
24680     return "g";
24681
24682   /* For all other types, use normal C++ mangling.  */
24683   return NULL;
24684 }
24685
24686 /* Handle a "longcall" or "shortcall" attribute; arguments as in
24687    struct attribute_spec.handler.  */
24688
24689 static tree
24690 rs6000_handle_longcall_attribute (tree *node, tree name,
24691                                   tree args ATTRIBUTE_UNUSED,
24692                                   int flags ATTRIBUTE_UNUSED,
24693                                   bool *no_add_attrs)
24694 {
24695   if (TREE_CODE (*node) != FUNCTION_TYPE
24696       && TREE_CODE (*node) != FIELD_DECL
24697       && TREE_CODE (*node) != TYPE_DECL)
24698     {
24699       warning (OPT_Wattributes, "%qE attribute only applies to functions",
24700                name);
24701       *no_add_attrs = true;
24702     }
24703
24704   return NULL_TREE;
24705 }
24706
24707 /* Set longcall attributes on all functions declared when
24708    rs6000_default_long_calls is true.  */
24709 static void
24710 rs6000_set_default_type_attributes (tree type)
24711 {
24712   if (rs6000_default_long_calls
24713       && (TREE_CODE (type) == FUNCTION_TYPE
24714           || TREE_CODE (type) == METHOD_TYPE))
24715     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
24716                                         NULL_TREE,
24717                                         TYPE_ATTRIBUTES (type));
24718
24719 #if TARGET_MACHO
24720   darwin_set_default_type_attributes (type);
24721 #endif
24722 }
24723
24724 /* Return a reference suitable for calling a function with the
24725    longcall attribute.  */
24726
24727 rtx
24728 rs6000_longcall_ref (rtx call_ref)
24729 {
24730   const char *call_name;
24731   tree node;
24732
24733   if (GET_CODE (call_ref) != SYMBOL_REF)
24734     return call_ref;
24735
24736   /* System V adds '.' to the internal name, so skip them.  */
24737   call_name = XSTR (call_ref, 0);
24738   if (*call_name == '.')
24739     {
24740       while (*call_name == '.')
24741         call_name++;
24742
24743       node = get_identifier (call_name);
24744       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
24745     }
24746
24747   return force_reg (Pmode, call_ref);
24748 }
24749 \f
24750 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
24751 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
24752 #endif
24753
24754 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
24755    struct attribute_spec.handler.  */
24756 static tree
24757 rs6000_handle_struct_attribute (tree *node, tree name,
24758                                 tree args ATTRIBUTE_UNUSED,
24759                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
24760 {
24761   tree *type = NULL;
24762   if (DECL_P (*node))
24763     {
24764       if (TREE_CODE (*node) == TYPE_DECL)
24765         type = &TREE_TYPE (*node);
24766     }
24767   else
24768     type = node;
24769
24770   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
24771                  || TREE_CODE (*type) == UNION_TYPE)))
24772     {
24773       warning (OPT_Wattributes, "%qE attribute ignored", name);
24774       *no_add_attrs = true;
24775     }
24776
24777   else if ((is_attribute_p ("ms_struct", name)
24778             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
24779            || ((is_attribute_p ("gcc_struct", name)
24780                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
24781     {
24782       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
24783                name);
24784       *no_add_attrs = true;
24785     }
24786
24787   return NULL_TREE;
24788 }
24789
24790 static bool
24791 rs6000_ms_bitfield_layout_p (const_tree record_type)
24792 {
24793   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
24794           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
24795     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
24796 }
24797 \f
24798 #ifdef USING_ELFOS_H
24799
24800 /* A get_unnamed_section callback, used for switching to toc_section.  */
24801
24802 static void
24803 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
24804 {
24805   if (DEFAULT_ABI == ABI_AIX
24806       && TARGET_MINIMAL_TOC
24807       && !TARGET_RELOCATABLE)
24808     {
24809       if (!toc_initialized)
24810         {
24811           toc_initialized = 1;
24812           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24813           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
24814           fprintf (asm_out_file, "\t.tc ");
24815           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
24816           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24817           fprintf (asm_out_file, "\n");
24818
24819           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24820           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24821           fprintf (asm_out_file, " = .+32768\n");
24822         }
24823       else
24824         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24825     }
24826   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
24827     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24828   else
24829     {
24830       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24831       if (!toc_initialized)
24832         {
24833           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24834           fprintf (asm_out_file, " = .+32768\n");
24835           toc_initialized = 1;
24836         }
24837     }
24838 }
24839
24840 /* Implement TARGET_ASM_INIT_SECTIONS.  */
24841
24842 static void
24843 rs6000_elf_asm_init_sections (void)
24844 {
24845   toc_section
24846     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
24847
24848   sdata2_section
24849     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
24850                            SDATA2_SECTION_ASM_OP);
24851 }
24852
24853 /* Implement TARGET_SELECT_RTX_SECTION.  */
24854
24855 static section *
24856 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
24857                                unsigned HOST_WIDE_INT align)
24858 {
24859   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
24860     return toc_section;
24861   else
24862     return default_elf_select_rtx_section (mode, x, align);
24863 }
24864 \f
24865 /* For a SYMBOL_REF, set generic flags and then perform some
24866    target-specific processing.
24867
24868    When the AIX ABI is requested on a non-AIX system, replace the
24869    function name with the real name (with a leading .) rather than the
24870    function descriptor name.  This saves a lot of overriding code to
24871    read the prefixes.  */
24872
24873 static void
24874 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
24875 {
24876   default_encode_section_info (decl, rtl, first);
24877
24878   if (first
24879       && TREE_CODE (decl) == FUNCTION_DECL
24880       && !TARGET_AIX
24881       && DEFAULT_ABI == ABI_AIX)
24882     {
24883       rtx sym_ref = XEXP (rtl, 0);
24884       size_t len = strlen (XSTR (sym_ref, 0));
24885       char *str = XALLOCAVEC (char, len + 2);
24886       str[0] = '.';
24887       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
24888       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
24889     }
24890 }
24891
24892 static inline bool
24893 compare_section_name (const char *section, const char *templ)
24894 {
24895   int len;
24896
24897   len = strlen (templ);
24898   return (strncmp (section, templ, len) == 0
24899           && (section[len] == 0 || section[len] == '.'));
24900 }
24901
24902 bool
24903 rs6000_elf_in_small_data_p (const_tree decl)
24904 {
24905   if (rs6000_sdata == SDATA_NONE)
24906     return false;
24907
24908   /* We want to merge strings, so we never consider them small data.  */
24909   if (TREE_CODE (decl) == STRING_CST)
24910     return false;
24911
24912   /* Functions are never in the small data area.  */
24913   if (TREE_CODE (decl) == FUNCTION_DECL)
24914     return false;
24915
24916   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
24917     {
24918       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
24919       if (compare_section_name (section, ".sdata")
24920           || compare_section_name (section, ".sdata2")
24921           || compare_section_name (section, ".gnu.linkonce.s")
24922           || compare_section_name (section, ".sbss")
24923           || compare_section_name (section, ".sbss2")
24924           || compare_section_name (section, ".gnu.linkonce.sb")
24925           || strcmp (section, ".PPC.EMB.sdata0") == 0
24926           || strcmp (section, ".PPC.EMB.sbss0") == 0)
24927         return true;
24928     }
24929   else
24930     {
24931       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
24932
24933       if (size > 0
24934           && size <= g_switch_value
24935           /* If it's not public, and we're not going to reference it there,
24936              there's no need to put it in the small data section.  */
24937           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
24938         return true;
24939     }
24940
24941   return false;
24942 }
24943
24944 #endif /* USING_ELFOS_H */
24945 \f
24946 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
24947
24948 static bool
24949 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
24950 {
24951   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
24952 }
24953 \f
24954 /* Return a REG that occurs in ADDR with coefficient 1.
24955    ADDR can be effectively incremented by incrementing REG.
24956
24957    r0 is special and we must not select it as an address
24958    register by this routine since our caller will try to
24959    increment the returned register via an "la" instruction.  */
24960
24961 rtx
24962 find_addr_reg (rtx addr)
24963 {
24964   while (GET_CODE (addr) == PLUS)
24965     {
24966       if (GET_CODE (XEXP (addr, 0)) == REG
24967           && REGNO (XEXP (addr, 0)) != 0)
24968         addr = XEXP (addr, 0);
24969       else if (GET_CODE (XEXP (addr, 1)) == REG
24970                && REGNO (XEXP (addr, 1)) != 0)
24971         addr = XEXP (addr, 1);
24972       else if (CONSTANT_P (XEXP (addr, 0)))
24973         addr = XEXP (addr, 1);
24974       else if (CONSTANT_P (XEXP (addr, 1)))
24975         addr = XEXP (addr, 0);
24976       else
24977         gcc_unreachable ();
24978     }
24979   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
24980   return addr;
24981 }
24982
24983 void
24984 rs6000_fatal_bad_address (rtx op)
24985 {
24986   fatal_insn ("bad address", op);
24987 }
24988
24989 #if TARGET_MACHO
24990
24991 typedef struct branch_island_d {
24992   tree function_name;
24993   tree label_name;
24994   int line_number;
24995 } branch_island;
24996
24997 DEF_VEC_O(branch_island);
24998 DEF_VEC_ALLOC_O(branch_island,gc);
24999
25000 static VEC(branch_island,gc) *branch_islands;
25001
25002 /* Remember to generate a branch island for far calls to the given
25003    function.  */
25004
25005 static void
25006 add_compiler_branch_island (tree label_name, tree function_name,
25007                             int line_number)
25008 {
25009   branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
25010
25011   bi->function_name = function_name;
25012   bi->label_name = label_name;
25013   bi->line_number = line_number;
25014 }
25015
25016 /* Generate far-jump branch islands for everything recorded in
25017    branch_islands.  Invoked immediately after the last instruction of
25018    the epilogue has been emitted; the branch islands must be appended
25019    to, and contiguous with, the function body.  Mach-O stubs are
25020    generated in machopic_output_stub().  */
25021
25022 static void
25023 macho_branch_islands (void)
25024 {
25025   char tmp_buf[512];
25026
25027   while (!VEC_empty (branch_island, branch_islands))
25028     {
25029       branch_island *bi = VEC_last (branch_island, branch_islands);
25030       const char *label = IDENTIFIER_POINTER (bi->label_name);
25031       const char *name = IDENTIFIER_POINTER (bi->function_name);
25032       char name_buf[512];
25033       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
25034       if (name[0] == '*' || name[0] == '&')
25035         strcpy (name_buf, name+1);
25036       else
25037         {
25038           name_buf[0] = '_';
25039           strcpy (name_buf+1, name);
25040         }
25041       strcpy (tmp_buf, "\n");
25042       strcat (tmp_buf, label);
25043 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25044       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25045         dbxout_stabd (N_SLINE, bi->line_number);
25046 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25047       if (flag_pic)
25048         {
25049           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
25050           strcat (tmp_buf, label);
25051           strcat (tmp_buf, "_pic\n");
25052           strcat (tmp_buf, label);
25053           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
25054
25055           strcat (tmp_buf, "\taddis r11,r11,ha16(");
25056           strcat (tmp_buf, name_buf);
25057           strcat (tmp_buf, " - ");
25058           strcat (tmp_buf, label);
25059           strcat (tmp_buf, "_pic)\n");
25060
25061           strcat (tmp_buf, "\tmtlr r0\n");
25062
25063           strcat (tmp_buf, "\taddi r12,r11,lo16(");
25064           strcat (tmp_buf, name_buf);
25065           strcat (tmp_buf, " - ");
25066           strcat (tmp_buf, label);
25067           strcat (tmp_buf, "_pic)\n");
25068
25069           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
25070         }
25071       else
25072         {
25073           strcat (tmp_buf, ":\nlis r12,hi16(");
25074           strcat (tmp_buf, name_buf);
25075           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
25076           strcat (tmp_buf, name_buf);
25077           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
25078         }
25079       output_asm_insn (tmp_buf, 0);
25080 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25081       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25082         dbxout_stabd (N_SLINE, bi->line_number);
25083 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25084       VEC_pop (branch_island, branch_islands);
25085     }
25086 }
25087
25088 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
25089    already there or not.  */
25090
25091 static int
25092 no_previous_def (tree function_name)
25093 {
25094   branch_island *bi;
25095   unsigned ix;
25096
25097   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25098     if (function_name == bi->function_name)
25099       return 0;
25100   return 1;
25101 }
25102
25103 /* GET_PREV_LABEL gets the label name from the previous definition of
25104    the function.  */
25105
25106 static tree
25107 get_prev_label (tree function_name)
25108 {
25109   branch_island *bi;
25110   unsigned ix;
25111
25112   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25113     if (function_name == bi->function_name)
25114       return bi->label_name;
25115   return NULL_TREE;
25116 }
25117
25118 /* INSN is either a function call or a millicode call.  It may have an
25119    unconditional jump in its delay slot.
25120
25121    CALL_DEST is the routine we are calling.  */
25122
25123 char *
25124 output_call (rtx insn, rtx *operands, int dest_operand_number,
25125              int cookie_operand_number)
25126 {
25127   static char buf[256];
25128   if (darwin_emit_branch_islands
25129       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
25130       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
25131     {
25132       tree labelname;
25133       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
25134
25135       if (no_previous_def (funname))
25136         {
25137           rtx label_rtx = gen_label_rtx ();
25138           char *label_buf, temp_buf[256];
25139           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
25140                                        CODE_LABEL_NUMBER (label_rtx));
25141           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
25142           labelname = get_identifier (label_buf);
25143           add_compiler_branch_island (labelname, funname, insn_line (insn));
25144         }
25145       else
25146         labelname = get_prev_label (funname);
25147
25148       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
25149          instruction will reach 'foo', otherwise link as 'bl L42'".
25150          "L42" should be a 'branch island', that will do a far jump to
25151          'foo'.  Branch islands are generated in
25152          macho_branch_islands().  */
25153       sprintf (buf, "jbsr %%z%d,%.246s",
25154                dest_operand_number, IDENTIFIER_POINTER (labelname));
25155     }
25156   else
25157     sprintf (buf, "bl %%z%d", dest_operand_number);
25158   return buf;
25159 }
25160
25161 /* Generate PIC and indirect symbol stubs.  */
25162
25163 void
25164 machopic_output_stub (FILE *file, const char *symb, const char *stub)
25165 {
25166   unsigned int length;
25167   char *symbol_name, *lazy_ptr_name;
25168   char *local_label_0;
25169   static int label = 0;
25170
25171   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
25172   symb = (*targetm.strip_name_encoding) (symb);
25173
25174
25175   length = strlen (symb);
25176   symbol_name = XALLOCAVEC (char, length + 32);
25177   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
25178
25179   lazy_ptr_name = XALLOCAVEC (char, length + 32);
25180   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
25181
25182   if (flag_pic == 2)
25183     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
25184   else
25185     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
25186
25187   if (flag_pic == 2)
25188     {
25189       fprintf (file, "\t.align 5\n");
25190
25191       fprintf (file, "%s:\n", stub);
25192       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25193
25194       label++;
25195       local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
25196       sprintf (local_label_0, "\"L%011d$spb\"", label);
25197
25198       fprintf (file, "\tmflr r0\n");
25199       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
25200       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
25201       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
25202                lazy_ptr_name, local_label_0);
25203       fprintf (file, "\tmtlr r0\n");
25204       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
25205                (TARGET_64BIT ? "ldu" : "lwzu"),
25206                lazy_ptr_name, local_label_0);
25207       fprintf (file, "\tmtctr r12\n");
25208       fprintf (file, "\tbctr\n");
25209     }
25210   else
25211     {
25212       fprintf (file, "\t.align 4\n");
25213
25214       fprintf (file, "%s:\n", stub);
25215       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25216
25217       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
25218       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
25219                (TARGET_64BIT ? "ldu" : "lwzu"),
25220                lazy_ptr_name);
25221       fprintf (file, "\tmtctr r12\n");
25222       fprintf (file, "\tbctr\n");
25223     }
25224
25225   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
25226   fprintf (file, "%s:\n", lazy_ptr_name);
25227   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25228   fprintf (file, "%sdyld_stub_binding_helper\n",
25229            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
25230 }
25231
25232 /* Legitimize PIC addresses.  If the address is already
25233    position-independent, we return ORIG.  Newly generated
25234    position-independent addresses go into a reg.  This is REG if non
25235    zero, otherwise we allocate register(s) as necessary.  */
25236
25237 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
25238
25239 rtx
25240 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
25241                                         rtx reg)
25242 {
25243   rtx base, offset;
25244
25245   if (reg == NULL && ! reload_in_progress && ! reload_completed)
25246     reg = gen_reg_rtx (Pmode);
25247
25248   if (GET_CODE (orig) == CONST)
25249     {
25250       rtx reg_temp;
25251
25252       if (GET_CODE (XEXP (orig, 0)) == PLUS
25253           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
25254         return orig;
25255
25256       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
25257
25258       /* Use a different reg for the intermediate value, as
25259          it will be marked UNCHANGING.  */
25260       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
25261       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
25262                                                      Pmode, reg_temp);
25263       offset =
25264         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
25265                                                 Pmode, reg);
25266
25267       if (GET_CODE (offset) == CONST_INT)
25268         {
25269           if (SMALL_INT (offset))
25270             return plus_constant (base, INTVAL (offset));
25271           else if (! reload_in_progress && ! reload_completed)
25272             offset = force_reg (Pmode, offset);
25273           else
25274             {
25275               rtx mem = force_const_mem (Pmode, orig);
25276               return machopic_legitimize_pic_address (mem, Pmode, reg);
25277             }
25278         }
25279       return gen_rtx_PLUS (Pmode, base, offset);
25280     }
25281
25282   /* Fall back on generic machopic code.  */
25283   return machopic_legitimize_pic_address (orig, mode, reg);
25284 }
25285
25286 /* Output a .machine directive for the Darwin assembler, and call
25287    the generic start_file routine.  */
25288
25289 static void
25290 rs6000_darwin_file_start (void)
25291 {
25292   static const struct
25293   {
25294     const char *arg;
25295     const char *name;
25296     int if_set;
25297   } mapping[] = {
25298     { "ppc64", "ppc64", MASK_64BIT },
25299     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
25300     { "power4", "ppc970", 0 },
25301     { "G5", "ppc970", 0 },
25302     { "7450", "ppc7450", 0 },
25303     { "7400", "ppc7400", MASK_ALTIVEC },
25304     { "G4", "ppc7400", 0 },
25305     { "750", "ppc750", 0 },
25306     { "740", "ppc750", 0 },
25307     { "G3", "ppc750", 0 },
25308     { "604e", "ppc604e", 0 },
25309     { "604", "ppc604", 0 },
25310     { "603e", "ppc603", 0 },
25311     { "603", "ppc603", 0 },
25312     { "601", "ppc601", 0 },
25313     { NULL, "ppc", 0 } };
25314   const char *cpu_id = "";
25315   size_t i;
25316
25317   rs6000_file_start ();
25318   darwin_file_start ();
25319
25320   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
25321   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
25322     if (rs6000_select[i].set_arch_p && rs6000_select[i].string
25323         && rs6000_select[i].string[0] != '\0')
25324       cpu_id = rs6000_select[i].string;
25325
25326   /* Look through the mapping array.  Pick the first name that either
25327      matches the argument, has a bit set in IF_SET that is also set
25328      in the target flags, or has a NULL name.  */
25329
25330   i = 0;
25331   while (mapping[i].arg != NULL
25332          && strcmp (mapping[i].arg, cpu_id) != 0
25333          && (mapping[i].if_set & target_flags) == 0)
25334     i++;
25335
25336   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
25337 }
25338
25339 #endif /* TARGET_MACHO */
25340
25341 #if TARGET_ELF
25342 static int
25343 rs6000_elf_reloc_rw_mask (void)
25344 {
25345   if (flag_pic)
25346     return 3;
25347   else if (DEFAULT_ABI == ABI_AIX)
25348     return 2;
25349   else
25350     return 0;
25351 }
25352
25353 /* Record an element in the table of global constructors.  SYMBOL is
25354    a SYMBOL_REF of the function to be called; PRIORITY is a number
25355    between 0 and MAX_INIT_PRIORITY.
25356
25357    This differs from default_named_section_asm_out_constructor in
25358    that we have special handling for -mrelocatable.  */
25359
25360 static void
25361 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
25362 {
25363   const char *section = ".ctors";
25364   char buf[16];
25365
25366   if (priority != DEFAULT_INIT_PRIORITY)
25367     {
25368       sprintf (buf, ".ctors.%.5u",
25369                /* Invert the numbering so the linker puts us in the proper
25370                   order; constructors are run from right to left, and the
25371                   linker sorts in increasing order.  */
25372                MAX_INIT_PRIORITY - priority);
25373       section = buf;
25374     }
25375
25376   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25377   assemble_align (POINTER_SIZE);
25378
25379   if (TARGET_RELOCATABLE)
25380     {
25381       fputs ("\t.long (", asm_out_file);
25382       output_addr_const (asm_out_file, symbol);
25383       fputs (")@fixup\n", asm_out_file);
25384     }
25385   else
25386     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25387 }
25388
25389 static void
25390 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
25391 {
25392   const char *section = ".dtors";
25393   char buf[16];
25394
25395   if (priority != DEFAULT_INIT_PRIORITY)
25396     {
25397       sprintf (buf, ".dtors.%.5u",
25398                /* Invert the numbering so the linker puts us in the proper
25399                   order; constructors are run from right to left, and the
25400                   linker sorts in increasing order.  */
25401                MAX_INIT_PRIORITY - priority);
25402       section = buf;
25403     }
25404
25405   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25406   assemble_align (POINTER_SIZE);
25407
25408   if (TARGET_RELOCATABLE)
25409     {
25410       fputs ("\t.long (", asm_out_file);
25411       output_addr_const (asm_out_file, symbol);
25412       fputs (")@fixup\n", asm_out_file);
25413     }
25414   else
25415     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25416 }
25417
25418 void
25419 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
25420 {
25421   if (TARGET_64BIT)
25422     {
25423       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
25424       ASM_OUTPUT_LABEL (file, name);
25425       fputs (DOUBLE_INT_ASM_OP, file);
25426       rs6000_output_function_entry (file, name);
25427       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
25428       if (DOT_SYMBOLS)
25429         {
25430           fputs ("\t.size\t", file);
25431           assemble_name (file, name);
25432           fputs (",24\n\t.type\t.", file);
25433           assemble_name (file, name);
25434           fputs (",@function\n", file);
25435           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
25436             {
25437               fputs ("\t.globl\t.", file);
25438               assemble_name (file, name);
25439               putc ('\n', file);
25440             }
25441         }
25442       else
25443         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25444       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25445       rs6000_output_function_entry (file, name);
25446       fputs (":\n", file);
25447       return;
25448     }
25449
25450   if (TARGET_RELOCATABLE
25451       && !TARGET_SECURE_PLT
25452       && (get_pool_size () != 0 || crtl->profile)
25453       && uses_TOC ())
25454     {
25455       char buf[256];
25456
25457       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
25458
25459       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
25460       fprintf (file, "\t.long ");
25461       assemble_name (file, buf);
25462       putc ('-', file);
25463       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
25464       assemble_name (file, buf);
25465       putc ('\n', file);
25466     }
25467
25468   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25469   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25470
25471   if (DEFAULT_ABI == ABI_AIX)
25472     {
25473       const char *desc_name, *orig_name;
25474
25475       orig_name = (*targetm.strip_name_encoding) (name);
25476       desc_name = orig_name;
25477       while (*desc_name == '.')
25478         desc_name++;
25479
25480       if (TREE_PUBLIC (decl))
25481         fprintf (file, "\t.globl %s\n", desc_name);
25482
25483       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25484       fprintf (file, "%s:\n", desc_name);
25485       fprintf (file, "\t.long %s\n", orig_name);
25486       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
25487       if (DEFAULT_ABI == ABI_AIX)
25488         fputs ("\t.long 0\n", file);
25489       fprintf (file, "\t.previous\n");
25490     }
25491   ASM_OUTPUT_LABEL (file, name);
25492 }
25493
25494 static void
25495 rs6000_elf_end_indicate_exec_stack (void)
25496 {
25497   if (TARGET_32BIT)
25498     file_end_indicate_exec_stack ();
25499 }
25500 #endif
25501
25502 #if TARGET_XCOFF
25503 static void
25504 rs6000_xcoff_asm_output_anchor (rtx symbol)
25505 {
25506   char buffer[100];
25507
25508   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
25509            SYMBOL_REF_BLOCK_OFFSET (symbol));
25510   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
25511 }
25512
25513 static void
25514 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
25515 {
25516   fputs (GLOBAL_ASM_OP, stream);
25517   RS6000_OUTPUT_BASENAME (stream, name);
25518   putc ('\n', stream);
25519 }
25520
25521 /* A get_unnamed_decl callback, used for read-only sections.  PTR
25522    points to the section string variable.  */
25523
25524 static void
25525 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
25526 {
25527   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
25528            *(const char *const *) directive,
25529            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25530 }
25531
25532 /* Likewise for read-write sections.  */
25533
25534 static void
25535 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
25536 {
25537   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
25538            *(const char *const *) directive,
25539            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25540 }
25541
25542 /* A get_unnamed_section callback, used for switching to toc_section.  */
25543
25544 static void
25545 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
25546 {
25547   if (TARGET_MINIMAL_TOC)
25548     {
25549       /* toc_section is always selected at least once from
25550          rs6000_xcoff_file_start, so this is guaranteed to
25551          always be defined once and only once in each file.  */
25552       if (!toc_initialized)
25553         {
25554           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
25555           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
25556           toc_initialized = 1;
25557         }
25558       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
25559                (TARGET_32BIT ? "" : ",3"));
25560     }
25561   else
25562     fputs ("\t.toc\n", asm_out_file);
25563 }
25564
25565 /* Implement TARGET_ASM_INIT_SECTIONS.  */
25566
25567 static void
25568 rs6000_xcoff_asm_init_sections (void)
25569 {
25570   read_only_data_section
25571     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25572                            &xcoff_read_only_section_name);
25573
25574   private_data_section
25575     = get_unnamed_section (SECTION_WRITE,
25576                            rs6000_xcoff_output_readwrite_section_asm_op,
25577                            &xcoff_private_data_section_name);
25578
25579   read_only_private_data_section
25580     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25581                            &xcoff_private_data_section_name);
25582
25583   toc_section
25584     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
25585
25586   readonly_data_section = read_only_data_section;
25587   exception_section = data_section;
25588 }
25589
25590 static int
25591 rs6000_xcoff_reloc_rw_mask (void)
25592 {
25593   return 3;
25594 }
25595
25596 static void
25597 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
25598                                 tree decl ATTRIBUTE_UNUSED)
25599 {
25600   int smclass;
25601   static const char * const suffix[3] = { "PR", "RO", "RW" };
25602
25603   if (flags & SECTION_CODE)
25604     smclass = 0;
25605   else if (flags & SECTION_WRITE)
25606     smclass = 2;
25607   else
25608     smclass = 1;
25609
25610   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
25611            (flags & SECTION_CODE) ? "." : "",
25612            name, suffix[smclass], flags & SECTION_ENTSIZE);
25613 }
25614
25615 static section *
25616 rs6000_xcoff_select_section (tree decl, int reloc,
25617                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25618 {
25619   if (decl_readonly_section (decl, reloc))
25620     {
25621       if (TREE_PUBLIC (decl))
25622         return read_only_data_section;
25623       else
25624         return read_only_private_data_section;
25625     }
25626   else
25627     {
25628       if (TREE_PUBLIC (decl))
25629         return data_section;
25630       else
25631         return private_data_section;
25632     }
25633 }
25634
25635 static void
25636 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
25637 {
25638   const char *name;
25639
25640   /* Use select_section for private and uninitialized data.  */
25641   if (!TREE_PUBLIC (decl)
25642       || DECL_COMMON (decl)
25643       || DECL_INITIAL (decl) == NULL_TREE
25644       || DECL_INITIAL (decl) == error_mark_node
25645       || (flag_zero_initialized_in_bss
25646           && initializer_zerop (DECL_INITIAL (decl))))
25647     return;
25648
25649   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
25650   name = (*targetm.strip_name_encoding) (name);
25651   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
25652 }
25653
25654 /* Select section for constant in constant pool.
25655
25656    On RS/6000, all constants are in the private read-only data area.
25657    However, if this is being placed in the TOC it must be output as a
25658    toc entry.  */
25659
25660 static section *
25661 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
25662                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25663 {
25664   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
25665     return toc_section;
25666   else
25667     return read_only_private_data_section;
25668 }
25669
25670 /* Remove any trailing [DS] or the like from the symbol name.  */
25671
25672 static const char *
25673 rs6000_xcoff_strip_name_encoding (const char *name)
25674 {
25675   size_t len;
25676   if (*name == '*')
25677     name++;
25678   len = strlen (name);
25679   if (name[len - 1] == ']')
25680     return ggc_alloc_string (name, len - 4);
25681   else
25682     return name;
25683 }
25684
25685 /* Section attributes.  AIX is always PIC.  */
25686
25687 static unsigned int
25688 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
25689 {
25690   unsigned int align;
25691   unsigned int flags = default_section_type_flags (decl, name, reloc);
25692
25693   /* Align to at least UNIT size.  */
25694   if (flags & SECTION_CODE)
25695     align = MIN_UNITS_PER_WORD;
25696   else
25697     /* Increase alignment of large objects if not already stricter.  */
25698     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
25699                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
25700                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
25701
25702   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
25703 }
25704
25705 /* Output at beginning of assembler file.
25706
25707    Initialize the section names for the RS/6000 at this point.
25708
25709    Specify filename, including full path, to assembler.
25710
25711    We want to go into the TOC section so at least one .toc will be emitted.
25712    Also, in order to output proper .bs/.es pairs, we need at least one static
25713    [RW] section emitted.
25714
25715    Finally, declare mcount when profiling to make the assembler happy.  */
25716
25717 static void
25718 rs6000_xcoff_file_start (void)
25719 {
25720   rs6000_gen_section_name (&xcoff_bss_section_name,
25721                            main_input_filename, ".bss_");
25722   rs6000_gen_section_name (&xcoff_private_data_section_name,
25723                            main_input_filename, ".rw_");
25724   rs6000_gen_section_name (&xcoff_read_only_section_name,
25725                            main_input_filename, ".ro_");
25726
25727   fputs ("\t.file\t", asm_out_file);
25728   output_quoted_string (asm_out_file, main_input_filename);
25729   fputc ('\n', asm_out_file);
25730   if (write_symbols != NO_DEBUG)
25731     switch_to_section (private_data_section);
25732   switch_to_section (text_section);
25733   if (profile_flag)
25734     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
25735   rs6000_file_start ();
25736 }
25737
25738 /* Output at end of assembler file.
25739    On the RS/6000, referencing data should automatically pull in text.  */
25740
25741 static void
25742 rs6000_xcoff_file_end (void)
25743 {
25744   switch_to_section (text_section);
25745   fputs ("_section_.text:\n", asm_out_file);
25746   switch_to_section (data_section);
25747   fputs (TARGET_32BIT
25748          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
25749          asm_out_file);
25750 }
25751 #endif /* TARGET_XCOFF */
25752
25753 /* Compute a (partial) cost for rtx X.  Return true if the complete
25754    cost has been computed, and false if subexpressions should be
25755    scanned.  In either case, *TOTAL contains the cost result.  */
25756
25757 static bool
25758 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
25759                   bool speed)
25760 {
25761   enum machine_mode mode = GET_MODE (x);
25762
25763   switch (code)
25764     {
25765       /* On the RS/6000, if it is valid in the insn, it is free.  */
25766     case CONST_INT:
25767       if (((outer_code == SET
25768             || outer_code == PLUS
25769             || outer_code == MINUS)
25770            && (satisfies_constraint_I (x)
25771                || satisfies_constraint_L (x)))
25772           || (outer_code == AND
25773               && (satisfies_constraint_K (x)
25774                   || (mode == SImode
25775                       ? satisfies_constraint_L (x)
25776                       : satisfies_constraint_J (x))
25777                   || mask_operand (x, mode)
25778                   || (mode == DImode
25779                       && mask64_operand (x, DImode))))
25780           || ((outer_code == IOR || outer_code == XOR)
25781               && (satisfies_constraint_K (x)
25782                   || (mode == SImode
25783                       ? satisfies_constraint_L (x)
25784                       : satisfies_constraint_J (x))))
25785           || outer_code == ASHIFT
25786           || outer_code == ASHIFTRT
25787           || outer_code == LSHIFTRT
25788           || outer_code == ROTATE
25789           || outer_code == ROTATERT
25790           || outer_code == ZERO_EXTRACT
25791           || (outer_code == MULT
25792               && satisfies_constraint_I (x))
25793           || ((outer_code == DIV || outer_code == UDIV
25794                || outer_code == MOD || outer_code == UMOD)
25795               && exact_log2 (INTVAL (x)) >= 0)
25796           || (outer_code == COMPARE
25797               && (satisfies_constraint_I (x)
25798                   || satisfies_constraint_K (x)))
25799           || ((outer_code == EQ || outer_code == NE)
25800               && (satisfies_constraint_I (x)
25801                   || satisfies_constraint_K (x)
25802                   || (mode == SImode
25803                       ? satisfies_constraint_L (x)
25804                       : satisfies_constraint_J (x))))
25805           || (outer_code == GTU
25806               && satisfies_constraint_I (x))
25807           || (outer_code == LTU
25808               && satisfies_constraint_P (x)))
25809         {
25810           *total = 0;
25811           return true;
25812         }
25813       else if ((outer_code == PLUS
25814                 && reg_or_add_cint_operand (x, VOIDmode))
25815                || (outer_code == MINUS
25816                    && reg_or_sub_cint_operand (x, VOIDmode))
25817                || ((outer_code == SET
25818                     || outer_code == IOR
25819                     || outer_code == XOR)
25820                    && (INTVAL (x)
25821                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
25822         {
25823           *total = COSTS_N_INSNS (1);
25824           return true;
25825         }
25826       /* FALLTHRU */
25827
25828     case CONST_DOUBLE:
25829       if (mode == DImode && code == CONST_DOUBLE)
25830         {
25831           if ((outer_code == IOR || outer_code == XOR)
25832               && CONST_DOUBLE_HIGH (x) == 0
25833               && (CONST_DOUBLE_LOW (x)
25834                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
25835             {
25836               *total = 0;
25837               return true;
25838             }
25839           else if ((outer_code == AND && and64_2_operand (x, DImode))
25840                    || ((outer_code == SET
25841                         || outer_code == IOR
25842                         || outer_code == XOR)
25843                        && CONST_DOUBLE_HIGH (x) == 0))
25844             {
25845               *total = COSTS_N_INSNS (1);
25846               return true;
25847             }
25848         }
25849       /* FALLTHRU */
25850
25851     case CONST:
25852     case HIGH:
25853     case SYMBOL_REF:
25854     case MEM:
25855       /* When optimizing for size, MEM should be slightly more expensive
25856          than generating address, e.g., (plus (reg) (const)).
25857          L1 cache latency is about two instructions.  */
25858       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
25859       return true;
25860
25861     case LABEL_REF:
25862       *total = 0;
25863       return true;
25864
25865     case PLUS:
25866       if (mode == DFmode)
25867         {
25868           if (GET_CODE (XEXP (x, 0)) == MULT)
25869             {
25870               /* FNMA accounted in outer NEG.  */
25871               if (outer_code == NEG)
25872                 *total = rs6000_cost->dmul - rs6000_cost->fp;
25873               else
25874                 *total = rs6000_cost->dmul;
25875             }
25876           else
25877             *total = rs6000_cost->fp;
25878         }
25879       else if (mode == SFmode)
25880         {
25881           /* FNMA accounted in outer NEG.  */
25882           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
25883             *total = 0;
25884           else
25885             *total = rs6000_cost->fp;
25886         }
25887       else
25888         *total = COSTS_N_INSNS (1);
25889       return false;
25890
25891     case MINUS:
25892       if (mode == DFmode)
25893         {
25894           if (GET_CODE (XEXP (x, 0)) == MULT
25895               || GET_CODE (XEXP (x, 1)) == MULT)
25896             {
25897               /* FNMA accounted in outer NEG.  */
25898               if (outer_code == NEG)
25899                 *total = rs6000_cost->dmul - rs6000_cost->fp;
25900               else
25901                 *total = rs6000_cost->dmul;
25902             }
25903           else
25904             *total = rs6000_cost->fp;
25905         }
25906       else if (mode == SFmode)
25907         {
25908           /* FNMA accounted in outer NEG.  */
25909           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
25910             *total = 0;
25911           else
25912             *total = rs6000_cost->fp;
25913         }
25914       else
25915         *total = COSTS_N_INSNS (1);
25916       return false;
25917
25918     case MULT:
25919       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25920           && satisfies_constraint_I (XEXP (x, 1)))
25921         {
25922           if (INTVAL (XEXP (x, 1)) >= -256
25923               && INTVAL (XEXP (x, 1)) <= 255)
25924             *total = rs6000_cost->mulsi_const9;
25925           else
25926             *total = rs6000_cost->mulsi_const;
25927         }
25928       /* FMA accounted in outer PLUS/MINUS.  */
25929       else if ((mode == DFmode || mode == SFmode)
25930                && (outer_code == PLUS || outer_code == MINUS))
25931         *total = 0;
25932       else if (mode == DFmode)
25933         *total = rs6000_cost->dmul;
25934       else if (mode == SFmode)
25935         *total = rs6000_cost->fp;
25936       else if (mode == DImode)
25937         *total = rs6000_cost->muldi;
25938       else
25939         *total = rs6000_cost->mulsi;
25940       return false;
25941
25942     case DIV:
25943     case MOD:
25944       if (FLOAT_MODE_P (mode))
25945         {
25946           *total = mode == DFmode ? rs6000_cost->ddiv
25947                                   : rs6000_cost->sdiv;
25948           return false;
25949         }
25950       /* FALLTHRU */
25951
25952     case UDIV:
25953     case UMOD:
25954       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25955           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
25956         {
25957           if (code == DIV || code == MOD)
25958             /* Shift, addze */
25959             *total = COSTS_N_INSNS (2);
25960           else
25961             /* Shift */
25962             *total = COSTS_N_INSNS (1);
25963         }
25964       else
25965         {
25966           if (GET_MODE (XEXP (x, 1)) == DImode)
25967             *total = rs6000_cost->divdi;
25968           else
25969             *total = rs6000_cost->divsi;
25970         }
25971       /* Add in shift and subtract for MOD. */
25972       if (code == MOD || code == UMOD)
25973         *total += COSTS_N_INSNS (2);
25974       return false;
25975
25976     case CTZ:
25977     case FFS:
25978       *total = COSTS_N_INSNS (4);
25979       return false;
25980
25981     case POPCOUNT:
25982       *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
25983       return false;
25984
25985     case PARITY:
25986       *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
25987       return false;
25988
25989     case NOT:
25990       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
25991         {
25992           *total = 0;
25993           return false;
25994         }
25995       /* FALLTHRU */
25996
25997     case AND:
25998     case CLZ:
25999     case IOR:
26000     case XOR:
26001     case ZERO_EXTRACT:
26002       *total = COSTS_N_INSNS (1);
26003       return false;
26004
26005     case ASHIFT:
26006     case ASHIFTRT:
26007     case LSHIFTRT:
26008     case ROTATE:
26009     case ROTATERT:
26010       /* Handle mul_highpart.  */
26011       if (outer_code == TRUNCATE
26012           && GET_CODE (XEXP (x, 0)) == MULT)
26013         {
26014           if (mode == DImode)
26015             *total = rs6000_cost->muldi;
26016           else
26017             *total = rs6000_cost->mulsi;
26018           return true;
26019         }
26020       else if (outer_code == AND)
26021         *total = 0;
26022       else
26023         *total = COSTS_N_INSNS (1);
26024       return false;
26025
26026     case SIGN_EXTEND:
26027     case ZERO_EXTEND:
26028       if (GET_CODE (XEXP (x, 0)) == MEM)
26029         *total = 0;
26030       else
26031         *total = COSTS_N_INSNS (1);
26032       return false;
26033
26034     case COMPARE:
26035     case NEG:
26036     case ABS:
26037       if (!FLOAT_MODE_P (mode))
26038         {
26039           *total = COSTS_N_INSNS (1);
26040           return false;
26041         }
26042       /* FALLTHRU */
26043
26044     case FLOAT:
26045     case UNSIGNED_FLOAT:
26046     case FIX:
26047     case UNSIGNED_FIX:
26048     case FLOAT_TRUNCATE:
26049       *total = rs6000_cost->fp;
26050       return false;
26051
26052     case FLOAT_EXTEND:
26053       if (mode == DFmode)
26054         *total = 0;
26055       else
26056         *total = rs6000_cost->fp;
26057       return false;
26058
26059     case UNSPEC:
26060       switch (XINT (x, 1))
26061         {
26062         case UNSPEC_FRSP:
26063           *total = rs6000_cost->fp;
26064           return true;
26065
26066         default:
26067           break;
26068         }
26069       break;
26070
26071     case CALL:
26072     case IF_THEN_ELSE:
26073       if (!speed)
26074         {
26075           *total = COSTS_N_INSNS (1);
26076           return true;
26077         }
26078       else if (FLOAT_MODE_P (mode)
26079                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
26080         {
26081           *total = rs6000_cost->fp;
26082           return false;
26083         }
26084       break;
26085
26086     case EQ:
26087     case GTU:
26088     case LTU:
26089       /* Carry bit requires mode == Pmode.
26090          NEG or PLUS already counted so only add one.  */
26091       if (mode == Pmode
26092           && (outer_code == NEG || outer_code == PLUS))
26093         {
26094           *total = COSTS_N_INSNS (1);
26095           return true;
26096         }
26097       if (outer_code == SET)
26098         {
26099           if (XEXP (x, 1) == const0_rtx)
26100             {
26101               if (TARGET_ISEL && !TARGET_MFCRF)
26102                 *total = COSTS_N_INSNS (8);
26103               else
26104                 *total = COSTS_N_INSNS (2);
26105               return true;
26106             }
26107           else if (mode == Pmode)
26108             {
26109               *total = COSTS_N_INSNS (3);
26110               return false;
26111             }
26112         }
26113       /* FALLTHRU */
26114
26115     case GT:
26116     case LT:
26117     case UNORDERED:
26118       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
26119         {
26120           if (TARGET_ISEL && !TARGET_MFCRF)
26121             *total = COSTS_N_INSNS (8);
26122           else
26123             *total = COSTS_N_INSNS (2);
26124           return true;
26125         }
26126       /* CC COMPARE.  */
26127       if (outer_code == COMPARE)
26128         {
26129           *total = 0;
26130           return true;
26131         }
26132       break;
26133
26134     default:
26135       break;
26136     }
26137
26138   return false;
26139 }
26140
26141 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
26142
26143 static bool
26144 rs6000_debug_rtx_costs (rtx x, int code, int outer_code, int *total,
26145                         bool speed)
26146 {
26147   bool ret = rs6000_rtx_costs (x, code, outer_code, total, speed);
26148
26149   fprintf (stderr,
26150            "\nrs6000_rtx_costs, return = %s, code = %s, outer_code = %s, "
26151            "total = %d, speed = %s, x:\n",
26152            ret ? "complete" : "scan inner",
26153            GET_RTX_NAME (code),
26154            GET_RTX_NAME (outer_code),
26155            *total,
26156            speed ? "true" : "false");
26157
26158   debug_rtx (x);
26159
26160   return ret;
26161 }
26162
26163 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
26164
26165 static int
26166 rs6000_debug_address_cost (rtx x, bool speed)
26167 {
26168   int ret = TARGET_ADDRESS_COST (x, speed);
26169
26170   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
26171            ret, speed ? "true" : "false");
26172   debug_rtx (x);
26173
26174   return ret;
26175 }
26176
26177
26178 /* A C expression returning the cost of moving data from a register of class
26179    CLASS1 to one of CLASS2.  */
26180
26181 static int
26182 rs6000_register_move_cost (enum machine_mode mode,
26183                            reg_class_t from, reg_class_t to)
26184 {
26185   int ret;
26186
26187   /*  Moves from/to GENERAL_REGS.  */
26188   if (reg_classes_intersect_p (to, GENERAL_REGS)
26189       || reg_classes_intersect_p (from, GENERAL_REGS))
26190     {
26191       if (! reg_classes_intersect_p (to, GENERAL_REGS))
26192         from = to;
26193
26194       if (from == FLOAT_REGS || from == ALTIVEC_REGS || from == VSX_REGS)
26195         ret = (rs6000_memory_move_cost (mode, from, false)
26196                + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
26197
26198       /* It's more expensive to move CR_REGS than CR0_REGS because of the
26199          shift.  */
26200       else if (from == CR_REGS)
26201         ret = 4;
26202
26203       /* Power6 has slower LR/CTR moves so make them more expensive than
26204          memory in order to bias spills to memory .*/
26205       else if (rs6000_cpu == PROCESSOR_POWER6
26206                && reg_classes_intersect_p (from, LINK_OR_CTR_REGS))
26207         ret = 6 * hard_regno_nregs[0][mode];
26208
26209       else
26210         /* A move will cost one instruction per GPR moved.  */
26211         ret = 2 * hard_regno_nregs[0][mode];
26212     }
26213
26214   /* If we have VSX, we can easily move between FPR or Altivec registers.  */
26215   else if (VECTOR_UNIT_VSX_P (mode)
26216            && reg_classes_intersect_p (to, VSX_REGS)
26217            && reg_classes_intersect_p (from, VSX_REGS))
26218     ret = 2 * hard_regno_nregs[32][mode];
26219
26220   /* Moving between two similar registers is just one instruction.  */
26221   else if (reg_classes_intersect_p (to, from))
26222     ret = (mode == TFmode || mode == TDmode) ? 4 : 2;
26223
26224   /* Everything else has to go through GENERAL_REGS.  */
26225   else
26226     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
26227            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
26228
26229   if (TARGET_DEBUG_COST)
26230     fprintf (stderr,
26231              "rs6000_register_move_cost:, ret=%d, mode=%s, from=%s, to=%s\n",
26232              ret, GET_MODE_NAME (mode), reg_class_names[from],
26233              reg_class_names[to]);
26234
26235   return ret;
26236 }
26237
26238 /* A C expressions returning the cost of moving data of MODE from a register to
26239    or from memory.  */
26240
26241 static int
26242 rs6000_memory_move_cost (enum machine_mode mode, reg_class_t rclass,
26243                          bool in ATTRIBUTE_UNUSED)
26244 {
26245   int ret;
26246
26247   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
26248     ret = 4 * hard_regno_nregs[0][mode];
26249   else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
26250     ret = 4 * hard_regno_nregs[32][mode];
26251   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
26252     ret = 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
26253   else
26254     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
26255
26256   if (TARGET_DEBUG_COST)
26257     fprintf (stderr,
26258              "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
26259              ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
26260
26261   return ret;
26262 }
26263
26264 /* Returns a code for a target-specific builtin that implements
26265    reciprocal of the function, or NULL_TREE if not available.  */
26266
26267 static tree
26268 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
26269                            bool sqrt ATTRIBUTE_UNUSED)
26270 {
26271   if (optimize_insn_for_size_p ())
26272     return NULL_TREE;
26273
26274   if (md_fn)
26275     switch (fn)
26276       {
26277       case VSX_BUILTIN_XVSQRTDP:
26278         if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
26279           return NULL_TREE;
26280
26281         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
26282
26283       case VSX_BUILTIN_XVSQRTSP:
26284         if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
26285           return NULL_TREE;
26286
26287         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V4SF];
26288
26289       default:
26290         return NULL_TREE;
26291       }
26292
26293   else
26294     switch (fn)
26295       {
26296       case BUILT_IN_SQRT:
26297         if (!RS6000_RECIP_AUTO_RSQRTE_P (DFmode))
26298           return NULL_TREE;
26299
26300         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRT];
26301
26302       case BUILT_IN_SQRTF:
26303         if (!RS6000_RECIP_AUTO_RSQRTE_P (SFmode))
26304           return NULL_TREE;
26305
26306         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
26307
26308       default:
26309         return NULL_TREE;
26310       }
26311 }
26312
26313 /* Load up a constant.  If the mode is a vector mode, splat the value across
26314    all of the vector elements.  */
26315
26316 static rtx
26317 rs6000_load_constant_and_splat (enum machine_mode mode, REAL_VALUE_TYPE dconst)
26318 {
26319   rtx reg;
26320
26321   if (mode == SFmode || mode == DFmode)
26322     {
26323       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, mode);
26324       reg = force_reg (mode, d);
26325     }
26326   else if (mode == V4SFmode)
26327     {
26328       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, SFmode);
26329       rtvec v = gen_rtvec (4, d, d, d, d);
26330       reg = gen_reg_rtx (mode);
26331       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26332     }
26333   else if (mode == V2DFmode)
26334     {
26335       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, DFmode);
26336       rtvec v = gen_rtvec (2, d, d);
26337       reg = gen_reg_rtx (mode);
26338       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26339     }
26340   else
26341     gcc_unreachable ();
26342
26343   return reg;
26344 }
26345
26346 /* Generate a FMADD instruction:
26347         dst = (m1 * m2) + a
26348
26349    generating different RTL based on the fused multiply/add switch.  */
26350
26351 static void
26352 rs6000_emit_madd (rtx dst, rtx m1, rtx m2, rtx a)
26353 {
26354   enum machine_mode mode = GET_MODE (dst);
26355
26356   if (!TARGET_FUSED_MADD)
26357     {
26358       /* For the simple ops, use the generator function, rather than assuming
26359          that the RTL is standard.  */
26360       enum insn_code mcode = optab_handler (smul_optab, mode);
26361       enum insn_code acode = optab_handler (add_optab, mode);
26362       gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (mcode);
26363       gen_2arg_fn_t gen_add = (gen_2arg_fn_t) GEN_FCN (acode);
26364       rtx mreg = gen_reg_rtx (mode);
26365
26366       gcc_assert (mcode != CODE_FOR_nothing && acode != CODE_FOR_nothing);
26367       emit_insn (gen_mul (mreg, m1, m2));
26368       emit_insn (gen_add (dst, mreg, a));
26369     }
26370
26371   else
26372     emit_insn (gen_rtx_SET (VOIDmode, dst,
26373                             gen_rtx_PLUS (mode,
26374                                           gen_rtx_MULT (mode, m1, m2),
26375                                           a)));
26376 }
26377
26378 /* Generate a FMSUB instruction:
26379         dst = (m1 * m2) - a
26380
26381    generating different RTL based on the fused multiply/add switch.  */
26382
26383 static void
26384 rs6000_emit_msub (rtx dst, rtx m1, rtx m2, rtx a)
26385 {
26386   enum machine_mode mode = GET_MODE (dst);
26387
26388   if (!TARGET_FUSED_MADD
26389       || (mode == V4SFmode && VECTOR_UNIT_ALTIVEC_P (V4SFmode)))
26390     {
26391       /* For the simple ops, use the generator function, rather than assuming
26392          that the RTL is standard.  */
26393       enum insn_code mcode = optab_handler (smul_optab, mode);
26394       enum insn_code scode = optab_handler (add_optab, mode);
26395       gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (mcode);
26396       gen_2arg_fn_t gen_sub = (gen_2arg_fn_t) GEN_FCN (scode);
26397       rtx mreg = gen_reg_rtx (mode);
26398
26399       gcc_assert (mcode != CODE_FOR_nothing && scode != CODE_FOR_nothing);
26400       emit_insn (gen_mul (mreg, m1, m2));
26401       emit_insn (gen_sub (dst, mreg, a));
26402     }
26403
26404   else
26405     emit_insn (gen_rtx_SET (VOIDmode, dst,
26406                             gen_rtx_MINUS (mode,
26407                                            gen_rtx_MULT (mode, m1, m2),
26408                                            a)));
26409 }
26410
26411 /* Generate a FNMSUB instruction:
26412         dst = - ((m1 * m2) - a)
26413
26414    Which is equivalent to (except in the prescence of -0.0):
26415         dst = a - (m1 * m2)
26416
26417    generating different RTL based on the fast-math and fused multiply/add
26418    switches.  */
26419
26420 static void
26421 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
26422 {
26423   enum machine_mode mode = GET_MODE (dst);
26424
26425   if (!TARGET_FUSED_MADD)
26426     {
26427       /* For the simple ops, use the generator function, rather than assuming
26428          that the RTL is standard.  */
26429       enum insn_code mcode = optab_handler (smul_optab, mode);
26430       enum insn_code scode = optab_handler (sub_optab, mode);
26431       gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (mcode);
26432       gen_2arg_fn_t gen_sub = (gen_2arg_fn_t) GEN_FCN (scode);
26433       rtx mreg = gen_reg_rtx (mode);
26434
26435       gcc_assert (mcode != CODE_FOR_nothing && scode != CODE_FOR_nothing);
26436       emit_insn (gen_mul (mreg, m1, m2));
26437       emit_insn (gen_sub (dst, a, mreg));
26438     }
26439
26440   else
26441     {
26442       rtx m = gen_rtx_MULT (mode, m1, m2);
26443
26444       if (!HONOR_SIGNED_ZEROS (mode))
26445         emit_insn (gen_rtx_SET (VOIDmode, dst, gen_rtx_MINUS (mode, a, m)));
26446
26447       else
26448         emit_insn (gen_rtx_SET (VOIDmode, dst,
26449                                 gen_rtx_NEG (mode,
26450                                              gen_rtx_MINUS (mode, m, a))));
26451     }
26452 }
26453
26454 /* Newton-Raphson approximation of floating point divide with just 2 passes
26455    (either single precision floating point, or newer machines with higher
26456    accuracy estimates).  Support both scalar and vector divide.  Assumes no
26457    trapping math and finite arguments.  */
26458
26459 static void
26460 rs6000_emit_swdiv_high_precision (rtx dst, rtx n, rtx d)
26461 {
26462   enum machine_mode mode = GET_MODE (dst);
26463   rtx x0, e0, e1, y1, u0, v0;
26464   enum insn_code code = optab_handler (smul_optab, mode);
26465   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26466   rtx one = rs6000_load_constant_and_splat (mode, dconst1);
26467
26468   gcc_assert (code != CODE_FOR_nothing);
26469
26470   /* x0 = 1./d estimate */
26471   x0 = gen_reg_rtx (mode);
26472   emit_insn (gen_rtx_SET (VOIDmode, x0,
26473                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26474                                           UNSPEC_FRES)));
26475
26476   e0 = gen_reg_rtx (mode);
26477   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - (d * x0) */
26478
26479   e1 = gen_reg_rtx (mode);
26480   rs6000_emit_madd (e1, e0, e0, e0);            /* e1 = (e0 * e0) + e0 */
26481
26482   y1 = gen_reg_rtx (mode);
26483   rs6000_emit_madd (y1, e1, x0, x0);            /* y1 = (e1 * x0) + x0 */
26484
26485   u0 = gen_reg_rtx (mode);
26486   emit_insn (gen_mul (u0, n, y1));              /* u0 = n * y1 */
26487
26488   v0 = gen_reg_rtx (mode);
26489   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - (d * u0) */
26490
26491   rs6000_emit_madd (dst, v0, y1, u0);           /* dst = (v0 * y1) + u0 */
26492 }
26493
26494 /* Newton-Raphson approximation of floating point divide that has a low
26495    precision estimate.  Assumes no trapping math and finite arguments.  */
26496
26497 static void
26498 rs6000_emit_swdiv_low_precision (rtx dst, rtx n, rtx d)
26499 {
26500   enum machine_mode mode = GET_MODE (dst);
26501   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
26502   enum insn_code code = optab_handler (smul_optab, mode);
26503   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26504
26505   gcc_assert (code != CODE_FOR_nothing);
26506
26507   one = rs6000_load_constant_and_splat (mode, dconst1);
26508
26509   /* x0 = 1./d estimate */
26510   x0 = gen_reg_rtx (mode);
26511   emit_insn (gen_rtx_SET (VOIDmode, x0,
26512                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26513                                           UNSPEC_FRES)));
26514
26515   e0 = gen_reg_rtx (mode);
26516   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - d * x0 */
26517
26518   y1 = gen_reg_rtx (mode);
26519   rs6000_emit_madd (y1, e0, x0, x0);            /* y1 = x0 + e0 * x0 */
26520
26521   e1 = gen_reg_rtx (mode);
26522   emit_insn (gen_mul (e1, e0, e0));             /* e1 = e0 * e0 */
26523
26524   y2 = gen_reg_rtx (mode);
26525   rs6000_emit_madd (y2, e1, y1, y1);            /* y2 = y1 + e1 * y1 */
26526
26527   e2 = gen_reg_rtx (mode);
26528   emit_insn (gen_mul (e2, e1, e1));             /* e2 = e1 * e1 */
26529
26530   y3 = gen_reg_rtx (mode);
26531   rs6000_emit_madd (y3, e2, y2, y2);            /* y3 = y2 + e2 * y2 */
26532
26533   u0 = gen_reg_rtx (mode);
26534   emit_insn (gen_mul (u0, n, y3));              /* u0 = n * y3 */
26535
26536   v0 = gen_reg_rtx (mode);
26537   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - d * u0 */
26538
26539   rs6000_emit_madd (dst, v0, y3, u0);           /* dst = u0 + v0 * y3 */
26540 }
26541
26542 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
26543    add a reg_note saying that this was a division.  Support both scalar and
26544    vector divide.  Assumes no trapping math and finite arguments.  */
26545
26546 void
26547 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
26548 {
26549   enum machine_mode mode = GET_MODE (dst);
26550
26551   if (RS6000_RECIP_HIGH_PRECISION_P (mode))
26552     rs6000_emit_swdiv_high_precision (dst, n, d);
26553   else
26554     rs6000_emit_swdiv_low_precision (dst, n, d);
26555
26556   if (note_p)
26557     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
26558 }
26559
26560 /* Newton-Raphson approximation of single/double-precision floating point
26561    rsqrt.  Assumes no trapping math and finite arguments.  */
26562
26563 void
26564 rs6000_emit_swrsqrt (rtx dst, rtx src)
26565 {
26566   enum machine_mode mode = GET_MODE (src);
26567   rtx x0 = gen_reg_rtx (mode);
26568   rtx y = gen_reg_rtx (mode);
26569   int passes = (TARGET_RECIP_PRECISION) ? 2 : 3;
26570   REAL_VALUE_TYPE dconst3_2;
26571   int i;
26572   rtx halfthree;
26573   enum insn_code code = optab_handler (smul_optab, mode);
26574   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26575
26576   gcc_assert (code != CODE_FOR_nothing);
26577
26578   /* Load up the constant 1.5 either as a scalar, or as a vector.  */
26579   real_from_integer (&dconst3_2, VOIDmode, 3, 0, 0);
26580   SET_REAL_EXP (&dconst3_2, REAL_EXP (&dconst3_2) - 1);
26581
26582   halfthree = rs6000_load_constant_and_splat (mode, dconst3_2);
26583
26584   /* x0 = rsqrt estimate */
26585   emit_insn (gen_rtx_SET (VOIDmode, x0,
26586                           gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
26587                                           UNSPEC_RSQRT)));
26588
26589   /* y = 0.5 * src = 1.5 * src - src -> fewer constants */
26590   rs6000_emit_msub (y, src, halfthree, src);
26591
26592   for (i = 0; i < passes; i++)
26593     {
26594       rtx x1 = gen_reg_rtx (mode);
26595       rtx u = gen_reg_rtx (mode);
26596       rtx v = gen_reg_rtx (mode);
26597
26598       /* x1 = x0 * (1.5 - y * (x0 * x0)) */
26599       emit_insn (gen_mul (u, x0, x0));
26600       rs6000_emit_nmsub (v, y, u, halfthree);
26601       emit_insn (gen_mul (x1, x0, v));
26602       x0 = x1;
26603     }
26604
26605   emit_move_insn (dst, x0);
26606   return;
26607 }
26608
26609 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
26610    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
26611
26612 void
26613 rs6000_emit_popcount (rtx dst, rtx src)
26614 {
26615   enum machine_mode mode = GET_MODE (dst);
26616   rtx tmp1, tmp2;
26617
26618   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
26619   if (TARGET_POPCNTD)
26620     {
26621       if (mode == SImode)
26622         emit_insn (gen_popcntdsi2 (dst, src));
26623       else
26624         emit_insn (gen_popcntddi2 (dst, src));
26625       return;
26626     }
26627
26628   tmp1 = gen_reg_rtx (mode);
26629
26630   if (mode == SImode)
26631     {
26632       emit_insn (gen_popcntbsi2 (tmp1, src));
26633       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
26634                            NULL_RTX, 0);
26635       tmp2 = force_reg (SImode, tmp2);
26636       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
26637     }
26638   else
26639     {
26640       emit_insn (gen_popcntbdi2 (tmp1, src));
26641       tmp2 = expand_mult (DImode, tmp1,
26642                           GEN_INT ((HOST_WIDE_INT)
26643                                    0x01010101 << 32 | 0x01010101),
26644                           NULL_RTX, 0);
26645       tmp2 = force_reg (DImode, tmp2);
26646       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
26647     }
26648 }
26649
26650
26651 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
26652    target, and SRC is the argument operand.  */
26653
26654 void
26655 rs6000_emit_parity (rtx dst, rtx src)
26656 {
26657   enum machine_mode mode = GET_MODE (dst);
26658   rtx tmp;
26659
26660   tmp = gen_reg_rtx (mode);
26661
26662   /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can.  */
26663   if (TARGET_CMPB)
26664     {
26665       if (mode == SImode)
26666         {
26667           emit_insn (gen_popcntbsi2 (tmp, src));
26668           emit_insn (gen_paritysi2_cmpb (dst, tmp));
26669         }
26670       else
26671         {
26672           emit_insn (gen_popcntbdi2 (tmp, src));
26673           emit_insn (gen_paritydi2_cmpb (dst, tmp));
26674         }
26675       return;
26676     }
26677
26678   if (mode == SImode)
26679     {
26680       /* Is mult+shift >= shift+xor+shift+xor?  */
26681       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
26682         {
26683           rtx tmp1, tmp2, tmp3, tmp4;
26684
26685           tmp1 = gen_reg_rtx (SImode);
26686           emit_insn (gen_popcntbsi2 (tmp1, src));
26687
26688           tmp2 = gen_reg_rtx (SImode);
26689           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
26690           tmp3 = gen_reg_rtx (SImode);
26691           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
26692
26693           tmp4 = gen_reg_rtx (SImode);
26694           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
26695           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
26696         }
26697       else
26698         rs6000_emit_popcount (tmp, src);
26699       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
26700     }
26701   else
26702     {
26703       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
26704       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
26705         {
26706           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
26707
26708           tmp1 = gen_reg_rtx (DImode);
26709           emit_insn (gen_popcntbdi2 (tmp1, src));
26710
26711           tmp2 = gen_reg_rtx (DImode);
26712           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
26713           tmp3 = gen_reg_rtx (DImode);
26714           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
26715
26716           tmp4 = gen_reg_rtx (DImode);
26717           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
26718           tmp5 = gen_reg_rtx (DImode);
26719           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
26720
26721           tmp6 = gen_reg_rtx (DImode);
26722           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
26723           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
26724         }
26725       else
26726         rs6000_emit_popcount (tmp, src);
26727       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
26728     }
26729 }
26730
26731 /* Return an RTX representing where to find the function value of a
26732    function returning MODE.  */
26733 static rtx
26734 rs6000_complex_function_value (enum machine_mode mode)
26735 {
26736   unsigned int regno;
26737   rtx r1, r2;
26738   enum machine_mode inner = GET_MODE_INNER (mode);
26739   unsigned int inner_bytes = GET_MODE_SIZE (inner);
26740
26741   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26742     regno = FP_ARG_RETURN;
26743   else
26744     {
26745       regno = GP_ARG_RETURN;
26746
26747       /* 32-bit is OK since it'll go in r3/r4.  */
26748       if (TARGET_32BIT && inner_bytes >= 4)
26749         return gen_rtx_REG (mode, regno);
26750     }
26751
26752   if (inner_bytes >= 8)
26753     return gen_rtx_REG (mode, regno);
26754
26755   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
26756                           const0_rtx);
26757   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
26758                           GEN_INT (inner_bytes));
26759   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
26760 }
26761
26762 /* Target hook for TARGET_FUNCTION_VALUE.
26763
26764    On the SPE, both FPs and vectors are returned in r3.
26765
26766    On RS/6000 an integer value is in r3 and a floating-point value is in
26767    fp1, unless -msoft-float.  */
26768
26769 rtx
26770 rs6000_function_value (const_tree valtype,
26771                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
26772                        bool outgoing ATTRIBUTE_UNUSED)
26773 {
26774   enum machine_mode mode;
26775   unsigned int regno;
26776
26777   /* Special handling for structs in darwin64.  */
26778   if (TARGET_MACHO 
26779       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
26780     {
26781       CUMULATIVE_ARGS valcum;
26782       rtx valret;
26783
26784       valcum.words = 0;
26785       valcum.fregno = FP_ARG_MIN_REG;
26786       valcum.vregno = ALTIVEC_ARG_MIN_REG;
26787       /* Do a trial code generation as if this were going to be passed as
26788          an argument; if any part goes in memory, we return NULL.  */
26789       valret = rs6000_darwin64_record_arg (&valcum, valtype, true, true);
26790       if (valret)
26791         return valret;
26792       /* Otherwise fall through to standard ABI rules.  */
26793     }
26794
26795   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
26796     {
26797       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26798       return gen_rtx_PARALLEL (DImode,
26799         gen_rtvec (2,
26800                    gen_rtx_EXPR_LIST (VOIDmode,
26801                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26802                                       const0_rtx),
26803                    gen_rtx_EXPR_LIST (VOIDmode,
26804                                       gen_rtx_REG (SImode,
26805                                                    GP_ARG_RETURN + 1),
26806                                       GEN_INT (4))));
26807     }
26808   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
26809     {
26810       return gen_rtx_PARALLEL (DCmode,
26811         gen_rtvec (4,
26812                    gen_rtx_EXPR_LIST (VOIDmode,
26813                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26814                                       const0_rtx),
26815                    gen_rtx_EXPR_LIST (VOIDmode,
26816                                       gen_rtx_REG (SImode,
26817                                                    GP_ARG_RETURN + 1),
26818                                       GEN_INT (4)),
26819                    gen_rtx_EXPR_LIST (VOIDmode,
26820                                       gen_rtx_REG (SImode,
26821                                                    GP_ARG_RETURN + 2),
26822                                       GEN_INT (8)),
26823                    gen_rtx_EXPR_LIST (VOIDmode,
26824                                       gen_rtx_REG (SImode,
26825                                                    GP_ARG_RETURN + 3),
26826                                       GEN_INT (12))));
26827     }
26828
26829   mode = TYPE_MODE (valtype);
26830   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
26831       || POINTER_TYPE_P (valtype))
26832     mode = TARGET_32BIT ? SImode : DImode;
26833
26834   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26835     /* _Decimal128 must use an even/odd register pair.  */
26836     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26837   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
26838            && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
26839     regno = FP_ARG_RETURN;
26840   else if (TREE_CODE (valtype) == COMPLEX_TYPE
26841            && targetm.calls.split_complex_arg)
26842     return rs6000_complex_function_value (mode);
26843   else if (TREE_CODE (valtype) == VECTOR_TYPE
26844            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
26845            && ALTIVEC_VECTOR_MODE (mode))
26846     regno = ALTIVEC_ARG_RETURN;
26847   else if (TREE_CODE (valtype) == VECTOR_TYPE
26848            && TARGET_VSX && TARGET_ALTIVEC_ABI
26849            && VSX_VECTOR_MODE (mode))
26850     regno = ALTIVEC_ARG_RETURN;
26851   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26852            && (mode == DFmode || mode == DCmode
26853                || mode == TFmode || mode == TCmode))
26854     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26855   else
26856     regno = GP_ARG_RETURN;
26857
26858   return gen_rtx_REG (mode, regno);
26859 }
26860
26861 /* Define how to find the value returned by a library function
26862    assuming the value has mode MODE.  */
26863 rtx
26864 rs6000_libcall_value (enum machine_mode mode)
26865 {
26866   unsigned int regno;
26867
26868   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
26869     {
26870       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26871       return gen_rtx_PARALLEL (DImode,
26872         gen_rtvec (2,
26873                    gen_rtx_EXPR_LIST (VOIDmode,
26874                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26875                                       const0_rtx),
26876                    gen_rtx_EXPR_LIST (VOIDmode,
26877                                       gen_rtx_REG (SImode,
26878                                                    GP_ARG_RETURN + 1),
26879                                       GEN_INT (4))));
26880     }
26881
26882   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26883     /* _Decimal128 must use an even/odd register pair.  */
26884     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26885   else if (SCALAR_FLOAT_MODE_P (mode)
26886            && TARGET_HARD_FLOAT && TARGET_FPRS
26887            && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
26888     regno = FP_ARG_RETURN;
26889   else if (ALTIVEC_VECTOR_MODE (mode)
26890            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
26891     regno = ALTIVEC_ARG_RETURN;
26892   else if (VSX_VECTOR_MODE (mode)
26893            && TARGET_VSX && TARGET_ALTIVEC_ABI)
26894     regno = ALTIVEC_ARG_RETURN;
26895   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
26896     return rs6000_complex_function_value (mode);
26897   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26898            && (mode == DFmode || mode == DCmode
26899                || mode == TFmode || mode == TCmode))
26900     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26901   else
26902     regno = GP_ARG_RETURN;
26903
26904   return gen_rtx_REG (mode, regno);
26905 }
26906
26907
26908 /* Given FROM and TO register numbers, say whether this elimination is allowed.
26909    Frame pointer elimination is automatically handled.
26910
26911    For the RS/6000, if frame pointer elimination is being done, we would like
26912    to convert ap into fp, not sp.
26913
26914    We need r30 if -mminimal-toc was specified, and there are constant pool
26915    references.  */
26916
26917 bool
26918 rs6000_can_eliminate (const int from, const int to)
26919 {
26920   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
26921           ? ! frame_pointer_needed
26922           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
26923             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0
26924             : true);
26925 }
26926
26927 /* Define the offset between two registers, FROM to be eliminated and its
26928    replacement TO, at the start of a routine.  */
26929 HOST_WIDE_INT
26930 rs6000_initial_elimination_offset (int from, int to)
26931 {
26932   rs6000_stack_t *info = rs6000_stack_info ();
26933   HOST_WIDE_INT offset;
26934
26935   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26936     offset = info->push_p ? 0 : -info->total_size;
26937   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26938     {
26939       offset = info->push_p ? 0 : -info->total_size;
26940       if (FRAME_GROWS_DOWNWARD)
26941         offset += info->fixed_size + info->vars_size + info->parm_size;
26942     }
26943   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26944     offset = FRAME_GROWS_DOWNWARD
26945              ? info->fixed_size + info->vars_size + info->parm_size
26946              : 0;
26947   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26948     offset = info->total_size;
26949   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26950     offset = info->push_p ? info->total_size : 0;
26951   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
26952     offset = 0;
26953   else
26954     gcc_unreachable ();
26955
26956   return offset;
26957 }
26958
26959 static rtx
26960 rs6000_dwarf_register_span (rtx reg)
26961 {
26962   rtx parts[8];
26963   int i, words;
26964   unsigned regno = REGNO (reg);
26965   enum machine_mode mode = GET_MODE (reg);
26966
26967   if (TARGET_SPE
26968       && regno < 32
26969       && (SPE_VECTOR_MODE (GET_MODE (reg))
26970           || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
26971               && mode != SFmode && mode != SDmode && mode != SCmode)))
26972     ;
26973   else
26974     return NULL_RTX;
26975
26976   regno = REGNO (reg);
26977
26978   /* The duality of the SPE register size wreaks all kinds of havoc.
26979      This is a way of distinguishing r0 in 32-bits from r0 in
26980      64-bits.  */
26981   words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
26982   gcc_assert (words <= 4);
26983   for (i = 0; i < words; i++, regno++)
26984     {
26985       if (BYTES_BIG_ENDIAN)
26986         {
26987           parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
26988           parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
26989         }
26990       else
26991         {
26992           parts[2 * i] = gen_rtx_REG (SImode, regno);
26993           parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
26994         }
26995     }
26996
26997   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
26998 }
26999
27000 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
27001
27002 static void
27003 rs6000_init_dwarf_reg_sizes_extra (tree address)
27004 {
27005   if (TARGET_SPE)
27006     {
27007       int i;
27008       enum machine_mode mode = TYPE_MODE (char_type_node);
27009       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
27010       rtx mem = gen_rtx_MEM (BLKmode, addr);
27011       rtx value = gen_int_mode (4, mode);
27012
27013       for (i = 1201; i < 1232; i++)
27014         {
27015           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
27016           HOST_WIDE_INT offset
27017             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
27018
27019           emit_move_insn (adjust_address (mem, mode, offset), value);
27020         }
27021     }
27022 }
27023
27024 /* Map internal gcc register numbers to DWARF2 register numbers.  */
27025
27026 unsigned int
27027 rs6000_dbx_register_number (unsigned int regno)
27028 {
27029   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
27030     return regno;
27031   if (regno == MQ_REGNO)
27032     return 100;
27033   if (regno == LR_REGNO)
27034     return 108;
27035   if (regno == CTR_REGNO)
27036     return 109;
27037   if (CR_REGNO_P (regno))
27038     return regno - CR0_REGNO + 86;
27039   if (regno == CA_REGNO)
27040     return 101;  /* XER */
27041   if (ALTIVEC_REGNO_P (regno))
27042     return regno - FIRST_ALTIVEC_REGNO + 1124;
27043   if (regno == VRSAVE_REGNO)
27044     return 356;
27045   if (regno == VSCR_REGNO)
27046     return 67;
27047   if (regno == SPE_ACC_REGNO)
27048     return 99;
27049   if (regno == SPEFSCR_REGNO)
27050     return 612;
27051   /* SPE high reg number.  We get these values of regno from
27052      rs6000_dwarf_register_span.  */
27053   gcc_assert (regno >= 1200 && regno < 1232);
27054   return regno;
27055 }
27056
27057 /* target hook eh_return_filter_mode */
27058 static enum machine_mode
27059 rs6000_eh_return_filter_mode (void)
27060 {
27061   return TARGET_32BIT ? SImode : word_mode;
27062 }
27063
27064 /* Target hook for scalar_mode_supported_p.  */
27065 static bool
27066 rs6000_scalar_mode_supported_p (enum machine_mode mode)
27067 {
27068   if (DECIMAL_FLOAT_MODE_P (mode))
27069     return default_decimal_float_supported_p ();
27070   else
27071     return default_scalar_mode_supported_p (mode);
27072 }
27073
27074 /* Target hook for vector_mode_supported_p.  */
27075 static bool
27076 rs6000_vector_mode_supported_p (enum machine_mode mode)
27077 {
27078
27079   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
27080     return true;
27081
27082   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
27083     return true;
27084
27085   else if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
27086     return true;
27087
27088   else
27089     return false;
27090 }
27091
27092 /* Target hook for invalid_arg_for_unprototyped_fn. */
27093 static const char *
27094 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
27095 {
27096   return (!rs6000_darwin64_abi
27097           && typelist == 0
27098           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
27099           && (funcdecl == NULL_TREE
27100               || (TREE_CODE (funcdecl) == FUNCTION_DECL
27101                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
27102           ? N_("AltiVec argument passed to unprototyped function")
27103           : NULL;
27104 }
27105
27106 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
27107    setup by using __stack_chk_fail_local hidden function instead of
27108    calling __stack_chk_fail directly.  Otherwise it is better to call
27109    __stack_chk_fail directly.  */
27110
27111 static tree
27112 rs6000_stack_protect_fail (void)
27113 {
27114   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
27115          ? default_hidden_stack_protect_fail ()
27116          : default_external_stack_protect_fail ();
27117 }
27118
27119 void
27120 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
27121                            int num_operands ATTRIBUTE_UNUSED)
27122 {
27123   if (rs6000_warn_cell_microcode)
27124     {
27125       const char *temp;
27126       int insn_code_number = recog_memoized (insn);
27127       location_t location = locator_location (INSN_LOCATOR (insn));
27128
27129       /* Punt on insns we cannot recognize.  */
27130       if (insn_code_number < 0)
27131         return;
27132
27133       temp = get_insn_template (insn_code_number, insn);
27134
27135       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
27136         warning_at (location, OPT_mwarn_cell_microcode,
27137                     "emitting microcode insn %s\t[%s] #%d",
27138                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn)); 
27139       else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
27140         warning_at (location, OPT_mwarn_cell_microcode,
27141                     "emitting conditional microcode insn %s\t[%s] #%d",
27142                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
27143     }
27144 }
27145
27146 \f
27147 /* Allocate a stack temp and fixup the address so it meets the particular
27148    memory requirements (either offetable or REG+REG addressing).  */
27149
27150 rtx
27151 rs6000_allocate_stack_temp (enum machine_mode mode,
27152                             bool offsettable_p,
27153                             bool reg_reg_p)
27154 {
27155   rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
27156   rtx addr = XEXP (stack, 0);
27157   int strict_p = (reload_in_progress || reload_completed);
27158
27159   if (!legitimate_indirect_address_p (addr, strict_p))
27160     {
27161       if (offsettable_p
27162           && !rs6000_legitimate_offset_address_p (mode, addr, strict_p))
27163         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
27164
27165       else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
27166         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
27167     }
27168
27169   return stack;
27170 }
27171
27172 /* Given a memory reference, if it is not a reg or reg+reg addressing, convert
27173    to such a form to deal with memory reference instructions like STFIWX that
27174    only take reg+reg addressing.  */
27175
27176 rtx
27177 rs6000_address_for_fpconvert (rtx x)
27178 {
27179   int strict_p = (reload_in_progress || reload_completed);
27180   rtx addr;
27181
27182   gcc_assert (MEM_P (x));
27183   addr = XEXP (x, 0);
27184   if (! legitimate_indirect_address_p (addr, strict_p)
27185       && ! legitimate_indexed_address_p (addr, strict_p))
27186     x = replace_equiv_address (x, copy_addr_to_reg (addr));
27187
27188   return x;
27189 }
27190
27191 /* Expand 32-bit int -> floating point conversions.  Return true if
27192    successful.  */
27193
27194 void
27195 rs6000_expand_convert_si_to_sfdf (rtx dest, rtx src, bool unsigned_p)
27196 {
27197   enum machine_mode dmode = GET_MODE (dest);
27198   rtx (*func_si) (rtx, rtx, rtx, rtx);
27199   rtx (*func_si_mem) (rtx, rtx);
27200   rtx (*func_di) (rtx, rtx);
27201   rtx reg, stack;
27202
27203   gcc_assert (GET_MODE (src) == SImode);
27204
27205   if (dmode == SFmode)
27206     {
27207       if (unsigned_p)
27208         {
27209           gcc_assert (TARGET_FCFIDUS && TARGET_LFIWZX);
27210           func_si = gen_floatunssisf2_lfiwzx;
27211           func_si_mem = gen_floatunssisf2_lfiwzx_mem;
27212           func_di = gen_floatunsdisf2;
27213         }
27214       else
27215         {
27216           gcc_assert (TARGET_FCFIDS && TARGET_LFIWAX);
27217           func_si = gen_floatsisf2_lfiwax;
27218           func_si_mem = gen_floatsisf2_lfiwax_mem;
27219           func_di = gen_floatdisf2;
27220         }
27221     }
27222
27223   else if (dmode == DFmode)
27224     {
27225       if (unsigned_p)
27226         {
27227           gcc_assert (TARGET_FCFIDU && TARGET_LFIWZX);
27228           func_si = gen_floatunssidf2_lfiwzx;
27229           func_si_mem = gen_floatunssidf2_lfiwzx_mem;
27230           func_di = gen_floatunsdidf2;
27231         }
27232       else
27233         {
27234           gcc_assert (TARGET_FCFID && TARGET_LFIWAX);
27235           func_si = gen_floatsidf2_lfiwax;
27236           func_si_mem = gen_floatsidf2_lfiwax_mem;
27237           func_di = gen_floatdidf2;
27238         }
27239     }
27240
27241   else
27242     gcc_unreachable ();
27243
27244   if (MEM_P (src))
27245     {
27246       src = rs6000_address_for_fpconvert (src);
27247       emit_insn (func_si_mem (dest, src));
27248     }
27249   else if (!TARGET_MFPGPR)
27250     {
27251       reg = gen_reg_rtx (DImode);
27252       stack = rs6000_allocate_stack_temp (SImode, false, true);
27253       emit_insn (func_si (dest, src, stack, reg));
27254     }
27255   else
27256     {
27257       if (!REG_P (src))
27258         src = force_reg (SImode, src);
27259       reg = convert_to_mode (DImode, src, unsigned_p);
27260       emit_insn (func_di (dest, reg));
27261     }
27262 }
27263
27264 #include "gt-rs6000.h"