OSDN Git Service

* dwarf2out.c (dwarf2out_frame_debug_expr): Consult the
[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
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 "real.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-attr.h"
34 #include "flags.h"
35 #include "recog.h"
36 #include "obstack.h"
37 #include "tree.h"
38 #include "expr.h"
39 #include "optabs.h"
40 #include "except.h"
41 #include "function.h"
42 #include "output.h"
43 #include "basic-block.h"
44 #include "integrate.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 "tree-gimple.h"
56 #include "tree-flow.h"
57 #include "intl.h"
58 #include "params.h"
59 #include "tm-constrs.h"
60 #if TARGET_XCOFF
61 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
62 #endif
63 #if TARGET_MACHO
64 #include "gstab.h"  /* for N_SLINE */
65 #endif
66
67 #ifndef TARGET_NO_PROTOTYPE
68 #define TARGET_NO_PROTOTYPE 0
69 #endif
70
71 #define min(A,B)        ((A) < (B) ? (A) : (B))
72 #define max(A,B)        ((A) > (B) ? (A) : (B))
73
74 /* Structure used to define the rs6000 stack */
75 typedef struct rs6000_stack {
76   int first_gp_reg_save;        /* first callee saved GP register used */
77   int first_fp_reg_save;        /* first callee saved FP register used */
78   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
79   int lr_save_p;                /* true if the link reg needs to be saved */
80   int cr_save_p;                /* true if the CR reg needs to be saved */
81   unsigned int vrsave_mask;     /* mask of vec registers to save */
82   int push_p;                   /* true if we need to allocate stack space */
83   int calls_p;                  /* true if the function makes any calls */
84   int world_save_p;             /* true if we're saving *everything*:
85                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
86   enum rs6000_abi abi;          /* which ABI to use */
87   int gp_save_offset;           /* offset to save GP regs from initial SP */
88   int fp_save_offset;           /* offset to save FP regs from initial SP */
89   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
90   int lr_save_offset;           /* offset to save LR from initial SP */
91   int cr_save_offset;           /* offset to save CR from initial SP */
92   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
93   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
94   int varargs_save_offset;      /* offset to save the varargs registers */
95   int ehrd_offset;              /* offset to EH return data */
96   int reg_size;                 /* register size (4 or 8) */
97   HOST_WIDE_INT vars_size;      /* variable save area size */
98   int parm_size;                /* outgoing parameter size */
99   int save_size;                /* save area size */
100   int fixed_size;               /* fixed size of stack frame */
101   int gp_size;                  /* size of saved GP registers */
102   int fp_size;                  /* size of saved FP registers */
103   int altivec_size;             /* size of saved AltiVec registers */
104   int cr_size;                  /* size to hold CR if not in save_size */
105   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
106   int altivec_padding_size;     /* size of altivec alignment padding if
107                                    not in save_size */
108   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
109   int spe_padding_size;
110   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
111   int spe_64bit_regs_used;
112 } rs6000_stack_t;
113
114 /* A C structure for machine-specific, per-function data.
115    This is added to the cfun structure.  */
116 typedef struct machine_function GTY(())
117 {
118   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
119   int ra_needs_full_frame;
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 (0) was used.  */
125   int ra_need_lr;
126   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
127      varargs save area.  */
128   HOST_WIDE_INT varargs_save_offset;
129   /* Temporary stack slot to use for SDmode copies.  This slot is
130      64-bits wide and is allocated early enough so that the offset
131      does not overflow the 16-bit load/store offset field.  */
132   rtx sdmode_stack_slot;
133 } machine_function;
134
135 /* Target cpu type */
136
137 enum processor_type rs6000_cpu;
138 struct rs6000_cpu_select rs6000_select[3] =
139 {
140   /* switch             name,                   tune    arch */
141   { (const char *)0,    "--with-cpu=",          1,      1 },
142   { (const char *)0,    "-mcpu=",               1,      1 },
143   { (const char *)0,    "-mtune=",              1,      0 },
144 };
145
146 static GTY(()) bool rs6000_cell_dont_microcode;
147
148 /* Always emit branch hint bits.  */
149 static GTY(()) bool rs6000_always_hint;
150
151 /* Schedule instructions for group formation.  */
152 static GTY(()) bool rs6000_sched_groups;
153
154 /* Align branch targets.  */
155 static GTY(()) bool rs6000_align_branch_targets;
156
157 /* Support for -msched-costly-dep option.  */
158 const char *rs6000_sched_costly_dep_str;
159 enum rs6000_dependence_cost rs6000_sched_costly_dep;
160
161 /* Support for -minsert-sched-nops option.  */
162 const char *rs6000_sched_insert_nops_str;
163 enum rs6000_nop_insertion rs6000_sched_insert_nops;
164
165 /* Support targetm.vectorize.builtin_mask_for_load.  */
166 static GTY(()) tree altivec_builtin_mask_for_load;
167
168 /* Size of long double.  */
169 int rs6000_long_double_type_size;
170
171 /* IEEE quad extended precision long double. */
172 int rs6000_ieeequad;
173
174 /* Nonzero to use AltiVec ABI.  */
175 int rs6000_altivec_abi;
176
177 /* Nonzero if we want SPE ABI extensions.  */
178 int rs6000_spe_abi;
179
180 /* Nonzero if floating point operations are done in the GPRs.  */
181 int rs6000_float_gprs = 0;
182
183 /* Nonzero if we want Darwin's struct-by-value-in-regs ABI.  */
184 int rs6000_darwin64_abi;
185
186 /* Set to nonzero once AIX common-mode calls have been defined.  */
187 static GTY(()) int common_mode_defined;
188
189 /* Save information from a "cmpxx" operation until the branch or scc is
190    emitted.  */
191 rtx rs6000_compare_op0, rs6000_compare_op1;
192 int rs6000_compare_fp_p;
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
227 /* Value is TRUE if register/mode pair is acceptable.  */
228 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
229
230 /* Built in types.  */
231
232 tree rs6000_builtin_types[RS6000_BTI_MAX];
233 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
234
235 const char *rs6000_traceback_name;
236 static enum {
237   traceback_default = 0,
238   traceback_none,
239   traceback_part,
240   traceback_full
241 } rs6000_traceback;
242
243 /* Flag to say the TOC is initialized */
244 int toc_initialized;
245 char toc_label_name[10];
246
247 /* Cached value of rs6000_variable_issue. This is cached in
248    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
249 static short cached_can_issue_more;
250
251 static GTY(()) section *read_only_data_section;
252 static GTY(()) section *private_data_section;
253 static GTY(()) section *read_only_private_data_section;
254 static GTY(()) section *sdata2_section;
255 static GTY(()) section *toc_section;
256
257 /* Control alignment for fields within structures.  */
258 /* String from -malign-XXXXX.  */
259 int rs6000_alignment_flags;
260
261 /* True for any options that were explicitly set.  */
262 struct {
263   bool aix_struct_ret;          /* True if -maix-struct-ret was used.  */
264   bool alignment;               /* True if -malign- was used.  */
265   bool spe_abi;                 /* True if -mabi=spe/no-spe was used.  */
266   bool altivec_abi;             /* True if -mabi=altivec/no-altivec used.  */
267   bool spe;                     /* True if -mspe= was used.  */
268   bool float_gprs;              /* True if -mfloat-gprs= was used.  */
269   bool isel;                    /* True if -misel was used. */
270   bool long_double;             /* True if -mlong-double- was used.  */
271   bool ieee;                    /* True if -mabi=ieee/ibmlongdouble used.  */
272   bool vrsave;                  /* True if -mvrsave was used.  */
273 } rs6000_explicit_options;
274
275 struct builtin_description
276 {
277   /* mask is not const because we're going to alter it below.  This
278      nonsense will go away when we rewrite the -march infrastructure
279      to give us more target flag bits.  */
280   unsigned int mask;
281   const enum insn_code icode;
282   const char *const name;
283   const enum rs6000_builtins code;
284 };
285 \f
286 /* Target cpu costs.  */
287
288 struct processor_costs {
289   const int mulsi;        /* cost of SImode multiplication.  */
290   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
291   const int mulsi_const9; /* cost of SImode mult by short constant.  */
292   const int muldi;        /* cost of DImode multiplication.  */
293   const int divsi;        /* cost of SImode division.  */
294   const int divdi;        /* cost of DImode division.  */
295   const int fp;           /* cost of simple SFmode and DFmode insns.  */
296   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
297   const int sdiv;         /* cost of SFmode division (fdivs).  */
298   const int ddiv;         /* cost of DFmode division (fdiv).  */
299   const int cache_line_size;    /* cache line size in bytes. */
300   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
301   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
302   const int simultaneous_prefetches; /* number of parallel prefetch
303                                         operations.  */
304 };
305
306 const struct processor_costs *rs6000_cost;
307
308 /* Processor costs (relative to an add) */
309
310 /* Instruction size costs on 32bit processors.  */
311 static const
312 struct processor_costs size32_cost = {
313   COSTS_N_INSNS (1),    /* mulsi */
314   COSTS_N_INSNS (1),    /* mulsi_const */
315   COSTS_N_INSNS (1),    /* mulsi_const9 */
316   COSTS_N_INSNS (1),    /* muldi */
317   COSTS_N_INSNS (1),    /* divsi */
318   COSTS_N_INSNS (1),    /* divdi */
319   COSTS_N_INSNS (1),    /* fp */
320   COSTS_N_INSNS (1),    /* dmul */
321   COSTS_N_INSNS (1),    /* sdiv */
322   COSTS_N_INSNS (1),    /* ddiv */
323   32,
324   0,
325   0,
326   0,
327 };
328
329 /* Instruction size costs on 64bit processors.  */
330 static const
331 struct processor_costs size64_cost = {
332   COSTS_N_INSNS (1),    /* mulsi */
333   COSTS_N_INSNS (1),    /* mulsi_const */
334   COSTS_N_INSNS (1),    /* mulsi_const9 */
335   COSTS_N_INSNS (1),    /* muldi */
336   COSTS_N_INSNS (1),    /* divsi */
337   COSTS_N_INSNS (1),    /* divdi */
338   COSTS_N_INSNS (1),    /* fp */
339   COSTS_N_INSNS (1),    /* dmul */
340   COSTS_N_INSNS (1),    /* sdiv */
341   COSTS_N_INSNS (1),    /* ddiv */
342   128,
343   0,
344   0,
345   0,
346 };
347
348 /* Instruction costs on RIOS1 processors.  */
349 static const
350 struct processor_costs rios1_cost = {
351   COSTS_N_INSNS (5),    /* mulsi */
352   COSTS_N_INSNS (4),    /* mulsi_const */
353   COSTS_N_INSNS (3),    /* mulsi_const9 */
354   COSTS_N_INSNS (5),    /* muldi */
355   COSTS_N_INSNS (19),   /* divsi */
356   COSTS_N_INSNS (19),   /* divdi */
357   COSTS_N_INSNS (2),    /* fp */
358   COSTS_N_INSNS (2),    /* dmul */
359   COSTS_N_INSNS (19),   /* sdiv */
360   COSTS_N_INSNS (19),   /* ddiv */
361   128,                  /* cache line size */
362   64,                   /* l1 cache */
363   512,                  /* l2 cache */
364   0,                    /* streams */
365 };
366
367 /* Instruction costs on RIOS2 processors.  */
368 static const
369 struct processor_costs rios2_cost = {
370   COSTS_N_INSNS (2),    /* mulsi */
371   COSTS_N_INSNS (2),    /* mulsi_const */
372   COSTS_N_INSNS (2),    /* mulsi_const9 */
373   COSTS_N_INSNS (2),    /* muldi */
374   COSTS_N_INSNS (13),   /* divsi */
375   COSTS_N_INSNS (13),   /* divdi */
376   COSTS_N_INSNS (2),    /* fp */
377   COSTS_N_INSNS (2),    /* dmul */
378   COSTS_N_INSNS (17),   /* sdiv */
379   COSTS_N_INSNS (17),   /* ddiv */
380   256,                  /* cache line size */
381   256,                  /* l1 cache */
382   1024,                 /* l2 cache */
383   0,                    /* streams */
384 };
385
386 /* Instruction costs on RS64A processors.  */
387 static const
388 struct processor_costs rs64a_cost = {
389   COSTS_N_INSNS (20),   /* mulsi */
390   COSTS_N_INSNS (12),   /* mulsi_const */
391   COSTS_N_INSNS (8),    /* mulsi_const9 */
392   COSTS_N_INSNS (34),   /* muldi */
393   COSTS_N_INSNS (65),   /* divsi */
394   COSTS_N_INSNS (67),   /* divdi */
395   COSTS_N_INSNS (4),    /* fp */
396   COSTS_N_INSNS (4),    /* dmul */
397   COSTS_N_INSNS (31),   /* sdiv */
398   COSTS_N_INSNS (31),   /* ddiv */
399   128,                  /* cache line size */
400   128,                  /* l1 cache */
401   2048,                 /* l2 cache */
402   1,                    /* streams */
403 };
404
405 /* Instruction costs on MPCCORE processors.  */
406 static const
407 struct processor_costs mpccore_cost = {
408   COSTS_N_INSNS (2),    /* mulsi */
409   COSTS_N_INSNS (2),    /* mulsi_const */
410   COSTS_N_INSNS (2),    /* mulsi_const9 */
411   COSTS_N_INSNS (2),    /* muldi */
412   COSTS_N_INSNS (6),    /* divsi */
413   COSTS_N_INSNS (6),    /* divdi */
414   COSTS_N_INSNS (4),    /* fp */
415   COSTS_N_INSNS (5),    /* dmul */
416   COSTS_N_INSNS (10),   /* sdiv */
417   COSTS_N_INSNS (17),   /* ddiv */
418   32,                   /* cache line size */
419   4,                    /* l1 cache */
420   16,                   /* l2 cache */
421   1,                    /* streams */
422 };
423
424 /* Instruction costs on PPC403 processors.  */
425 static const
426 struct processor_costs ppc403_cost = {
427   COSTS_N_INSNS (4),    /* mulsi */
428   COSTS_N_INSNS (4),    /* mulsi_const */
429   COSTS_N_INSNS (4),    /* mulsi_const9 */
430   COSTS_N_INSNS (4),    /* muldi */
431   COSTS_N_INSNS (33),   /* divsi */
432   COSTS_N_INSNS (33),   /* divdi */
433   COSTS_N_INSNS (11),   /* fp */
434   COSTS_N_INSNS (11),   /* dmul */
435   COSTS_N_INSNS (11),   /* sdiv */
436   COSTS_N_INSNS (11),   /* ddiv */
437   32,                   /* cache line size */
438   4,                    /* l1 cache */
439   16,                   /* l2 cache */
440   1,                    /* streams */
441 };
442
443 /* Instruction costs on PPC405 processors.  */
444 static const
445 struct processor_costs ppc405_cost = {
446   COSTS_N_INSNS (5),    /* mulsi */
447   COSTS_N_INSNS (4),    /* mulsi_const */
448   COSTS_N_INSNS (3),    /* mulsi_const9 */
449   COSTS_N_INSNS (5),    /* muldi */
450   COSTS_N_INSNS (35),   /* divsi */
451   COSTS_N_INSNS (35),   /* divdi */
452   COSTS_N_INSNS (11),   /* fp */
453   COSTS_N_INSNS (11),   /* dmul */
454   COSTS_N_INSNS (11),   /* sdiv */
455   COSTS_N_INSNS (11),   /* ddiv */
456   32,                   /* cache line size */
457   16,                   /* l1 cache */
458   128,                  /* l2 cache */
459   1,                    /* streams */
460 };
461
462 /* Instruction costs on PPC440 processors.  */
463 static const
464 struct processor_costs ppc440_cost = {
465   COSTS_N_INSNS (3),    /* mulsi */
466   COSTS_N_INSNS (2),    /* mulsi_const */
467   COSTS_N_INSNS (2),    /* mulsi_const9 */
468   COSTS_N_INSNS (3),    /* muldi */
469   COSTS_N_INSNS (34),   /* divsi */
470   COSTS_N_INSNS (34),   /* divdi */
471   COSTS_N_INSNS (5),    /* fp */
472   COSTS_N_INSNS (5),    /* dmul */
473   COSTS_N_INSNS (19),   /* sdiv */
474   COSTS_N_INSNS (33),   /* ddiv */
475   32,                   /* cache line size */
476   32,                   /* l1 cache */
477   256,                  /* l2 cache */
478   1,                    /* streams */
479 };
480
481 /* Instruction costs on PPC601 processors.  */
482 static const
483 struct processor_costs ppc601_cost = {
484   COSTS_N_INSNS (5),    /* mulsi */
485   COSTS_N_INSNS (5),    /* mulsi_const */
486   COSTS_N_INSNS (5),    /* mulsi_const9 */
487   COSTS_N_INSNS (5),    /* muldi */
488   COSTS_N_INSNS (36),   /* divsi */
489   COSTS_N_INSNS (36),   /* divdi */
490   COSTS_N_INSNS (4),    /* fp */
491   COSTS_N_INSNS (5),    /* dmul */
492   COSTS_N_INSNS (17),   /* sdiv */
493   COSTS_N_INSNS (31),   /* ddiv */
494   32,                   /* cache line size */
495   32,                   /* l1 cache */
496   256,                  /* l2 cache */
497   1,                    /* streams */
498 };
499
500 /* Instruction costs on PPC603 processors.  */
501 static const
502 struct processor_costs ppc603_cost = {
503   COSTS_N_INSNS (5),    /* mulsi */
504   COSTS_N_INSNS (3),    /* mulsi_const */
505   COSTS_N_INSNS (2),    /* mulsi_const9 */
506   COSTS_N_INSNS (5),    /* muldi */
507   COSTS_N_INSNS (37),   /* divsi */
508   COSTS_N_INSNS (37),   /* divdi */
509   COSTS_N_INSNS (3),    /* fp */
510   COSTS_N_INSNS (4),    /* dmul */
511   COSTS_N_INSNS (18),   /* sdiv */
512   COSTS_N_INSNS (33),   /* ddiv */
513   32,                   /* cache line size */
514   8,                    /* l1 cache */
515   64,                   /* l2 cache */
516   1,                    /* streams */
517 };
518
519 /* Instruction costs on PPC604 processors.  */
520 static const
521 struct processor_costs ppc604_cost = {
522   COSTS_N_INSNS (4),    /* mulsi */
523   COSTS_N_INSNS (4),    /* mulsi_const */
524   COSTS_N_INSNS (4),    /* mulsi_const9 */
525   COSTS_N_INSNS (4),    /* muldi */
526   COSTS_N_INSNS (20),   /* divsi */
527   COSTS_N_INSNS (20),   /* divdi */
528   COSTS_N_INSNS (3),    /* fp */
529   COSTS_N_INSNS (3),    /* dmul */
530   COSTS_N_INSNS (18),   /* sdiv */
531   COSTS_N_INSNS (32),   /* ddiv */
532   32,                   /* cache line size */
533   16,                   /* l1 cache */
534   512,                  /* l2 cache */
535   1,                    /* streams */
536 };
537
538 /* Instruction costs on PPC604e processors.  */
539 static const
540 struct processor_costs ppc604e_cost = {
541   COSTS_N_INSNS (2),    /* mulsi */
542   COSTS_N_INSNS (2),    /* mulsi_const */
543   COSTS_N_INSNS (2),    /* mulsi_const9 */
544   COSTS_N_INSNS (2),    /* muldi */
545   COSTS_N_INSNS (20),   /* divsi */
546   COSTS_N_INSNS (20),   /* divdi */
547   COSTS_N_INSNS (3),    /* fp */
548   COSTS_N_INSNS (3),    /* dmul */
549   COSTS_N_INSNS (18),   /* sdiv */
550   COSTS_N_INSNS (32),   /* ddiv */
551   32,                   /* cache line size */
552   32,                   /* l1 cache */
553   1024,                 /* l2 cache */
554   1,                    /* streams */
555 };
556
557 /* Instruction costs on PPC620 processors.  */
558 static const
559 struct processor_costs ppc620_cost = {
560   COSTS_N_INSNS (5),    /* mulsi */
561   COSTS_N_INSNS (4),    /* mulsi_const */
562   COSTS_N_INSNS (3),    /* mulsi_const9 */
563   COSTS_N_INSNS (7),    /* muldi */
564   COSTS_N_INSNS (21),   /* divsi */
565   COSTS_N_INSNS (37),   /* divdi */
566   COSTS_N_INSNS (3),    /* fp */
567   COSTS_N_INSNS (3),    /* dmul */
568   COSTS_N_INSNS (18),   /* sdiv */
569   COSTS_N_INSNS (32),   /* ddiv */
570   128,                  /* cache line size */
571   32,                   /* l1 cache */
572   1024,                 /* l2 cache */
573   1,                    /* streams */
574 };
575
576 /* Instruction costs on PPC630 processors.  */
577 static const
578 struct processor_costs ppc630_cost = {
579   COSTS_N_INSNS (5),    /* mulsi */
580   COSTS_N_INSNS (4),    /* mulsi_const */
581   COSTS_N_INSNS (3),    /* mulsi_const9 */
582   COSTS_N_INSNS (7),    /* muldi */
583   COSTS_N_INSNS (21),   /* divsi */
584   COSTS_N_INSNS (37),   /* divdi */
585   COSTS_N_INSNS (3),    /* fp */
586   COSTS_N_INSNS (3),    /* dmul */
587   COSTS_N_INSNS (17),   /* sdiv */
588   COSTS_N_INSNS (21),   /* ddiv */
589   128,                  /* cache line size */
590   64,                   /* l1 cache */
591   1024,                 /* l2 cache */
592   1,                    /* streams */
593 };
594
595 /* Instruction costs on Cell processor.  */
596 /* COSTS_N_INSNS (1) ~ one add.  */
597 static const
598 struct processor_costs ppccell_cost = {
599   COSTS_N_INSNS (9/2)+2,    /* mulsi */
600   COSTS_N_INSNS (6/2),    /* mulsi_const */
601   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
602   COSTS_N_INSNS (15/2)+2,   /* muldi */
603   COSTS_N_INSNS (38/2),   /* divsi */
604   COSTS_N_INSNS (70/2),   /* divdi */
605   COSTS_N_INSNS (10/2),   /* fp */
606   COSTS_N_INSNS (10/2),   /* dmul */
607   COSTS_N_INSNS (74/2),   /* sdiv */
608   COSTS_N_INSNS (74/2),   /* ddiv */
609   128,                  /* cache line size */
610   32,                   /* l1 cache */
611   512,                  /* l2 cache */
612   6,                    /* streams */
613 };
614
615 /* Instruction costs on PPC750 and PPC7400 processors.  */
616 static const
617 struct processor_costs ppc750_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 (17),   /* divsi */
623   COSTS_N_INSNS (17),   /* divdi */
624   COSTS_N_INSNS (3),    /* fp */
625   COSTS_N_INSNS (3),    /* dmul */
626   COSTS_N_INSNS (17),   /* sdiv */
627   COSTS_N_INSNS (31),   /* ddiv */
628   32,                   /* cache line size */
629   32,                   /* l1 cache */
630   512,                  /* l2 cache */
631   1,                    /* streams */
632 };
633
634 /* Instruction costs on PPC7450 processors.  */
635 static const
636 struct processor_costs ppc7450_cost = {
637   COSTS_N_INSNS (4),    /* mulsi */
638   COSTS_N_INSNS (3),    /* mulsi_const */
639   COSTS_N_INSNS (3),    /* mulsi_const9 */
640   COSTS_N_INSNS (4),    /* muldi */
641   COSTS_N_INSNS (23),   /* divsi */
642   COSTS_N_INSNS (23),   /* divdi */
643   COSTS_N_INSNS (5),    /* fp */
644   COSTS_N_INSNS (5),    /* dmul */
645   COSTS_N_INSNS (21),   /* sdiv */
646   COSTS_N_INSNS (35),   /* ddiv */
647   32,                   /* cache line size */
648   32,                   /* l1 cache */
649   1024,                 /* l2 cache */
650   1,                    /* streams */
651 };
652
653 /* Instruction costs on PPC8540 processors.  */
654 static const
655 struct processor_costs ppc8540_cost = {
656   COSTS_N_INSNS (4),    /* mulsi */
657   COSTS_N_INSNS (4),    /* mulsi_const */
658   COSTS_N_INSNS (4),    /* mulsi_const9 */
659   COSTS_N_INSNS (4),    /* muldi */
660   COSTS_N_INSNS (19),   /* divsi */
661   COSTS_N_INSNS (19),   /* divdi */
662   COSTS_N_INSNS (4),    /* fp */
663   COSTS_N_INSNS (4),    /* dmul */
664   COSTS_N_INSNS (29),   /* sdiv */
665   COSTS_N_INSNS (29),   /* ddiv */
666   32,                   /* cache line size */
667   32,                   /* l1 cache */
668   256,                  /* l2 cache */
669   1,                    /* prefetch streams /*/
670 };
671
672 /* Instruction costs on E300C2 and E300C3 cores.  */
673 static const
674 struct processor_costs ppce300c2c3_cost = {
675   COSTS_N_INSNS (4),    /* mulsi */
676   COSTS_N_INSNS (4),    /* mulsi_const */
677   COSTS_N_INSNS (4),    /* mulsi_const9 */
678   COSTS_N_INSNS (4),    /* muldi */
679   COSTS_N_INSNS (19),   /* divsi */
680   COSTS_N_INSNS (19),   /* divdi */
681   COSTS_N_INSNS (3),    /* fp */
682   COSTS_N_INSNS (4),    /* dmul */
683   COSTS_N_INSNS (18),   /* sdiv */
684   COSTS_N_INSNS (33),   /* ddiv */
685   32,
686   16,                   /* l1 cache */
687   16,                   /* l2 cache */
688   1,                    /* prefetch streams /*/
689 };
690
691 /* Instruction costs on POWER4 and POWER5 processors.  */
692 static const
693 struct processor_costs power4_cost = {
694   COSTS_N_INSNS (3),    /* mulsi */
695   COSTS_N_INSNS (2),    /* mulsi_const */
696   COSTS_N_INSNS (2),    /* mulsi_const9 */
697   COSTS_N_INSNS (4),    /* muldi */
698   COSTS_N_INSNS (18),   /* divsi */
699   COSTS_N_INSNS (34),   /* divdi */
700   COSTS_N_INSNS (3),    /* fp */
701   COSTS_N_INSNS (3),    /* dmul */
702   COSTS_N_INSNS (17),   /* sdiv */
703   COSTS_N_INSNS (17),   /* ddiv */
704   128,                  /* cache line size */
705   32,                   /* l1 cache */
706   1024,                 /* l2 cache */
707   8,                    /* prefetch streams /*/
708 };
709
710 /* Instruction costs on POWER6 processors.  */
711 static const
712 struct processor_costs power6_cost = {
713   COSTS_N_INSNS (8),    /* mulsi */
714   COSTS_N_INSNS (8),    /* mulsi_const */
715   COSTS_N_INSNS (8),    /* mulsi_const9 */
716   COSTS_N_INSNS (8),    /* muldi */
717   COSTS_N_INSNS (22),   /* divsi */
718   COSTS_N_INSNS (28),   /* divdi */
719   COSTS_N_INSNS (3),    /* fp */
720   COSTS_N_INSNS (3),    /* dmul */
721   COSTS_N_INSNS (13),   /* sdiv */
722   COSTS_N_INSNS (16),   /* ddiv */
723   128,                  /* cache line size */
724   64,                   /* l1 cache */
725   2048,                 /* l2 cache */
726   16,                   /* prefetch streams */
727 };
728
729 \f
730 static bool rs6000_function_ok_for_sibcall (tree, tree);
731 static const char *rs6000_invalid_within_doloop (const_rtx);
732 static rtx rs6000_generate_compare (enum rtx_code);
733 static void rs6000_emit_stack_tie (void);
734 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
735 static bool spe_func_has_64bit_regs_p (void);
736 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
737                              int, HOST_WIDE_INT);
738 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
739 static void rs6000_emit_allocate_stack (HOST_WIDE_INT, int);
740 static unsigned rs6000_hash_constant (rtx);
741 static unsigned toc_hash_function (const void *);
742 static int toc_hash_eq (const void *, const void *);
743 static int constant_pool_expr_1 (rtx, int *, int *);
744 static bool constant_pool_expr_p (rtx);
745 static bool legitimate_small_data_p (enum machine_mode, rtx);
746 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
747 static struct machine_function * rs6000_init_machine_status (void);
748 static bool rs6000_assemble_integer (rtx, unsigned int, int);
749 static bool no_global_regs_above (int);
750 #ifdef HAVE_GAS_HIDDEN
751 static void rs6000_assemble_visibility (tree, int);
752 #endif
753 static int rs6000_ra_ever_killed (void);
754 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
755 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
756 static bool rs6000_ms_bitfield_layout_p (const_tree);
757 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
758 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
759 static const char *rs6000_mangle_type (const_tree);
760 extern const struct attribute_spec rs6000_attribute_table[];
761 static void rs6000_set_default_type_attributes (tree);
762 static bool rs6000_reg_live_or_pic_offset_p (int);
763 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
764 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
765 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
766                                     tree);
767 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
768 static bool rs6000_return_in_memory (const_tree, const_tree);
769 static void rs6000_file_start (void);
770 #if TARGET_ELF
771 static int rs6000_elf_reloc_rw_mask (void);
772 static void rs6000_elf_asm_out_constructor (rtx, int);
773 static void rs6000_elf_asm_out_destructor (rtx, int);
774 static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
775 static void rs6000_elf_asm_init_sections (void);
776 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
777                                                unsigned HOST_WIDE_INT);
778 static void rs6000_elf_encode_section_info (tree, rtx, int)
779      ATTRIBUTE_UNUSED;
780 #endif
781 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
782 static void rs6000_alloc_sdmode_stack_slot (void);
783 static void rs6000_instantiate_decls (void);
784 #if TARGET_XCOFF
785 static void rs6000_xcoff_asm_output_anchor (rtx);
786 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
787 static void rs6000_xcoff_asm_init_sections (void);
788 static int rs6000_xcoff_reloc_rw_mask (void);
789 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
790 static section *rs6000_xcoff_select_section (tree, int,
791                                              unsigned HOST_WIDE_INT);
792 static void rs6000_xcoff_unique_section (tree, int);
793 static section *rs6000_xcoff_select_rtx_section
794   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
795 static const char * rs6000_xcoff_strip_name_encoding (const char *);
796 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
797 static void rs6000_xcoff_file_start (void);
798 static void rs6000_xcoff_file_end (void);
799 #endif
800 static int rs6000_variable_issue (FILE *, int, rtx, int);
801 static bool rs6000_rtx_costs (rtx, int, int, int *);
802 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
803 static void rs6000_sched_init (FILE *, int, int);
804 static bool is_microcoded_insn (rtx);
805 static bool is_nonpipeline_insn (rtx);
806 static bool is_cracked_insn (rtx);
807 static bool is_branch_slot_insn (rtx);
808 static bool is_load_insn (rtx);
809 static rtx get_store_dest (rtx pat);
810 static bool is_store_insn (rtx);
811 static bool set_to_load_agen (rtx,rtx);
812 static bool adjacent_mem_locations (rtx,rtx);
813 static int rs6000_adjust_priority (rtx, int);
814 static int rs6000_issue_rate (void);
815 static bool rs6000_is_costly_dependence (dep_t, int, int);
816 static rtx get_next_active_insn (rtx, rtx);
817 static bool insn_terminates_group_p (rtx , enum group_termination);
818 static bool insn_must_be_first_in_group (rtx);
819 static bool insn_must_be_last_in_group (rtx);
820 static bool is_costly_group (rtx *, rtx);
821 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
822 static int redefine_groups (FILE *, int, rtx, rtx);
823 static int pad_groups (FILE *, int, rtx, rtx);
824 static void rs6000_sched_finish (FILE *, int);
825 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
826 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
827 static int rs6000_use_sched_lookahead (void);
828 static int rs6000_use_sched_lookahead_guard (rtx);
829 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
830 static tree rs6000_builtin_mask_for_load (void);
831 static tree rs6000_builtin_mul_widen_even (tree);
832 static tree rs6000_builtin_mul_widen_odd (tree);
833 static tree rs6000_builtin_conversion (enum tree_code, tree);
834
835 static void def_builtin (int, const char *, tree, int);
836 static bool rs6000_vector_alignment_reachable (const_tree, bool);
837 static void rs6000_init_builtins (void);
838 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
839 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
840 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
841 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
842 static void altivec_init_builtins (void);
843 static void rs6000_common_init_builtins (void);
844 static void rs6000_init_libfuncs (void);
845
846 static void paired_init_builtins (void);
847 static rtx paired_expand_builtin (tree, rtx, bool *);
848 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
849 static rtx paired_expand_stv_builtin (enum insn_code, tree);
850 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
851
852 static void enable_mask_for_builtins (struct builtin_description *, int,
853                                       enum rs6000_builtins,
854                                       enum rs6000_builtins);
855 static tree build_opaque_vector_type (tree, int);
856 static void spe_init_builtins (void);
857 static rtx spe_expand_builtin (tree, rtx, bool *);
858 static rtx spe_expand_stv_builtin (enum insn_code, tree);
859 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
860 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
861 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
862 static rs6000_stack_t *rs6000_stack_info (void);
863 static void debug_stack_info (rs6000_stack_t *);
864
865 static rtx altivec_expand_builtin (tree, rtx, bool *);
866 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
867 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
868 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
869 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
870 static rtx altivec_expand_predicate_builtin (enum insn_code,
871                                              const char *, tree, rtx);
872 static rtx altivec_expand_lv_builtin (enum insn_code, tree, rtx);
873 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
874 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
875 static rtx altivec_expand_vec_set_builtin (tree);
876 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
877 static int get_element_number (tree, tree);
878 static bool rs6000_handle_option (size_t, const char *, int);
879 static void rs6000_parse_tls_size_option (void);
880 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
881 static int first_altivec_reg_to_save (void);
882 static unsigned int compute_vrsave_mask (void);
883 static void compute_save_world_info (rs6000_stack_t *info_ptr);
884 static void is_altivec_return_reg (rtx, void *);
885 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
886 int easy_vector_constant (rtx, enum machine_mode);
887 static bool rs6000_is_opaque_type (const_tree);
888 static rtx rs6000_dwarf_register_span (rtx);
889 static void rs6000_init_dwarf_reg_sizes_extra (tree);
890 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
891 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
892 static rtx rs6000_tls_get_addr (void);
893 static rtx rs6000_got_sym (void);
894 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
895 static const char *rs6000_get_some_local_dynamic_name (void);
896 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
897 static rtx rs6000_complex_function_value (enum machine_mode);
898 static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
899                                     enum machine_mode, tree);
900 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
901                                                       HOST_WIDE_INT);
902 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
903                                                         tree, HOST_WIDE_INT);
904 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
905                                               HOST_WIDE_INT,
906                                               rtx[], int *);
907 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
908                                                 const_tree, HOST_WIDE_INT,
909                                                 rtx[], int *);
910 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, int, bool);
911 static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
912 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
913 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
914                                     enum machine_mode, tree,
915                                     int *, int);
916 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
917                                       const_tree, bool);
918 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
919                                      tree, bool);
920 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
921 #if TARGET_MACHO
922 static void macho_branch_islands (void);
923 static int no_previous_def (tree function_name);
924 static tree get_prev_label (tree function_name);
925 static void rs6000_darwin_file_start (void);
926 #endif
927
928 static tree rs6000_build_builtin_va_list (void);
929 static void rs6000_va_start (tree, rtx);
930 static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *);
931 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
932 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
933 static bool rs6000_vector_mode_supported_p (enum machine_mode);
934 static int get_vec_cmp_insn (enum rtx_code, enum machine_mode,
935                              enum machine_mode);
936 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
937                                        enum machine_mode);
938 static int get_vsel_insn (enum machine_mode);
939 static void rs6000_emit_vector_select (rtx, rtx, rtx, rtx);
940 static tree rs6000_stack_protect_fail (void);
941
942 const int INSN_NOT_AVAILABLE = -1;
943 static enum machine_mode rs6000_eh_return_filter_mode (void);
944
945 /* Hash table stuff for keeping track of TOC entries.  */
946
947 struct toc_hash_struct GTY(())
948 {
949   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
950      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
951   rtx key;
952   enum machine_mode key_mode;
953   int labelno;
954 };
955
956 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
957 \f
958 /* Default register names.  */
959 char rs6000_reg_names[][8] =
960 {
961       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
962       "8",  "9", "10", "11", "12", "13", "14", "15",
963      "16", "17", "18", "19", "20", "21", "22", "23",
964      "24", "25", "26", "27", "28", "29", "30", "31",
965       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
966       "8",  "9", "10", "11", "12", "13", "14", "15",
967      "16", "17", "18", "19", "20", "21", "22", "23",
968      "24", "25", "26", "27", "28", "29", "30", "31",
969      "mq", "lr", "ctr","ap",
970       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
971       "xer",
972       /* AltiVec registers.  */
973       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
974       "8",  "9",  "10", "11", "12", "13", "14", "15",
975       "16", "17", "18", "19", "20", "21", "22", "23",
976       "24", "25", "26", "27", "28", "29", "30", "31",
977       "vrsave", "vscr",
978       /* SPE registers.  */
979       "spe_acc", "spefscr",
980       /* Soft frame pointer.  */
981       "sfp"
982 };
983
984 #ifdef TARGET_REGNAMES
985 static const char alt_reg_names[][8] =
986 {
987    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
988    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
989   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
990   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
991    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
992    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
993   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
994   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
995     "mq",    "lr",  "ctr",   "ap",
996   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
997    "xer",
998   /* AltiVec registers.  */
999    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1000    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1001   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1002   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1003   "vrsave", "vscr",
1004   /* SPE registers.  */
1005   "spe_acc", "spefscr",
1006   /* Soft frame pointer.  */
1007   "sfp"
1008 };
1009 #endif
1010 \f
1011 #ifndef MASK_STRICT_ALIGN
1012 #define MASK_STRICT_ALIGN 0
1013 #endif
1014 #ifndef TARGET_PROFILE_KERNEL
1015 #define TARGET_PROFILE_KERNEL 0
1016 #endif
1017
1018 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1019 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1020 \f
1021 /* Initialize the GCC target structure.  */
1022 #undef TARGET_ATTRIBUTE_TABLE
1023 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1024 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1025 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1026
1027 #undef TARGET_ASM_ALIGNED_DI_OP
1028 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1029
1030 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1031    for non-ELF systems.  */
1032 #ifndef OBJECT_FORMAT_ELF
1033 #if TARGET_XCOFF
1034 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1035    64-bit targets.  */
1036 #undef TARGET_ASM_UNALIGNED_HI_OP
1037 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1038 #undef TARGET_ASM_UNALIGNED_SI_OP
1039 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1040 #undef TARGET_ASM_UNALIGNED_DI_OP
1041 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1042 #else
1043 /* For Darwin.  */
1044 #undef TARGET_ASM_UNALIGNED_HI_OP
1045 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1046 #undef TARGET_ASM_UNALIGNED_SI_OP
1047 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1048 #undef TARGET_ASM_UNALIGNED_DI_OP
1049 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1050 #undef TARGET_ASM_ALIGNED_DI_OP
1051 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1052 #endif
1053 #endif
1054
1055 /* This hook deals with fixups for relocatable code and DI-mode objects
1056    in 64-bit code.  */
1057 #undef TARGET_ASM_INTEGER
1058 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1059
1060 #ifdef HAVE_GAS_HIDDEN
1061 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1062 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1063 #endif
1064
1065 #undef TARGET_HAVE_TLS
1066 #define TARGET_HAVE_TLS HAVE_AS_TLS
1067
1068 #undef TARGET_CANNOT_FORCE_CONST_MEM
1069 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
1070
1071 #undef TARGET_ASM_FUNCTION_PROLOGUE
1072 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1073 #undef TARGET_ASM_FUNCTION_EPILOGUE
1074 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1075
1076 #undef  TARGET_SCHED_VARIABLE_ISSUE
1077 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1078
1079 #undef TARGET_SCHED_ISSUE_RATE
1080 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1081 #undef TARGET_SCHED_ADJUST_COST
1082 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1083 #undef TARGET_SCHED_ADJUST_PRIORITY
1084 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1085 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1086 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1087 #undef TARGET_SCHED_INIT
1088 #define TARGET_SCHED_INIT rs6000_sched_init
1089 #undef TARGET_SCHED_FINISH
1090 #define TARGET_SCHED_FINISH rs6000_sched_finish
1091 #undef TARGET_SCHED_REORDER
1092 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1093 #undef TARGET_SCHED_REORDER2
1094 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1095
1096 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1097 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1098
1099 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1100 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1101
1102 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1103 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1104 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1105 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1106 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1107 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1108 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1109 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1110
1111 #undef TARGET_VECTOR_ALIGNMENT_REACHABLE
1112 #define TARGET_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1113
1114 #undef TARGET_INIT_BUILTINS
1115 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1116
1117 #undef TARGET_EXPAND_BUILTIN
1118 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1119
1120 #undef TARGET_MANGLE_TYPE
1121 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1122
1123 #undef TARGET_INIT_LIBFUNCS
1124 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1125
1126 #if TARGET_MACHO
1127 #undef TARGET_BINDS_LOCAL_P
1128 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1129 #endif
1130
1131 #undef TARGET_MS_BITFIELD_LAYOUT_P
1132 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1133
1134 #undef TARGET_ASM_OUTPUT_MI_THUNK
1135 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1136
1137 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1138 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1139
1140 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1141 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1142
1143 #undef TARGET_INVALID_WITHIN_DOLOOP
1144 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1145
1146 #undef TARGET_RTX_COSTS
1147 #define TARGET_RTX_COSTS rs6000_rtx_costs
1148 #undef TARGET_ADDRESS_COST
1149 #define TARGET_ADDRESS_COST hook_int_rtx_0
1150
1151 #undef TARGET_VECTOR_OPAQUE_P
1152 #define TARGET_VECTOR_OPAQUE_P rs6000_is_opaque_type
1153
1154 #undef TARGET_DWARF_REGISTER_SPAN
1155 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1156
1157 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1158 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1159
1160 /* On rs6000, function arguments are promoted, as are function return
1161    values.  */
1162 #undef TARGET_PROMOTE_FUNCTION_ARGS
1163 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
1164 #undef TARGET_PROMOTE_FUNCTION_RETURN
1165 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
1166
1167 #undef TARGET_RETURN_IN_MEMORY
1168 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1169
1170 #undef TARGET_SETUP_INCOMING_VARARGS
1171 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1172
1173 /* Always strict argument naming on rs6000.  */
1174 #undef TARGET_STRICT_ARGUMENT_NAMING
1175 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1176 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1177 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1178 #undef TARGET_SPLIT_COMPLEX_ARG
1179 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1180 #undef TARGET_MUST_PASS_IN_STACK
1181 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1182 #undef TARGET_PASS_BY_REFERENCE
1183 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1184 #undef TARGET_ARG_PARTIAL_BYTES
1185 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1186
1187 #undef TARGET_BUILD_BUILTIN_VA_LIST
1188 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1189
1190 #undef TARGET_EXPAND_BUILTIN_VA_START
1191 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1192
1193 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1194 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1195
1196 #undef TARGET_EH_RETURN_FILTER_MODE
1197 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1198
1199 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1200 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1201
1202 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1203 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1204
1205 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1206 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1207
1208 #undef TARGET_HANDLE_OPTION
1209 #define TARGET_HANDLE_OPTION rs6000_handle_option
1210
1211 #undef TARGET_DEFAULT_TARGET_FLAGS
1212 #define TARGET_DEFAULT_TARGET_FLAGS \
1213   (TARGET_DEFAULT)
1214
1215 #undef TARGET_STACK_PROTECT_FAIL
1216 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1217
1218 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1219    The PowerPC architecture requires only weak consistency among
1220    processors--that is, memory accesses between processors need not be
1221    sequentially consistent and memory accesses among processors can occur
1222    in any order. The ability to order memory accesses weakly provides
1223    opportunities for more efficient use of the system bus. Unless a
1224    dependency exists, the 604e allows read operations to precede store
1225    operations.  */
1226 #undef TARGET_RELAXED_ORDERING
1227 #define TARGET_RELAXED_ORDERING true
1228
1229 #ifdef HAVE_AS_TLS
1230 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1231 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1232 #endif
1233
1234 /* Use a 32-bit anchor range.  This leads to sequences like:
1235
1236         addis   tmp,anchor,high
1237         add     dest,tmp,low
1238
1239    where tmp itself acts as an anchor, and can be shared between
1240    accesses to the same 64k page.  */
1241 #undef TARGET_MIN_ANCHOR_OFFSET
1242 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1243 #undef TARGET_MAX_ANCHOR_OFFSET
1244 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1245 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1246 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1247
1248 #undef TARGET_BUILTIN_RECIPROCAL
1249 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1250
1251 #undef TARGET_EXPAND_TO_RTL_HOOK
1252 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1253
1254 #undef TARGET_INSTANTIATE_DECLS
1255 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1256
1257 struct gcc_target targetm = TARGET_INITIALIZER;
1258 \f
1259
1260 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1261    MODE.  */
1262 static int
1263 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1264 {
1265   /* The GPRs can hold any mode, but values bigger than one register
1266      cannot go past R31.  */
1267   if (INT_REGNO_P (regno))
1268     return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1);
1269
1270   /* The float registers can only hold floating modes and DImode.
1271      This excludes the 32-bit decimal float mode for now.  */
1272   if (FP_REGNO_P (regno))
1273     return
1274       ((SCALAR_FLOAT_MODE_P (mode)
1275        && (mode != TDmode || (regno % 2) == 0)
1276        && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1))
1277       || (GET_MODE_CLASS (mode) == MODE_INT
1278           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1279       || (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1280            && PAIRED_VECTOR_MODE (mode)));
1281
1282   /* The CR register can only hold CC modes.  */
1283   if (CR_REGNO_P (regno))
1284     return GET_MODE_CLASS (mode) == MODE_CC;
1285
1286   if (XER_REGNO_P (regno))
1287     return mode == PSImode;
1288
1289   /* AltiVec only in AldyVec registers.  */
1290   if (ALTIVEC_REGNO_P (regno))
1291     return ALTIVEC_VECTOR_MODE (mode);
1292
1293   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1294   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1295     return 1;
1296
1297   /* We cannot put TImode anywhere except general register and it must be
1298      able to fit within the register set.  */
1299
1300   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1301 }
1302
1303 /* Initialize rs6000_hard_regno_mode_ok_p table.  */
1304 static void
1305 rs6000_init_hard_regno_mode_ok (void)
1306 {
1307   int r, m;
1308
1309   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
1310     for (m = 0; m < NUM_MACHINE_MODES; ++m)
1311       if (rs6000_hard_regno_mode_ok (r, m))
1312         rs6000_hard_regno_mode_ok_p[m][r] = true;
1313 }
1314
1315 #if TARGET_MACHO
1316 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
1317
1318 static void
1319 darwin_rs6000_override_options (void)
1320 {
1321   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
1322      off.  */
1323   rs6000_altivec_abi = 1;
1324   TARGET_ALTIVEC_VRSAVE = 1;
1325   if (DEFAULT_ABI == ABI_DARWIN)
1326   {
1327     if (MACHO_DYNAMIC_NO_PIC_P)
1328       {
1329         if (flag_pic)
1330             warning (0, "-mdynamic-no-pic overrides -fpic or -fPIC");
1331         flag_pic = 0;
1332       }
1333     else if (flag_pic == 1)
1334       {
1335         flag_pic = 2;
1336       }
1337   }
1338   if (TARGET_64BIT && ! TARGET_POWERPC64)
1339     {
1340       target_flags |= MASK_POWERPC64;
1341       warning (0, "-m64 requires PowerPC64 architecture, enabling");
1342     }
1343   if (flag_mkernel)
1344     {
1345       rs6000_default_long_calls = 1;
1346       target_flags |= MASK_SOFT_FLOAT;
1347     }
1348
1349   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
1350      Altivec.  */
1351   if (!flag_mkernel && !flag_apple_kext
1352       && TARGET_64BIT
1353       && ! (target_flags_explicit & MASK_ALTIVEC))
1354     target_flags |= MASK_ALTIVEC;
1355
1356   /* Unless the user (not the configurer) has explicitly overridden
1357      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
1358      G4 unless targetting the kernel.  */
1359   if (!flag_mkernel
1360       && !flag_apple_kext
1361       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
1362       && ! (target_flags_explicit & MASK_ALTIVEC)
1363       && ! rs6000_select[1].string)
1364     {
1365       target_flags |= MASK_ALTIVEC;
1366     }
1367 }
1368 #endif
1369
1370 /* If not otherwise specified by a target, make 'long double' equivalent to
1371    'double'.  */
1372
1373 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
1374 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
1375 #endif
1376
1377 /* Override command line options.  Mostly we process the processor
1378    type and sometimes adjust other TARGET_ options.  */
1379
1380 void
1381 rs6000_override_options (const char *default_cpu)
1382 {
1383   size_t i, j;
1384   struct rs6000_cpu_select *ptr;
1385   int set_masks;
1386
1387   /* Simplifications for entries below.  */
1388
1389   enum {
1390     POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1391     POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1392   };
1393
1394   /* This table occasionally claims that a processor does not support
1395      a particular feature even though it does, but the feature is slower
1396      than the alternative.  Thus, it shouldn't be relied on as a
1397      complete description of the processor's support.
1398
1399      Please keep this list in order, and don't forget to update the
1400      documentation in invoke.texi when adding a new processor or
1401      flag.  */
1402   static struct ptt
1403     {
1404       const char *const name;           /* Canonical processor name.  */
1405       const enum processor_type processor; /* Processor type enum value.  */
1406       const int target_enable;  /* Target flags to enable.  */
1407     } const processor_target_table[]
1408       = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1409          {"403", PROCESSOR_PPC403,
1410           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1411          {"405", PROCESSOR_PPC405,
1412           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1413          {"405fp", PROCESSOR_PPC405,
1414           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1415          {"440", PROCESSOR_PPC440,
1416           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1417          {"440fp", PROCESSOR_PPC440,
1418           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1419          {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
1420          {"601", PROCESSOR_PPC601,
1421           MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1422          {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1423          {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1424          {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1425          {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1426          {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1427          {"620", PROCESSOR_PPC620,
1428           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1429          {"630", PROCESSOR_PPC630,
1430           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1431          {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1432          {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1433          {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1434          {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1435          {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1436          {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1437          {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1438          {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN},
1439          /* 8548 has a dummy entry for now.  */
1440          {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN},
1441          {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1442          {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK},
1443          {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1444          {"970", PROCESSOR_POWER4,
1445           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1446          {"cell", PROCESSOR_CELL,
1447           POWERPC_7400_MASK  | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1448          {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1449          {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1450          {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1451          {"G4",  PROCESSOR_PPC7450, POWERPC_7400_MASK},
1452          {"G5", PROCESSOR_POWER4,
1453           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1454          {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1455          {"power2", PROCESSOR_POWER,
1456           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1457          {"power3", PROCESSOR_PPC630,
1458           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1459          {"power4", PROCESSOR_POWER4,
1460           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64},
1461          {"power5", PROCESSOR_POWER5,
1462           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
1463           | MASK_MFCRF | MASK_POPCNTB},
1464          {"power5+", PROCESSOR_POWER5,
1465           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
1466           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
1467          {"power6", PROCESSOR_POWER6,
1468           POWERPC_7400_MASK | MASK_POWERPC64 | MASK_MFCRF | MASK_POPCNTB
1469           | MASK_FPRND | MASK_CMPB | MASK_DFP },
1470          {"power6x", PROCESSOR_POWER6,
1471           POWERPC_7400_MASK | MASK_POWERPC64 | MASK_MFCRF | MASK_POPCNTB
1472           | MASK_FPRND | MASK_CMPB | MASK_MFPGPR | MASK_DFP },
1473          {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1474          {"powerpc64", PROCESSOR_POWERPC64,
1475           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1476          {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1477          {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1478          {"rios2", PROCESSOR_RIOS2,
1479           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1480          {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1481          {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1482          {"rs64", PROCESSOR_RS64A,
1483           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
1484       };
1485
1486   const size_t ptt_size = ARRAY_SIZE (processor_target_table);
1487
1488   /* Some OSs don't support saving the high part of 64-bit registers on
1489      context switch.  Other OSs don't support saving Altivec registers.
1490      On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
1491      settings; if the user wants either, the user must explicitly specify
1492      them and we won't interfere with the user's specification.  */
1493
1494   enum {
1495     POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1496     POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1497                      | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1498                      | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1499                      | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP)
1500   };
1501
1502   rs6000_init_hard_regno_mode_ok ();
1503
1504   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
1505 #ifdef OS_MISSING_POWERPC64
1506   if (OS_MISSING_POWERPC64)
1507     set_masks &= ~MASK_POWERPC64;
1508 #endif
1509 #ifdef OS_MISSING_ALTIVEC
1510   if (OS_MISSING_ALTIVEC)
1511     set_masks &= ~MASK_ALTIVEC;
1512 #endif
1513
1514   /* Don't override by the processor default if given explicitly.  */
1515   set_masks &= ~target_flags_explicit;
1516
1517   /* Identify the processor type.  */
1518   rs6000_select[0].string = default_cpu;
1519   rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
1520
1521   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
1522     {
1523       ptr = &rs6000_select[i];
1524       if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1525         {
1526           for (j = 0; j < ptt_size; j++)
1527             if (! strcmp (ptr->string, processor_target_table[j].name))
1528               {
1529                 if (ptr->set_tune_p)
1530                   rs6000_cpu = processor_target_table[j].processor;
1531
1532                 if (ptr->set_arch_p)
1533                   {
1534                     target_flags &= ~set_masks;
1535                     target_flags |= (processor_target_table[j].target_enable
1536                                      & set_masks);
1537                   }
1538                 break;
1539               }
1540
1541           if (j == ptt_size)
1542             error ("bad value (%s) for %s switch", ptr->string, ptr->name);
1543         }
1544     }
1545
1546   if (TARGET_E500)
1547     rs6000_isel = 1;
1548
1549   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3)
1550     {
1551       if (TARGET_ALTIVEC)
1552         error ("AltiVec not supported in this target");
1553       if (TARGET_SPE)
1554         error ("Spe not supported in this target");
1555     }
1556
1557   /* If we are optimizing big endian systems for space, use the load/store
1558      multiple and string instructions.  */
1559   if (BYTES_BIG_ENDIAN && optimize_size)
1560     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
1561
1562   /* Don't allow -mmultiple or -mstring on little endian systems
1563      unless the cpu is a 750, because the hardware doesn't support the
1564      instructions used in little endian mode, and causes an alignment
1565      trap.  The 750 does not cause an alignment trap (except when the
1566      target is unaligned).  */
1567
1568   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
1569     {
1570       if (TARGET_MULTIPLE)
1571         {
1572           target_flags &= ~MASK_MULTIPLE;
1573           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
1574             warning (0, "-mmultiple is not supported on little endian systems");
1575         }
1576
1577       if (TARGET_STRING)
1578         {
1579           target_flags &= ~MASK_STRING;
1580           if ((target_flags_explicit & MASK_STRING) != 0)
1581             warning (0, "-mstring is not supported on little endian systems");
1582         }
1583     }
1584
1585   /* Set debug flags */
1586   if (rs6000_debug_name)
1587     {
1588       if (! strcmp (rs6000_debug_name, "all"))
1589         rs6000_debug_stack = rs6000_debug_arg = 1;
1590       else if (! strcmp (rs6000_debug_name, "stack"))
1591         rs6000_debug_stack = 1;
1592       else if (! strcmp (rs6000_debug_name, "arg"))
1593         rs6000_debug_arg = 1;
1594       else
1595         error ("unknown -mdebug-%s switch", rs6000_debug_name);
1596     }
1597
1598   if (rs6000_traceback_name)
1599     {
1600       if (! strncmp (rs6000_traceback_name, "full", 4))
1601         rs6000_traceback = traceback_full;
1602       else if (! strncmp (rs6000_traceback_name, "part", 4))
1603         rs6000_traceback = traceback_part;
1604       else if (! strncmp (rs6000_traceback_name, "no", 2))
1605         rs6000_traceback = traceback_none;
1606       else
1607         error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
1608                rs6000_traceback_name);
1609     }
1610
1611   if (!rs6000_explicit_options.long_double)
1612     rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1613
1614 #ifndef POWERPC_LINUX
1615   if (!rs6000_explicit_options.ieee)
1616     rs6000_ieeequad = 1;
1617 #endif
1618
1619   /* Enable Altivec ABI for AIX -maltivec.  */
1620   if (TARGET_XCOFF && TARGET_ALTIVEC)
1621     rs6000_altivec_abi = 1;
1622
1623   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
1624      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
1625      be explicitly overridden in either case.  */
1626   if (TARGET_ELF)
1627     {
1628       if (!rs6000_explicit_options.altivec_abi
1629           && (TARGET_64BIT || TARGET_ALTIVEC))
1630         rs6000_altivec_abi = 1;
1631
1632       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
1633       if (!rs6000_explicit_options.vrsave)
1634         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
1635     }
1636
1637   /* Set the Darwin64 ABI as default for 64-bit Darwin.  */
1638   if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1639     {
1640       rs6000_darwin64_abi = 1;
1641 #if TARGET_MACHO
1642       darwin_one_byte_bool = 1;
1643 #endif
1644       /* Default to natural alignment, for better performance.  */
1645       rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1646     }
1647
1648   /* Place FP constants in the constant pool instead of TOC
1649      if section anchors enabled.  */
1650   if (flag_section_anchors)
1651     TARGET_NO_FP_IN_TOC = 1;
1652
1653   /* Handle -mtls-size option.  */
1654   rs6000_parse_tls_size_option ();
1655
1656 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1657   SUBTARGET_OVERRIDE_OPTIONS;
1658 #endif
1659 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
1660   SUBSUBTARGET_OVERRIDE_OPTIONS;
1661 #endif
1662 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
1663   SUB3TARGET_OVERRIDE_OPTIONS;
1664 #endif
1665
1666   if (TARGET_E500)
1667     {
1668       /* The e500 does not have string instructions, and we set
1669          MASK_STRING above when optimizing for size.  */
1670       if ((target_flags & MASK_STRING) != 0)
1671         target_flags = target_flags & ~MASK_STRING;
1672     }
1673   else if (rs6000_select[1].string != NULL)
1674     {
1675       /* For the powerpc-eabispe configuration, we set all these by
1676          default, so let's unset them if we manually set another
1677          CPU that is not the E500.  */
1678       if (!rs6000_explicit_options.spe_abi)
1679         rs6000_spe_abi = 0;
1680       if (!rs6000_explicit_options.spe)
1681         rs6000_spe = 0;
1682       if (!rs6000_explicit_options.float_gprs)
1683         rs6000_float_gprs = 0;
1684       if (!rs6000_explicit_options.isel)
1685         rs6000_isel = 0;
1686     }
1687
1688   /* Detect invalid option combinations with E500.  */
1689   CHECK_E500_OPTIONS;
1690
1691   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
1692                         && rs6000_cpu != PROCESSOR_POWER5
1693                         && rs6000_cpu != PROCESSOR_POWER6
1694                         && rs6000_cpu != PROCESSOR_CELL);
1695   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
1696                          || rs6000_cpu == PROCESSOR_POWER5);
1697   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
1698                                  || rs6000_cpu == PROCESSOR_POWER5
1699                                  || rs6000_cpu == PROCESSOR_POWER6);
1700
1701   rs6000_sched_restricted_insns_priority
1702     = (rs6000_sched_groups ? 1 : 0);
1703
1704   /* Handle -msched-costly-dep option.  */
1705   rs6000_sched_costly_dep
1706     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
1707
1708   if (rs6000_sched_costly_dep_str)
1709     {
1710       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
1711         rs6000_sched_costly_dep = no_dep_costly;
1712       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
1713         rs6000_sched_costly_dep = all_deps_costly;
1714       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
1715         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
1716       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
1717         rs6000_sched_costly_dep = store_to_load_dep_costly;
1718       else
1719         rs6000_sched_costly_dep = atoi (rs6000_sched_costly_dep_str);
1720     }
1721
1722   /* Handle -minsert-sched-nops option.  */
1723   rs6000_sched_insert_nops
1724     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
1725
1726   if (rs6000_sched_insert_nops_str)
1727     {
1728       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
1729         rs6000_sched_insert_nops = sched_finish_none;
1730       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
1731         rs6000_sched_insert_nops = sched_finish_pad_groups;
1732       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
1733         rs6000_sched_insert_nops = sched_finish_regroup_exact;
1734       else
1735         rs6000_sched_insert_nops = atoi (rs6000_sched_insert_nops_str);
1736     }
1737
1738 #ifdef TARGET_REGNAMES
1739   /* If the user desires alternate register names, copy in the
1740      alternate names now.  */
1741   if (TARGET_REGNAMES)
1742     memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
1743 #endif
1744
1745   /* Set aix_struct_return last, after the ABI is determined.
1746      If -maix-struct-return or -msvr4-struct-return was explicitly
1747      used, don't override with the ABI default.  */
1748   if (!rs6000_explicit_options.aix_struct_ret)
1749     aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
1750
1751   if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
1752     REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
1753
1754   if (TARGET_TOC)
1755     ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
1756
1757   /* We can only guarantee the availability of DI pseudo-ops when
1758      assembling for 64-bit targets.  */
1759   if (!TARGET_64BIT)
1760     {
1761       targetm.asm_out.aligned_op.di = NULL;
1762       targetm.asm_out.unaligned_op.di = NULL;
1763     }
1764
1765   /* Set branch target alignment, if not optimizing for size.  */
1766   if (!optimize_size)
1767     {
1768       /* Cell wants to be aligned 8byte for dual issue. */
1769       if (rs6000_cpu == PROCESSOR_CELL)
1770         {
1771           if (align_functions <= 0)
1772             align_functions = 8;
1773           if (align_jumps <= 0)
1774             align_jumps = 8;
1775           if (align_loops <= 0)
1776             align_loops = 8;
1777         }
1778       if (rs6000_align_branch_targets)
1779         {
1780           if (align_functions <= 0)
1781             align_functions = 16;
1782           if (align_jumps <= 0)
1783             align_jumps = 16;
1784           if (align_loops <= 0)
1785             align_loops = 16;
1786         }
1787       if (align_jumps_max_skip <= 0)
1788         align_jumps_max_skip = 15;
1789       if (align_loops_max_skip <= 0)
1790         align_loops_max_skip = 15;
1791     }
1792
1793   /* Arrange to save and restore machine status around nested functions.  */
1794   init_machine_status = rs6000_init_machine_status;
1795
1796   /* We should always be splitting complex arguments, but we can't break
1797      Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
1798   if (DEFAULT_ABI != ABI_AIX)
1799     targetm.calls.split_complex_arg = NULL;
1800
1801   /* Initialize rs6000_cost with the appropriate target costs.  */
1802   if (optimize_size)
1803     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
1804   else
1805     switch (rs6000_cpu)
1806       {
1807       case PROCESSOR_RIOS1:
1808         rs6000_cost = &rios1_cost;
1809         break;
1810
1811       case PROCESSOR_RIOS2:
1812         rs6000_cost = &rios2_cost;
1813         break;
1814
1815       case PROCESSOR_RS64A:
1816         rs6000_cost = &rs64a_cost;
1817         break;
1818
1819       case PROCESSOR_MPCCORE:
1820         rs6000_cost = &mpccore_cost;
1821         break;
1822
1823       case PROCESSOR_PPC403:
1824         rs6000_cost = &ppc403_cost;
1825         break;
1826
1827       case PROCESSOR_PPC405:
1828         rs6000_cost = &ppc405_cost;
1829         break;
1830
1831       case PROCESSOR_PPC440:
1832         rs6000_cost = &ppc440_cost;
1833         break;
1834
1835       case PROCESSOR_PPC601:
1836         rs6000_cost = &ppc601_cost;
1837         break;
1838
1839       case PROCESSOR_PPC603:
1840         rs6000_cost = &ppc603_cost;
1841         break;
1842
1843       case PROCESSOR_PPC604:
1844         rs6000_cost = &ppc604_cost;
1845         break;
1846
1847       case PROCESSOR_PPC604e:
1848         rs6000_cost = &ppc604e_cost;
1849         break;
1850
1851       case PROCESSOR_PPC620:
1852         rs6000_cost = &ppc620_cost;
1853         break;
1854
1855       case PROCESSOR_PPC630:
1856         rs6000_cost = &ppc630_cost;
1857         break;
1858
1859       case PROCESSOR_CELL:
1860         rs6000_cost = &ppccell_cost;
1861         break;
1862
1863       case PROCESSOR_PPC750:
1864       case PROCESSOR_PPC7400:
1865         rs6000_cost = &ppc750_cost;
1866         break;
1867
1868       case PROCESSOR_PPC7450:
1869         rs6000_cost = &ppc7450_cost;
1870         break;
1871
1872       case PROCESSOR_PPC8540:
1873         rs6000_cost = &ppc8540_cost;
1874         break;
1875
1876       case PROCESSOR_PPCE300C2:
1877       case PROCESSOR_PPCE300C3:
1878         rs6000_cost = &ppce300c2c3_cost;
1879         break;
1880
1881       case PROCESSOR_POWER4:
1882       case PROCESSOR_POWER5:
1883         rs6000_cost = &power4_cost;
1884         break;
1885
1886       case PROCESSOR_POWER6:
1887         rs6000_cost = &power6_cost;
1888         break;
1889
1890       default:
1891         gcc_unreachable ();
1892       }
1893
1894   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
1895     set_param_value ("simultaneous-prefetches",
1896                      rs6000_cost->simultaneous_prefetches);
1897   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
1898     set_param_value ("l1-cache-size", rs6000_cost->l1_cache_size);
1899   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
1900     set_param_value ("l1-cache-line-size", rs6000_cost->cache_line_size);
1901   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
1902     set_param_value ("l2-cache-size", rs6000_cost->l2_cache_size);
1903
1904   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
1905      can be optimized to ap = __builtin_next_arg (0).  */
1906   if (DEFAULT_ABI != ABI_V4)
1907     targetm.expand_builtin_va_start = NULL;
1908 }
1909
1910 /* Implement targetm.vectorize.builtin_mask_for_load.  */
1911 static tree
1912 rs6000_builtin_mask_for_load (void)
1913 {
1914   if (TARGET_ALTIVEC)
1915     return altivec_builtin_mask_for_load;
1916   else
1917     return 0;
1918 }
1919
1920 /* Implement targetm.vectorize.builtin_conversion.  */
1921 static tree
1922 rs6000_builtin_conversion (enum tree_code code, tree type)
1923 {
1924   if (!TARGET_ALTIVEC)
1925     return NULL_TREE;
1926
1927   switch (code)
1928     {
1929     case FLOAT_EXPR:
1930       switch (TYPE_MODE (type))
1931         {
1932         case V4SImode:
1933           return TYPE_UNSIGNED (type) ?
1934             rs6000_builtin_decls[ALTIVEC_BUILTIN_VCFUX] :
1935             rs6000_builtin_decls[ALTIVEC_BUILTIN_VCFSX];
1936         default:
1937           return NULL_TREE;
1938         }
1939     default:
1940       return NULL_TREE;
1941     }
1942 }
1943
1944 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
1945 static tree
1946 rs6000_builtin_mul_widen_even (tree type)
1947 {
1948   if (!TARGET_ALTIVEC)
1949     return NULL_TREE;
1950
1951   switch (TYPE_MODE (type))
1952     {
1953     case V8HImode:
1954       return TYPE_UNSIGNED (type) ?
1955             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH] :
1956             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
1957
1958     case V16QImode:
1959       return TYPE_UNSIGNED (type) ?
1960             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB] :
1961             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
1962     default:
1963       return NULL_TREE;
1964     }
1965 }
1966
1967 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
1968 static tree
1969 rs6000_builtin_mul_widen_odd (tree type)
1970 {
1971   if (!TARGET_ALTIVEC)
1972     return NULL_TREE;
1973
1974   switch (TYPE_MODE (type))
1975     {
1976     case V8HImode:
1977       return TYPE_UNSIGNED (type) ?
1978             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH] :
1979             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
1980
1981     case V16QImode:
1982       return TYPE_UNSIGNED (type) ?
1983             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB] :
1984             rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
1985     default:
1986       return NULL_TREE;
1987     }
1988 }
1989
1990
1991 /* Return true iff, data reference of TYPE can reach vector alignment (16)
1992    after applying N number of iterations.  This routine does not determine
1993    how may iterations are required to reach desired alignment.  */
1994
1995 static bool
1996 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
1997 {
1998   if (is_packed)
1999     return false;
2000
2001   if (TARGET_32BIT)
2002     {
2003       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
2004         return true;
2005
2006       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
2007         return true;
2008
2009       return false;
2010     }
2011   else
2012     {
2013       if (TARGET_MACHO)
2014         return false;
2015
2016       /* Assuming that all other types are naturally aligned. CHECKME!  */
2017       return true;
2018     }
2019 }
2020
2021 /* Handle generic options of the form -mfoo=yes/no.
2022    NAME is the option name.
2023    VALUE is the option value.
2024    FLAG is the pointer to the flag where to store a 1 or 0, depending on
2025    whether the option value is 'yes' or 'no' respectively.  */
2026 static void
2027 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
2028 {
2029   if (value == 0)
2030     return;
2031   else if (!strcmp (value, "yes"))
2032     *flag = 1;
2033   else if (!strcmp (value, "no"))
2034     *flag = 0;
2035   else
2036     error ("unknown -m%s= option specified: '%s'", name, value);
2037 }
2038
2039 /* Validate and record the size specified with the -mtls-size option.  */
2040
2041 static void
2042 rs6000_parse_tls_size_option (void)
2043 {
2044   if (rs6000_tls_size_string == 0)
2045     return;
2046   else if (strcmp (rs6000_tls_size_string, "16") == 0)
2047     rs6000_tls_size = 16;
2048   else if (strcmp (rs6000_tls_size_string, "32") == 0)
2049     rs6000_tls_size = 32;
2050   else if (strcmp (rs6000_tls_size_string, "64") == 0)
2051     rs6000_tls_size = 64;
2052   else
2053     error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
2054 }
2055
2056 void
2057 optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
2058 {
2059   if (DEFAULT_ABI == ABI_DARWIN)
2060     /* The Darwin libraries never set errno, so we might as well
2061        avoid calling them when that's the only reason we would.  */
2062     flag_errno_math = 0;
2063
2064   /* Double growth factor to counter reduced min jump length.  */
2065   set_param_value ("max-grow-copy-bb-insns", 16);
2066
2067   /* Enable section anchors by default.
2068      Skip section anchors for Objective C and Objective C++
2069      until front-ends fixed.  */
2070   if (!TARGET_MACHO && lang_hooks.name[4] != 'O')
2071     flag_section_anchors = 1;
2072 }
2073
2074 /* Implement TARGET_HANDLE_OPTION.  */
2075
2076 static bool
2077 rs6000_handle_option (size_t code, const char *arg, int value)
2078 {
2079   switch (code)
2080     {
2081     case OPT_mno_power:
2082       target_flags &= ~(MASK_POWER | MASK_POWER2
2083                         | MASK_MULTIPLE | MASK_STRING);
2084       target_flags_explicit |= (MASK_POWER | MASK_POWER2
2085                                 | MASK_MULTIPLE | MASK_STRING);
2086       break;
2087     case OPT_mno_powerpc:
2088       target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
2089                         | MASK_PPC_GFXOPT | MASK_POWERPC64);
2090       target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
2091                                 | MASK_PPC_GFXOPT | MASK_POWERPC64);
2092       break;
2093     case OPT_mfull_toc:
2094       target_flags &= ~MASK_MINIMAL_TOC;
2095       TARGET_NO_FP_IN_TOC = 0;
2096       TARGET_NO_SUM_IN_TOC = 0;
2097       target_flags_explicit |= MASK_MINIMAL_TOC;
2098 #ifdef TARGET_USES_SYSV4_OPT
2099       /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
2100          just the same as -mminimal-toc.  */
2101       target_flags |= MASK_MINIMAL_TOC;
2102       target_flags_explicit |= MASK_MINIMAL_TOC;
2103 #endif
2104       break;
2105
2106 #ifdef TARGET_USES_SYSV4_OPT
2107     case OPT_mtoc:
2108       /* Make -mtoc behave like -mminimal-toc.  */
2109       target_flags |= MASK_MINIMAL_TOC;
2110       target_flags_explicit |= MASK_MINIMAL_TOC;
2111       break;
2112 #endif
2113
2114 #ifdef TARGET_USES_AIX64_OPT
2115     case OPT_maix64:
2116 #else
2117     case OPT_m64:
2118 #endif
2119       target_flags |= MASK_POWERPC64 | MASK_POWERPC;
2120       target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
2121       target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
2122       break;
2123
2124 #ifdef TARGET_USES_AIX64_OPT
2125     case OPT_maix32:
2126 #else
2127     case OPT_m32:
2128 #endif
2129       target_flags &= ~MASK_POWERPC64;
2130       target_flags_explicit |= MASK_POWERPC64;
2131       break;
2132
2133     case OPT_minsert_sched_nops_:
2134       rs6000_sched_insert_nops_str = arg;
2135       break;
2136
2137     case OPT_mminimal_toc:
2138       if (value == 1)
2139         {
2140           TARGET_NO_FP_IN_TOC = 0;
2141           TARGET_NO_SUM_IN_TOC = 0;
2142         }
2143       break;
2144
2145     case OPT_mpower:
2146       if (value == 1)
2147         {
2148           target_flags |= (MASK_MULTIPLE | MASK_STRING);
2149           target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
2150         }
2151       break;
2152
2153     case OPT_mpower2:
2154       if (value == 1)
2155         {
2156           target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
2157           target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
2158         }
2159       break;
2160
2161     case OPT_mpowerpc_gpopt:
2162     case OPT_mpowerpc_gfxopt:
2163       if (value == 1)
2164         {
2165           target_flags |= MASK_POWERPC;
2166           target_flags_explicit |= MASK_POWERPC;
2167         }
2168       break;
2169
2170     case OPT_maix_struct_return:
2171     case OPT_msvr4_struct_return:
2172       rs6000_explicit_options.aix_struct_ret = true;
2173       break;
2174
2175     case OPT_mvrsave_:
2176       rs6000_explicit_options.vrsave = true;
2177       rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
2178       break;
2179
2180     case OPT_misel_:
2181       rs6000_explicit_options.isel = true;
2182       rs6000_parse_yes_no_option ("isel", arg, &(rs6000_isel));
2183       break;
2184
2185     case OPT_mspe_:
2186       rs6000_explicit_options.spe = true;
2187       rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
2188       break;
2189
2190     case OPT_mdebug_:
2191       rs6000_debug_name = arg;
2192       break;
2193
2194 #ifdef TARGET_USES_SYSV4_OPT
2195     case OPT_mcall_:
2196       rs6000_abi_name = arg;
2197       break;
2198
2199     case OPT_msdata_:
2200       rs6000_sdata_name = arg;
2201       break;
2202
2203     case OPT_mtls_size_:
2204       rs6000_tls_size_string = arg;
2205       break;
2206
2207     case OPT_mrelocatable:
2208       if (value == 1)
2209         {
2210           target_flags |= MASK_MINIMAL_TOC;
2211           target_flags_explicit |= MASK_MINIMAL_TOC;
2212           TARGET_NO_FP_IN_TOC = 1;
2213         }
2214       break;
2215
2216     case OPT_mrelocatable_lib:
2217       if (value == 1)
2218         {
2219           target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
2220           target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
2221           TARGET_NO_FP_IN_TOC = 1;
2222         }
2223       else
2224         {
2225           target_flags &= ~MASK_RELOCATABLE;
2226           target_flags_explicit |= MASK_RELOCATABLE;
2227         }
2228       break;
2229 #endif
2230
2231     case OPT_mabi_:
2232       if (!strcmp (arg, "altivec"))
2233         {
2234           rs6000_explicit_options.altivec_abi = true;
2235           rs6000_altivec_abi = 1;
2236
2237           /* Enabling the AltiVec ABI turns off the SPE ABI.  */
2238           rs6000_spe_abi = 0;
2239         }
2240       else if (! strcmp (arg, "no-altivec"))
2241         {
2242           rs6000_explicit_options.altivec_abi = true;
2243           rs6000_altivec_abi = 0;
2244         }
2245       else if (! strcmp (arg, "spe"))
2246         {
2247           rs6000_explicit_options.spe_abi = true;
2248           rs6000_spe_abi = 1;
2249           rs6000_altivec_abi = 0;
2250           if (!TARGET_SPE_ABI)
2251             error ("not configured for ABI: '%s'", arg);
2252         }
2253       else if (! strcmp (arg, "no-spe"))
2254         {
2255           rs6000_explicit_options.spe_abi = true;
2256           rs6000_spe_abi = 0;
2257         }
2258
2259       /* These are here for testing during development only, do not
2260          document in the manual please.  */
2261       else if (! strcmp (arg, "d64"))
2262         {
2263           rs6000_darwin64_abi = 1;
2264           warning (0, "Using darwin64 ABI");
2265         }
2266       else if (! strcmp (arg, "d32"))
2267         {
2268           rs6000_darwin64_abi = 0;
2269           warning (0, "Using old darwin ABI");
2270         }
2271
2272       else if (! strcmp (arg, "ibmlongdouble"))
2273         {
2274           rs6000_explicit_options.ieee = true;
2275           rs6000_ieeequad = 0;
2276           warning (0, "Using IBM extended precision long double");
2277         }
2278       else if (! strcmp (arg, "ieeelongdouble"))
2279         {
2280           rs6000_explicit_options.ieee = true;
2281           rs6000_ieeequad = 1;
2282           warning (0, "Using IEEE extended precision long double");
2283         }
2284
2285       else
2286         {
2287           error ("unknown ABI specified: '%s'", arg);
2288           return false;
2289         }
2290       break;
2291
2292     case OPT_mcpu_:
2293       rs6000_select[1].string = arg;
2294       break;
2295
2296     case OPT_mtune_:
2297       rs6000_select[2].string = arg;
2298       break;
2299
2300     case OPT_mtraceback_:
2301       rs6000_traceback_name = arg;
2302       break;
2303
2304     case OPT_mfloat_gprs_:
2305       rs6000_explicit_options.float_gprs = true;
2306       if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
2307         rs6000_float_gprs = 1;
2308       else if (! strcmp (arg, "double"))
2309         rs6000_float_gprs = 2;
2310       else if (! strcmp (arg, "no"))
2311         rs6000_float_gprs = 0;
2312       else
2313         {
2314           error ("invalid option for -mfloat-gprs: '%s'", arg);
2315           return false;
2316         }
2317       break;
2318
2319     case OPT_mlong_double_:
2320       rs6000_explicit_options.long_double = true;
2321       rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2322       if (value != 64 && value != 128)
2323         {
2324           error ("Unknown switch -mlong-double-%s", arg);
2325           rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2326           return false;
2327         }
2328       else
2329         rs6000_long_double_type_size = value;
2330       break;
2331
2332     case OPT_msched_costly_dep_:
2333       rs6000_sched_costly_dep_str = arg;
2334       break;
2335
2336     case OPT_malign_:
2337       rs6000_explicit_options.alignment = true;
2338       if (! strcmp (arg, "power"))
2339         {
2340           /* On 64-bit Darwin, power alignment is ABI-incompatible with
2341              some C library functions, so warn about it. The flag may be
2342              useful for performance studies from time to time though, so
2343              don't disable it entirely.  */
2344           if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
2345             warning (0, "-malign-power is not supported for 64-bit Darwin;"
2346                      " it is incompatible with the installed C and C++ libraries");
2347           rs6000_alignment_flags = MASK_ALIGN_POWER;
2348         }
2349       else if (! strcmp (arg, "natural"))
2350         rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2351       else
2352         {
2353           error ("unknown -malign-XXXXX option specified: '%s'", arg);
2354           return false;
2355         }
2356       break;
2357     }
2358   return true;
2359 }
2360 \f
2361 /* Do anything needed at the start of the asm file.  */
2362
2363 static void
2364 rs6000_file_start (void)
2365 {
2366   size_t i;
2367   char buffer[80];
2368   const char *start = buffer;
2369   struct rs6000_cpu_select *ptr;
2370   const char *default_cpu = TARGET_CPU_DEFAULT;
2371   FILE *file = asm_out_file;
2372
2373   default_file_start ();
2374
2375 #ifdef TARGET_BI_ARCH
2376   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
2377     default_cpu = 0;
2378 #endif
2379
2380   if (flag_verbose_asm)
2381     {
2382       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
2383       rs6000_select[0].string = default_cpu;
2384
2385       for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
2386         {
2387           ptr = &rs6000_select[i];
2388           if (ptr->string != (char *)0 && ptr->string[0] != '\0')
2389             {
2390               fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
2391               start = "";
2392             }
2393         }
2394
2395       if (PPC405_ERRATUM77)
2396         {
2397           fprintf (file, "%s PPC405CR_ERRATUM77", start);
2398           start = "";
2399         }
2400
2401 #ifdef USING_ELFOS_H
2402       switch (rs6000_sdata)
2403         {
2404         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
2405         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
2406         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
2407         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
2408         }
2409
2410       if (rs6000_sdata && g_switch_value)
2411         {
2412           fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
2413                    g_switch_value);
2414           start = "";
2415         }
2416 #endif
2417
2418       if (*start == '\0')
2419         putc ('\n', file);
2420     }
2421
2422 #ifdef HAVE_AS_GNU_ATTRIBUTE
2423   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
2424     {
2425       fprintf (file, "\t.gnu_attribute 4, %d\n",
2426                (TARGET_HARD_FLOAT && TARGET_FPRS) ? 1 : 2);
2427       fprintf (file, "\t.gnu_attribute 8, %d\n",
2428                (TARGET_ALTIVEC_ABI ? 2
2429                 : TARGET_SPE_ABI ? 3
2430                 : 1));
2431     }
2432 #endif
2433
2434   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
2435     {
2436       switch_to_section (toc_section);
2437       switch_to_section (text_section);
2438     }
2439 }
2440
2441 \f
2442 /* Return nonzero if this function is known to have a null epilogue.  */
2443
2444 int
2445 direct_return (void)
2446 {
2447   if (reload_completed)
2448     {
2449       rs6000_stack_t *info = rs6000_stack_info ();
2450
2451       if (info->first_gp_reg_save == 32
2452           && info->first_fp_reg_save == 64
2453           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
2454           && ! info->lr_save_p
2455           && ! info->cr_save_p
2456           && info->vrsave_mask == 0
2457           && ! info->push_p)
2458         return 1;
2459     }
2460
2461   return 0;
2462 }
2463
2464 /* Return the number of instructions it takes to form a constant in an
2465    integer register.  */
2466
2467 int
2468 num_insns_constant_wide (HOST_WIDE_INT value)
2469 {
2470   /* signed constant loadable with {cal|addi} */
2471   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
2472     return 1;
2473
2474   /* constant loadable with {cau|addis} */
2475   else if ((value & 0xffff) == 0
2476            && (value >> 31 == -1 || value >> 31 == 0))
2477     return 1;
2478
2479 #if HOST_BITS_PER_WIDE_INT == 64
2480   else if (TARGET_POWERPC64)
2481     {
2482       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
2483       HOST_WIDE_INT high = value >> 31;
2484
2485       if (high == 0 || high == -1)
2486         return 2;
2487
2488       high >>= 1;
2489
2490       if (low == 0)
2491         return num_insns_constant_wide (high) + 1;
2492       else
2493         return (num_insns_constant_wide (high)
2494                 + num_insns_constant_wide (low) + 1);
2495     }
2496 #endif
2497
2498   else
2499     return 2;
2500 }
2501
2502 int
2503 num_insns_constant (rtx op, enum machine_mode mode)
2504 {
2505   HOST_WIDE_INT low, high;
2506
2507   switch (GET_CODE (op))
2508     {
2509     case CONST_INT:
2510 #if HOST_BITS_PER_WIDE_INT == 64
2511       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
2512           && mask64_operand (op, mode))
2513         return 2;
2514       else
2515 #endif
2516         return num_insns_constant_wide (INTVAL (op));
2517
2518       case CONST_DOUBLE:
2519         if (mode == SFmode || mode == SDmode)
2520           {
2521             long l;
2522             REAL_VALUE_TYPE rv;
2523
2524             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2525             if (DECIMAL_FLOAT_MODE_P (mode))
2526               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
2527             else
2528               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
2529             return num_insns_constant_wide ((HOST_WIDE_INT) l);
2530           }
2531
2532         if (mode == VOIDmode || mode == DImode)
2533           {
2534             high = CONST_DOUBLE_HIGH (op);
2535             low  = CONST_DOUBLE_LOW (op);
2536           }
2537         else
2538           {
2539             long l[2];
2540             REAL_VALUE_TYPE rv;
2541
2542             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2543             if (DECIMAL_FLOAT_MODE_P (mode))
2544               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
2545             else
2546               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
2547             high = l[WORDS_BIG_ENDIAN == 0];
2548             low  = l[WORDS_BIG_ENDIAN != 0];
2549           }
2550
2551         if (TARGET_32BIT)
2552           return (num_insns_constant_wide (low)
2553                   + num_insns_constant_wide (high));
2554         else
2555           {
2556             if ((high == 0 && low >= 0)
2557                 || (high == -1 && low < 0))
2558               return num_insns_constant_wide (low);
2559
2560             else if (mask64_operand (op, mode))
2561               return 2;
2562
2563             else if (low == 0)
2564               return num_insns_constant_wide (high) + 1;
2565
2566             else
2567               return (num_insns_constant_wide (high)
2568                       + num_insns_constant_wide (low) + 1);
2569           }
2570
2571     default:
2572       gcc_unreachable ();
2573     }
2574 }
2575
2576 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
2577    If the mode of OP is MODE_VECTOR_INT, this simply returns the
2578    corresponding element of the vector, but for V4SFmode and V2SFmode,
2579    the corresponding "float" is interpreted as an SImode integer.  */
2580
2581 static HOST_WIDE_INT
2582 const_vector_elt_as_int (rtx op, unsigned int elt)
2583 {
2584   rtx tmp = CONST_VECTOR_ELT (op, elt);
2585   if (GET_MODE (op) == V4SFmode
2586       || GET_MODE (op) == V2SFmode)
2587     tmp = gen_lowpart (SImode, tmp);
2588   return INTVAL (tmp);
2589 }
2590
2591 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
2592    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
2593    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
2594    all items are set to the same value and contain COPIES replicas of the
2595    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
2596    operand and the others are set to the value of the operand's msb.  */
2597
2598 static bool
2599 vspltis_constant (rtx op, unsigned step, unsigned copies)
2600 {
2601   enum machine_mode mode = GET_MODE (op);
2602   enum machine_mode inner = GET_MODE_INNER (mode);
2603
2604   unsigned i;
2605   unsigned nunits = GET_MODE_NUNITS (mode);
2606   unsigned bitsize = GET_MODE_BITSIZE (inner);
2607   unsigned mask = GET_MODE_MASK (inner);
2608
2609   HOST_WIDE_INT val = const_vector_elt_as_int (op, nunits - 1);
2610   HOST_WIDE_INT splat_val = val;
2611   HOST_WIDE_INT msb_val = val > 0 ? 0 : -1;
2612
2613   /* Construct the value to be splatted, if possible.  If not, return 0.  */
2614   for (i = 2; i <= copies; i *= 2)
2615     {
2616       HOST_WIDE_INT small_val;
2617       bitsize /= 2;
2618       small_val = splat_val >> bitsize;
2619       mask >>= bitsize;
2620       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
2621         return false;
2622       splat_val = small_val;
2623     }
2624
2625   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
2626   if (EASY_VECTOR_15 (splat_val))
2627     ;
2628
2629   /* Also check if we can splat, and then add the result to itself.  Do so if
2630      the value is positive, of if the splat instruction is using OP's mode;
2631      for splat_val < 0, the splat and the add should use the same mode.  */
2632   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
2633            && (splat_val >= 0 || (step == 1 && copies == 1)))
2634     ;
2635
2636   else
2637     return false;
2638
2639   /* Check if VAL is present in every STEP-th element, and the
2640      other elements are filled with its most significant bit.  */
2641   for (i = 0; i < nunits - 1; ++i)
2642     {
2643       HOST_WIDE_INT desired_val;
2644       if (((i + 1) & (step - 1)) == 0)
2645         desired_val = val;
2646       else
2647         desired_val = msb_val;
2648
2649       if (desired_val != const_vector_elt_as_int (op, i))
2650         return false;
2651     }
2652
2653   return true;
2654 }
2655
2656
2657 /* Return true if OP is of the given MODE and can be synthesized
2658    with a vspltisb, vspltish or vspltisw.  */
2659
2660 bool
2661 easy_altivec_constant (rtx op, enum machine_mode mode)
2662 {
2663   unsigned step, copies;
2664
2665   if (mode == VOIDmode)
2666     mode = GET_MODE (op);
2667   else if (mode != GET_MODE (op))
2668     return false;
2669
2670   /* Start with a vspltisw.  */
2671   step = GET_MODE_NUNITS (mode) / 4;
2672   copies = 1;
2673
2674   if (vspltis_constant (op, step, copies))
2675     return true;
2676
2677   /* Then try with a vspltish.  */
2678   if (step == 1)
2679     copies <<= 1;
2680   else
2681     step >>= 1;
2682
2683   if (vspltis_constant (op, step, copies))
2684     return true;
2685
2686   /* And finally a vspltisb.  */
2687   if (step == 1)
2688     copies <<= 1;
2689   else
2690     step >>= 1;
2691
2692   if (vspltis_constant (op, step, copies))
2693     return true;
2694
2695   return false;
2696 }
2697
2698 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
2699    result is OP.  Abort if it is not possible.  */
2700
2701 rtx
2702 gen_easy_altivec_constant (rtx op)
2703 {
2704   enum machine_mode mode = GET_MODE (op);
2705   int nunits = GET_MODE_NUNITS (mode);
2706   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
2707   unsigned step = nunits / 4;
2708   unsigned copies = 1;
2709
2710   /* Start with a vspltisw.  */
2711   if (vspltis_constant (op, step, copies))
2712     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
2713
2714   /* Then try with a vspltish.  */
2715   if (step == 1)
2716     copies <<= 1;
2717   else
2718     step >>= 1;
2719
2720   if (vspltis_constant (op, step, copies))
2721     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
2722
2723   /* And finally a vspltisb.  */
2724   if (step == 1)
2725     copies <<= 1;
2726   else
2727     step >>= 1;
2728
2729   if (vspltis_constant (op, step, copies))
2730     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
2731
2732   gcc_unreachable ();
2733 }
2734
2735 const char *
2736 output_vec_const_move (rtx *operands)
2737 {
2738   int cst, cst2;
2739   enum machine_mode mode;
2740   rtx dest, vec;
2741
2742   dest = operands[0];
2743   vec = operands[1];
2744   mode = GET_MODE (dest);
2745
2746   if (TARGET_ALTIVEC)
2747     {
2748       rtx splat_vec;
2749       if (zero_constant (vec, mode))
2750         return "vxor %0,%0,%0";
2751
2752       splat_vec = gen_easy_altivec_constant (vec);
2753       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
2754       operands[1] = XEXP (splat_vec, 0);
2755       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
2756         return "#";
2757
2758       switch (GET_MODE (splat_vec))
2759         {
2760         case V4SImode:
2761           return "vspltisw %0,%1";
2762
2763         case V8HImode:
2764           return "vspltish %0,%1";
2765
2766         case V16QImode:
2767           return "vspltisb %0,%1";
2768
2769         default:
2770           gcc_unreachable ();
2771         }
2772     }
2773
2774   gcc_assert (TARGET_SPE);
2775
2776   /* Vector constant 0 is handled as a splitter of V2SI, and in the
2777      pattern of V1DI, V4HI, and V2SF.
2778
2779      FIXME: We should probably return # and add post reload
2780      splitters for these, but this way is so easy ;-).  */
2781   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
2782   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
2783   operands[1] = CONST_VECTOR_ELT (vec, 0);
2784   operands[2] = CONST_VECTOR_ELT (vec, 1);
2785   if (cst == cst2)
2786     return "li %0,%1\n\tevmergelo %0,%0,%0";
2787   else
2788     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
2789 }
2790
2791 /* Initialize TARGET of vector PAIRED to VALS.  */
2792
2793 void
2794 paired_expand_vector_init (rtx target, rtx vals)
2795 {
2796   enum machine_mode mode = GET_MODE (target);
2797   int n_elts = GET_MODE_NUNITS (mode);
2798   int n_var = 0;
2799   rtx x, new, tmp, constant_op, op1, op2;
2800   int i;
2801
2802   for (i = 0; i < n_elts; ++i)
2803     {
2804       x = XVECEXP (vals, 0, i);
2805       if (!CONSTANT_P (x))
2806         ++n_var;
2807     }
2808   if (n_var == 0)
2809     {
2810       /* Load from constant pool.  */
2811       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
2812       return;
2813     }
2814
2815   if (n_var == 2)
2816     {
2817       /* The vector is initialized only with non-constants.  */
2818       new = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
2819                                 XVECEXP (vals, 0, 1));
2820
2821       emit_move_insn (target, new);
2822       return;
2823     }
2824   
2825   /* One field is non-constant and the other one is a constant.  Load the
2826      constant from the constant pool and use ps_merge instruction to
2827      construct the whole vector.  */
2828   op1 = XVECEXP (vals, 0, 0);
2829   op2 = XVECEXP (vals, 0, 1);
2830
2831   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
2832
2833   tmp = gen_reg_rtx (GET_MODE (constant_op));
2834   emit_move_insn (tmp, constant_op);
2835
2836   if (CONSTANT_P (op1))
2837     new = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
2838   else
2839     new = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
2840
2841   emit_move_insn (target, new);
2842 }
2843
2844 void
2845 paired_expand_vector_move (rtx operands[])
2846 {
2847   rtx op0 = operands[0], op1 = operands[1];
2848
2849   emit_move_insn (op0, op1);
2850 }
2851
2852 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
2853    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
2854    operands for the relation operation COND.  This is a recursive
2855    function.  */
2856
2857 static void
2858 paired_emit_vector_compare (enum rtx_code rcode,
2859                             rtx dest, rtx op0, rtx op1,
2860                             rtx cc_op0, rtx cc_op1)
2861 {
2862   rtx tmp = gen_reg_rtx (V2SFmode);
2863   rtx tmp1, max, min, equal_zero;
2864
2865   gcc_assert (TARGET_PAIRED_FLOAT);
2866   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
2867
2868   switch (rcode)
2869     {
2870     case LT:
2871     case LTU:
2872       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
2873       return;
2874     case GE:
2875     case GEU:
2876       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
2877       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
2878       return;
2879     case LE:
2880     case LEU:
2881       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
2882       return;
2883     case GT:
2884       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
2885       return;
2886     case EQ:
2887       tmp1 = gen_reg_rtx (V2SFmode);
2888       max = gen_reg_rtx (V2SFmode);
2889       min = gen_reg_rtx (V2SFmode);
2890       equal_zero = gen_reg_rtx (V2SFmode);
2891
2892       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
2893       emit_insn (gen_selv2sf4
2894                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
2895       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
2896       emit_insn (gen_selv2sf4
2897                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
2898       emit_insn (gen_subv2sf3 (tmp1, min, max));
2899       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
2900       return;
2901     case NE:
2902       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
2903       return;
2904     case UNLE:
2905       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
2906       return;
2907     case UNLT:
2908       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
2909       return;
2910     case UNGE:
2911       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
2912       return;
2913     case UNGT:
2914       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
2915       return;
2916     default:
2917       gcc_unreachable ();
2918     }
2919
2920   return;
2921 }
2922
2923 /* Emit vector conditional expression.
2924    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
2925    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
2926
2927 int
2928 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
2929                               rtx cond, rtx cc_op0, rtx cc_op1)
2930 {
2931   enum rtx_code rcode = GET_CODE (cond);
2932
2933   if (!TARGET_PAIRED_FLOAT)
2934     return 0;
2935
2936   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
2937
2938   return 1;
2939 }
2940
2941 /* Initialize vector TARGET to VALS.  */
2942
2943 void
2944 rs6000_expand_vector_init (rtx target, rtx vals)
2945 {
2946   enum machine_mode mode = GET_MODE (target);
2947   enum machine_mode inner_mode = GET_MODE_INNER (mode);
2948   int n_elts = GET_MODE_NUNITS (mode);
2949   int n_var = 0, one_var = -1;
2950   bool all_same = true, all_const_zero = true;
2951   rtx x, mem;
2952   int i;
2953
2954   for (i = 0; i < n_elts; ++i)
2955     {
2956       x = XVECEXP (vals, 0, i);
2957       if (!CONSTANT_P (x))
2958         ++n_var, one_var = i;
2959       else if (x != CONST0_RTX (inner_mode))
2960         all_const_zero = false;
2961
2962       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
2963         all_same = false;
2964     }
2965
2966   if (n_var == 0)
2967     {
2968       if (mode != V4SFmode && all_const_zero)
2969         {
2970           /* Zero register.  */
2971           emit_insn (gen_rtx_SET (VOIDmode, target,
2972                                   gen_rtx_XOR (mode, target, target)));
2973           return;
2974         }
2975       else if (mode != V4SFmode && easy_vector_constant (vals, mode))
2976         {
2977           /* Splat immediate.  */
2978           emit_insn (gen_rtx_SET (VOIDmode, target, vals));
2979           return;
2980         }
2981       else if (all_same)
2982         ;       /* Splat vector element.  */
2983       else
2984         {
2985           /* Load from constant pool.  */
2986           emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
2987           return;
2988         }
2989     }
2990
2991   /* Store value to stack temp.  Load vector element.  Splat.  */
2992   if (all_same)
2993     {
2994       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
2995       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
2996                       XVECEXP (vals, 0, 0));
2997       x = gen_rtx_UNSPEC (VOIDmode,
2998                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
2999       emit_insn (gen_rtx_PARALLEL (VOIDmode,
3000                                    gen_rtvec (2,
3001                                               gen_rtx_SET (VOIDmode,
3002                                                            target, mem),
3003                                               x)));
3004       x = gen_rtx_VEC_SELECT (inner_mode, target,
3005                               gen_rtx_PARALLEL (VOIDmode,
3006                                                 gen_rtvec (1, const0_rtx)));
3007       emit_insn (gen_rtx_SET (VOIDmode, target,
3008                               gen_rtx_VEC_DUPLICATE (mode, x)));
3009       return;
3010     }
3011
3012   /* One field is non-constant.  Load constant then overwrite
3013      varying field.  */
3014   if (n_var == 1)
3015     {
3016       rtx copy = copy_rtx (vals);
3017
3018       /* Load constant part of vector, substitute neighboring value for
3019          varying element.  */
3020       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
3021       rs6000_expand_vector_init (target, copy);
3022
3023       /* Insert variable.  */
3024       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
3025       return;
3026     }
3027
3028   /* Construct the vector in memory one field at a time
3029      and load the whole vector.  */
3030   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
3031   for (i = 0; i < n_elts; i++)
3032     emit_move_insn (adjust_address_nv (mem, inner_mode,
3033                                     i * GET_MODE_SIZE (inner_mode)),
3034                     XVECEXP (vals, 0, i));
3035   emit_move_insn (target, mem);
3036 }
3037
3038 /* Set field ELT of TARGET to VAL.  */
3039
3040 void
3041 rs6000_expand_vector_set (rtx target, rtx val, int elt)
3042 {
3043   enum machine_mode mode = GET_MODE (target);
3044   enum machine_mode inner_mode = GET_MODE_INNER (mode);
3045   rtx reg = gen_reg_rtx (mode);
3046   rtx mask, mem, x;
3047   int width = GET_MODE_SIZE (inner_mode);
3048   int i;
3049
3050   /* Load single variable value.  */
3051   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
3052   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
3053   x = gen_rtx_UNSPEC (VOIDmode,
3054                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
3055   emit_insn (gen_rtx_PARALLEL (VOIDmode,
3056                                gen_rtvec (2,
3057                                           gen_rtx_SET (VOIDmode,
3058                                                        reg, mem),
3059                                           x)));
3060
3061   /* Linear sequence.  */
3062   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
3063   for (i = 0; i < 16; ++i)
3064     XVECEXP (mask, 0, i) = GEN_INT (i);
3065
3066   /* Set permute mask to insert element into target.  */
3067   for (i = 0; i < width; ++i)
3068     XVECEXP (mask, 0, elt*width + i)
3069       = GEN_INT (i + 0x10);
3070   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
3071   x = gen_rtx_UNSPEC (mode,
3072                       gen_rtvec (3, target, reg,
3073                                  force_reg (V16QImode, x)),
3074                       UNSPEC_VPERM);
3075   emit_insn (gen_rtx_SET (VOIDmode, target, x));
3076 }
3077
3078 /* Extract field ELT from VEC into TARGET.  */
3079
3080 void
3081 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
3082 {
3083   enum machine_mode mode = GET_MODE (vec);
3084   enum machine_mode inner_mode = GET_MODE_INNER (mode);
3085   rtx mem, x;
3086
3087   /* Allocate mode-sized buffer.  */
3088   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
3089
3090   /* Add offset to field within buffer matching vector element.  */
3091   mem = adjust_address_nv (mem, mode, elt * GET_MODE_SIZE (inner_mode));
3092
3093   /* Store single field into mode-sized buffer.  */
3094   x = gen_rtx_UNSPEC (VOIDmode,
3095                       gen_rtvec (1, const0_rtx), UNSPEC_STVE);
3096   emit_insn (gen_rtx_PARALLEL (VOIDmode,
3097                                gen_rtvec (2,
3098                                           gen_rtx_SET (VOIDmode,
3099                                                        mem, vec),
3100                                           x)));
3101   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
3102 }
3103
3104 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
3105    implement ANDing by the mask IN.  */
3106 void
3107 build_mask64_2_operands (rtx in, rtx *out)
3108 {
3109 #if HOST_BITS_PER_WIDE_INT >= 64
3110   unsigned HOST_WIDE_INT c, lsb, m1, m2;
3111   int shift;
3112
3113   gcc_assert (GET_CODE (in) == CONST_INT);
3114
3115   c = INTVAL (in);
3116   if (c & 1)
3117     {
3118       /* Assume c initially something like 0x00fff000000fffff.  The idea
3119          is to rotate the word so that the middle ^^^^^^ group of zeros
3120          is at the MS end and can be cleared with an rldicl mask.  We then
3121          rotate back and clear off the MS    ^^ group of zeros with a
3122          second rldicl.  */
3123       c = ~c;                   /*   c == 0xff000ffffff00000 */
3124       lsb = c & -c;             /* lsb == 0x0000000000100000 */
3125       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
3126       c = ~c;                   /*   c == 0x00fff000000fffff */
3127       c &= -lsb;                /*   c == 0x00fff00000000000 */
3128       lsb = c & -c;             /* lsb == 0x0000100000000000 */
3129       c = ~c;                   /*   c == 0xff000fffffffffff */
3130       c &= -lsb;                /*   c == 0xff00000000000000 */
3131       shift = 0;
3132       while ((lsb >>= 1) != 0)
3133         shift++;                /* shift == 44 on exit from loop */
3134       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
3135       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
3136       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
3137     }
3138   else
3139     {
3140       /* Assume c initially something like 0xff000f0000000000.  The idea
3141          is to rotate the word so that the     ^^^  middle group of zeros
3142          is at the LS end and can be cleared with an rldicr mask.  We then
3143          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
3144          a second rldicr.  */
3145       lsb = c & -c;             /* lsb == 0x0000010000000000 */
3146       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
3147       c = ~c;                   /*   c == 0x00fff0ffffffffff */
3148       c &= -lsb;                /*   c == 0x00fff00000000000 */
3149       lsb = c & -c;             /* lsb == 0x0000100000000000 */
3150       c = ~c;                   /*   c == 0xff000fffffffffff */
3151       c &= -lsb;                /*   c == 0xff00000000000000 */
3152       shift = 0;
3153       while ((lsb >>= 1) != 0)
3154         shift++;                /* shift == 44 on exit from loop */
3155       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
3156       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
3157       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
3158     }
3159
3160   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
3161      masks will be all 1's.  We are guaranteed more than one transition.  */
3162   out[0] = GEN_INT (64 - shift);
3163   out[1] = GEN_INT (m1);
3164   out[2] = GEN_INT (shift);
3165   out[3] = GEN_INT (m2);
3166 #else
3167   (void)in;
3168   (void)out;
3169   gcc_unreachable ();
3170 #endif
3171 }
3172
3173 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
3174
3175 bool
3176 invalid_e500_subreg (rtx op, enum machine_mode mode)
3177 {
3178   if (TARGET_E500_DOUBLE)
3179     {
3180       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
3181          subreg:TI and reg:TF.  */
3182       if (GET_CODE (op) == SUBREG
3183           && (mode == SImode || mode == DImode || mode == TImode)
3184           && REG_P (SUBREG_REG (op))
3185           && (GET_MODE (SUBREG_REG (op)) == DFmode
3186               || GET_MODE (SUBREG_REG (op)) == TFmode
3187               || GET_MODE (SUBREG_REG (op)) == DDmode
3188               || GET_MODE (SUBREG_REG (op)) == TDmode))
3189         return true;
3190
3191       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
3192          reg:TI.  */
3193       if (GET_CODE (op) == SUBREG
3194           && (mode == DFmode || mode == TFmode
3195               || mode == DDmode || mode == TDmode)
3196           && REG_P (SUBREG_REG (op))
3197           && (GET_MODE (SUBREG_REG (op)) == DImode
3198               || GET_MODE (SUBREG_REG (op)) == TImode))
3199         return true;
3200     }
3201
3202   if (TARGET_SPE
3203       && GET_CODE (op) == SUBREG
3204       && mode == SImode
3205       && REG_P (SUBREG_REG (op))
3206       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
3207     return true;
3208
3209   return false;
3210 }
3211
3212 /* AIX increases natural record alignment to doubleword if the first
3213    field is an FP double while the FP fields remain word aligned.  */
3214
3215 unsigned int
3216 rs6000_special_round_type_align (tree type, unsigned int computed,
3217                                  unsigned int specified)
3218 {
3219   unsigned int align = MAX (computed, specified);
3220   tree field = TYPE_FIELDS (type);
3221
3222   /* Skip all non field decls */
3223   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
3224     field = TREE_CHAIN (field);
3225
3226   if (field != NULL && field != type)
3227     {
3228       type = TREE_TYPE (field);
3229       while (TREE_CODE (type) == ARRAY_TYPE)
3230         type = TREE_TYPE (type);
3231
3232       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
3233         align = MAX (align, 64);
3234     }
3235
3236   return align;
3237 }
3238
3239 /* Darwin increases record alignment to the natural alignment of
3240    the first field.  */
3241
3242 unsigned int
3243 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
3244                                         unsigned int specified)
3245 {
3246   unsigned int align = MAX (computed, specified);
3247
3248   if (TYPE_PACKED (type))
3249     return align;
3250
3251   /* Find the first field, looking down into aggregates.  */
3252   do {
3253     tree field = TYPE_FIELDS (type);
3254     /* Skip all non field decls */
3255     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
3256       field = TREE_CHAIN (field);
3257     if (! field)
3258       break;
3259     type = TREE_TYPE (field);
3260     while (TREE_CODE (type) == ARRAY_TYPE)
3261       type = TREE_TYPE (type);
3262   } while (AGGREGATE_TYPE_P (type));
3263
3264   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
3265     align = MAX (align, TYPE_ALIGN (type));
3266
3267   return align;
3268 }
3269
3270 /* Return 1 for an operand in small memory on V.4/eabi.  */
3271
3272 int
3273 small_data_operand (rtx op ATTRIBUTE_UNUSED,
3274                     enum machine_mode mode ATTRIBUTE_UNUSED)
3275 {
3276 #if TARGET_ELF
3277   rtx sym_ref;
3278
3279   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
3280     return 0;
3281
3282   if (DEFAULT_ABI != ABI_V4)
3283     return 0;
3284
3285   /* Vector and float memory instructions have a limited offset on the
3286      SPE, so using a vector or float variable directly as an operand is
3287      not useful.  */
3288   if (TARGET_SPE
3289       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
3290     return 0;
3291
3292   if (GET_CODE (op) == SYMBOL_REF)
3293     sym_ref = op;
3294
3295   else if (GET_CODE (op) != CONST
3296            || GET_CODE (XEXP (op, 0)) != PLUS
3297            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
3298            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
3299     return 0;
3300
3301   else
3302     {
3303       rtx sum = XEXP (op, 0);
3304       HOST_WIDE_INT summand;
3305
3306       /* We have to be careful here, because it is the referenced address
3307          that must be 32k from _SDA_BASE_, not just the symbol.  */
3308       summand = INTVAL (XEXP (sum, 1));
3309       if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
3310         return 0;
3311
3312       sym_ref = XEXP (sum, 0);
3313     }
3314
3315   return SYMBOL_REF_SMALL_P (sym_ref);
3316 #else
3317   return 0;
3318 #endif
3319 }
3320
3321 /* Return true if either operand is a general purpose register.  */
3322
3323 bool
3324 gpr_or_gpr_p (rtx op0, rtx op1)
3325 {
3326   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
3327           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
3328 }
3329
3330 \f
3331 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address.  */
3332
3333 static int
3334 constant_pool_expr_1 (rtx op, int *have_sym, int *have_toc)
3335 {
3336   switch (GET_CODE (op))
3337     {
3338     case SYMBOL_REF:
3339       if (RS6000_SYMBOL_REF_TLS_P (op))
3340         return 0;
3341       else if (CONSTANT_POOL_ADDRESS_P (op))
3342         {
3343           if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
3344             {
3345               *have_sym = 1;
3346               return 1;
3347             }
3348           else
3349             return 0;
3350         }
3351       else if (! strcmp (XSTR (op, 0), toc_label_name))
3352         {
3353           *have_toc = 1;
3354           return 1;
3355         }
3356       else
3357         return 0;
3358     case PLUS:
3359     case MINUS:
3360       return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
3361               && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
3362     case CONST:
3363       return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
3364     case CONST_INT:
3365       return 1;
3366     default:
3367       return 0;
3368     }
3369 }
3370
3371 static bool
3372 constant_pool_expr_p (rtx op)
3373 {
3374   int have_sym = 0;
3375   int have_toc = 0;
3376   return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
3377 }
3378
3379 bool
3380 toc_relative_expr_p (rtx op)
3381 {
3382   int have_sym = 0;
3383   int have_toc = 0;
3384   return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
3385 }
3386
3387 bool
3388 legitimate_constant_pool_address_p (rtx x)
3389 {
3390   return (TARGET_TOC
3391           && GET_CODE (x) == PLUS
3392           && GET_CODE (XEXP (x, 0)) == REG
3393           && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
3394           && constant_pool_expr_p (XEXP (x, 1)));
3395 }
3396
3397 static bool
3398 legitimate_small_data_p (enum machine_mode mode, rtx x)
3399 {
3400   return (DEFAULT_ABI == ABI_V4
3401           && !flag_pic && !TARGET_TOC
3402           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
3403           && small_data_operand (x, mode));
3404 }
3405
3406 /* SPE offset addressing is limited to 5-bits worth of double words.  */
3407 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
3408
3409 bool
3410 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
3411 {
3412   unsigned HOST_WIDE_INT offset, extra;
3413
3414   if (GET_CODE (x) != PLUS)
3415     return false;
3416   if (GET_CODE (XEXP (x, 0)) != REG)
3417     return false;
3418   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
3419     return false;
3420   if (legitimate_constant_pool_address_p (x))
3421     return true;
3422   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3423     return false;
3424
3425   offset = INTVAL (XEXP (x, 1));
3426   extra = 0;
3427   switch (mode)
3428     {
3429     case V16QImode:
3430     case V8HImode:
3431     case V4SFmode:
3432     case V4SImode:
3433       /* AltiVec vector modes.  Only reg+reg addressing is valid and
3434          constant offset zero should not occur due to canonicalization.  */
3435       return false;
3436
3437     case V4HImode:
3438     case V2SImode:
3439     case V1DImode:
3440     case V2SFmode:
3441        /* Paired vector modes.  Only reg+reg addressing is valid and
3442           constant offset zero should not occur due to canonicalization.  */
3443       if (TARGET_PAIRED_FLOAT)
3444         return false;
3445       /* SPE vector modes.  */
3446       return SPE_CONST_OFFSET_OK (offset);
3447
3448     case DFmode:
3449     case DDmode:
3450       if (TARGET_E500_DOUBLE)
3451         return SPE_CONST_OFFSET_OK (offset);
3452
3453     case DImode:
3454       /* On e500v2, we may have:
3455
3456            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
3457
3458          Which gets addressed with evldd instructions.  */
3459       if (TARGET_E500_DOUBLE)
3460         return SPE_CONST_OFFSET_OK (offset);
3461
3462       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
3463         extra = 4;
3464       else if (offset & 3)
3465         return false;
3466       break;
3467
3468     case TFmode:
3469     case TDmode:
3470       if (TARGET_E500_DOUBLE)
3471         return (SPE_CONST_OFFSET_OK (offset)
3472                 && SPE_CONST_OFFSET_OK (offset + 8));
3473
3474     case TImode:
3475       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
3476         extra = 12;
3477       else if (offset & 3)
3478         return false;
3479       else
3480         extra = 8;
3481       break;
3482
3483     default:
3484       break;
3485     }
3486
3487   offset += 0x8000;
3488   return (offset < 0x10000) && (offset + extra < 0x10000);
3489 }
3490
3491 bool
3492 legitimate_indexed_address_p (rtx x, int strict)
3493 {
3494   rtx op0, op1;
3495
3496   if (GET_CODE (x) != PLUS)
3497     return false;
3498
3499   op0 = XEXP (x, 0);
3500   op1 = XEXP (x, 1);
3501
3502   /* Recognize the rtl generated by reload which we know will later be
3503      replaced with proper base and index regs.  */
3504   if (!strict
3505       && reload_in_progress
3506       && (REG_P (op0) || GET_CODE (op0) == PLUS)
3507       && REG_P (op1))
3508     return true;
3509
3510   return (REG_P (op0) && REG_P (op1)
3511           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
3512                && INT_REG_OK_FOR_INDEX_P (op1, strict))
3513               || (INT_REG_OK_FOR_BASE_P (op1, strict)
3514                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
3515 }
3516
3517 inline bool
3518 legitimate_indirect_address_p (rtx x, int strict)
3519 {
3520   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
3521 }
3522
3523 bool
3524 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
3525 {
3526   if (!TARGET_MACHO || !flag_pic
3527       || mode != SImode || GET_CODE (x) != MEM)
3528     return false;
3529   x = XEXP (x, 0);
3530
3531   if (GET_CODE (x) != LO_SUM)
3532     return false;
3533   if (GET_CODE (XEXP (x, 0)) != REG)
3534     return false;
3535   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
3536     return false;
3537   x = XEXP (x, 1);
3538
3539   return CONSTANT_P (x);
3540 }
3541
3542 static bool
3543 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
3544 {
3545   if (GET_CODE (x) != LO_SUM)
3546     return false;
3547   if (GET_CODE (XEXP (x, 0)) != REG)
3548     return false;
3549   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
3550     return false;
3551   /* Restrict addressing for DI because of our SUBREG hackery.  */
3552   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
3553                              || mode == DDmode || mode == TDmode
3554                              || mode == DImode))
3555     return false;
3556   x = XEXP (x, 1);
3557
3558   if (TARGET_ELF || TARGET_MACHO)
3559     {
3560       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
3561         return false;
3562       if (TARGET_TOC)
3563         return false;
3564       if (GET_MODE_NUNITS (mode) != 1)
3565         return false;
3566       if (GET_MODE_BITSIZE (mode) > 64
3567           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
3568               && !(TARGET_HARD_FLOAT && TARGET_FPRS
3569                    && (mode == DFmode || mode == DDmode))))
3570         return false;
3571
3572       return CONSTANT_P (x);
3573     }
3574
3575   return false;
3576 }
3577
3578
3579 /* Try machine-dependent ways of modifying an illegitimate address
3580    to be legitimate.  If we find one, return the new, valid address.
3581    This is used from only one place: `memory_address' in explow.c.
3582
3583    OLDX is the address as it was before break_out_memory_refs was
3584    called.  In some cases it is useful to look at this to decide what
3585    needs to be done.
3586
3587    MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
3588
3589    It is always safe for this function to do nothing.  It exists to
3590    recognize opportunities to optimize the output.
3591
3592    On RS/6000, first check for the sum of a register with a constant
3593    integer that is out of range.  If so, generate code to add the
3594    constant with the low-order 16 bits masked to the register and force
3595    this result into another register (this can be done with `cau').
3596    Then generate an address of REG+(CONST&0xffff), allowing for the
3597    possibility of bit 16 being a one.
3598
3599    Then check for the sum of a register and something not constant, try to
3600    load the other things into a register and return the sum.  */
3601
3602 rtx
3603 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3604                            enum machine_mode mode)
3605 {
3606   if (GET_CODE (x) == SYMBOL_REF)
3607     {
3608       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
3609       if (model != 0)
3610         return rs6000_legitimize_tls_address (x, model);
3611     }
3612
3613   if (GET_CODE (x) == PLUS
3614       && GET_CODE (XEXP (x, 0)) == REG
3615       && GET_CODE (XEXP (x, 1)) == CONST_INT
3616       && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000
3617       && !(SPE_VECTOR_MODE (mode)
3618            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
3619                                       || mode == DImode))))
3620     {
3621       HOST_WIDE_INT high_int, low_int;
3622       rtx sum;
3623       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
3624       high_int = INTVAL (XEXP (x, 1)) - low_int;
3625       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
3626                                          GEN_INT (high_int)), 0);
3627       return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
3628     }
3629   else if (GET_CODE (x) == PLUS
3630            && GET_CODE (XEXP (x, 0)) == REG
3631            && GET_CODE (XEXP (x, 1)) != CONST_INT
3632            && GET_MODE_NUNITS (mode) == 1
3633            && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3634                || TARGET_POWERPC64
3635                || (((mode != DImode && mode != DFmode && mode != DDmode)
3636                     || TARGET_E500_DOUBLE)
3637                    && mode != TFmode && mode != TDmode))
3638            && (TARGET_POWERPC64 || mode != DImode)
3639            && mode != TImode)
3640     {
3641       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
3642                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
3643     }
3644   else if (ALTIVEC_VECTOR_MODE (mode))
3645     {
3646       rtx reg;
3647
3648       /* Make sure both operands are registers.  */
3649       if (GET_CODE (x) == PLUS)
3650         return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
3651                              force_reg (Pmode, XEXP (x, 1)));
3652
3653       reg = force_reg (Pmode, x);
3654       return reg;
3655     }
3656   else if (SPE_VECTOR_MODE (mode)
3657            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
3658                                       || mode == DDmode || mode == TDmode
3659                                       || mode == DImode)))
3660     {
3661       if (mode == DImode)
3662         return NULL_RTX;
3663       /* We accept [reg + reg] and [reg + OFFSET].  */
3664
3665       if (GET_CODE (x) == PLUS)
3666        {
3667          rtx op1 = XEXP (x, 0);
3668          rtx op2 = XEXP (x, 1);
3669          rtx y;
3670
3671          op1 = force_reg (Pmode, op1);
3672
3673          if (GET_CODE (op2) != REG
3674              && (GET_CODE (op2) != CONST_INT
3675                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
3676                  || (GET_MODE_SIZE (mode) > 8
3677                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
3678            op2 = force_reg (Pmode, op2);
3679
3680          /* We can't always do [reg + reg] for these, because [reg +
3681             reg + offset] is not a legitimate addressing mode.  */
3682          y = gen_rtx_PLUS (Pmode, op1, op2);
3683
3684          if (GET_MODE_SIZE (mode) > 8 && REG_P (op2))
3685            return force_reg (Pmode, y);
3686          else
3687            return y;
3688        }
3689
3690       return force_reg (Pmode, x);
3691     }
3692   else if (TARGET_ELF
3693            && TARGET_32BIT
3694            && TARGET_NO_TOC
3695            && ! flag_pic
3696            && GET_CODE (x) != CONST_INT
3697            && GET_CODE (x) != CONST_DOUBLE
3698            && CONSTANT_P (x)
3699            && GET_MODE_NUNITS (mode) == 1
3700            && (GET_MODE_BITSIZE (mode) <= 32
3701                || ((TARGET_HARD_FLOAT && TARGET_FPRS)
3702                    && (mode == DFmode || mode == DDmode))))
3703     {
3704       rtx reg = gen_reg_rtx (Pmode);
3705       emit_insn (gen_elf_high (reg, x));
3706       return gen_rtx_LO_SUM (Pmode, reg, x);
3707     }
3708   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
3709            && ! flag_pic
3710 #if TARGET_MACHO
3711            && ! MACHO_DYNAMIC_NO_PIC_P
3712 #endif
3713            && GET_CODE (x) != CONST_INT
3714            && GET_CODE (x) != CONST_DOUBLE
3715            && CONSTANT_P (x)
3716            && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3717                || (mode != DFmode && mode != DDmode))
3718            && mode != DImode
3719            && mode != TImode)
3720     {
3721       rtx reg = gen_reg_rtx (Pmode);
3722       emit_insn (gen_macho_high (reg, x));
3723       return gen_rtx_LO_SUM (Pmode, reg, x);
3724     }
3725   else if (TARGET_TOC
3726            && constant_pool_expr_p (x)
3727            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
3728     {
3729       return create_TOC_reference (x);
3730     }
3731   else
3732     return NULL_RTX;
3733 }
3734
3735 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
3736    We need to emit DTP-relative relocations.  */
3737
3738 static void
3739 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
3740 {
3741   switch (size)
3742     {
3743     case 4:
3744       fputs ("\t.long\t", file);
3745       break;
3746     case 8:
3747       fputs (DOUBLE_INT_ASM_OP, file);
3748       break;
3749     default:
3750       gcc_unreachable ();
3751     }
3752   output_addr_const (file, x);
3753   fputs ("@dtprel+0x8000", file);
3754 }
3755
3756 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
3757
3758 static GTY(()) rtx rs6000_tls_symbol;
3759 static rtx
3760 rs6000_tls_get_addr (void)
3761 {
3762   if (!rs6000_tls_symbol)
3763     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
3764
3765   return rs6000_tls_symbol;
3766 }
3767
3768 /* Construct the SYMBOL_REF for TLS GOT references.  */
3769
3770 static GTY(()) rtx rs6000_got_symbol;
3771 static rtx
3772 rs6000_got_sym (void)
3773 {
3774   if (!rs6000_got_symbol)
3775     {
3776       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3777       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
3778       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
3779     }
3780
3781   return rs6000_got_symbol;
3782 }
3783
3784 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
3785    this (thread-local) address.  */
3786
3787 static rtx
3788 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
3789 {
3790   rtx dest, insn;
3791
3792   dest = gen_reg_rtx (Pmode);
3793   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
3794     {
3795       rtx tlsreg;
3796
3797       if (TARGET_64BIT)
3798         {
3799           tlsreg = gen_rtx_REG (Pmode, 13);
3800           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
3801         }
3802       else
3803         {
3804           tlsreg = gen_rtx_REG (Pmode, 2);
3805           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
3806         }
3807       emit_insn (insn);
3808     }
3809   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
3810     {
3811       rtx tlsreg, tmp;
3812
3813       tmp = gen_reg_rtx (Pmode);
3814       if (TARGET_64BIT)
3815         {
3816           tlsreg = gen_rtx_REG (Pmode, 13);
3817           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
3818         }
3819       else
3820         {
3821           tlsreg = gen_rtx_REG (Pmode, 2);
3822           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
3823         }
3824       emit_insn (insn);
3825       if (TARGET_64BIT)
3826         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
3827       else
3828         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
3829       emit_insn (insn);
3830     }
3831   else
3832     {
3833       rtx r3, got, tga, tmp1, tmp2, eqv;
3834
3835       /* We currently use relocations like @got@tlsgd for tls, which
3836          means the linker will handle allocation of tls entries, placing
3837          them in the .got section.  So use a pointer to the .got section,
3838          not one to secondary TOC sections used by 64-bit -mminimal-toc,
3839          or to secondary GOT sections used by 32-bit -fPIC.  */
3840       if (TARGET_64BIT)
3841         got = gen_rtx_REG (Pmode, 2);
3842       else
3843         {
3844           if (flag_pic == 1)
3845             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
3846           else
3847             {
3848               rtx gsym = rs6000_got_sym ();
3849               got = gen_reg_rtx (Pmode);
3850               if (flag_pic == 0)
3851                 rs6000_emit_move (got, gsym, Pmode);
3852               else
3853                 {
3854                   rtx tmp3, mem;
3855                   rtx first, last;
3856
3857                   tmp1 = gen_reg_rtx (Pmode);
3858                   tmp2 = gen_reg_rtx (Pmode);
3859                   tmp3 = gen_reg_rtx (Pmode);
3860                   mem = gen_const_mem (Pmode, tmp1);
3861
3862                   first = emit_insn (gen_load_toc_v4_PIC_1b (gsym));
3863                   emit_move_insn (tmp1,
3864                                   gen_rtx_REG (Pmode, LR_REGNO));
3865                   emit_move_insn (tmp2, mem);
3866                   emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
3867                   last = emit_move_insn (got, tmp3);
3868                   set_unique_reg_note (last, REG_EQUAL, gsym);
3869                   maybe_encapsulate_block (first, last, gsym);
3870                 }
3871             }
3872         }
3873
3874       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
3875         {
3876           r3 = gen_rtx_REG (Pmode, 3);
3877           if (TARGET_64BIT)
3878             insn = gen_tls_gd_64 (r3, got, addr);
3879           else
3880             insn = gen_tls_gd_32 (r3, got, addr);
3881           start_sequence ();
3882           emit_insn (insn);
3883           tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
3884           insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
3885           insn = emit_call_insn (insn);
3886           CONST_OR_PURE_CALL_P (insn) = 1;
3887           use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
3888           insn = get_insns ();
3889           end_sequence ();
3890           emit_libcall_block (insn, dest, r3, addr);
3891         }
3892       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
3893         {
3894           r3 = gen_rtx_REG (Pmode, 3);
3895           if (TARGET_64BIT)
3896             insn = gen_tls_ld_64 (r3, got);
3897           else
3898             insn = gen_tls_ld_32 (r3, got);
3899           start_sequence ();
3900           emit_insn (insn);
3901           tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
3902           insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
3903           insn = emit_call_insn (insn);
3904           CONST_OR_PURE_CALL_P (insn) = 1;
3905           use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
3906           insn = get_insns ();
3907           end_sequence ();
3908           tmp1 = gen_reg_rtx (Pmode);
3909           eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3910                                 UNSPEC_TLSLD);
3911           emit_libcall_block (insn, tmp1, r3, eqv);
3912           if (rs6000_tls_size == 16)
3913             {
3914               if (TARGET_64BIT)
3915                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
3916               else
3917                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
3918             }
3919           else if (rs6000_tls_size == 32)
3920             {
3921               tmp2 = gen_reg_rtx (Pmode);
3922               if (TARGET_64BIT)
3923                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
3924               else
3925                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
3926               emit_insn (insn);
3927               if (TARGET_64BIT)
3928                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
3929               else
3930                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
3931             }
3932           else
3933             {
3934               tmp2 = gen_reg_rtx (Pmode);
3935               if (TARGET_64BIT)
3936                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
3937               else
3938                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
3939               emit_insn (insn);
3940               insn = gen_rtx_SET (Pmode, dest,
3941                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
3942             }
3943           emit_insn (insn);
3944         }
3945       else
3946         {
3947           /* IE, or 64-bit offset LE.  */
3948           tmp2 = gen_reg_rtx (Pmode);
3949           if (TARGET_64BIT)
3950             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
3951           else
3952             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
3953           emit_insn (insn);
3954           if (TARGET_64BIT)
3955             insn = gen_tls_tls_64 (dest, tmp2, addr);
3956           else
3957             insn = gen_tls_tls_32 (dest, tmp2, addr);
3958           emit_insn (insn);
3959         }
3960     }
3961
3962   return dest;
3963 }
3964
3965 /* Return 1 if X contains a thread-local symbol.  */
3966
3967 bool
3968 rs6000_tls_referenced_p (rtx x)
3969 {
3970   if (! TARGET_HAVE_TLS)
3971     return false;
3972
3973   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
3974 }
3975
3976 /* Return 1 if *X is a thread-local symbol.  This is the same as
3977    rs6000_tls_symbol_ref except for the type of the unused argument.  */
3978
3979 static int
3980 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
3981 {
3982   return RS6000_SYMBOL_REF_TLS_P (*x);
3983 }
3984
3985 /* The convention appears to be to define this wherever it is used.
3986    With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
3987    is now used here.  */
3988 #ifndef REG_MODE_OK_FOR_BASE_P
3989 #define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
3990 #endif
3991
3992 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
3993    replace the input X, or the original X if no replacement is called for.
3994    The output parameter *WIN is 1 if the calling macro should goto WIN,
3995    0 if it should not.
3996
3997    For RS/6000, we wish to handle large displacements off a base
3998    register by splitting the addend across an addiu/addis and the mem insn.
3999    This cuts number of extra insns needed from 3 to 1.
4000
4001    On Darwin, we use this to generate code for floating point constants.
4002    A movsf_low is generated so we wind up with 2 instructions rather than 3.
4003    The Darwin code is inside #if TARGET_MACHO because only then is
4004    machopic_function_base_name() defined.  */
4005 rtx
4006 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
4007                                   int opnum, int type,
4008                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
4009 {
4010   /* We must recognize output that we have already generated ourselves.  */
4011   if (GET_CODE (x) == PLUS
4012       && GET_CODE (XEXP (x, 0)) == PLUS
4013       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
4014       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4015       && GET_CODE (XEXP (x, 1)) == CONST_INT)
4016     {
4017       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4018                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4019                    opnum, (enum reload_type)type);
4020       *win = 1;
4021       return x;
4022     }
4023
4024 #if TARGET_MACHO
4025   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
4026       && GET_CODE (x) == LO_SUM
4027       && GET_CODE (XEXP (x, 0)) == PLUS
4028       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
4029       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
4030       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
4031       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
4032       && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
4033       && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
4034       && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
4035     {
4036       /* Result of previous invocation of this function on Darwin
4037          floating point constant.  */
4038       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4039                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
4040                    opnum, (enum reload_type)type);
4041       *win = 1;
4042       return x;
4043     }
4044 #endif
4045
4046   /* Force ld/std non-word aligned offset into base register by wrapping
4047      in offset 0.  */
4048   if (GET_CODE (x) == PLUS
4049       && GET_CODE (XEXP (x, 0)) == REG
4050       && REGNO (XEXP (x, 0)) < 32
4051       && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
4052       && GET_CODE (XEXP (x, 1)) == CONST_INT
4053       && (INTVAL (XEXP (x, 1)) & 3) != 0
4054       && !ALTIVEC_VECTOR_MODE (mode)
4055       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
4056       && TARGET_POWERPC64)
4057     {
4058       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
4059       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4060                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4061                    opnum, (enum reload_type) type);
4062       *win = 1;
4063       return x;
4064     }
4065
4066   if (GET_CODE (x) == PLUS
4067       && GET_CODE (XEXP (x, 0)) == REG
4068       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
4069       && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
4070       && GET_CODE (XEXP (x, 1)) == CONST_INT
4071       && !SPE_VECTOR_MODE (mode)
4072       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
4073                                   || mode == DDmode || mode == TDmode
4074                                   || mode == DImode))
4075       && !ALTIVEC_VECTOR_MODE (mode))
4076     {
4077       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
4078       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
4079       HOST_WIDE_INT high
4080         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
4081
4082       /* Check for 32-bit overflow.  */
4083       if (high + low != val)
4084         {
4085           *win = 0;
4086           return x;
4087         }
4088
4089       /* Reload the high part into a base reg; leave the low part
4090          in the mem directly.  */
4091
4092       x = gen_rtx_PLUS (GET_MODE (x),
4093                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
4094                                       GEN_INT (high)),
4095                         GEN_INT (low));
4096
4097       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4098                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4099                    opnum, (enum reload_type)type);
4100       *win = 1;
4101       return x;
4102     }
4103
4104   if (GET_CODE (x) == SYMBOL_REF
4105       && !ALTIVEC_VECTOR_MODE (mode)
4106       && !SPE_VECTOR_MODE (mode)
4107 #if TARGET_MACHO
4108       && DEFAULT_ABI == ABI_DARWIN
4109       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
4110 #else
4111       && DEFAULT_ABI == ABI_V4
4112       && !flag_pic
4113 #endif
4114       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
4115          The same goes for DImode without 64-bit gprs and DFmode and DDmode
4116          without fprs.  */
4117       && mode != TFmode
4118       && mode != TDmode
4119       && (mode != DImode || TARGET_POWERPC64)
4120       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
4121           || (TARGET_FPRS && TARGET_HARD_FLOAT)))
4122     {
4123 #if TARGET_MACHO
4124       if (flag_pic)
4125         {
4126           rtx offset = gen_rtx_CONST (Pmode,
4127                          gen_rtx_MINUS (Pmode, x,
4128                                         machopic_function_base_sym ()));
4129           x = gen_rtx_LO_SUM (GET_MODE (x),
4130                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
4131                   gen_rtx_HIGH (Pmode, offset)), offset);
4132         }
4133       else
4134 #endif
4135         x = gen_rtx_LO_SUM (GET_MODE (x),
4136               gen_rtx_HIGH (Pmode, x), x);
4137
4138       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4139                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
4140                    opnum, (enum reload_type)type);
4141       *win = 1;
4142       return x;
4143     }
4144
4145   /* Reload an offset address wrapped by an AND that represents the
4146      masking of the lower bits.  Strip the outer AND and let reload
4147      convert the offset address into an indirect address.  */
4148   if (TARGET_ALTIVEC
4149       && ALTIVEC_VECTOR_MODE (mode)
4150       && GET_CODE (x) == AND
4151       && GET_CODE (XEXP (x, 0)) == PLUS
4152       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
4153       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4154       && GET_CODE (XEXP (x, 1)) == CONST_INT
4155       && INTVAL (XEXP (x, 1)) == -16)
4156     {
4157       x = XEXP (x, 0);
4158       *win = 1;
4159       return x;
4160     }
4161
4162   if (TARGET_TOC
4163       && constant_pool_expr_p (x)
4164       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
4165     {
4166       x = create_TOC_reference (x);
4167       *win = 1;
4168       return x;
4169     }
4170   *win = 0;
4171   return x;
4172 }
4173
4174 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
4175    that is a valid memory address for an instruction.
4176    The MODE argument is the machine mode for the MEM expression
4177    that wants to use this address.
4178
4179    On the RS/6000, there are four valid address: a SYMBOL_REF that
4180    refers to a constant pool entry of an address (or the sum of it
4181    plus a constant), a short (16-bit signed) constant plus a register,
4182    the sum of two registers, or a register indirect, possibly with an
4183    auto-increment.  For DFmode, DDmode and DImode with a constant plus
4184    register, we must ensure that both words are addressable or PowerPC64
4185    with offset word aligned.
4186
4187    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
4188    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
4189    because adjacent memory cells are accessed by adding word-sized offsets
4190    during assembly output.  */
4191 int
4192 rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
4193 {
4194   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
4195   if (TARGET_ALTIVEC
4196       && ALTIVEC_VECTOR_MODE (mode)
4197       && GET_CODE (x) == AND
4198       && GET_CODE (XEXP (x, 1)) == CONST_INT
4199       && INTVAL (XEXP (x, 1)) == -16)
4200     x = XEXP (x, 0);
4201
4202   if (RS6000_SYMBOL_REF_TLS_P (x))
4203     return 0;
4204   if (legitimate_indirect_address_p (x, reg_ok_strict))
4205     return 1;
4206   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
4207       && !ALTIVEC_VECTOR_MODE (mode)
4208       && !SPE_VECTOR_MODE (mode)
4209       && mode != TFmode
4210       && mode != TDmode
4211       /* Restrict addressing for DI because of our SUBREG hackery.  */
4212       && !(TARGET_E500_DOUBLE
4213            && (mode == DFmode || mode == DDmode || mode == DImode))
4214       && TARGET_UPDATE
4215       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
4216     return 1;
4217   if (legitimate_small_data_p (mode, x))
4218     return 1;
4219   if (legitimate_constant_pool_address_p (x))
4220     return 1;
4221   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
4222   if (! reg_ok_strict
4223       && GET_CODE (x) == PLUS
4224       && GET_CODE (XEXP (x, 0)) == REG
4225       && (XEXP (x, 0) == virtual_stack_vars_rtx
4226           || XEXP (x, 0) == arg_pointer_rtx)
4227       && GET_CODE (XEXP (x, 1)) == CONST_INT)
4228     return 1;
4229   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
4230     return 1;
4231   if (mode != TImode
4232       && mode != TFmode
4233       && mode != TDmode
4234       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
4235           || TARGET_POWERPC64
4236           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
4237       && (TARGET_POWERPC64 || mode != DImode)
4238       && legitimate_indexed_address_p (x, reg_ok_strict))
4239     return 1;
4240   if (GET_CODE (x) == PRE_MODIFY
4241       && mode != TImode
4242       && mode != TFmode
4243       && mode != TDmode
4244       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
4245           || TARGET_POWERPC64
4246           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
4247       && (TARGET_POWERPC64 || mode != DImode)
4248       && !ALTIVEC_VECTOR_MODE (mode)
4249       && !SPE_VECTOR_MODE (mode)
4250       /* Restrict addressing for DI because of our SUBREG hackery.  */
4251       && !(TARGET_E500_DOUBLE
4252            && (mode == DFmode || mode == DDmode || mode == DImode))
4253       && TARGET_UPDATE
4254       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
4255       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
4256           || legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict))
4257       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4258     return 1;
4259   if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
4260     return 1;
4261   return 0;
4262 }
4263
4264 /* Go to LABEL if ADDR (a legitimate address expression)
4265    has an effect that depends on the machine mode it is used for.
4266
4267    On the RS/6000 this is true of all integral offsets (since AltiVec
4268    modes don't allow them) or is a pre-increment or decrement.
4269
4270    ??? Except that due to conceptual problems in offsettable_address_p
4271    we can't really report the problems of integral offsets.  So leave
4272    this assuming that the adjustable offset must be valid for the
4273    sub-words of a TFmode operand, which is what we had before.  */
4274
4275 bool
4276 rs6000_mode_dependent_address (rtx addr)
4277 {
4278   switch (GET_CODE (addr))
4279     {
4280     case PLUS:
4281       if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
4282         {
4283           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
4284           return val + 12 + 0x8000 >= 0x10000;
4285         }
4286       break;
4287
4288     case LO_SUM:
4289       return true;
4290
4291     case PRE_INC:
4292     case PRE_DEC:
4293     case PRE_MODIFY:
4294       return TARGET_UPDATE;
4295
4296     default:
4297       break;
4298     }
4299
4300   return false;
4301 }
4302
4303 /* More elaborate version of recog's offsettable_memref_p predicate
4304    that works around the ??? note of rs6000_mode_dependent_address.
4305    In particular it accepts
4306
4307      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
4308
4309    in 32-bit mode, that the recog predicate rejects.  */
4310
4311 bool
4312 rs6000_offsettable_memref_p (rtx op)
4313 {
4314   if (!MEM_P (op))
4315     return false;
4316
4317   /* First mimic offsettable_memref_p.  */
4318   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
4319     return true;
4320
4321   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
4322      the latter predicate knows nothing about the mode of the memory
4323      reference and, therefore, assumes that it is the largest supported
4324      mode (TFmode).  As a consequence, legitimate offsettable memory
4325      references are rejected.  rs6000_legitimate_offset_address_p contains
4326      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
4327   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
4328 }
4329
4330 /* Return number of consecutive hard regs needed starting at reg REGNO
4331    to hold something of mode MODE.
4332    This is ordinarily the length in words of a value of mode MODE
4333    but can be less for certain modes in special long registers.
4334
4335    For the SPE, GPRs are 64 bits but only 32 bits are visible in
4336    scalar instructions.  The upper 32 bits are only available to the
4337    SIMD instructions.
4338
4339    POWER and PowerPC GPRs hold 32 bits worth;
4340    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
4341
4342 int
4343 rs6000_hard_regno_nregs (int regno, enum machine_mode mode)
4344 {
4345   if (FP_REGNO_P (regno))
4346     return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
4347
4348   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
4349     return (GET_MODE_SIZE (mode) + UNITS_PER_SPE_WORD - 1) / UNITS_PER_SPE_WORD;
4350
4351   if (ALTIVEC_REGNO_P (regno))
4352     return
4353       (GET_MODE_SIZE (mode) + UNITS_PER_ALTIVEC_WORD - 1) / UNITS_PER_ALTIVEC_WORD;
4354
4355   /* The value returned for SCmode in the E500 double case is 2 for
4356      ABI compatibility; storing an SCmode value in a single register
4357      would require function_arg and rs6000_spe_function_arg to handle
4358      SCmode so as to pass the value correctly in a pair of
4359      registers.  */
4360   if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode)
4361     return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
4362
4363   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4364 }
4365
4366 /* Change register usage conditional on target flags.  */
4367 void
4368 rs6000_conditional_register_usage (void)
4369 {
4370   int i;
4371
4372   /* Set MQ register fixed (already call_used) if not POWER
4373      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
4374      be allocated.  */
4375   if (! TARGET_POWER)
4376     fixed_regs[64] = 1;
4377
4378   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
4379   if (TARGET_64BIT)
4380     fixed_regs[13] = call_used_regs[13]
4381       = call_really_used_regs[13] = 1;
4382
4383   /* Conditionally disable FPRs.  */
4384   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
4385     for (i = 32; i < 64; i++)
4386       fixed_regs[i] = call_used_regs[i]
4387         = call_really_used_regs[i] = 1;
4388
4389   /* The TOC register is not killed across calls in a way that is
4390      visible to the compiler.  */
4391   if (DEFAULT_ABI == ABI_AIX)
4392     call_really_used_regs[2] = 0;
4393
4394   if (DEFAULT_ABI == ABI_V4
4395       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
4396       && flag_pic == 2)
4397     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4398
4399   if (DEFAULT_ABI == ABI_V4
4400       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
4401       && flag_pic == 1)
4402     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4403       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4404       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4405
4406   if (DEFAULT_ABI == ABI_DARWIN
4407       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
4408       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4409       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4410       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4411
4412   if (TARGET_TOC && TARGET_MINIMAL_TOC)
4413     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4414       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4415
4416   if (TARGET_SPE)
4417     {
4418       global_regs[SPEFSCR_REGNO] = 1;
4419       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
4420          registers in prologues and epilogues.  We no longer use r14
4421          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
4422          pool for link-compatibility with older versions of GCC.  Once
4423          "old" code has died out, we can return r14 to the allocation
4424          pool.  */
4425       fixed_regs[14]
4426         = call_used_regs[14]
4427         = call_really_used_regs[14] = 1;
4428     }
4429
4430   if (!TARGET_ALTIVEC)
4431     {
4432       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
4433         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
4434       call_really_used_regs[VRSAVE_REGNO] = 1;
4435     }
4436
4437   if (TARGET_ALTIVEC)
4438     global_regs[VSCR_REGNO] = 1;
4439
4440   if (TARGET_ALTIVEC_ABI)
4441     {
4442       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
4443         call_used_regs[i] = call_really_used_regs[i] = 1;
4444
4445       /* AIX reserves VR20:31 in non-extended ABI mode.  */
4446       if (TARGET_XCOFF)
4447         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
4448           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
4449     }
4450 }
4451 \f
4452 /* Try to output insns to set TARGET equal to the constant C if it can
4453    be done in less than N insns.  Do all computations in MODE.
4454    Returns the place where the output has been placed if it can be
4455    done and the insns have been emitted.  If it would take more than N
4456    insns, zero is returned and no insns and emitted.  */
4457
4458 rtx
4459 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
4460                        rtx source, int n ATTRIBUTE_UNUSED)
4461 {
4462   rtx result, insn, set;
4463   HOST_WIDE_INT c0, c1;
4464
4465   switch (mode)
4466     {
4467       case  QImode:
4468     case HImode:
4469       if (dest == NULL)
4470         dest = gen_reg_rtx (mode);
4471       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
4472       return dest;
4473
4474     case SImode:
4475       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
4476
4477       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
4478                               GEN_INT (INTVAL (source)
4479                                        & (~ (HOST_WIDE_INT) 0xffff))));
4480       emit_insn (gen_rtx_SET (VOIDmode, dest,
4481                               gen_rtx_IOR (SImode, copy_rtx (result),
4482                                            GEN_INT (INTVAL (source) & 0xffff))));
4483       result = dest;
4484       break;
4485
4486     case DImode:
4487       switch (GET_CODE (source))
4488         {
4489         case CONST_INT:
4490           c0 = INTVAL (source);
4491           c1 = -(c0 < 0);
4492           break;
4493
4494         case CONST_DOUBLE:
4495 #if HOST_BITS_PER_WIDE_INT >= 64
4496           c0 = CONST_DOUBLE_LOW (source);
4497           c1 = -(c0 < 0);
4498 #else
4499           c0 = CONST_DOUBLE_LOW (source);
4500           c1 = CONST_DOUBLE_HIGH (source);
4501 #endif
4502           break;
4503
4504         default:
4505           gcc_unreachable ();
4506         }
4507
4508       result = rs6000_emit_set_long_const (dest, c0, c1);
4509       break;
4510
4511     default:
4512       gcc_unreachable ();
4513     }
4514
4515   insn = get_last_insn ();
4516   set = single_set (insn);
4517   if (! CONSTANT_P (SET_SRC (set)))
4518     set_unique_reg_note (insn, REG_EQUAL, source);
4519
4520   return result;
4521 }
4522
4523 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
4524    fall back to a straight forward decomposition.  We do this to avoid
4525    exponential run times encountered when looking for longer sequences
4526    with rs6000_emit_set_const.  */
4527 static rtx
4528 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
4529 {
4530   if (!TARGET_POWERPC64)
4531     {
4532       rtx operand1, operand2;
4533
4534       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
4535                                         DImode);
4536       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
4537                                         DImode);
4538       emit_move_insn (operand1, GEN_INT (c1));
4539       emit_move_insn (operand2, GEN_INT (c2));
4540     }
4541   else
4542     {
4543       HOST_WIDE_INT ud1, ud2, ud3, ud4;
4544
4545       ud1 = c1 & 0xffff;
4546       ud2 = (c1 & 0xffff0000) >> 16;
4547 #if HOST_BITS_PER_WIDE_INT >= 64
4548       c2 = c1 >> 32;
4549 #endif
4550       ud3 = c2 & 0xffff;
4551       ud4 = (c2 & 0xffff0000) >> 16;
4552
4553       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
4554           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
4555         {
4556           if (ud1 & 0x8000)
4557             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
4558           else
4559             emit_move_insn (dest, GEN_INT (ud1));
4560         }
4561
4562       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
4563                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
4564         {
4565           if (ud2 & 0x8000)
4566             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
4567                                            - 0x80000000));
4568           else
4569             emit_move_insn (dest, GEN_INT (ud2 << 16));
4570           if (ud1 != 0)
4571             emit_move_insn (copy_rtx (dest),
4572                             gen_rtx_IOR (DImode, copy_rtx (dest),
4573                                          GEN_INT (ud1)));
4574         }
4575       else if ((ud4 == 0xffff && (ud3 & 0x8000))
4576                || (ud4 == 0 && ! (ud3 & 0x8000)))
4577         {
4578           if (ud3 & 0x8000)
4579             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
4580                                            - 0x80000000));
4581           else
4582             emit_move_insn (dest, GEN_INT (ud3 << 16));
4583
4584           if (ud2 != 0)
4585             emit_move_insn (copy_rtx (dest),
4586                             gen_rtx_IOR (DImode, copy_rtx (dest),
4587                                          GEN_INT (ud2)));
4588           emit_move_insn (copy_rtx (dest),
4589                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
4590                                           GEN_INT (16)));
4591           if (ud1 != 0)
4592             emit_move_insn (copy_rtx (dest),
4593                             gen_rtx_IOR (DImode, copy_rtx (dest),
4594                                          GEN_INT (ud1)));
4595         }
4596       else
4597         {
4598           if (ud4 & 0x8000)
4599             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
4600                                            - 0x80000000));
4601           else
4602             emit_move_insn (dest, GEN_INT (ud4 << 16));
4603
4604           if (ud3 != 0)
4605             emit_move_insn (copy_rtx (dest),
4606                             gen_rtx_IOR (DImode, copy_rtx (dest),
4607                                          GEN_INT (ud3)));
4608
4609           emit_move_insn (copy_rtx (dest),
4610                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
4611                                           GEN_INT (32)));
4612           if (ud2 != 0)
4613             emit_move_insn (copy_rtx (dest),
4614                             gen_rtx_IOR (DImode, copy_rtx (dest),
4615                                          GEN_INT (ud2 << 16)));
4616           if (ud1 != 0)
4617             emit_move_insn (copy_rtx (dest),
4618                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
4619         }
4620     }
4621   return dest;
4622 }
4623
4624 /* Helper for the following.  Get rid of [r+r] memory refs
4625    in cases where it won't work (TImode, TFmode, TDmode).  */
4626
4627 static void
4628 rs6000_eliminate_indexed_memrefs (rtx operands[2])
4629 {
4630   if (GET_CODE (operands[0]) == MEM
4631       && GET_CODE (XEXP (operands[0], 0)) != REG
4632       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0))
4633       && ! reload_in_progress)
4634     operands[0]
4635       = replace_equiv_address (operands[0],
4636                                copy_addr_to_reg (XEXP (operands[0], 0)));
4637
4638   if (GET_CODE (operands[1]) == MEM
4639       && GET_CODE (XEXP (operands[1], 0)) != REG
4640       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0))
4641       && ! reload_in_progress)
4642     operands[1]
4643       = replace_equiv_address (operands[1],
4644                                copy_addr_to_reg (XEXP (operands[1], 0)));
4645 }
4646
4647 /* Emit a move from SOURCE to DEST in mode MODE.  */
4648 void
4649 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
4650 {
4651   rtx operands[2];
4652   operands[0] = dest;
4653   operands[1] = source;
4654
4655   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
4656   if (GET_CODE (operands[1]) == CONST_DOUBLE
4657       && ! FLOAT_MODE_P (mode)
4658       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
4659     {
4660       /* FIXME.  This should never happen.  */
4661       /* Since it seems that it does, do the safe thing and convert
4662          to a CONST_INT.  */
4663       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
4664     }
4665   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
4666               || FLOAT_MODE_P (mode)
4667               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
4668                    || CONST_DOUBLE_LOW (operands[1]) < 0)
4669                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
4670                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
4671
4672   /* Check if GCC is setting up a block move that will end up using FP
4673      registers as temporaries.  We must make sure this is acceptable.  */
4674   if (GET_CODE (operands[0]) == MEM
4675       && GET_CODE (operands[1]) == MEM
4676       && mode == DImode
4677       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
4678           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
4679       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
4680                                             ? 32 : MEM_ALIGN (operands[0])))
4681             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
4682                                                ? 32
4683                                                : MEM_ALIGN (operands[1]))))
4684       && ! MEM_VOLATILE_P (operands [0])
4685       && ! MEM_VOLATILE_P (operands [1]))
4686     {
4687       emit_move_insn (adjust_address (operands[0], SImode, 0),
4688                       adjust_address (operands[1], SImode, 0));
4689       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
4690                       adjust_address (copy_rtx (operands[1]), SImode, 4));
4691       return;
4692     }
4693
4694   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
4695       && !gpc_reg_operand (operands[1], mode))
4696     operands[1] = force_reg (mode, operands[1]);
4697
4698   if (mode == SFmode && ! TARGET_POWERPC
4699       && TARGET_HARD_FLOAT && TARGET_FPRS
4700       && GET_CODE (operands[0]) == MEM)
4701     {
4702       int regnum;
4703
4704       if (reload_in_progress || reload_completed)
4705         regnum = true_regnum (operands[1]);
4706       else if (GET_CODE (operands[1]) == REG)
4707         regnum = REGNO (operands[1]);
4708       else
4709         regnum = -1;
4710
4711       /* If operands[1] is a register, on POWER it may have
4712          double-precision data in it, so truncate it to single
4713          precision.  */
4714       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
4715         {
4716           rtx newreg;
4717           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
4718                     : gen_reg_rtx (mode));
4719           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
4720           operands[1] = newreg;
4721         }
4722     }
4723
4724   /* Recognize the case where operand[1] is a reference to thread-local
4725      data and load its address to a register.  */
4726   if (rs6000_tls_referenced_p (operands[1]))
4727     {
4728       enum tls_model model;
4729       rtx tmp = operands[1];
4730       rtx addend = NULL;
4731
4732       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
4733         {
4734           addend = XEXP (XEXP (tmp, 0), 1);
4735           tmp = XEXP (XEXP (tmp, 0), 0);
4736         }
4737
4738       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
4739       model = SYMBOL_REF_TLS_MODEL (tmp);
4740       gcc_assert (model != 0);
4741
4742       tmp = rs6000_legitimize_tls_address (tmp, model);
4743       if (addend)
4744         {
4745           tmp = gen_rtx_PLUS (mode, tmp, addend);
4746           tmp = force_operand (tmp, operands[0]);
4747         }
4748       operands[1] = tmp;
4749     }
4750
4751   /* Handle the case where reload calls us with an invalid address.  */
4752   if (reload_in_progress && mode == Pmode
4753       && (! general_operand (operands[1], mode)
4754           || ! nonimmediate_operand (operands[0], mode)))
4755     goto emit_set;
4756
4757   /* 128-bit constant floating-point values on Darwin should really be
4758      loaded as two parts.  */
4759   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
4760       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
4761     {
4762       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
4763          know how to get a DFmode SUBREG of a TFmode.  */
4764       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
4765       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
4766                         simplify_gen_subreg (imode, operands[1], mode, 0),
4767                         imode);
4768       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
4769                                              GET_MODE_SIZE (imode)),
4770                         simplify_gen_subreg (imode, operands[1], mode,
4771                                              GET_MODE_SIZE (imode)),
4772                         imode);
4773       return;
4774     }
4775
4776   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
4777     cfun->machine->sdmode_stack_slot =
4778       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
4779
4780   if (reload_in_progress
4781       && mode == SDmode
4782       && MEM_P (operands[0])
4783       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
4784       && REG_P (operands[1]))
4785     {
4786       if (FP_REGNO_P (REGNO (operands[1])))
4787         {
4788           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
4789           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
4790           emit_insn (gen_movsd_store (mem, operands[1]));
4791         }
4792       else if (INT_REGNO_P (REGNO (operands[1])))
4793         {
4794           rtx mem = adjust_address_nv (operands[0], mode, 4);
4795           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
4796           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
4797         }
4798       else
4799         gcc_unreachable();
4800       return;
4801     }
4802   if (reload_in_progress
4803       && mode == SDmode
4804       && REG_P (operands[0])
4805       && MEM_P (operands[1])
4806       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
4807     {
4808       if (FP_REGNO_P (REGNO (operands[0])))
4809         {
4810           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
4811           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
4812           emit_insn (gen_movsd_load (operands[0], mem));
4813         }
4814       else if (INT_REGNO_P (REGNO (operands[0])))
4815         {
4816           rtx mem = adjust_address_nv (operands[1], mode, 4);
4817           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
4818           emit_insn (gen_movsd_hardfloat (operands[0], mem));
4819         }
4820       else
4821         gcc_unreachable();
4822       return;
4823     }
4824
4825   /* FIXME:  In the long term, this switch statement should go away
4826      and be replaced by a sequence of tests based on things like
4827      mode == Pmode.  */
4828   switch (mode)
4829     {
4830     case HImode:
4831     case QImode:
4832       if (CONSTANT_P (operands[1])
4833           && GET_CODE (operands[1]) != CONST_INT)
4834         operands[1] = force_const_mem (mode, operands[1]);
4835       break;
4836
4837     case TFmode:
4838     case TDmode:
4839       rs6000_eliminate_indexed_memrefs (operands);
4840       /* fall through */
4841
4842     case DFmode:
4843     case DDmode:
4844     case SFmode:
4845     case SDmode:
4846       if (CONSTANT_P (operands[1])
4847           && ! easy_fp_constant (operands[1], mode))
4848         operands[1] = force_const_mem (mode, operands[1]);
4849       break;
4850
4851     case V16QImode:
4852     case V8HImode:
4853     case V4SFmode:
4854     case V4SImode:
4855     case V4HImode:
4856     case V2SFmode:
4857     case V2SImode:
4858     case V1DImode:
4859       if (CONSTANT_P (operands[1])
4860           && !easy_vector_constant (operands[1], mode))
4861         operands[1] = force_const_mem (mode, operands[1]);
4862       break;
4863
4864     case SImode:
4865     case DImode:
4866       /* Use default pattern for address of ELF small data */
4867       if (TARGET_ELF
4868           && mode == Pmode
4869           && DEFAULT_ABI == ABI_V4
4870           && (GET_CODE (operands[1]) == SYMBOL_REF
4871               || GET_CODE (operands[1]) == CONST)
4872           && small_data_operand (operands[1], mode))
4873         {
4874           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4875           return;
4876         }
4877
4878       if (DEFAULT_ABI == ABI_V4
4879           && mode == Pmode && mode == SImode
4880           && flag_pic == 1 && got_operand (operands[1], mode))
4881         {
4882           emit_insn (gen_movsi_got (operands[0], operands[1]));
4883           return;
4884         }
4885
4886       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
4887           && TARGET_NO_TOC
4888           && ! flag_pic
4889           && mode == Pmode
4890           && CONSTANT_P (operands[1])
4891           && GET_CODE (operands[1]) != HIGH
4892           && GET_CODE (operands[1]) != CONST_INT)
4893         {
4894           rtx target = (!can_create_pseudo_p ()
4895                         ? operands[0]
4896                         : gen_reg_rtx (mode));
4897
4898           /* If this is a function address on -mcall-aixdesc,
4899              convert it to the address of the descriptor.  */
4900           if (DEFAULT_ABI == ABI_AIX
4901               && GET_CODE (operands[1]) == SYMBOL_REF
4902               && XSTR (operands[1], 0)[0] == '.')
4903             {
4904               const char *name = XSTR (operands[1], 0);
4905               rtx new_ref;
4906               while (*name == '.')
4907                 name++;
4908               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
4909               CONSTANT_POOL_ADDRESS_P (new_ref)
4910                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
4911               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
4912               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
4913               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
4914               operands[1] = new_ref;
4915             }
4916
4917           if (DEFAULT_ABI == ABI_DARWIN)
4918             {
4919 #if TARGET_MACHO
4920               if (MACHO_DYNAMIC_NO_PIC_P)
4921                 {
4922                   /* Take care of any required data indirection.  */
4923                   operands[1] = rs6000_machopic_legitimize_pic_address (
4924                                   operands[1], mode, operands[0]);
4925                   if (operands[0] != operands[1])
4926                     emit_insn (gen_rtx_SET (VOIDmode,
4927                                             operands[0], operands[1]));
4928                   return;
4929                 }
4930 #endif
4931               emit_insn (gen_macho_high (target, operands[1]));
4932               emit_insn (gen_macho_low (operands[0], target, operands[1]));
4933               return;
4934             }
4935
4936           emit_insn (gen_elf_high (target, operands[1]));
4937           emit_insn (gen_elf_low (operands[0], target, operands[1]));
4938           return;
4939         }
4940
4941       /* If this is a SYMBOL_REF that refers to a constant pool entry,
4942          and we have put it in the TOC, we just need to make a TOC-relative
4943          reference to it.  */
4944       if (TARGET_TOC
4945           && GET_CODE (operands[1]) == SYMBOL_REF
4946           && constant_pool_expr_p (operands[1])
4947           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
4948                                               get_pool_mode (operands[1])))
4949         {
4950           operands[1] = create_TOC_reference (operands[1]);
4951         }
4952       else if (mode == Pmode
4953                && CONSTANT_P (operands[1])
4954                && ((GET_CODE (operands[1]) != CONST_INT
4955                     && ! easy_fp_constant (operands[1], mode))
4956                    || (GET_CODE (operands[1]) == CONST_INT
4957                        && num_insns_constant (operands[1], mode) > 2)
4958                    || (GET_CODE (operands[0]) == REG
4959                        && FP_REGNO_P (REGNO (operands[0]))))
4960                && GET_CODE (operands[1]) != HIGH
4961                && ! legitimate_constant_pool_address_p (operands[1])
4962                && ! toc_relative_expr_p (operands[1]))
4963         {
4964           /* Emit a USE operation so that the constant isn't deleted if
4965              expensive optimizations are turned on because nobody
4966              references it.  This should only be done for operands that
4967              contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
4968              This should not be done for operands that contain LABEL_REFs.
4969              For now, we just handle the obvious case.  */
4970           if (GET_CODE (operands[1]) != LABEL_REF)
4971             emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
4972
4973 #if TARGET_MACHO
4974           /* Darwin uses a special PIC legitimizer.  */
4975           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
4976             {
4977               operands[1] =
4978                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
4979                                                         operands[0]);
4980               if (operands[0] != operands[1])
4981                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4982               return;
4983             }
4984 #endif
4985
4986           /* If we are to limit the number of things we put in the TOC and
4987              this is a symbol plus a constant we can add in one insn,
4988              just put the symbol in the TOC and add the constant.  Don't do
4989              this if reload is in progress.  */
4990           if (GET_CODE (operands[1]) == CONST
4991               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
4992               && GET_CODE (XEXP (operands[1], 0)) == PLUS
4993               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
4994               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
4995                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
4996               && ! side_effects_p (operands[0]))
4997             {
4998               rtx sym =
4999                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
5000               rtx other = XEXP (XEXP (operands[1], 0), 1);
5001
5002               sym = force_reg (mode, sym);
5003               if (mode == SImode)
5004                 emit_insn (gen_addsi3 (operands[0], sym, other));
5005               else
5006                 emit_insn (gen_adddi3 (operands[0], sym, other));
5007               return;
5008             }
5009
5010           operands[1] = force_const_mem (mode, operands[1]);
5011
5012           if (TARGET_TOC
5013               && constant_pool_expr_p (XEXP (operands[1], 0))
5014               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
5015                         get_pool_constant (XEXP (operands[1], 0)),
5016                         get_pool_mode (XEXP (operands[1], 0))))
5017             {
5018               operands[1]
5019                 = gen_const_mem (mode,
5020                                  create_TOC_reference (XEXP (operands[1], 0)));
5021               set_mem_alias_set (operands[1], get_TOC_alias_set ());
5022             }
5023         }
5024       break;
5025
5026     case TImode:
5027       rs6000_eliminate_indexed_memrefs (operands);
5028
5029       if (TARGET_POWER)
5030         {
5031           emit_insn (gen_rtx_PARALLEL (VOIDmode,
5032                        gen_rtvec (2,
5033                                   gen_rtx_SET (VOIDmode,
5034                                                operands[0], operands[1]),
5035                                   gen_rtx_CLOBBER (VOIDmode,
5036                                                    gen_rtx_SCRATCH (SImode)))));
5037           return;
5038         }
5039       break;
5040
5041     default:
5042       gcc_unreachable ();
5043     }
5044
5045   /* Above, we may have called force_const_mem which may have returned
5046      an invalid address.  If we can, fix this up; otherwise, reload will
5047      have to deal with it.  */
5048   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
5049     operands[1] = validize_mem (operands[1]);
5050
5051  emit_set:
5052   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
5053 }
5054 \f
5055 /* Nonzero if we can use a floating-point register to pass this arg.  */
5056 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
5057   (SCALAR_FLOAT_MODE_P (MODE)                   \
5058    && (CUM)->fregno <= FP_ARG_MAX_REG           \
5059    && TARGET_HARD_FLOAT && TARGET_FPRS)
5060
5061 /* Nonzero if we can use an AltiVec register to pass this arg.  */
5062 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)      \
5063   (ALTIVEC_VECTOR_MODE (MODE)                           \
5064    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG              \
5065    && TARGET_ALTIVEC_ABI                                \
5066    && (NAMED))
5067
5068 /* Return a nonzero value to say to return the function value in
5069    memory, just as large structures are always returned.  TYPE will be
5070    the data type of the value, and FNTYPE will be the type of the
5071    function doing the returning, or @code{NULL} for libcalls.
5072
5073    The AIX ABI for the RS/6000 specifies that all structures are
5074    returned in memory.  The Darwin ABI does the same.  The SVR4 ABI
5075    specifies that structures <= 8 bytes are returned in r3/r4, but a
5076    draft put them in memory, and GCC used to implement the draft
5077    instead of the final standard.  Therefore, aix_struct_return
5078    controls this instead of DEFAULT_ABI; V.4 targets needing backward
5079    compatibility can change DRAFT_V4_STRUCT_RET to override the
5080    default, and -m switches get the final word.  See
5081    rs6000_override_options for more details.
5082
5083    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
5084    long double support is enabled.  These values are returned in memory.
5085
5086    int_size_in_bytes returns -1 for variable size objects, which go in
5087    memory always.  The cast to unsigned makes -1 > 8.  */
5088
5089 static bool
5090 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
5091 {
5092   /* In the darwin64 abi, try to use registers for larger structs
5093      if possible.  */
5094   if (rs6000_darwin64_abi
5095       && TREE_CODE (type) == RECORD_TYPE
5096       && int_size_in_bytes (type) > 0)
5097     {
5098       CUMULATIVE_ARGS valcum;
5099       rtx valret;
5100
5101       valcum.words = 0;
5102       valcum.fregno = FP_ARG_MIN_REG;
5103       valcum.vregno = ALTIVEC_ARG_MIN_REG;
5104       /* Do a trial code generation as if this were going to be passed
5105          as an argument; if any part goes in memory, we return NULL.  */
5106       valret = rs6000_darwin64_record_arg (&valcum, type, 1, true);
5107       if (valret)
5108         return false;
5109       /* Otherwise fall through to more conventional ABI rules.  */
5110     }
5111
5112   if (AGGREGATE_TYPE_P (type)
5113       && (aix_struct_return
5114           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
5115     return true;
5116
5117   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
5118      modes only exist for GCC vector types if -maltivec.  */
5119   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
5120       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
5121     return false;
5122
5123   /* Return synthetic vectors in memory.  */
5124   if (TREE_CODE (type) == VECTOR_TYPE
5125       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
5126     {
5127       static bool warned_for_return_big_vectors = false;
5128       if (!warned_for_return_big_vectors)
5129         {
5130           warning (0, "GCC vector returned by reference: "
5131                    "non-standard ABI extension with no compatibility guarantee");
5132           warned_for_return_big_vectors = true;
5133         }
5134       return true;
5135     }
5136
5137   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
5138     return true;
5139
5140   return false;
5141 }
5142
5143 /* Initialize a variable CUM of type CUMULATIVE_ARGS
5144    for a call to a function whose data type is FNTYPE.
5145    For a library call, FNTYPE is 0.
5146
5147    For incoming args we set the number of arguments in the prototype large
5148    so we never return a PARALLEL.  */
5149
5150 void
5151 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
5152                       rtx libname ATTRIBUTE_UNUSED, int incoming,
5153                       int libcall, int n_named_args)
5154 {
5155   static CUMULATIVE_ARGS zero_cumulative;
5156
5157   *cum = zero_cumulative;
5158   cum->words = 0;
5159   cum->fregno = FP_ARG_MIN_REG;
5160   cum->vregno = ALTIVEC_ARG_MIN_REG;
5161   cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
5162   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
5163                       ? CALL_LIBCALL : CALL_NORMAL);
5164   cum->sysv_gregno = GP_ARG_MIN_REG;
5165   cum->stdarg = fntype
5166     && (TYPE_ARG_TYPES (fntype) != 0
5167         && (TREE_VALUE (tree_last  (TYPE_ARG_TYPES (fntype)))
5168             != void_type_node));
5169
5170   cum->nargs_prototype = 0;
5171   if (incoming || cum->prototype)
5172     cum->nargs_prototype = n_named_args;
5173
5174   /* Check for a longcall attribute.  */
5175   if ((!fntype && rs6000_default_long_calls)
5176       || (fntype
5177           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
5178           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
5179     cum->call_cookie |= CALL_LONG;
5180
5181   if (TARGET_DEBUG_ARG)
5182     {
5183       fprintf (stderr, "\ninit_cumulative_args:");
5184       if (fntype)
5185         {
5186           tree ret_type = TREE_TYPE (fntype);
5187           fprintf (stderr, " ret code = %s,",
5188                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
5189         }
5190
5191       if (cum->call_cookie & CALL_LONG)
5192         fprintf (stderr, " longcall,");
5193
5194       fprintf (stderr, " proto = %d, nargs = %d\n",
5195                cum->prototype, cum->nargs_prototype);
5196     }
5197
5198   if (fntype
5199       && !TARGET_ALTIVEC
5200       && TARGET_ALTIVEC_ABI
5201       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
5202     {
5203       error ("cannot return value in vector register because"
5204              " altivec instructions are disabled, use -maltivec"
5205              " to enable them");
5206     }
5207 }
5208 \f
5209 /* Return true if TYPE must be passed on the stack and not in registers.  */
5210
5211 static bool
5212 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
5213 {
5214   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
5215     return must_pass_in_stack_var_size (mode, type);
5216   else
5217     return must_pass_in_stack_var_size_or_pad (mode, type);
5218 }
5219
5220 /* If defined, a C expression which determines whether, and in which
5221    direction, to pad out an argument with extra space.  The value
5222    should be of type `enum direction': either `upward' to pad above
5223    the argument, `downward' to pad below, or `none' to inhibit
5224    padding.
5225
5226    For the AIX ABI structs are always stored left shifted in their
5227    argument slot.  */
5228
5229 enum direction
5230 function_arg_padding (enum machine_mode mode, const_tree type)
5231 {
5232 #ifndef AGGREGATE_PADDING_FIXED
5233 #define AGGREGATE_PADDING_FIXED 0
5234 #endif
5235 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
5236 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
5237 #endif
5238
5239   if (!AGGREGATE_PADDING_FIXED)
5240     {
5241       /* GCC used to pass structures of the same size as integer types as
5242          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
5243          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
5244          passed padded downward, except that -mstrict-align further
5245          muddied the water in that multi-component structures of 2 and 4
5246          bytes in size were passed padded upward.
5247
5248          The following arranges for best compatibility with previous
5249          versions of gcc, but removes the -mstrict-align dependency.  */
5250       if (BYTES_BIG_ENDIAN)
5251         {
5252           HOST_WIDE_INT size = 0;
5253
5254           if (mode == BLKmode)
5255             {
5256               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
5257                 size = int_size_in_bytes (type);
5258             }
5259           else
5260             size = GET_MODE_SIZE (mode);
5261
5262           if (size == 1 || size == 2 || size == 4)
5263             return downward;
5264         }
5265       return upward;
5266     }
5267
5268   if (AGGREGATES_PAD_UPWARD_ALWAYS)
5269     {
5270       if (type != 0 && AGGREGATE_TYPE_P (type))
5271         return upward;
5272     }
5273
5274   /* Fall back to the default.  */
5275   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
5276 }
5277
5278 /* If defined, a C expression that gives the alignment boundary, in bits,
5279    of an argument with the specified mode and type.  If it is not defined,
5280    PARM_BOUNDARY is used for all arguments.
5281
5282    V.4 wants long longs and doubles to be double word aligned.  Just
5283    testing the mode size is a boneheaded way to do this as it means
5284    that other types such as complex int are also double word aligned.
5285    However, we're stuck with this because changing the ABI might break
5286    existing library interfaces.
5287
5288    Doubleword align SPE vectors.
5289    Quadword align Altivec vectors.
5290    Quadword align large synthetic vector types.   */
5291
5292 int
5293 function_arg_boundary (enum machine_mode mode, tree type)
5294 {
5295   if (DEFAULT_ABI == ABI_V4
5296       && (GET_MODE_SIZE (mode) == 8
5297           || (TARGET_HARD_FLOAT
5298               && TARGET_FPRS
5299               && (mode == TFmode || mode == TDmode))))
5300     return 64;
5301   else if (SPE_VECTOR_MODE (mode)
5302            || (type && TREE_CODE (type) == VECTOR_TYPE
5303                && int_size_in_bytes (type) >= 8
5304                && int_size_in_bytes (type) < 16))
5305     return 64;
5306   else if (ALTIVEC_VECTOR_MODE (mode)
5307            || (type && TREE_CODE (type) == VECTOR_TYPE
5308                && int_size_in_bytes (type) >= 16))
5309     return 128;
5310   else if (rs6000_darwin64_abi && mode == BLKmode
5311            && type && TYPE_ALIGN (type) > 64)
5312     return 128;
5313   else
5314     return PARM_BOUNDARY;
5315 }
5316
5317 /* For a function parm of MODE and TYPE, return the starting word in
5318    the parameter area.  NWORDS of the parameter area are already used.  */
5319
5320 static unsigned int
5321 rs6000_parm_start (enum machine_mode mode, tree type, unsigned int nwords)
5322 {
5323   unsigned int align;
5324   unsigned int parm_offset;
5325
5326   align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
5327   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
5328   return nwords + (-(parm_offset + nwords) & align);
5329 }
5330
5331 /* Compute the size (in words) of a function argument.  */
5332
5333 static unsigned long
5334 rs6000_arg_size (enum machine_mode mode, tree type)
5335 {
5336   unsigned long size;
5337
5338   if (mode != BLKmode)
5339     size = GET_MODE_SIZE (mode);
5340   else
5341     size = int_size_in_bytes (type);
5342
5343   if (TARGET_32BIT)
5344     return (size + 3) >> 2;
5345   else
5346     return (size + 7) >> 3;
5347 }
5348 \f
5349 /* Use this to flush pending int fields.  */
5350
5351 static void
5352 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
5353                                           HOST_WIDE_INT bitpos)
5354 {
5355   unsigned int startbit, endbit;
5356   int intregs, intoffset;
5357   enum machine_mode mode;
5358
5359   if (cum->intoffset == -1)
5360     return;
5361
5362   intoffset = cum->intoffset;
5363   cum->intoffset = -1;
5364
5365   if (intoffset % BITS_PER_WORD != 0)
5366     {
5367       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
5368                             MODE_INT, 0);
5369       if (mode == BLKmode)
5370         {
5371           /* We couldn't find an appropriate mode, which happens,
5372              e.g., in packed structs when there are 3 bytes to load.
5373              Back intoffset back to the beginning of the word in this
5374              case.  */
5375           intoffset = intoffset & -BITS_PER_WORD;
5376         }
5377     }
5378
5379   startbit = intoffset & -BITS_PER_WORD;
5380   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5381   intregs = (endbit - startbit) / BITS_PER_WORD;
5382   cum->words += intregs;
5383 }
5384
5385 /* The darwin64 ABI calls for us to recurse down through structs,
5386    looking for elements passed in registers.  Unfortunately, we have
5387    to track int register count here also because of misalignments
5388    in powerpc alignment mode.  */
5389
5390 static void
5391 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
5392                                             tree type,
5393                                             HOST_WIDE_INT startbitpos)
5394 {
5395   tree f;
5396
5397   for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
5398     if (TREE_CODE (f) == FIELD_DECL)
5399       {
5400         HOST_WIDE_INT bitpos = startbitpos;
5401         tree ftype = TREE_TYPE (f);
5402         enum machine_mode mode;
5403         if (ftype == error_mark_node)
5404           continue;
5405         mode = TYPE_MODE (ftype);
5406
5407         if (DECL_SIZE (f) != 0
5408             && host_integerp (bit_position (f), 1))
5409           bitpos += int_bit_position (f);
5410
5411         /* ??? FIXME: else assume zero offset.  */
5412
5413         if (TREE_CODE (ftype) == RECORD_TYPE)
5414           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
5415         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
5416           {
5417             rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
5418             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
5419             cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
5420           }
5421         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
5422           {
5423             rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
5424             cum->vregno++;
5425             cum->words += 2;
5426           }
5427         else if (cum->intoffset == -1)
5428           cum->intoffset = bitpos;
5429       }
5430 }
5431
5432 /* Update the data in CUM to advance over an argument
5433    of mode MODE and data type TYPE.
5434    (TYPE is null for libcalls where that information may not be available.)
5435
5436    Note that for args passed by reference, function_arg will be called
5437    with MODE and TYPE set to that of the pointer to the arg, not the arg
5438    itself.  */
5439
5440 void
5441 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5442                       tree type, int named, int depth)
5443 {
5444   int size;
5445
5446   /* Only tick off an argument if we're not recursing.  */
5447   if (depth == 0)
5448     cum->nargs_prototype--;
5449
5450   if (TARGET_ALTIVEC_ABI
5451       && (ALTIVEC_VECTOR_MODE (mode)
5452           || (type && TREE_CODE (type) == VECTOR_TYPE
5453               && int_size_in_bytes (type) == 16)))
5454     {
5455       bool stack = false;
5456
5457       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
5458         {
5459           cum->vregno++;
5460           if (!TARGET_ALTIVEC)
5461             error ("cannot pass argument in vector register because"
5462                    " altivec instructions are disabled, use -maltivec"
5463                    " to enable them");
5464
5465           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
5466              even if it is going to be passed in a vector register.
5467              Darwin does the same for variable-argument functions.  */
5468           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5469               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
5470             stack = true;
5471         }
5472       else
5473         stack = true;
5474
5475       if (stack)
5476         {
5477           int align;
5478
5479           /* Vector parameters must be 16-byte aligned.  This places
5480              them at 2 mod 4 in terms of words in 32-bit mode, since
5481              the parameter save area starts at offset 24 from the
5482              stack.  In 64-bit mode, they just have to start on an
5483              even word, since the parameter save area is 16-byte
5484              aligned.  Space for GPRs is reserved even if the argument
5485              will be passed in memory.  */
5486           if (TARGET_32BIT)
5487             align = (2 - cum->words) & 3;
5488           else
5489             align = cum->words & 1;
5490           cum->words += align + rs6000_arg_size (mode, type);
5491
5492           if (TARGET_DEBUG_ARG)
5493             {
5494               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
5495                        cum->words, align);
5496               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
5497                        cum->nargs_prototype, cum->prototype,
5498                        GET_MODE_NAME (mode));
5499             }
5500         }
5501     }
5502   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
5503            && !cum->stdarg
5504            && cum->sysv_gregno <= GP_ARG_MAX_REG)
5505     cum->sysv_gregno++;
5506
5507   else if (rs6000_darwin64_abi
5508            && mode == BLKmode
5509            && TREE_CODE (type) == RECORD_TYPE
5510            && (size = int_size_in_bytes (type)) > 0)
5511     {
5512       /* Variable sized types have size == -1 and are
5513          treated as if consisting entirely of ints.
5514          Pad to 16 byte boundary if needed.  */
5515       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
5516           && (cum->words % 2) != 0)
5517         cum->words++;
5518       /* For varargs, we can just go up by the size of the struct. */
5519       if (!named)
5520         cum->words += (size + 7) / 8;
5521       else
5522         {
5523           /* It is tempting to say int register count just goes up by
5524              sizeof(type)/8, but this is wrong in a case such as
5525              { int; double; int; } [powerpc alignment].  We have to
5526              grovel through the fields for these too.  */
5527           cum->intoffset = 0;
5528           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
5529           rs6000_darwin64_record_arg_advance_flush (cum,
5530                                                     size * BITS_PER_UNIT);
5531         }
5532     }
5533   else if (DEFAULT_ABI == ABI_V4)
5534     {
5535       if (TARGET_HARD_FLOAT && TARGET_FPRS
5536           && (mode == SFmode || mode == DFmode
5537               || mode == SDmode || mode == DDmode || mode == TDmode
5538               || (mode == TFmode && !TARGET_IEEEQUAD)))
5539         {
5540           /* _Decimal128 must use an even/odd register pair.  This assumes
5541              that the register number is odd when fregno is odd.  */
5542           if (mode == TDmode && (cum->fregno % 2) == 1)
5543             cum->fregno++;
5544
5545           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
5546               <= FP_ARG_V4_MAX_REG)
5547             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
5548           else
5549             {
5550               cum->fregno = FP_ARG_V4_MAX_REG + 1;
5551               if (mode == DFmode || mode == TFmode
5552                   || mode == DDmode || mode == TDmode)
5553                 cum->words += cum->words & 1;
5554               cum->words += rs6000_arg_size (mode, type);
5555             }
5556         }
5557       else
5558         {
5559           int n_words = rs6000_arg_size (mode, type);
5560           int gregno = cum->sysv_gregno;
5561
5562           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
5563              (r7,r8) or (r9,r10).  As does any other 2 word item such
5564              as complex int due to a historical mistake.  */
5565           if (n_words == 2)
5566             gregno += (1 - gregno) & 1;
5567
5568           /* Multi-reg args are not split between registers and stack.  */
5569           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
5570             {
5571               /* Long long and SPE vectors are aligned on the stack.
5572                  So are other 2 word items such as complex int due to
5573                  a historical mistake.  */
5574               if (n_words == 2)
5575                 cum->words += cum->words & 1;
5576               cum->words += n_words;
5577             }
5578
5579           /* Note: continuing to accumulate gregno past when we've started
5580              spilling to the stack indicates the fact that we've started
5581              spilling to the stack to expand_builtin_saveregs.  */
5582           cum->sysv_gregno = gregno + n_words;
5583         }
5584
5585       if (TARGET_DEBUG_ARG)
5586         {
5587           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
5588                    cum->words, cum->fregno);
5589           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
5590                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
5591           fprintf (stderr, "mode = %4s, named = %d\n",
5592                    GET_MODE_NAME (mode), named);
5593         }
5594     }
5595   else
5596     {
5597       int n_words = rs6000_arg_size (mode, type);
5598       int start_words = cum->words;
5599       int align_words = rs6000_parm_start (mode, type, start_words);
5600
5601       cum->words = align_words + n_words;
5602
5603       if (SCALAR_FLOAT_MODE_P (mode)
5604           && TARGET_HARD_FLOAT && TARGET_FPRS)
5605         {
5606           /* _Decimal128 must be passed in an even/odd float register pair.
5607              This assumes that the register number is odd when fregno is
5608              odd.  */
5609           if (mode == TDmode && (cum->fregno % 2) == 1)
5610             cum->fregno++;
5611           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
5612         }
5613
5614       if (TARGET_DEBUG_ARG)
5615         {
5616           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
5617                    cum->words, cum->fregno);
5618           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
5619                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
5620           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
5621                    named, align_words - start_words, depth);
5622         }
5623     }
5624 }
5625
5626 static rtx
5627 spe_build_register_parallel (enum machine_mode mode, int gregno)
5628 {
5629   rtx r1, r3, r5, r7;
5630
5631   switch (mode)
5632     {
5633     case DFmode:
5634     case DDmode:
5635       r1 = gen_rtx_REG (DImode, gregno);
5636       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
5637       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
5638
5639     case DCmode:
5640     case TFmode:
5641     case TDmode:
5642       r1 = gen_rtx_REG (DImode, gregno);
5643       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
5644       r3 = gen_rtx_REG (DImode, gregno + 2);
5645       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
5646       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
5647
5648     case TCmode:
5649       r1 = gen_rtx_REG (DImode, gregno);
5650       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
5651       r3 = gen_rtx_REG (DImode, gregno + 2);
5652       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
5653       r5 = gen_rtx_REG (DImode, gregno + 4);
5654       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
5655       r7 = gen_rtx_REG (DImode, gregno + 6);
5656       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
5657       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
5658
5659     default:
5660       gcc_unreachable ();
5661     }
5662 }
5663
5664 /* Determine where to put a SIMD argument on the SPE.  */
5665 static rtx
5666 rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5667                          tree type)
5668 {
5669   int gregno = cum->sysv_gregno;
5670
5671   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
5672      are passed and returned in a pair of GPRs for ABI compatibility.  */
5673   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5674                              || mode == DDmode || mode == TDmode
5675                              || mode == DCmode || mode == TCmode))
5676     {
5677       int n_words = rs6000_arg_size (mode, type);
5678
5679       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
5680       if (mode == DFmode || mode == DDmode)
5681         gregno += (1 - gregno) & 1;
5682
5683       /* Multi-reg args are not split between registers and stack.  */
5684       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
5685         return NULL_RTX;
5686
5687       return spe_build_register_parallel (mode, gregno);
5688     }
5689   if (cum->stdarg)
5690     {
5691       int n_words = rs6000_arg_size (mode, type);
5692
5693       /* SPE vectors are put in odd registers.  */
5694       if (n_words == 2 && (gregno & 1) == 0)
5695         gregno += 1;
5696
5697       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
5698         {
5699           rtx r1, r2;
5700           enum machine_mode m = SImode;
5701
5702           r1 = gen_rtx_REG (m, gregno);
5703           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
5704           r2 = gen_rtx_REG (m, gregno + 1);
5705           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
5706           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
5707         }
5708       else
5709         return NULL_RTX;
5710     }
5711   else
5712     {
5713       if (gregno <= GP_ARG_MAX_REG)
5714         return gen_rtx_REG (mode, gregno);
5715       else
5716         return NULL_RTX;
5717     }
5718 }
5719
5720 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
5721    structure between cum->intoffset and bitpos to integer registers.  */
5722
5723 static void
5724 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
5725                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
5726 {
5727   enum machine_mode mode;
5728   unsigned int regno;
5729   unsigned int startbit, endbit;
5730   int this_regno, intregs, intoffset;
5731   rtx reg;
5732
5733   if (cum->intoffset == -1)
5734     return;
5735
5736   intoffset = cum->intoffset;
5737   cum->intoffset = -1;
5738
5739   /* If this is the trailing part of a word, try to only load that
5740      much into the register.  Otherwise load the whole register.  Note
5741      that in the latter case we may pick up unwanted bits.  It's not a
5742      problem at the moment but may wish to revisit.  */
5743
5744   if (intoffset % BITS_PER_WORD != 0)
5745     {
5746       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
5747                           MODE_INT, 0);
5748       if (mode == BLKmode)
5749         {
5750           /* We couldn't find an appropriate mode, which happens,
5751              e.g., in packed structs when there are 3 bytes to load.
5752              Back intoffset back to the beginning of the word in this
5753              case.  */
5754          intoffset = intoffset & -BITS_PER_WORD;
5755          mode = word_mode;
5756         }
5757     }
5758   else
5759     mode = word_mode;
5760
5761   startbit = intoffset & -BITS_PER_WORD;
5762   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5763   intregs = (endbit - startbit) / BITS_PER_WORD;
5764   this_regno = cum->words + intoffset / BITS_PER_WORD;
5765
5766   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
5767     cum->use_stack = 1;
5768
5769   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
5770   if (intregs <= 0)
5771     return;
5772
5773   intoffset /= BITS_PER_UNIT;
5774   do
5775     {
5776       regno = GP_ARG_MIN_REG + this_regno;
5777       reg = gen_rtx_REG (mode, regno);
5778       rvec[(*k)++] =
5779         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
5780
5781       this_regno += 1;
5782       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
5783       mode = word_mode;
5784       intregs -= 1;
5785     }
5786   while (intregs > 0);
5787 }
5788
5789 /* Recursive workhorse for the following.  */
5790
5791 static void
5792 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
5793                                     HOST_WIDE_INT startbitpos, rtx rvec[],
5794                                     int *k)
5795 {
5796   tree f;
5797
5798   for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
5799     if (TREE_CODE (f) == FIELD_DECL)
5800       {
5801         HOST_WIDE_INT bitpos = startbitpos;
5802         tree ftype = TREE_TYPE (f);
5803         enum machine_mode mode;
5804         if (ftype == error_mark_node)
5805           continue;
5806         mode = TYPE_MODE (ftype);
5807
5808         if (DECL_SIZE (f) != 0
5809             && host_integerp (bit_position (f), 1))
5810           bitpos += int_bit_position (f);
5811
5812         /* ??? FIXME: else assume zero offset.  */
5813
5814         if (TREE_CODE (ftype) == RECORD_TYPE)
5815           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
5816         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
5817           {
5818 #if 0
5819             switch (mode)
5820               {
5821               case SCmode: mode = SFmode; break;
5822               case DCmode: mode = DFmode; break;
5823               case TCmode: mode = TFmode; break;
5824               default: break;
5825               }
5826 #endif
5827             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
5828             rvec[(*k)++]
5829               = gen_rtx_EXPR_LIST (VOIDmode,
5830                                    gen_rtx_REG (mode, cum->fregno++),
5831                                    GEN_INT (bitpos / BITS_PER_UNIT));
5832             if (mode == TFmode || mode == TDmode)
5833               cum->fregno++;
5834           }
5835         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
5836           {
5837             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
5838             rvec[(*k)++]
5839               = gen_rtx_EXPR_LIST (VOIDmode,
5840                                    gen_rtx_REG (mode, cum->vregno++),
5841                                    GEN_INT (bitpos / BITS_PER_UNIT));
5842           }
5843         else if (cum->intoffset == -1)
5844           cum->intoffset = bitpos;
5845       }
5846 }
5847
5848 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
5849    the register(s) to be used for each field and subfield of a struct
5850    being passed by value, along with the offset of where the
5851    register's value may be found in the block.  FP fields go in FP
5852    register, vector fields go in vector registers, and everything
5853    else goes in int registers, packed as in memory.
5854
5855    This code is also used for function return values.  RETVAL indicates
5856    whether this is the case.
5857
5858    Much of this is taken from the SPARC V9 port, which has a similar
5859    calling convention.  */
5860
5861 static rtx
5862 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
5863                             int named, bool retval)
5864 {
5865   rtx rvec[FIRST_PSEUDO_REGISTER];
5866   int k = 1, kbase = 1;
5867   HOST_WIDE_INT typesize = int_size_in_bytes (type);
5868   /* This is a copy; modifications are not visible to our caller.  */
5869   CUMULATIVE_ARGS copy_cum = *orig_cum;
5870   CUMULATIVE_ARGS *cum = &copy_cum;
5871
5872   /* Pad to 16 byte boundary if needed.  */
5873   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
5874       && (cum->words % 2) != 0)
5875     cum->words++;
5876
5877   cum->intoffset = 0;
5878   cum->use_stack = 0;
5879   cum->named = named;
5880
5881   /* Put entries into rvec[] for individual FP and vector fields, and
5882      for the chunks of memory that go in int regs.  Note we start at
5883      element 1; 0 is reserved for an indication of using memory, and
5884      may or may not be filled in below. */
5885   rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
5886   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
5887
5888   /* If any part of the struct went on the stack put all of it there.
5889      This hack is because the generic code for
5890      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
5891      parts of the struct are not at the beginning.  */
5892   if (cum->use_stack)
5893     {
5894       if (retval)
5895         return NULL_RTX;    /* doesn't go in registers at all */
5896       kbase = 0;
5897       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5898     }
5899   if (k > 1 || cum->use_stack)
5900     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
5901   else
5902     return NULL_RTX;
5903 }
5904
5905 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
5906
5907 static rtx
5908 rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
5909 {
5910   int n_units;
5911   int i, k;
5912   rtx rvec[GP_ARG_NUM_REG + 1];
5913
5914   if (align_words >= GP_ARG_NUM_REG)
5915     return NULL_RTX;
5916
5917   n_units = rs6000_arg_size (mode, type);
5918
5919   /* Optimize the simple case where the arg fits in one gpr, except in
5920      the case of BLKmode due to assign_parms assuming that registers are
5921      BITS_PER_WORD wide.  */
5922   if (n_units == 0
5923       || (n_units == 1 && mode != BLKmode))
5924     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5925
5926   k = 0;
5927   if (align_words + n_units > GP_ARG_NUM_REG)
5928     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
5929        using a magic NULL_RTX component.
5930        This is not strictly correct.  Only some of the arg belongs in
5931        memory, not all of it.  However, the normal scheme using
5932        function_arg_partial_nregs can result in unusual subregs, eg.
5933        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
5934        store the whole arg to memory is often more efficient than code
5935        to store pieces, and we know that space is available in the right
5936        place for the whole arg.  */
5937     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5938
5939   i = 0;
5940   do
5941     {
5942       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
5943       rtx off = GEN_INT (i++ * 4);
5944       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
5945     }
5946   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
5947
5948   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
5949 }
5950
5951 /* Determine where to put an argument to a function.
5952    Value is zero to push the argument on the stack,
5953    or a hard register in which to store the argument.
5954
5955    MODE is the argument's machine mode.
5956    TYPE is the data type of the argument (as a tree).
5957     This is null for libcalls where that information may
5958     not be available.
5959    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5960     the preceding args and about the function being called.  It is
5961     not modified in this routine.
5962    NAMED is nonzero if this argument is a named parameter
5963     (otherwise it is an extra parameter matching an ellipsis).
5964
5965    On RS/6000 the first eight words of non-FP are normally in registers
5966    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
5967    Under V.4, the first 8 FP args are in registers.
5968
5969    If this is floating-point and no prototype is specified, we use
5970    both an FP and integer register (or possibly FP reg and stack).  Library
5971    functions (when CALL_LIBCALL is set) always have the proper types for args,
5972    so we can pass the FP value just in one register.  emit_library_function
5973    doesn't support PARALLEL anyway.
5974
5975    Note that for args passed by reference, function_arg will be called
5976    with MODE and TYPE set to that of the pointer to the arg, not the arg
5977    itself.  */
5978
5979 rtx
5980 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5981               tree type, int named)
5982 {
5983   enum rs6000_abi abi = DEFAULT_ABI;
5984
5985   /* Return a marker to indicate whether CR1 needs to set or clear the
5986      bit that V.4 uses to say fp args were passed in registers.
5987      Assume that we don't need the marker for software floating point,
5988      or compiler generated library calls.  */
5989   if (mode == VOIDmode)
5990     {
5991       if (abi == ABI_V4
5992           && (cum->call_cookie & CALL_LIBCALL) == 0
5993           && (cum->stdarg
5994               || (cum->nargs_prototype < 0
5995                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
5996         {
5997           /* For the SPE, we need to crxor CR6 always.  */
5998           if (TARGET_SPE_ABI)
5999             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
6000           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
6001             return GEN_INT (cum->call_cookie
6002                             | ((cum->fregno == FP_ARG_MIN_REG)
6003                                ? CALL_V4_SET_FP_ARGS
6004                                : CALL_V4_CLEAR_FP_ARGS));
6005         }
6006
6007       return GEN_INT (cum->call_cookie);
6008     }
6009
6010   if (rs6000_darwin64_abi && mode == BLKmode
6011       && TREE_CODE (type) == RECORD_TYPE)
6012     {
6013       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
6014       if (rslt != NULL_RTX)
6015         return rslt;
6016       /* Else fall through to usual handling.  */
6017     }
6018
6019   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
6020     if (TARGET_64BIT && ! cum->prototype)
6021       {
6022         /* Vector parameters get passed in vector register
6023            and also in GPRs or memory, in absence of prototype.  */
6024         int align_words;
6025         rtx slot;
6026         align_words = (cum->words + 1) & ~1;
6027
6028         if (align_words >= GP_ARG_NUM_REG)
6029           {
6030             slot = NULL_RTX;
6031           }
6032         else
6033           {
6034             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6035           }
6036         return gen_rtx_PARALLEL (mode,
6037                  gen_rtvec (2,
6038                             gen_rtx_EXPR_LIST (VOIDmode,
6039                                                slot, const0_rtx),
6040                             gen_rtx_EXPR_LIST (VOIDmode,
6041                                                gen_rtx_REG (mode, cum->vregno),
6042                                                const0_rtx)));
6043       }
6044     else
6045       return gen_rtx_REG (mode, cum->vregno);
6046   else if (TARGET_ALTIVEC_ABI
6047            && (ALTIVEC_VECTOR_MODE (mode)
6048                || (type && TREE_CODE (type) == VECTOR_TYPE
6049                    && int_size_in_bytes (type) == 16)))
6050     {
6051       if (named || abi == ABI_V4)
6052         return NULL_RTX;
6053       else
6054         {
6055           /* Vector parameters to varargs functions under AIX or Darwin
6056              get passed in memory and possibly also in GPRs.  */
6057           int align, align_words, n_words;
6058           enum machine_mode part_mode;
6059
6060           /* Vector parameters must be 16-byte aligned.  This places them at
6061              2 mod 4 in terms of words in 32-bit mode, since the parameter
6062              save area starts at offset 24 from the stack.  In 64-bit mode,
6063              they just have to start on an even word, since the parameter
6064              save area is 16-byte aligned.  */
6065           if (TARGET_32BIT)
6066             align = (2 - cum->words) & 3;
6067           else
6068             align = cum->words & 1;
6069           align_words = cum->words + align;
6070
6071           /* Out of registers?  Memory, then.  */
6072           if (align_words >= GP_ARG_NUM_REG)
6073             return NULL_RTX;
6074
6075           if (TARGET_32BIT && TARGET_POWERPC64)
6076             return rs6000_mixed_function_arg (mode, type, align_words);
6077
6078           /* The vector value goes in GPRs.  Only the part of the
6079              value in GPRs is reported here.  */
6080           part_mode = mode;
6081           n_words = rs6000_arg_size (mode, type);
6082           if (align_words + n_words > GP_ARG_NUM_REG)
6083             /* Fortunately, there are only two possibilities, the value
6084                is either wholly in GPRs or half in GPRs and half not.  */
6085             part_mode = DImode;
6086
6087           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
6088         }
6089     }
6090   else if (TARGET_SPE_ABI && TARGET_SPE
6091            && (SPE_VECTOR_MODE (mode)
6092                || (TARGET_E500_DOUBLE && (mode == DFmode
6093                                           || mode == DDmode
6094                                           || mode == DCmode
6095                                           || mode == TFmode
6096                                           || mode == TDmode
6097                                           || mode == TCmode))))
6098     return rs6000_spe_function_arg (cum, mode, type);
6099
6100   else if (abi == ABI_V4)
6101     {
6102       if (TARGET_HARD_FLOAT && TARGET_FPRS
6103           && (mode == SFmode || mode == DFmode
6104               || (mode == TFmode && !TARGET_IEEEQUAD)
6105               || mode == SDmode || mode == DDmode || mode == TDmode))
6106         {
6107           /* _Decimal128 must use an even/odd register pair.  This assumes
6108              that the register number is odd when fregno is odd.  */
6109           if (mode == TDmode && (cum->fregno % 2) == 1)
6110             cum->fregno++;
6111
6112           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
6113               <= FP_ARG_V4_MAX_REG)
6114             return gen_rtx_REG (mode, cum->fregno);
6115           else
6116             return NULL_RTX;
6117         }
6118       else
6119         {
6120           int n_words = rs6000_arg_size (mode, type);
6121           int gregno = cum->sysv_gregno;
6122
6123           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
6124              (r7,r8) or (r9,r10).  As does any other 2 word item such
6125              as complex int due to a historical mistake.  */
6126           if (n_words == 2)
6127             gregno += (1 - gregno) & 1;
6128
6129           /* Multi-reg args are not split between registers and stack.  */
6130           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
6131             return NULL_RTX;
6132
6133           if (TARGET_32BIT && TARGET_POWERPC64)
6134             return rs6000_mixed_function_arg (mode, type,
6135                                               gregno - GP_ARG_MIN_REG);
6136           return gen_rtx_REG (mode, gregno);
6137         }
6138     }
6139   else
6140     {
6141       int align_words = rs6000_parm_start (mode, type, cum->words);
6142
6143       /* _Decimal128 must be passed in an even/odd float register pair.
6144          This assumes that the register number is odd when fregno is odd.  */
6145       if (mode == TDmode && (cum->fregno % 2) == 1)
6146         cum->fregno++;
6147
6148       if (USE_FP_FOR_ARG_P (cum, mode, type))
6149         {
6150           rtx rvec[GP_ARG_NUM_REG + 1];
6151           rtx r;
6152           int k;
6153           bool needs_psave;
6154           enum machine_mode fmode = mode;
6155           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
6156
6157           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
6158             {
6159               /* Currently, we only ever need one reg here because complex
6160                  doubles are split.  */
6161               gcc_assert (cum->fregno == FP_ARG_MAX_REG
6162                           && (fmode == TFmode || fmode == TDmode));
6163
6164               /* Long double or _Decimal128 split over regs and memory.  */
6165               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
6166             }
6167
6168           /* Do we also need to pass this arg in the parameter save
6169              area?  */
6170           needs_psave = (type
6171                          && (cum->nargs_prototype <= 0
6172                              || (DEFAULT_ABI == ABI_AIX
6173                                  && TARGET_XL_COMPAT
6174                                  && align_words >= GP_ARG_NUM_REG)));
6175
6176           if (!needs_psave && mode == fmode)
6177             return gen_rtx_REG (fmode, cum->fregno);
6178
6179           k = 0;
6180           if (needs_psave)
6181             {
6182               /* Describe the part that goes in gprs or the stack.
6183                  This piece must come first, before the fprs.  */
6184               if (align_words < GP_ARG_NUM_REG)
6185                 {
6186                   unsigned long n_words = rs6000_arg_size (mode, type);
6187
6188                   if (align_words + n_words > GP_ARG_NUM_REG
6189                       || (TARGET_32BIT && TARGET_POWERPC64))
6190                     {
6191                       /* If this is partially on the stack, then we only
6192                          include the portion actually in registers here.  */
6193                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
6194                       rtx off;
6195                       int i = 0;
6196                       if (align_words + n_words > GP_ARG_NUM_REG)
6197                         /* Not all of the arg fits in gprs.  Say that it
6198                            goes in memory too, using a magic NULL_RTX
6199                            component.  Also see comment in
6200                            rs6000_mixed_function_arg for why the normal
6201                            function_arg_partial_nregs scheme doesn't work
6202                            in this case. */
6203                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
6204                                                        const0_rtx);
6205                       do
6206                         {
6207                           r = gen_rtx_REG (rmode,
6208                                            GP_ARG_MIN_REG + align_words);
6209                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
6210                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
6211                         }
6212                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
6213                     }
6214                   else
6215                     {
6216                       /* The whole arg fits in gprs.  */
6217                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6218                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
6219                     }
6220                 }
6221               else
6222                 /* It's entirely in memory.  */
6223                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6224             }
6225
6226           /* Describe where this piece goes in the fprs.  */
6227           r = gen_rtx_REG (fmode, cum->fregno);
6228           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
6229
6230           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
6231         }
6232       else if (align_words < GP_ARG_NUM_REG)
6233         {
6234           if (TARGET_32BIT && TARGET_POWERPC64)
6235             return rs6000_mixed_function_arg (mode, type, align_words);
6236
6237           if (mode == BLKmode)
6238             mode = Pmode;
6239
6240           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6241         }
6242       else
6243         return NULL_RTX;
6244     }
6245 }
6246 \f
6247 /* For an arg passed partly in registers and partly in memory, this is
6248    the number of bytes passed in registers.  For args passed entirely in
6249    registers or entirely in memory, zero.  When an arg is described by a
6250    PARALLEL, perhaps using more than one register type, this function
6251    returns the number of bytes used by the first element of the PARALLEL.  */
6252
6253 static int
6254 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6255                           tree type, bool named)
6256 {
6257   int ret = 0;
6258   int align_words;
6259
6260   if (DEFAULT_ABI == ABI_V4)
6261     return 0;
6262
6263   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
6264       && cum->nargs_prototype >= 0)
6265     return 0;
6266
6267   /* In this complicated case we just disable the partial_nregs code.  */
6268   if (rs6000_darwin64_abi && mode == BLKmode
6269       && TREE_CODE (type) == RECORD_TYPE
6270       && int_size_in_bytes (type) > 0)
6271     return 0;
6272
6273   align_words = rs6000_parm_start (mode, type, cum->words);
6274
6275   if (USE_FP_FOR_ARG_P (cum, mode, type))
6276     {
6277       /* If we are passing this arg in the fixed parameter save area
6278          (gprs or memory) as well as fprs, then this function should
6279          return the number of partial bytes passed in the parameter
6280          save area rather than partial bytes passed in fprs.  */
6281       if (type
6282           && (cum->nargs_prototype <= 0
6283               || (DEFAULT_ABI == ABI_AIX
6284                   && TARGET_XL_COMPAT
6285                   && align_words >= GP_ARG_NUM_REG)))
6286         return 0;
6287       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
6288                > FP_ARG_MAX_REG + 1)
6289         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
6290       else if (cum->nargs_prototype >= 0)
6291         return 0;
6292     }
6293
6294   if (align_words < GP_ARG_NUM_REG
6295       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
6296     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
6297
6298   if (ret != 0 && TARGET_DEBUG_ARG)
6299     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
6300
6301   return ret;
6302 }
6303 \f
6304 /* A C expression that indicates when an argument must be passed by
6305    reference.  If nonzero for an argument, a copy of that argument is
6306    made in memory and a pointer to the argument is passed instead of
6307    the argument itself.  The pointer is passed in whatever way is
6308    appropriate for passing a pointer to that type.
6309
6310    Under V.4, aggregates and long double are passed by reference.
6311
6312    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
6313    reference unless the AltiVec vector extension ABI is in force.
6314
6315    As an extension to all ABIs, variable sized types are passed by
6316    reference.  */
6317
6318 static bool
6319 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
6320                           enum machine_mode mode, const_tree type,
6321                           bool named ATTRIBUTE_UNUSED)
6322 {
6323   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
6324     {
6325       if (TARGET_DEBUG_ARG)
6326         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
6327       return 1;
6328     }
6329
6330   if (!type)
6331     return 0;
6332
6333   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
6334     {
6335       if (TARGET_DEBUG_ARG)
6336         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
6337       return 1;
6338     }
6339
6340   if (int_size_in_bytes (type) < 0)
6341     {
6342       if (TARGET_DEBUG_ARG)
6343         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
6344       return 1;
6345     }
6346
6347   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
6348      modes only exist for GCC vector types if -maltivec.  */
6349   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
6350     {
6351       if (TARGET_DEBUG_ARG)
6352         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
6353       return 1;
6354     }
6355
6356   /* Pass synthetic vectors in memory.  */
6357   if (TREE_CODE (type) == VECTOR_TYPE
6358       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
6359     {
6360       static bool warned_for_pass_big_vectors = false;
6361       if (TARGET_DEBUG_ARG)
6362         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
6363       if (!warned_for_pass_big_vectors)
6364         {
6365           warning (0, "GCC vector passed by reference: "
6366                    "non-standard ABI extension with no compatibility guarantee");
6367           warned_for_pass_big_vectors = true;
6368         }
6369       return 1;
6370     }
6371
6372   return 0;
6373 }
6374
6375 static void
6376 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
6377 {
6378   int i;
6379   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
6380
6381   if (nregs == 0)
6382     return;
6383
6384   for (i = 0; i < nregs; i++)
6385     {
6386       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
6387       if (reload_completed)
6388         {
6389           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
6390             tem = NULL_RTX;
6391           else
6392             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
6393                                        i * GET_MODE_SIZE (reg_mode));
6394         }
6395       else
6396         tem = replace_equiv_address (tem, XEXP (tem, 0));
6397
6398       gcc_assert (tem);
6399
6400       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
6401     }
6402 }
6403 \f
6404 /* Perform any needed actions needed for a function that is receiving a
6405    variable number of arguments.
6406
6407    CUM is as above.
6408
6409    MODE and TYPE are the mode and type of the current parameter.
6410
6411    PRETEND_SIZE is a variable that should be set to the amount of stack
6412    that must be pushed by the prolog to pretend that our caller pushed
6413    it.
6414
6415    Normally, this macro will push all remaining incoming registers on the
6416    stack and set PRETEND_SIZE to the length of the registers pushed.  */
6417
6418 static void
6419 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6420                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
6421                         int no_rtl)
6422 {
6423   CUMULATIVE_ARGS next_cum;
6424   int reg_size = TARGET_32BIT ? 4 : 8;
6425   rtx save_area = NULL_RTX, mem;
6426   int first_reg_offset;
6427   alias_set_type set;
6428
6429   /* Skip the last named argument.  */
6430   next_cum = *cum;
6431   function_arg_advance (&next_cum, mode, type, 1, 0);
6432
6433   if (DEFAULT_ABI == ABI_V4)
6434     {
6435       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
6436
6437       if (! no_rtl)
6438         {
6439           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
6440           HOST_WIDE_INT offset = 0;
6441
6442           /* Try to optimize the size of the varargs save area.
6443              The ABI requires that ap.reg_save_area is doubleword
6444              aligned, but we don't need to allocate space for all
6445              the bytes, only those to which we actually will save
6446              anything.  */
6447           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
6448             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
6449           if (TARGET_HARD_FLOAT && TARGET_FPRS
6450               && next_cum.fregno <= FP_ARG_V4_MAX_REG
6451               && cfun->va_list_fpr_size)
6452             {
6453               if (gpr_reg_num)
6454                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
6455                            * UNITS_PER_FP_WORD;
6456               if (cfun->va_list_fpr_size
6457                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
6458                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
6459               else
6460                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
6461                             * UNITS_PER_FP_WORD;
6462             }
6463           if (gpr_reg_num)
6464             {
6465               offset = -((first_reg_offset * reg_size) & ~7);
6466               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
6467                 {
6468                   gpr_reg_num = cfun->va_list_gpr_size;
6469                   if (reg_size == 4 && (first_reg_offset & 1))
6470                     gpr_reg_num++;
6471                 }
6472               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
6473             }
6474           else if (fpr_size)
6475             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
6476                        * UNITS_PER_FP_WORD
6477                      - (int) (GP_ARG_NUM_REG * reg_size);
6478
6479           if (gpr_size + fpr_size)
6480             {
6481               rtx reg_save_area
6482                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
6483               gcc_assert (GET_CODE (reg_save_area) == MEM);
6484               reg_save_area = XEXP (reg_save_area, 0);
6485               if (GET_CODE (reg_save_area) == PLUS)
6486                 {
6487                   gcc_assert (XEXP (reg_save_area, 0)
6488                               == virtual_stack_vars_rtx);
6489                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
6490                   offset += INTVAL (XEXP (reg_save_area, 1));
6491                 }
6492               else
6493                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
6494             }
6495
6496           cfun->machine->varargs_save_offset = offset;
6497           save_area = plus_constant (virtual_stack_vars_rtx, offset);
6498         }
6499     }
6500   else
6501     {
6502       first_reg_offset = next_cum.words;
6503       save_area = virtual_incoming_args_rtx;
6504
6505       if (targetm.calls.must_pass_in_stack (mode, type))
6506         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
6507     }
6508
6509   set = get_varargs_alias_set ();
6510   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
6511       && cfun->va_list_gpr_size)
6512     {
6513       int nregs = GP_ARG_NUM_REG - first_reg_offset;
6514
6515       if (va_list_gpr_counter_field)
6516         {
6517           /* V4 va_list_gpr_size counts number of registers needed.  */
6518           if (nregs > cfun->va_list_gpr_size)
6519             nregs = cfun->va_list_gpr_size;
6520         }
6521       else
6522         {
6523           /* char * va_list instead counts number of bytes needed.  */
6524           if (nregs > cfun->va_list_gpr_size / reg_size)
6525             nregs = cfun->va_list_gpr_size / reg_size;
6526         }
6527
6528       mem = gen_rtx_MEM (BLKmode,
6529                          plus_constant (save_area,
6530                                         first_reg_offset * reg_size));
6531       MEM_NOTRAP_P (mem) = 1;
6532       set_mem_alias_set (mem, set);
6533       set_mem_align (mem, BITS_PER_WORD);
6534
6535       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
6536                                   nregs);
6537     }
6538
6539   /* Save FP registers if needed.  */
6540   if (DEFAULT_ABI == ABI_V4
6541       && TARGET_HARD_FLOAT && TARGET_FPRS
6542       && ! no_rtl
6543       && next_cum.fregno <= FP_ARG_V4_MAX_REG
6544       && cfun->va_list_fpr_size)
6545     {
6546       int fregno = next_cum.fregno, nregs;
6547       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
6548       rtx lab = gen_label_rtx ();
6549       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
6550                                                * UNITS_PER_FP_WORD);
6551
6552       emit_jump_insn
6553         (gen_rtx_SET (VOIDmode,
6554                       pc_rtx,
6555                       gen_rtx_IF_THEN_ELSE (VOIDmode,
6556                                             gen_rtx_NE (VOIDmode, cr1,
6557                                                         const0_rtx),
6558                                             gen_rtx_LABEL_REF (VOIDmode, lab),
6559                                             pc_rtx)));
6560
6561       for (nregs = 0;
6562            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
6563            fregno++, off += UNITS_PER_FP_WORD, nregs++)
6564         {
6565           mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
6566           MEM_NOTRAP_P (mem) = 1;
6567           set_mem_alias_set (mem, set);
6568           set_mem_align (mem, GET_MODE_ALIGNMENT (DFmode));
6569           emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
6570         }
6571
6572       emit_label (lab);
6573     }
6574 }
6575
6576 /* Create the va_list data type.  */
6577
6578 static tree
6579 rs6000_build_builtin_va_list (void)
6580 {
6581   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
6582
6583   /* For AIX, prefer 'char *' because that's what the system
6584      header files like.  */
6585   if (DEFAULT_ABI != ABI_V4)
6586     return build_pointer_type (char_type_node);
6587
6588   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6589   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
6590
6591   f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
6592                       unsigned_char_type_node);
6593   f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
6594                       unsigned_char_type_node);
6595   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
6596      every user file.  */
6597   f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
6598                       short_unsigned_type_node);
6599   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
6600                       ptr_type_node);
6601   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
6602                       ptr_type_node);
6603
6604   va_list_gpr_counter_field = f_gpr;
6605   va_list_fpr_counter_field = f_fpr;
6606
6607   DECL_FIELD_CONTEXT (f_gpr) = record;
6608   DECL_FIELD_CONTEXT (f_fpr) = record;
6609   DECL_FIELD_CONTEXT (f_res) = record;
6610   DECL_FIELD_CONTEXT (f_ovf) = record;
6611   DECL_FIELD_CONTEXT (f_sav) = record;
6612
6613   TREE_CHAIN (record) = type_decl;
6614   TYPE_NAME (record) = type_decl;
6615   TYPE_FIELDS (record) = f_gpr;
6616   TREE_CHAIN (f_gpr) = f_fpr;
6617   TREE_CHAIN (f_fpr) = f_res;
6618   TREE_CHAIN (f_res) = f_ovf;
6619   TREE_CHAIN (f_ovf) = f_sav;
6620
6621   layout_type (record);
6622
6623   /* The correct type is an array type of one element.  */
6624   return build_array_type (record, build_index_type (size_zero_node));
6625 }
6626
6627 /* Implement va_start.  */
6628
6629 static void
6630 rs6000_va_start (tree valist, rtx nextarg)
6631 {
6632   HOST_WIDE_INT words, n_gpr, n_fpr;
6633   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
6634   tree gpr, fpr, ovf, sav, t;
6635
6636   /* Only SVR4 needs something special.  */
6637   if (DEFAULT_ABI != ABI_V4)
6638     {
6639       std_expand_builtin_va_start (valist, nextarg);
6640       return;
6641     }
6642
6643   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
6644   f_fpr = TREE_CHAIN (f_gpr);
6645   f_res = TREE_CHAIN (f_fpr);
6646   f_ovf = TREE_CHAIN (f_res);
6647   f_sav = TREE_CHAIN (f_ovf);
6648
6649   valist = build_va_arg_indirect_ref (valist);
6650   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6651   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6652   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6653   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6654
6655   /* Count number of gp and fp argument registers used.  */
6656   words = current_function_args_info.words;
6657   n_gpr = MIN (current_function_args_info.sysv_gregno - GP_ARG_MIN_REG,
6658                GP_ARG_NUM_REG);
6659   n_fpr = MIN (current_function_args_info.fregno - FP_ARG_MIN_REG,
6660                FP_ARG_NUM_REG);
6661
6662   if (TARGET_DEBUG_ARG)
6663     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
6664              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
6665              words, n_gpr, n_fpr);
6666
6667   if (cfun->va_list_gpr_size)
6668     {
6669       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (gpr), gpr,
6670                   build_int_cst (NULL_TREE, n_gpr));
6671       TREE_SIDE_EFFECTS (t) = 1;
6672       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6673     }
6674
6675   if (cfun->va_list_fpr_size)
6676     {
6677       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (fpr), fpr,
6678                   build_int_cst (NULL_TREE, n_fpr));
6679       TREE_SIDE_EFFECTS (t) = 1;
6680       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6681     }
6682
6683   /* Find the overflow area.  */
6684   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
6685   if (words != 0)
6686     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
6687                 size_int (words * UNITS_PER_WORD));
6688   t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovf), ovf, t);
6689   TREE_SIDE_EFFECTS (t) = 1;
6690   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6691
6692   /* If there were no va_arg invocations, don't set up the register
6693      save area.  */
6694   if (!cfun->va_list_gpr_size
6695       && !cfun->va_list_fpr_size
6696       && n_gpr < GP_ARG_NUM_REG
6697       && n_fpr < FP_ARG_V4_MAX_REG)
6698     return;
6699
6700   /* Find the register save area.  */
6701   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
6702   if (cfun->machine->varargs_save_offset)
6703     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
6704                 size_int (cfun->machine->varargs_save_offset));
6705   t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (sav), sav, t);
6706   TREE_SIDE_EFFECTS (t) = 1;
6707   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6708 }
6709
6710 /* Implement va_arg.  */
6711
6712 tree
6713 rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
6714 {
6715   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
6716   tree gpr, fpr, ovf, sav, reg, t, u;
6717   int size, rsize, n_reg, sav_ofs, sav_scale;
6718   tree lab_false, lab_over, addr;
6719   int align;
6720   tree ptrtype = build_pointer_type (type);
6721   int regalign = 0;
6722
6723   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
6724     {
6725       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
6726       return build_va_arg_indirect_ref (t);
6727     }
6728
6729   if (DEFAULT_ABI != ABI_V4)
6730     {
6731       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
6732         {
6733           tree elem_type = TREE_TYPE (type);
6734           enum machine_mode elem_mode = TYPE_MODE (elem_type);
6735           int elem_size = GET_MODE_SIZE (elem_mode);
6736
6737           if (elem_size < UNITS_PER_WORD)
6738             {
6739               tree real_part, imag_part;
6740               tree post = NULL_TREE;
6741
6742               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
6743                                                   &post);
6744               /* Copy the value into a temporary, lest the formal temporary
6745                  be reused out from under us.  */
6746               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
6747               append_to_statement_list (post, pre_p);
6748
6749               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
6750                                                   post_p);
6751
6752               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
6753             }
6754         }
6755
6756       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6757     }
6758
6759   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
6760   f_fpr = TREE_CHAIN (f_gpr);
6761   f_res = TREE_CHAIN (f_fpr);
6762   f_ovf = TREE_CHAIN (f_res);
6763   f_sav = TREE_CHAIN (f_ovf);
6764
6765   valist = build_va_arg_indirect_ref (valist);
6766   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6767   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6768   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6769   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6770
6771   size = int_size_in_bytes (type);
6772   rsize = (size + 3) / 4;
6773   align = 1;
6774
6775   if (TARGET_HARD_FLOAT && TARGET_FPRS
6776       && (TYPE_MODE (type) == SFmode
6777           || TYPE_MODE (type) == DFmode
6778           || TYPE_MODE (type) == TFmode
6779           || TYPE_MODE (type) == SDmode
6780           || TYPE_MODE (type) == DDmode
6781           || TYPE_MODE (type) == TDmode))
6782     {
6783       /* FP args go in FP registers, if present.  */
6784       reg = fpr;
6785       n_reg = (size + 7) / 8;
6786       sav_ofs = 8*4;
6787       sav_scale = 8;
6788       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
6789         align = 8;
6790     }
6791   else
6792     {
6793       /* Otherwise into GP registers.  */
6794       reg = gpr;
6795       n_reg = rsize;
6796       sav_ofs = 0;
6797       sav_scale = 4;
6798       if (n_reg == 2)
6799         align = 8;
6800     }
6801
6802   /* Pull the value out of the saved registers....  */
6803
6804   lab_over = NULL;
6805   addr = create_tmp_var (ptr_type_node, "addr");
6806   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
6807
6808   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
6809   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
6810     align = 16;
6811   else
6812     {
6813       lab_false = create_artificial_label ();
6814       lab_over = create_artificial_label ();
6815
6816       /* Long long and SPE vectors are aligned in the registers.
6817          As are any other 2 gpr item such as complex int due to a
6818          historical mistake.  */
6819       u = reg;
6820       if (n_reg == 2 && reg == gpr)
6821         {
6822           regalign = 1;
6823           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), reg,
6824                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
6825           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, u);
6826         }
6827       /* _Decimal128 is passed in even/odd fpr pairs; the stored
6828          reg number is 0 for f1, so we want to make it odd.  */
6829       else if (reg == fpr && TYPE_MODE (type) == TDmode)
6830         {
6831           regalign = 1;
6832           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), reg, size_int (1));
6833           u = build2 (MODIFY_EXPR, void_type_node, reg, t);
6834         }
6835
6836       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
6837       t = build2 (GE_EXPR, boolean_type_node, u, t);
6838       u = build1 (GOTO_EXPR, void_type_node, lab_false);
6839       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
6840       gimplify_and_add (t, pre_p);
6841
6842       t = sav;
6843       if (sav_ofs)
6844         t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
6845
6846       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg,
6847                   build_int_cst (TREE_TYPE (reg), n_reg));
6848       u = fold_convert (sizetype, u);
6849       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
6850       t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
6851
6852       /* _Decimal32 varargs are located in the second word of the 64-bit
6853          FP register for 32-bit binaries.  */
6854       if (!TARGET_POWERPC64 && TYPE_MODE (type) == SDmode)
6855         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
6856
6857       t = build2 (GIMPLE_MODIFY_STMT, void_type_node, addr, t);
6858       gimplify_and_add (t, pre_p);
6859
6860       t = build1 (GOTO_EXPR, void_type_node, lab_over);
6861       gimplify_and_add (t, pre_p);
6862
6863       t = build1 (LABEL_EXPR, void_type_node, lab_false);
6864       append_to_statement_list (t, pre_p);
6865
6866       if ((n_reg == 2 && !regalign) || n_reg > 2)
6867         {
6868           /* Ensure that we don't find any more args in regs.
6869              Alignment has taken care of for special cases.  */
6870           t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (reg), reg, size_int (8));
6871           gimplify_and_add (t, pre_p);
6872         }
6873     }
6874
6875   /* ... otherwise out of the overflow area.  */
6876
6877   /* Care for on-stack alignment if needed.  */
6878   t = ovf;
6879   if (align != 1)
6880     {
6881       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
6882       t = fold_convert (sizetype, t);
6883       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
6884                   size_int (-align));
6885       t = fold_convert (TREE_TYPE (ovf), t);
6886     }
6887   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
6888
6889   u = build2 (GIMPLE_MODIFY_STMT, void_type_node, addr, t);
6890   gimplify_and_add (u, pre_p);
6891
6892   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
6893   t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovf), ovf, t);
6894   gimplify_and_add (t, pre_p);
6895
6896   if (lab_over)
6897     {
6898       t = build1 (LABEL_EXPR, void_type_node, lab_over);
6899       append_to_statement_list (t, pre_p);
6900     }
6901
6902   if (STRICT_ALIGNMENT
6903       && (TYPE_ALIGN (type)
6904           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
6905     {
6906       /* The value (of type complex double, for example) may not be
6907          aligned in memory in the saved registers, so copy via a
6908          temporary.  (This is the same code as used for SPARC.)  */
6909       tree tmp = create_tmp_var (type, "va_arg_tmp");
6910       tree dest_addr = build_fold_addr_expr (tmp);
6911
6912       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
6913                                    3, dest_addr, addr, size_int (rsize * 4));
6914
6915       gimplify_and_add (copy, pre_p);
6916       addr = dest_addr;
6917     }
6918
6919   addr = fold_convert (ptrtype, addr);
6920   return build_va_arg_indirect_ref (addr);
6921 }
6922
6923 /* Builtins.  */
6924
6925 static void
6926 def_builtin (int mask, const char *name, tree type, int code)
6927 {
6928   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
6929     {
6930       if (rs6000_builtin_decls[code])
6931         abort ();
6932
6933       rs6000_builtin_decls[code] =
6934         add_builtin_function (name, type, code, BUILT_IN_MD,
6935                               NULL, NULL_TREE);
6936     }
6937 }
6938
6939 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
6940
6941 static const struct builtin_description bdesc_3arg[] =
6942 {
6943   { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
6944   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
6945   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
6946   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
6947   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
6948   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
6949   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
6950   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
6951   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
6952   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
6953   { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
6954   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
6955   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
6956   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
6957   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
6958   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
6959   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
6960   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
6961   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
6962   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
6963   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
6964   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
6965   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
6966
6967   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
6968   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
6969   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
6970   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
6971   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
6972   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
6973   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
6974   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
6975   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
6976   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
6977   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
6978   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
6979   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
6980   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
6981   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
6982
6983   { 0, CODE_FOR_paired_msub, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
6984   { 0, CODE_FOR_paired_madd, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
6985   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
6986   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
6987   { 0, CODE_FOR_paired_nmsub, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
6988   { 0, CODE_FOR_paired_nmadd, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
6989   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
6990   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
6991   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
6992 };
6993
6994 /* DST operations: void foo (void *, const int, const char).  */
6995
6996 static const struct builtin_description bdesc_dst[] =
6997 {
6998   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
6999   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
7000   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
7001   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
7002
7003   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
7004   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
7005   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
7006   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
7007 };
7008
7009 /* Simple binary operations: VECc = foo (VECa, VECb).  */
7010
7011 static struct builtin_description bdesc_2arg[] =
7012 {
7013   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
7014   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
7015   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
7016   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
7017   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
7018   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
7019   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
7020   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
7021   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
7022   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
7023   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
7024   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
7025   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
7026   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
7027   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
7028   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
7029   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
7030   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
7031   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
7032   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
7033   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
7034   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
7035   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
7036   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
7037   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
7038   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
7039   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
7040   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
7041   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
7042   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
7043   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
7044   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
7045   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
7046   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
7047   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
7048   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
7049   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
7050   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
7051   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
7052   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
7053   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
7054   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
7055   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
7056   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
7057   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
7058   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
7059   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
7060   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
7061   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
7062   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
7063   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
7064   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
7065   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
7066   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
7067   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
7068   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
7069   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
7070   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
7071   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
7072   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
7073   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
7074   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
7075   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
7076   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
7077   { MASK_ALTIVEC, CODE_FOR_altivec_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
7078   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
7079   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
7080   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
7081   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
7082   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
7083   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
7084   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
7085   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
7086   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
7087   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
7088   { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
7089   { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
7090   { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
7091   { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
7092   { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
7093   { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
7094   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
7095   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
7096   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
7097   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
7098   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
7099   { MASK_ALTIVEC, CODE_FOR_lshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
7100   { MASK_ALTIVEC, CODE_FOR_lshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
7101   { MASK_ALTIVEC, CODE_FOR_lshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
7102   { MASK_ALTIVEC, CODE_FOR_ashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
7103   { MASK_ALTIVEC, CODE_FOR_ashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
7104   { MASK_ALTIVEC, CODE_FOR_ashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
7105   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
7106   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
7107   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
7108   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
7109   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
7110   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
7111   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
7112   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
7113   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
7114   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
7115   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
7116   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
7117   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
7118   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
7119   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
7120   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
7121   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
7122   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
7123   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
7124
7125   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
7126   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
7127   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
7128   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
7129   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
7130   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
7131   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
7132   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
7133   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
7134   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
7135   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
7136   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
7137   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
7138   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
7139   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
7140   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
7141   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
7142   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
7143   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
7144   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
7145   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
7146   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
7147   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
7148   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
7149   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
7150   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
7151   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
7152   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
7153   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
7154   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
7155   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
7156   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
7157   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
7158   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
7159   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
7160   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
7161   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
7162   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
7163   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
7164   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
7165   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
7166   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
7167   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
7168   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
7169   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
7170   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
7171   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
7172   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
7173   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
7174   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
7175   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
7176   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
7177   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
7178   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
7179   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
7180   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
7181   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
7182   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
7183   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
7184   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
7185   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
7186   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
7187   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
7188   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
7189   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
7190   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
7191   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
7192   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
7193   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
7194   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
7195   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
7196   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
7197   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
7198   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
7199   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
7200   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
7201   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
7202   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
7203   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
7204   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
7205   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
7206   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
7207   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
7208   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
7209   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
7210   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
7211   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
7212   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
7213   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
7214   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
7215   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
7216   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
7217   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
7218   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
7219   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
7220   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
7221   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
7222   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
7223   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
7224   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
7225   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
7226   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
7227   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
7228   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
7229   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
7230   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
7231   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
7232   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
7233   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
7234   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
7235   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
7236   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
7237   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
7238   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
7239   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
7240   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
7241   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
7242   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
7243   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
7244   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
7245   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
7246   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
7247   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
7248   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
7249   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
7250   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
7251   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
7252
7253   { 0, CODE_FOR_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
7254   { 0, CODE_FOR_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
7255   { 0, CODE_FOR_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
7256   { 0, CODE_FOR_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
7257   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
7258   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
7259   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
7260   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
7261   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
7262   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
7263
7264   /* Place holder, leave as first spe builtin.  */
7265   { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
7266   { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
7267   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
7268   { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
7269   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
7270   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
7271   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
7272   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
7273   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
7274   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
7275   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
7276   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
7277   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
7278   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
7279   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
7280   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
7281   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
7282   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
7283   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
7284   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
7285   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
7286   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
7287   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
7288   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
7289   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
7290   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
7291   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
7292   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
7293   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
7294   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
7295   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
7296   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
7297   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
7298   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
7299   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
7300   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
7301   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
7302   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
7303   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
7304   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
7305   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
7306   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
7307   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
7308   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
7309   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
7310   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
7311   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
7312   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
7313   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
7314   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
7315   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
7316   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
7317   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
7318   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
7319   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
7320   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
7321   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
7322   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
7323   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
7324   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
7325   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
7326   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
7327   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
7328   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
7329   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
7330   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
7331   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
7332   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
7333   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
7334   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
7335   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
7336   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
7337   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
7338   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
7339   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
7340   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
7341   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
7342   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
7343   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
7344   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
7345   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
7346   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
7347   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
7348   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
7349   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
7350   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
7351   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
7352   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
7353   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
7354   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
7355   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
7356   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
7357   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
7358   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
7359   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
7360   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
7361   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
7362   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
7363   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
7364   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
7365   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
7366   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
7367   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
7368   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
7369   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
7370   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
7371   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
7372   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
7373   { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
7374
7375   /* SPE binary operations expecting a 5-bit unsigned literal.  */
7376   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
7377
7378   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
7379   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
7380   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
7381   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
7382   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
7383   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
7384   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
7385   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
7386   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
7387   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
7388   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
7389   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
7390   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
7391   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
7392   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
7393   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
7394   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
7395   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
7396   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
7397   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
7398   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
7399   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
7400   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
7401   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
7402   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
7403   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
7404
7405   /* Place-holder.  Leave as last binary SPE builtin.  */
7406   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
7407 };
7408
7409 /* AltiVec predicates.  */
7410
7411 struct builtin_description_predicates
7412 {
7413   const unsigned int mask;
7414   const enum insn_code icode;
7415   const char *opcode;
7416   const char *const name;
7417   const enum rs6000_builtins code;
7418 };
7419
7420 static const struct builtin_description_predicates bdesc_altivec_preds[] =
7421 {
7422   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
7423   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
7424   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
7425   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
7426   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
7427   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
7428   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
7429   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
7430   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
7431   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
7432   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
7433   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
7434   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
7435
7436   { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpeq_p", ALTIVEC_BUILTIN_VCMPEQ_P },
7437   { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpgt_p", ALTIVEC_BUILTIN_VCMPGT_P },
7438   { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpge_p", ALTIVEC_BUILTIN_VCMPGE_P }
7439 };
7440
7441 /* SPE predicates.  */
7442 static struct builtin_description bdesc_spe_predicates[] =
7443 {
7444   /* Place-holder.  Leave as first.  */
7445   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
7446   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
7447   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
7448   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
7449   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
7450   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
7451   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
7452   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
7453   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
7454   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
7455   /* Place-holder.  Leave as last.  */
7456   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
7457 };
7458
7459 /* SPE evsel predicates.  */
7460 static struct builtin_description bdesc_spe_evsel[] =
7461 {
7462   /* Place-holder.  Leave as first.  */
7463   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
7464   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
7465   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
7466   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
7467   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
7468   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
7469   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
7470   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
7471   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
7472   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
7473   /* Place-holder.  Leave as last.  */
7474   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
7475 };
7476
7477 /* PAIRED predicates.  */
7478 static const struct builtin_description bdesc_paired_preds[] =
7479 {
7480   /* Place-holder.  Leave as first.  */
7481   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
7482   /* Place-holder.  Leave as last.  */
7483   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
7484 };
7485
7486 /* ABS* operations.  */
7487
7488 static const struct builtin_description bdesc_abs[] =
7489 {
7490   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
7491   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
7492   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
7493   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
7494   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
7495   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
7496   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
7497 };
7498
7499 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
7500    foo (VECa).  */
7501
7502 static struct builtin_description bdesc_1arg[] =
7503 {
7504   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
7505   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
7506   { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
7507   { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
7508   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
7509   { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
7510   { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
7511   { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
7512   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
7513   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
7514   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
7515   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
7516   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
7517   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
7518   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
7519   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
7520   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
7521
7522   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
7523   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
7524   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
7525   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
7526   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
7527   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
7528   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
7529   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
7530   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
7531   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
7532   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
7533   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
7534   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
7535   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
7536   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
7537   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
7538   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
7539   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
7540   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
7541
7542   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
7543      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
7544   { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
7545   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
7546   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
7547   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
7548   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
7549   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
7550   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
7551   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
7552   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
7553   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
7554   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
7555   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
7556   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
7557   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
7558   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
7559   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
7560   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
7561   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
7562   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
7563   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
7564   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
7565   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
7566   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
7567   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
7568   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
7569   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
7570   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
7571   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
7572
7573   /* Place-holder.  Leave as last unary SPE builtin.  */
7574   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
7575
7576   { 0, CODE_FOR_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
7577   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
7578   { 0, CODE_FOR_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
7579   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
7580   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
7581 };
7582
7583 static rtx
7584 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
7585 {
7586   rtx pat;
7587   tree arg0 = CALL_EXPR_ARG (exp, 0);
7588   rtx op0 = expand_normal (arg0);
7589   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7590   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7591
7592   if (icode == CODE_FOR_nothing)
7593     /* Builtin not supported on this processor.  */
7594     return 0;
7595
7596   /* If we got invalid arguments bail out before generating bad rtl.  */
7597   if (arg0 == error_mark_node)
7598     return const0_rtx;
7599
7600   if (icode == CODE_FOR_altivec_vspltisb
7601       || icode == CODE_FOR_altivec_vspltish
7602       || icode == CODE_FOR_altivec_vspltisw
7603       || icode == CODE_FOR_spe_evsplatfi
7604       || icode == CODE_FOR_spe_evsplati)
7605     {
7606       /* Only allow 5-bit *signed* literals.  */
7607       if (GET_CODE (op0) != CONST_INT
7608           || INTVAL (op0) > 15
7609           || INTVAL (op0) < -16)
7610         {
7611           error ("argument 1 must be a 5-bit signed literal");
7612           return const0_rtx;
7613         }
7614     }
7615
7616   if (target == 0
7617       || GET_MODE (target) != tmode
7618       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7619     target = gen_reg_rtx (tmode);
7620
7621   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7622     op0 = copy_to_mode_reg (mode0, op0);
7623
7624   pat = GEN_FCN (icode) (target, op0);
7625   if (! pat)
7626     return 0;
7627   emit_insn (pat);
7628
7629   return target;
7630 }
7631
7632 static rtx
7633 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
7634 {
7635   rtx pat, scratch1, scratch2;
7636   tree arg0 = CALL_EXPR_ARG (exp, 0);
7637   rtx op0 = expand_normal (arg0);
7638   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7639   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7640
7641   /* If we have invalid arguments, bail out before generating bad rtl.  */
7642   if (arg0 == error_mark_node)
7643     return const0_rtx;
7644
7645   if (target == 0
7646       || GET_MODE (target) != tmode
7647       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7648     target = gen_reg_rtx (tmode);
7649
7650   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7651     op0 = copy_to_mode_reg (mode0, op0);
7652
7653   scratch1 = gen_reg_rtx (mode0);
7654   scratch2 = gen_reg_rtx (mode0);
7655
7656   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
7657   if (! pat)
7658     return 0;
7659   emit_insn (pat);
7660
7661   return target;
7662 }
7663
7664 static rtx
7665 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
7666 {
7667   rtx pat;
7668   tree arg0 = CALL_EXPR_ARG (exp, 0);
7669   tree arg1 = CALL_EXPR_ARG (exp, 1);
7670   rtx op0 = expand_normal (arg0);
7671   rtx op1 = expand_normal (arg1);
7672   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7673   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7674   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7675
7676   if (icode == CODE_FOR_nothing)
7677     /* Builtin not supported on this processor.  */
7678     return 0;
7679
7680   /* If we got invalid arguments bail out before generating bad rtl.  */
7681   if (arg0 == error_mark_node || arg1 == error_mark_node)
7682     return const0_rtx;
7683
7684   if (icode == CODE_FOR_altivec_vcfux
7685       || icode == CODE_FOR_altivec_vcfsx
7686       || icode == CODE_FOR_altivec_vctsxs
7687       || icode == CODE_FOR_altivec_vctuxs
7688       || icode == CODE_FOR_altivec_vspltb
7689       || icode == CODE_FOR_altivec_vsplth
7690       || icode == CODE_FOR_altivec_vspltw
7691       || icode == CODE_FOR_spe_evaddiw
7692       || icode == CODE_FOR_spe_evldd
7693       || icode == CODE_FOR_spe_evldh
7694       || icode == CODE_FOR_spe_evldw
7695       || icode == CODE_FOR_spe_evlhhesplat
7696       || icode == CODE_FOR_spe_evlhhossplat
7697       || icode == CODE_FOR_spe_evlhhousplat
7698       || icode == CODE_FOR_spe_evlwhe
7699       || icode == CODE_FOR_spe_evlwhos
7700       || icode == CODE_FOR_spe_evlwhou
7701       || icode == CODE_FOR_spe_evlwhsplat
7702       || icode == CODE_FOR_spe_evlwwsplat
7703       || icode == CODE_FOR_spe_evrlwi
7704       || icode == CODE_FOR_spe_evslwi
7705       || icode == CODE_FOR_spe_evsrwis
7706       || icode == CODE_FOR_spe_evsubifw
7707       || icode == CODE_FOR_spe_evsrwiu)
7708     {
7709       /* Only allow 5-bit unsigned literals.  */
7710       STRIP_NOPS (arg1);
7711       if (TREE_CODE (arg1) != INTEGER_CST
7712           || TREE_INT_CST_LOW (arg1) & ~0x1f)
7713         {
7714           error ("argument 2 must be a 5-bit unsigned literal");
7715           return const0_rtx;
7716         }
7717     }
7718
7719   if (target == 0
7720       || GET_MODE (target) != tmode
7721       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7722     target = gen_reg_rtx (tmode);
7723
7724   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7725     op0 = copy_to_mode_reg (mode0, op0);
7726   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7727     op1 = copy_to_mode_reg (mode1, op1);
7728
7729   pat = GEN_FCN (icode) (target, op0, op1);
7730   if (! pat)
7731     return 0;
7732   emit_insn (pat);
7733
7734   return target;
7735 }
7736
7737 static rtx
7738 altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode,
7739                                   tree exp, rtx target)
7740 {
7741   rtx pat, scratch;
7742   tree cr6_form = CALL_EXPR_ARG (exp, 0);
7743   tree arg0 = CALL_EXPR_ARG (exp, 1);
7744   tree arg1 = CALL_EXPR_ARG (exp, 2);
7745   rtx op0 = expand_normal (arg0);
7746   rtx op1 = expand_normal (arg1);
7747   enum machine_mode tmode = SImode;
7748   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7749   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7750   int cr6_form_int;
7751
7752   if (TREE_CODE (cr6_form) != INTEGER_CST)
7753     {
7754       error ("argument 1 of __builtin_altivec_predicate must be a constant");
7755       return const0_rtx;
7756     }
7757   else
7758     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
7759
7760   gcc_assert (mode0 == mode1);
7761
7762   /* If we have invalid arguments, bail out before generating bad rtl.  */
7763   if (arg0 == error_mark_node || arg1 == error_mark_node)
7764     return const0_rtx;
7765
7766   if (target == 0
7767       || GET_MODE (target) != tmode
7768       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7769     target = gen_reg_rtx (tmode);
7770
7771   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7772     op0 = copy_to_mode_reg (mode0, op0);
7773   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7774     op1 = copy_to_mode_reg (mode1, op1);
7775
7776   scratch = gen_reg_rtx (mode0);
7777
7778   pat = GEN_FCN (icode) (scratch, op0, op1,
7779                          gen_rtx_SYMBOL_REF (Pmode, opcode));
7780   if (! pat)
7781     return 0;
7782   emit_insn (pat);
7783
7784   /* The vec_any* and vec_all* predicates use the same opcodes for two
7785      different operations, but the bits in CR6 will be different
7786      depending on what information we want.  So we have to play tricks
7787      with CR6 to get the right bits out.
7788
7789      If you think this is disgusting, look at the specs for the
7790      AltiVec predicates.  */
7791
7792   switch (cr6_form_int)
7793     {
7794     case 0:
7795       emit_insn (gen_cr6_test_for_zero (target));
7796       break;
7797     case 1:
7798       emit_insn (gen_cr6_test_for_zero_reverse (target));
7799       break;
7800     case 2:
7801       emit_insn (gen_cr6_test_for_lt (target));
7802       break;
7803     case 3:
7804       emit_insn (gen_cr6_test_for_lt_reverse (target));
7805       break;
7806     default:
7807       error ("argument 1 of __builtin_altivec_predicate is out of range");
7808       break;
7809     }
7810
7811   return target;
7812 }
7813
7814 static rtx
7815 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
7816 {
7817   rtx pat, addr;
7818   tree arg0 = CALL_EXPR_ARG (exp, 0);
7819   tree arg1 = CALL_EXPR_ARG (exp, 1);
7820   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7821   enum machine_mode mode0 = Pmode;
7822   enum machine_mode mode1 = Pmode;
7823   rtx op0 = expand_normal (arg0);
7824   rtx op1 = expand_normal (arg1);
7825
7826   if (icode == CODE_FOR_nothing)
7827     /* Builtin not supported on this processor.  */
7828     return 0;
7829
7830   /* If we got invalid arguments bail out before generating bad rtl.  */
7831   if (arg0 == error_mark_node || arg1 == error_mark_node)
7832     return const0_rtx;
7833
7834   if (target == 0
7835       || GET_MODE (target) != tmode
7836       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7837     target = gen_reg_rtx (tmode);
7838
7839   op1 = copy_to_mode_reg (mode1, op1);
7840
7841   if (op0 == const0_rtx)
7842     {
7843       addr = gen_rtx_MEM (tmode, op1);
7844     }
7845   else
7846     {
7847       op0 = copy_to_mode_reg (mode0, op0);
7848       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
7849     }
7850
7851   pat = GEN_FCN (icode) (target, addr);
7852
7853   if (! pat)
7854     return 0;
7855   emit_insn (pat);
7856
7857   return target;
7858 }
7859
7860 static rtx
7861 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
7862 {
7863   rtx pat, addr;
7864   tree arg0 = CALL_EXPR_ARG (exp, 0);
7865   tree arg1 = CALL_EXPR_ARG (exp, 1);
7866   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7867   enum machine_mode mode0 = Pmode;
7868   enum machine_mode mode1 = Pmode;
7869   rtx op0 = expand_normal (arg0);
7870   rtx op1 = expand_normal (arg1);
7871
7872   if (icode == CODE_FOR_nothing)
7873     /* Builtin not supported on this processor.  */
7874     return 0;
7875
7876   /* If we got invalid arguments bail out before generating bad rtl.  */
7877   if (arg0 == error_mark_node || arg1 == error_mark_node)
7878     return const0_rtx;
7879
7880   if (target == 0
7881       || GET_MODE (target) != tmode
7882       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7883     target = gen_reg_rtx (tmode);
7884
7885   op1 = copy_to_mode_reg (mode1, op1);
7886
7887   if (op0 == const0_rtx)
7888     {
7889       addr = gen_rtx_MEM (tmode, op1);
7890     }
7891   else
7892     {
7893       op0 = copy_to_mode_reg (mode0, op0);
7894       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
7895     }
7896
7897   pat = GEN_FCN (icode) (target, addr);
7898
7899   if (! pat)
7900     return 0;
7901   emit_insn (pat);
7902
7903   return target;
7904 }
7905
7906 static rtx
7907 spe_expand_stv_builtin (enum insn_code icode, tree exp)
7908 {
7909   tree arg0 = CALL_EXPR_ARG (exp, 0);
7910   tree arg1 = CALL_EXPR_ARG (exp, 1);
7911   tree arg2 = CALL_EXPR_ARG (exp, 2);
7912   rtx op0 = expand_normal (arg0);
7913   rtx op1 = expand_normal (arg1);
7914   rtx op2 = expand_normal (arg2);
7915   rtx pat;
7916   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
7917   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
7918   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
7919
7920   /* Invalid arguments.  Bail before doing anything stoopid!  */
7921   if (arg0 == error_mark_node
7922       || arg1 == error_mark_node
7923       || arg2 == error_mark_node)
7924     return const0_rtx;
7925
7926   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
7927     op0 = copy_to_mode_reg (mode2, op0);
7928   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
7929     op1 = copy_to_mode_reg (mode0, op1);
7930   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
7931     op2 = copy_to_mode_reg (mode1, op2);
7932
7933   pat = GEN_FCN (icode) (op1, op2, op0);
7934   if (pat)
7935     emit_insn (pat);
7936   return NULL_RTX;
7937 }
7938
7939 static rtx
7940 paired_expand_stv_builtin (enum insn_code icode, tree exp)
7941 {
7942   tree arg0 = CALL_EXPR_ARG (exp, 0);
7943   tree arg1 = CALL_EXPR_ARG (exp, 1);
7944   tree arg2 = CALL_EXPR_ARG (exp, 2);
7945   rtx op0 = expand_normal (arg0);
7946   rtx op1 = expand_normal (arg1);
7947   rtx op2 = expand_normal (arg2);
7948   rtx pat, addr;
7949   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7950   enum machine_mode mode1 = Pmode;
7951   enum machine_mode mode2 = Pmode;
7952
7953   /* Invalid arguments.  Bail before doing anything stoopid!  */
7954   if (arg0 == error_mark_node
7955       || arg1 == error_mark_node
7956       || arg2 == error_mark_node)
7957     return const0_rtx;
7958
7959   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
7960     op0 = copy_to_mode_reg (tmode, op0);
7961
7962   op2 = copy_to_mode_reg (mode2, op2);
7963
7964   if (op1 == const0_rtx)
7965     {
7966       addr = gen_rtx_MEM (tmode, op2);
7967     }
7968   else
7969     {
7970       op1 = copy_to_mode_reg (mode1, op1);
7971       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
7972     }
7973
7974   pat = GEN_FCN (icode) (addr, op0);
7975   if (pat)
7976     emit_insn (pat);
7977   return NULL_RTX;
7978 }
7979
7980 static rtx
7981 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
7982 {
7983   tree arg0 = CALL_EXPR_ARG (exp, 0);
7984   tree arg1 = CALL_EXPR_ARG (exp, 1);
7985   tree arg2 = CALL_EXPR_ARG (exp, 2);
7986   rtx op0 = expand_normal (arg0);
7987   rtx op1 = expand_normal (arg1);
7988   rtx op2 = expand_normal (arg2);
7989   rtx pat, addr;
7990   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7991   enum machine_mode mode1 = Pmode;
7992   enum machine_mode mode2 = Pmode;
7993
7994   /* Invalid arguments.  Bail before doing anything stoopid!  */
7995   if (arg0 == error_mark_node
7996       || arg1 == error_mark_node
7997       || arg2 == error_mark_node)
7998     return const0_rtx;
7999
8000   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
8001     op0 = copy_to_mode_reg (tmode, op0);
8002
8003   op2 = copy_to_mode_reg (mode2, op2);
8004
8005   if (op1 == const0_rtx)
8006     {
8007       addr = gen_rtx_MEM (tmode, op2);
8008     }
8009   else
8010     {
8011       op1 = copy_to_mode_reg (mode1, op1);
8012       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
8013     }
8014
8015   pat = GEN_FCN (icode) (addr, op0);
8016   if (pat)
8017     emit_insn (pat);
8018   return NULL_RTX;
8019 }
8020
8021 static rtx
8022 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
8023 {
8024   rtx pat;
8025   tree arg0 = CALL_EXPR_ARG (exp, 0);
8026   tree arg1 = CALL_EXPR_ARG (exp, 1);
8027   tree arg2 = CALL_EXPR_ARG (exp, 2);
8028   rtx op0 = expand_normal (arg0);
8029   rtx op1 = expand_normal (arg1);
8030   rtx op2 = expand_normal (arg2);
8031   enum machine_mode tmode = insn_data[icode].operand[0].mode;
8032   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
8033   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
8034   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
8035
8036   if (icode == CODE_FOR_nothing)
8037     /* Builtin not supported on this processor.  */
8038     return 0;
8039
8040   /* If we got invalid arguments bail out before generating bad rtl.  */
8041   if (arg0 == error_mark_node
8042       || arg1 == error_mark_node
8043       || arg2 == error_mark_node)
8044     return const0_rtx;
8045
8046   if (icode == CODE_FOR_altivec_vsldoi_v4sf
8047       || icode == CODE_FOR_altivec_vsldoi_v4si
8048       || icode == CODE_FOR_altivec_vsldoi_v8hi
8049       || icode == CODE_FOR_altivec_vsldoi_v16qi)
8050     {
8051       /* Only allow 4-bit unsigned literals.  */
8052       STRIP_NOPS (arg2);
8053       if (TREE_CODE (arg2) != INTEGER_CST
8054           || TREE_INT_CST_LOW (arg2) & ~0xf)
8055         {
8056           error ("argument 3 must be a 4-bit unsigned literal");
8057           return const0_rtx;
8058         }
8059     }
8060
8061   if (target == 0
8062       || GET_MODE (target) != tmode
8063       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8064     target = gen_reg_rtx (tmode);
8065
8066   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8067     op0 = copy_to_mode_reg (mode0, op0);
8068   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
8069     op1 = copy_to_mode_reg (mode1, op1);
8070   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
8071     op2 = copy_to_mode_reg (mode2, op2);
8072
8073   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
8074     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
8075   else 
8076     pat = GEN_FCN (icode) (target, op0, op1, op2);
8077   if (! pat)
8078     return 0;
8079   emit_insn (pat);
8080
8081   return target;
8082 }
8083
8084 /* Expand the lvx builtins.  */
8085 static rtx
8086 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
8087 {
8088   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8089   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8090   tree arg0;
8091   enum machine_mode tmode, mode0;
8092   rtx pat, op0;
8093   enum insn_code icode;
8094
8095   switch (fcode)
8096     {
8097     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
8098       icode = CODE_FOR_altivec_lvx_v16qi;
8099       break;
8100     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
8101       icode = CODE_FOR_altivec_lvx_v8hi;
8102       break;
8103     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
8104       icode = CODE_FOR_altivec_lvx_v4si;
8105       break;
8106     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
8107       icode = CODE_FOR_altivec_lvx_v4sf;
8108       break;
8109     default:
8110       *expandedp = false;
8111       return NULL_RTX;
8112     }
8113
8114   *expandedp = true;
8115
8116   arg0 = CALL_EXPR_ARG (exp, 0);
8117   op0 = expand_normal (arg0);
8118   tmode = insn_data[icode].operand[0].mode;
8119   mode0 = insn_data[icode].operand[1].mode;
8120
8121   if (target == 0
8122       || GET_MODE (target) != tmode
8123       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8124     target = gen_reg_rtx (tmode);
8125
8126   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8127     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
8128
8129   pat = GEN_FCN (icode) (target, op0);
8130   if (! pat)
8131     return 0;
8132   emit_insn (pat);
8133   return target;
8134 }
8135
8136 /* Expand the stvx builtins.  */
8137 static rtx
8138 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
8139                            bool *expandedp)
8140 {
8141   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8142   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8143   tree arg0, arg1;
8144   enum machine_mode mode0, mode1;
8145   rtx pat, op0, op1;
8146   enum insn_code icode;
8147
8148   switch (fcode)
8149     {
8150     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
8151       icode = CODE_FOR_altivec_stvx_v16qi;
8152       break;
8153     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
8154       icode = CODE_FOR_altivec_stvx_v8hi;
8155       break;
8156     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
8157       icode = CODE_FOR_altivec_stvx_v4si;
8158       break;
8159     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
8160       icode = CODE_FOR_altivec_stvx_v4sf;
8161       break;
8162     default:
8163       *expandedp = false;
8164       return NULL_RTX;
8165     }
8166
8167   arg0 = CALL_EXPR_ARG (exp, 0);
8168   arg1 = CALL_EXPR_ARG (exp, 1);
8169   op0 = expand_normal (arg0);
8170   op1 = expand_normal (arg1);
8171   mode0 = insn_data[icode].operand[0].mode;
8172   mode1 = insn_data[icode].operand[1].mode;
8173
8174   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8175     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
8176   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
8177     op1 = copy_to_mode_reg (mode1, op1);
8178
8179   pat = GEN_FCN (icode) (op0, op1);
8180   if (pat)
8181     emit_insn (pat);
8182
8183   *expandedp = true;
8184   return NULL_RTX;
8185 }
8186
8187 /* Expand the dst builtins.  */
8188 static rtx
8189 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
8190                             bool *expandedp)
8191 {
8192   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8193   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8194   tree arg0, arg1, arg2;
8195   enum machine_mode mode0, mode1, mode2;
8196   rtx pat, op0, op1, op2;
8197   const struct builtin_description *d;
8198   size_t i;
8199
8200   *expandedp = false;
8201
8202   /* Handle DST variants.  */
8203   d = bdesc_dst;
8204   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
8205     if (d->code == fcode)
8206       {
8207         arg0 = CALL_EXPR_ARG (exp, 0);
8208         arg1 = CALL_EXPR_ARG (exp, 1);
8209         arg2 = CALL_EXPR_ARG (exp, 2);
8210         op0 = expand_normal (arg0);
8211         op1 = expand_normal (arg1);
8212         op2 = expand_normal (arg2);
8213         mode0 = insn_data[d->icode].operand[0].mode;
8214         mode1 = insn_data[d->icode].operand[1].mode;
8215         mode2 = insn_data[d->icode].operand[2].mode;
8216
8217         /* Invalid arguments, bail out before generating bad rtl.  */
8218         if (arg0 == error_mark_node
8219             || arg1 == error_mark_node
8220             || arg2 == error_mark_node)
8221           return const0_rtx;
8222
8223         *expandedp = true;
8224         STRIP_NOPS (arg2);
8225         if (TREE_CODE (arg2) != INTEGER_CST
8226             || TREE_INT_CST_LOW (arg2) & ~0x3)
8227           {
8228             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
8229             return const0_rtx;
8230           }
8231
8232         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
8233           op0 = copy_to_mode_reg (Pmode, op0);
8234         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
8235           op1 = copy_to_mode_reg (mode1, op1);
8236
8237         pat = GEN_FCN (d->icode) (op0, op1, op2);
8238         if (pat != 0)
8239           emit_insn (pat);
8240
8241         return NULL_RTX;
8242       }
8243
8244   return NULL_RTX;
8245 }
8246
8247 /* Expand vec_init builtin.  */
8248 static rtx
8249 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
8250 {
8251   enum machine_mode tmode = TYPE_MODE (type);
8252   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
8253   int i, n_elt = GET_MODE_NUNITS (tmode);
8254   rtvec v = rtvec_alloc (n_elt);
8255
8256   gcc_assert (VECTOR_MODE_P (tmode));
8257   gcc_assert (n_elt == call_expr_nargs (exp));
8258
8259   for (i = 0; i < n_elt; ++i)
8260     {
8261       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
8262       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
8263     }
8264
8265   if (!target || !register_operand (target, tmode))
8266     target = gen_reg_rtx (tmode);
8267
8268   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
8269   return target;
8270 }
8271
8272 /* Return the integer constant in ARG.  Constrain it to be in the range
8273    of the subparts of VEC_TYPE; issue an error if not.  */
8274
8275 static int
8276 get_element_number (tree vec_type, tree arg)
8277 {
8278   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
8279
8280   if (!host_integerp (arg, 1)
8281       || (elt = tree_low_cst (arg, 1), elt > max))
8282     {
8283       error ("selector must be an integer constant in the range 0..%wi", max);
8284       return 0;
8285     }
8286
8287   return elt;
8288 }
8289
8290 /* Expand vec_set builtin.  */
8291 static rtx
8292 altivec_expand_vec_set_builtin (tree exp)
8293 {
8294   enum machine_mode tmode, mode1;
8295   tree arg0, arg1, arg2;
8296   int elt;
8297   rtx op0, op1;
8298
8299   arg0 = CALL_EXPR_ARG (exp, 0);
8300   arg1 = CALL_EXPR_ARG (exp, 1);
8301   arg2 = CALL_EXPR_ARG (exp, 2);
8302
8303   tmode = TYPE_MODE (TREE_TYPE (arg0));
8304   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
8305   gcc_assert (VECTOR_MODE_P (tmode));
8306
8307   op0 = expand_expr (arg0, NULL_RTX, tmode, 0);
8308   op1 = expand_expr (arg1, NULL_RTX, mode1, 0);
8309   elt = get_element_number (TREE_TYPE (arg0), arg2);
8310
8311   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
8312     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
8313
8314   op0 = force_reg (tmode, op0);
8315   op1 = force_reg (mode1, op1);
8316
8317   rs6000_expand_vector_set (op0, op1, elt);
8318
8319   return op0;
8320 }
8321
8322 /* Expand vec_ext builtin.  */
8323 static rtx
8324 altivec_expand_vec_ext_builtin (tree exp, rtx target)
8325 {
8326   enum machine_mode tmode, mode0;
8327   tree arg0, arg1;
8328   int elt;
8329   rtx op0;
8330
8331   arg0 = CALL_EXPR_ARG (exp, 0);
8332   arg1 = CALL_EXPR_ARG (exp, 1);
8333
8334   op0 = expand_normal (arg0);
8335   elt = get_element_number (TREE_TYPE (arg0), arg1);
8336
8337   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
8338   mode0 = TYPE_MODE (TREE_TYPE (arg0));
8339   gcc_assert (VECTOR_MODE_P (mode0));
8340
8341   op0 = force_reg (mode0, op0);
8342
8343   if (optimize || !target || !register_operand (target, tmode))
8344     target = gen_reg_rtx (tmode);
8345
8346   rs6000_expand_vector_extract (target, op0, elt);
8347
8348   return target;
8349 }
8350
8351 /* Expand the builtin in EXP and store the result in TARGET.  Store
8352    true in *EXPANDEDP if we found a builtin to expand.  */
8353 static rtx
8354 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
8355 {
8356   const struct builtin_description *d;
8357   const struct builtin_description_predicates *dp;
8358   size_t i;
8359   enum insn_code icode;
8360   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8361   tree arg0;
8362   rtx op0, pat;
8363   enum machine_mode tmode, mode0;
8364   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8365
8366   if (fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8367       && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
8368     {
8369       *expandedp = true;
8370       error ("unresolved overload for Altivec builtin %qF", fndecl);
8371       return const0_rtx;
8372     }
8373
8374   target = altivec_expand_ld_builtin (exp, target, expandedp);
8375   if (*expandedp)
8376     return target;
8377
8378   target = altivec_expand_st_builtin (exp, target, expandedp);
8379   if (*expandedp)
8380     return target;
8381
8382   target = altivec_expand_dst_builtin (exp, target, expandedp);
8383   if (*expandedp)
8384     return target;
8385
8386   *expandedp = true;
8387
8388   switch (fcode)
8389     {
8390     case ALTIVEC_BUILTIN_STVX:
8391       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, exp);
8392     case ALTIVEC_BUILTIN_STVEBX:
8393       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
8394     case ALTIVEC_BUILTIN_STVEHX:
8395       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
8396     case ALTIVEC_BUILTIN_STVEWX:
8397       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
8398     case ALTIVEC_BUILTIN_STVXL:
8399       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
8400
8401     case ALTIVEC_BUILTIN_MFVSCR:
8402       icode = CODE_FOR_altivec_mfvscr;
8403       tmode = insn_data[icode].operand[0].mode;
8404
8405       if (target == 0
8406           || GET_MODE (target) != tmode
8407           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8408         target = gen_reg_rtx (tmode);
8409
8410       pat = GEN_FCN (icode) (target);
8411       if (! pat)
8412         return 0;
8413       emit_insn (pat);
8414       return target;
8415
8416     case ALTIVEC_BUILTIN_MTVSCR:
8417       icode = CODE_FOR_altivec_mtvscr;
8418       arg0 = CALL_EXPR_ARG (exp, 0);
8419       op0 = expand_normal (arg0);
8420       mode0 = insn_data[icode].operand[0].mode;
8421
8422       /* If we got invalid arguments bail out before generating bad rtl.  */
8423       if (arg0 == error_mark_node)
8424         return const0_rtx;
8425
8426       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8427         op0 = copy_to_mode_reg (mode0, op0);
8428
8429       pat = GEN_FCN (icode) (op0);
8430       if (pat)
8431         emit_insn (pat);
8432       return NULL_RTX;
8433
8434     case ALTIVEC_BUILTIN_DSSALL:
8435       emit_insn (gen_altivec_dssall ());
8436       return NULL_RTX;
8437
8438     case ALTIVEC_BUILTIN_DSS:
8439       icode = CODE_FOR_altivec_dss;
8440       arg0 = CALL_EXPR_ARG (exp, 0);
8441       STRIP_NOPS (arg0);
8442       op0 = expand_normal (arg0);
8443       mode0 = insn_data[icode].operand[0].mode;
8444
8445       /* If we got invalid arguments bail out before generating bad rtl.  */
8446       if (arg0 == error_mark_node)
8447         return const0_rtx;
8448
8449       if (TREE_CODE (arg0) != INTEGER_CST
8450           || TREE_INT_CST_LOW (arg0) & ~0x3)
8451         {
8452           error ("argument to dss must be a 2-bit unsigned literal");
8453           return const0_rtx;
8454         }
8455
8456       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8457         op0 = copy_to_mode_reg (mode0, op0);
8458
8459       emit_insn (gen_altivec_dss (op0));
8460       return NULL_RTX;
8461
8462     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
8463     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
8464     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
8465     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
8466       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
8467
8468     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
8469     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
8470     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
8471     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
8472       return altivec_expand_vec_set_builtin (exp);
8473
8474     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
8475     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
8476     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
8477     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
8478       return altivec_expand_vec_ext_builtin (exp, target);
8479
8480     default:
8481       break;
8482       /* Fall through.  */
8483     }
8484
8485   /* Expand abs* operations.  */
8486   d = bdesc_abs;
8487   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
8488     if (d->code == fcode)
8489       return altivec_expand_abs_builtin (d->icode, exp, target);
8490
8491   /* Expand the AltiVec predicates.  */
8492   dp = bdesc_altivec_preds;
8493   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
8494     if (dp->code == fcode)
8495       return altivec_expand_predicate_builtin (dp->icode, dp->opcode,
8496                                                exp, target);
8497
8498   /* LV* are funky.  We initialized them differently.  */
8499   switch (fcode)
8500     {
8501     case ALTIVEC_BUILTIN_LVSL:
8502       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
8503                                         exp, target);
8504     case ALTIVEC_BUILTIN_LVSR:
8505       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
8506                                         exp, target);
8507     case ALTIVEC_BUILTIN_LVEBX:
8508       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
8509                                         exp, target);
8510     case ALTIVEC_BUILTIN_LVEHX:
8511       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
8512                                         exp, target);
8513     case ALTIVEC_BUILTIN_LVEWX:
8514       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
8515                                         exp, target);
8516     case ALTIVEC_BUILTIN_LVXL:
8517       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
8518                                         exp, target);
8519     case ALTIVEC_BUILTIN_LVX:
8520       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
8521                                         exp, target);
8522     default:
8523       break;
8524       /* Fall through.  */
8525     }
8526
8527   *expandedp = false;
8528   return NULL_RTX;
8529 }
8530
8531 /* Expand the builtin in EXP and store the result in TARGET.  Store
8532    true in *EXPANDEDP if we found a builtin to expand.  */
8533 static rtx
8534 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
8535 {
8536   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8537   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8538   const struct builtin_description *d;
8539   size_t i;
8540
8541   *expandedp = true;
8542
8543   switch (fcode)
8544     {
8545     case PAIRED_BUILTIN_STX:
8546       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
8547     case PAIRED_BUILTIN_LX:
8548       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
8549     default:
8550       break;
8551       /* Fall through.  */
8552     }
8553
8554   /* Expand the paired predicates.  */
8555   d = bdesc_paired_preds;
8556   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
8557     if (d->code == fcode)
8558       return paired_expand_predicate_builtin (d->icode, exp, target);
8559
8560   *expandedp = false;
8561   return NULL_RTX;
8562 }
8563
8564 /* Binops that need to be initialized manually, but can be expanded
8565    automagically by rs6000_expand_binop_builtin.  */
8566 static struct builtin_description bdesc_2arg_spe[] =
8567 {
8568   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
8569   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
8570   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
8571   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
8572   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
8573   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
8574   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
8575   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
8576   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
8577   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
8578   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
8579   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
8580   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
8581   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
8582   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
8583   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
8584   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
8585   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
8586   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
8587   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
8588   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
8589   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
8590 };
8591
8592 /* Expand the builtin in EXP and store the result in TARGET.  Store
8593    true in *EXPANDEDP if we found a builtin to expand.
8594
8595    This expands the SPE builtins that are not simple unary and binary
8596    operations.  */
8597 static rtx
8598 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
8599 {
8600   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8601   tree arg1, arg0;
8602   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8603   enum insn_code icode;
8604   enum machine_mode tmode, mode0;
8605   rtx pat, op0;
8606   struct builtin_description *d;
8607   size_t i;
8608
8609   *expandedp = true;
8610
8611   /* Syntax check for a 5-bit unsigned immediate.  */
8612   switch (fcode)
8613     {
8614     case SPE_BUILTIN_EVSTDD:
8615     case SPE_BUILTIN_EVSTDH:
8616     case SPE_BUILTIN_EVSTDW:
8617     case SPE_BUILTIN_EVSTWHE:
8618     case SPE_BUILTIN_EVSTWHO:
8619     case SPE_BUILTIN_EVSTWWE:
8620     case SPE_BUILTIN_EVSTWWO:
8621       arg1 = CALL_EXPR_ARG (exp, 2);
8622       if (TREE_CODE (arg1) != INTEGER_CST
8623           || TREE_INT_CST_LOW (arg1) & ~0x1f)
8624         {
8625           error ("argument 2 must be a 5-bit unsigned literal");
8626           return const0_rtx;
8627         }
8628       break;
8629     default:
8630       break;
8631     }
8632
8633   /* The evsplat*i instructions are not quite generic.  */
8634   switch (fcode)
8635     {
8636     case SPE_BUILTIN_EVSPLATFI:
8637       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
8638                                          exp, target);
8639     case SPE_BUILTIN_EVSPLATI:
8640       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
8641                                          exp, target);
8642     default:
8643       break;
8644     }
8645
8646   d = (struct builtin_description *) bdesc_2arg_spe;
8647   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
8648     if (d->code == fcode)
8649       return rs6000_expand_binop_builtin (d->icode, exp, target);
8650
8651   d = (struct builtin_description *) bdesc_spe_predicates;
8652   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
8653     if (d->code == fcode)
8654       return spe_expand_predicate_builtin (d->icode, exp, target);
8655
8656   d = (struct builtin_description *) bdesc_spe_evsel;
8657   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
8658     if (d->code == fcode)
8659       return spe_expand_evsel_builtin (d->icode, exp, target);
8660
8661   switch (fcode)
8662     {
8663     case SPE_BUILTIN_EVSTDDX:
8664       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
8665     case SPE_BUILTIN_EVSTDHX:
8666       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
8667     case SPE_BUILTIN_EVSTDWX:
8668       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
8669     case SPE_BUILTIN_EVSTWHEX:
8670       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
8671     case SPE_BUILTIN_EVSTWHOX:
8672       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
8673     case SPE_BUILTIN_EVSTWWEX:
8674       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
8675     case SPE_BUILTIN_EVSTWWOX:
8676       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
8677     case SPE_BUILTIN_EVSTDD:
8678       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
8679     case SPE_BUILTIN_EVSTDH:
8680       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
8681     case SPE_BUILTIN_EVSTDW:
8682       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
8683     case SPE_BUILTIN_EVSTWHE:
8684       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
8685     case SPE_BUILTIN_EVSTWHO:
8686       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
8687     case SPE_BUILTIN_EVSTWWE:
8688       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
8689     case SPE_BUILTIN_EVSTWWO:
8690       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
8691     case SPE_BUILTIN_MFSPEFSCR:
8692       icode = CODE_FOR_spe_mfspefscr;
8693       tmode = insn_data[icode].operand[0].mode;
8694
8695       if (target == 0
8696           || GET_MODE (target) != tmode
8697           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8698         target = gen_reg_rtx (tmode);
8699
8700       pat = GEN_FCN (icode) (target);
8701       if (! pat)
8702         return 0;
8703       emit_insn (pat);
8704       return target;
8705     case SPE_BUILTIN_MTSPEFSCR:
8706       icode = CODE_FOR_spe_mtspefscr;
8707       arg0 = CALL_EXPR_ARG (exp, 0);
8708       op0 = expand_normal (arg0);
8709       mode0 = insn_data[icode].operand[0].mode;
8710
8711       if (arg0 == error_mark_node)
8712         return const0_rtx;
8713
8714       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8715         op0 = copy_to_mode_reg (mode0, op0);
8716
8717       pat = GEN_FCN (icode) (op0);
8718       if (pat)
8719         emit_insn (pat);
8720       return NULL_RTX;
8721     default:
8722       break;
8723     }
8724
8725   *expandedp = false;
8726   return NULL_RTX;
8727 }
8728
8729 static rtx
8730 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
8731 {
8732   rtx pat, scratch, tmp;
8733   tree form = CALL_EXPR_ARG (exp, 0);
8734   tree arg0 = CALL_EXPR_ARG (exp, 1);
8735   tree arg1 = CALL_EXPR_ARG (exp, 2);
8736   rtx op0 = expand_normal (arg0);
8737   rtx op1 = expand_normal (arg1);
8738   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
8739   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
8740   int form_int;
8741   enum rtx_code code;
8742
8743   if (TREE_CODE (form) != INTEGER_CST)
8744     {
8745       error ("argument 1 of __builtin_paired_predicate must be a constant");
8746       return const0_rtx;
8747     }
8748   else
8749     form_int = TREE_INT_CST_LOW (form);
8750
8751   gcc_assert (mode0 == mode1);
8752
8753   if (arg0 == error_mark_node || arg1 == error_mark_node)
8754     return const0_rtx;
8755
8756   if (target == 0
8757       || GET_MODE (target) != SImode
8758       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
8759     target = gen_reg_rtx (SImode);
8760   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
8761     op0 = copy_to_mode_reg (mode0, op0);
8762   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
8763     op1 = copy_to_mode_reg (mode1, op1);
8764
8765   scratch = gen_reg_rtx (CCFPmode);
8766
8767   pat = GEN_FCN (icode) (scratch, op0, op1);
8768   if (!pat)
8769     return const0_rtx;
8770
8771   emit_insn (pat);
8772
8773   switch (form_int)
8774     {
8775       /* LT bit.  */
8776     case 0:
8777       code = LT;
8778       break;
8779       /* GT bit.  */
8780     case 1:
8781       code = GT;
8782       break;
8783       /* EQ bit.  */
8784     case 2:
8785       code = EQ;
8786       break;
8787       /* UN bit.  */
8788     case 3:
8789       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
8790       return target;
8791     default:
8792       error ("argument 1 of __builtin_paired_predicate is out of range");
8793       return const0_rtx;
8794     }
8795
8796   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
8797   emit_move_insn (target, tmp);
8798   return target;
8799 }
8800
8801 static rtx
8802 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
8803 {
8804   rtx pat, scratch, tmp;
8805   tree form = CALL_EXPR_ARG (exp, 0);
8806   tree arg0 = CALL_EXPR_ARG (exp, 1);
8807   tree arg1 = CALL_EXPR_ARG (exp, 2);
8808   rtx op0 = expand_normal (arg0);
8809   rtx op1 = expand_normal (arg1);
8810   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
8811   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
8812   int form_int;
8813   enum rtx_code code;
8814
8815   if (TREE_CODE (form) != INTEGER_CST)
8816     {
8817       error ("argument 1 of __builtin_spe_predicate must be a constant");
8818       return const0_rtx;
8819     }
8820   else
8821     form_int = TREE_INT_CST_LOW (form);
8822
8823   gcc_assert (mode0 == mode1);
8824
8825   if (arg0 == error_mark_node || arg1 == error_mark_node)
8826     return const0_rtx;
8827
8828   if (target == 0
8829       || GET_MODE (target) != SImode
8830       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
8831     target = gen_reg_rtx (SImode);
8832
8833   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8834     op0 = copy_to_mode_reg (mode0, op0);
8835   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
8836     op1 = copy_to_mode_reg (mode1, op1);
8837
8838   scratch = gen_reg_rtx (CCmode);
8839
8840   pat = GEN_FCN (icode) (scratch, op0, op1);
8841   if (! pat)
8842     return const0_rtx;
8843   emit_insn (pat);
8844
8845   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
8846      _lower_.  We use one compare, but look in different bits of the
8847      CR for each variant.
8848
8849      There are 2 elements in each SPE simd type (upper/lower).  The CR
8850      bits are set as follows:
8851
8852      BIT0  | BIT 1  | BIT 2   | BIT 3
8853      U     |   L    | (U | L) | (U & L)
8854
8855      So, for an "all" relationship, BIT 3 would be set.
8856      For an "any" relationship, BIT 2 would be set.  Etc.
8857
8858      Following traditional nomenclature, these bits map to:
8859
8860      BIT0  | BIT 1  | BIT 2   | BIT 3
8861      LT    | GT     | EQ      | OV
8862
8863      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
8864   */
8865
8866   switch (form_int)
8867     {
8868       /* All variant.  OV bit.  */
8869     case 0:
8870       /* We need to get to the OV bit, which is the ORDERED bit.  We
8871          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
8872          that's ugly and will make validate_condition_mode die.
8873          So let's just use another pattern.  */
8874       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
8875       return target;
8876       /* Any variant.  EQ bit.  */
8877     case 1:
8878       code = EQ;
8879       break;
8880       /* Upper variant.  LT bit.  */
8881     case 2:
8882       code = LT;
8883       break;
8884       /* Lower variant.  GT bit.  */
8885     case 3:
8886       code = GT;
8887       break;
8888     default:
8889       error ("argument 1 of __builtin_spe_predicate is out of range");
8890       return const0_rtx;
8891     }
8892
8893   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
8894   emit_move_insn (target, tmp);
8895
8896   return target;
8897 }
8898
8899 /* The evsel builtins look like this:
8900
8901      e = __builtin_spe_evsel_OP (a, b, c, d);
8902
8903    and work like this:
8904
8905      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
8906      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
8907 */
8908
8909 static rtx
8910 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
8911 {
8912   rtx pat, scratch;
8913   tree arg0 = CALL_EXPR_ARG (exp, 0);
8914   tree arg1 = CALL_EXPR_ARG (exp, 1);
8915   tree arg2 = CALL_EXPR_ARG (exp, 2);
8916   tree arg3 = CALL_EXPR_ARG (exp, 3);
8917   rtx op0 = expand_normal (arg0);
8918   rtx op1 = expand_normal (arg1);
8919   rtx op2 = expand_normal (arg2);
8920   rtx op3 = expand_normal (arg3);
8921   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
8922   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
8923
8924   gcc_assert (mode0 == mode1);
8925
8926   if (arg0 == error_mark_node || arg1 == error_mark_node
8927       || arg2 == error_mark_node || arg3 == error_mark_node)
8928     return const0_rtx;
8929
8930   if (target == 0
8931       || GET_MODE (target) != mode0
8932       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
8933     target = gen_reg_rtx (mode0);
8934
8935   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8936     op0 = copy_to_mode_reg (mode0, op0);
8937   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
8938     op1 = copy_to_mode_reg (mode0, op1);
8939   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
8940     op2 = copy_to_mode_reg (mode0, op2);
8941   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
8942     op3 = copy_to_mode_reg (mode0, op3);
8943
8944   /* Generate the compare.  */
8945   scratch = gen_reg_rtx (CCmode);
8946   pat = GEN_FCN (icode) (scratch, op0, op1);
8947   if (! pat)
8948     return const0_rtx;
8949   emit_insn (pat);
8950
8951   if (mode0 == V2SImode)
8952     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
8953   else
8954     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
8955
8956   return target;
8957 }
8958
8959 /* Expand an expression EXP that calls a built-in function,
8960    with result going to TARGET if that's convenient
8961    (and in mode MODE if that's convenient).
8962    SUBTARGET may be used as the target for computing one of EXP's operands.
8963    IGNORE is nonzero if the value is to be ignored.  */
8964
8965 static rtx
8966 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
8967                        enum machine_mode mode ATTRIBUTE_UNUSED,
8968                        int ignore ATTRIBUTE_UNUSED)
8969 {
8970   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8971   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8972   const struct builtin_description *d;
8973   size_t i;
8974   rtx ret;
8975   bool success;
8976
8977   if (fcode == RS6000_BUILTIN_RECIP)
8978       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);    
8979
8980   if (fcode == RS6000_BUILTIN_RECIPF)
8981       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);    
8982
8983   if (fcode == RS6000_BUILTIN_RSQRTF)
8984       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);    
8985
8986   if (fcode == ALTIVEC_BUILTIN_MASK_FOR_LOAD
8987       || fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
8988     {
8989       int icode = (int) CODE_FOR_altivec_lvsr;
8990       enum machine_mode tmode = insn_data[icode].operand[0].mode;
8991       enum machine_mode mode = insn_data[icode].operand[1].mode;
8992       tree arg;
8993       rtx op, addr, pat;
8994
8995       gcc_assert (TARGET_ALTIVEC);
8996
8997       arg = CALL_EXPR_ARG (exp, 0);
8998       gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE);
8999       op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
9000       addr = memory_address (mode, op);
9001       if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
9002         op = addr;
9003       else
9004         {
9005           /* For the load case need to negate the address.  */
9006           op = gen_reg_rtx (GET_MODE (addr));
9007           emit_insn (gen_rtx_SET (VOIDmode, op,
9008                          gen_rtx_NEG (GET_MODE (addr), addr)));
9009         }
9010       op = gen_rtx_MEM (mode, op);
9011
9012       if (target == 0
9013           || GET_MODE (target) != tmode
9014           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
9015         target = gen_reg_rtx (tmode);
9016
9017       /*pat = gen_altivec_lvsr (target, op);*/
9018       pat = GEN_FCN (icode) (target, op);
9019       if (!pat)
9020         return 0;
9021       emit_insn (pat);
9022
9023       return target;
9024     }
9025
9026   /* FIXME: There's got to be a nicer way to handle this case than
9027      constructing a new CALL_EXPR.  */
9028   if (fcode == ALTIVEC_BUILTIN_VCFUX
9029       || fcode == ALTIVEC_BUILTIN_VCFSX)
9030     {
9031       if (call_expr_nargs (exp) == 1)
9032         exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
9033                                2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
9034     }
9035
9036   if (TARGET_ALTIVEC)
9037     {
9038       ret = altivec_expand_builtin (exp, target, &success);
9039
9040       if (success)
9041         return ret;
9042     }
9043   if (TARGET_SPE)
9044     {
9045       ret = spe_expand_builtin (exp, target, &success);
9046
9047       if (success)
9048         return ret;
9049     }
9050   if (TARGET_PAIRED_FLOAT)
9051     {
9052       ret = paired_expand_builtin (exp, target, &success);
9053
9054       if (success)
9055         return ret;
9056     }  
9057
9058   gcc_assert (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT);
9059
9060   /* Handle simple unary operations.  */
9061   d = (struct builtin_description *) bdesc_1arg;
9062   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
9063     if (d->code == fcode)
9064       return rs6000_expand_unop_builtin (d->icode, exp, target);
9065
9066   /* Handle simple binary operations.  */
9067   d = (struct builtin_description *) bdesc_2arg;
9068   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
9069     if (d->code == fcode)
9070       return rs6000_expand_binop_builtin (d->icode, exp, target);
9071
9072   /* Handle simple ternary operations.  */
9073   d = bdesc_3arg;
9074   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
9075     if (d->code == fcode)
9076       return rs6000_expand_ternop_builtin (d->icode, exp, target);
9077
9078   gcc_unreachable ();
9079 }
9080
9081 static tree
9082 build_opaque_vector_type (tree node, int nunits)
9083 {
9084   node = copy_node (node);
9085   TYPE_MAIN_VARIANT (node) = node;
9086   return build_vector_type (node, nunits);
9087 }
9088
9089 static void
9090 rs6000_init_builtins (void)
9091 {
9092   V2SI_type_node = build_vector_type (intSI_type_node, 2);
9093   V2SF_type_node = build_vector_type (float_type_node, 2);
9094   V4HI_type_node = build_vector_type (intHI_type_node, 4);
9095   V4SI_type_node = build_vector_type (intSI_type_node, 4);
9096   V4SF_type_node = build_vector_type (float_type_node, 4);
9097   V8HI_type_node = build_vector_type (intHI_type_node, 8);
9098   V16QI_type_node = build_vector_type (intQI_type_node, 16);
9099
9100   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
9101   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
9102   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
9103
9104   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
9105   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
9106   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
9107   opaque_V4SI_type_node = copy_node (V4SI_type_node);
9108
9109   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
9110      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
9111      'vector unsigned short'.  */
9112
9113   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
9114   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
9115   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
9116   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
9117
9118   long_integer_type_internal_node = long_integer_type_node;
9119   long_unsigned_type_internal_node = long_unsigned_type_node;
9120   intQI_type_internal_node = intQI_type_node;
9121   uintQI_type_internal_node = unsigned_intQI_type_node;
9122   intHI_type_internal_node = intHI_type_node;
9123   uintHI_type_internal_node = unsigned_intHI_type_node;
9124   intSI_type_internal_node = intSI_type_node;
9125   uintSI_type_internal_node = unsigned_intSI_type_node;
9126   float_type_internal_node = float_type_node;
9127   void_type_internal_node = void_type_node;
9128
9129   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9130                                             get_identifier ("__bool char"),
9131                                             bool_char_type_node));
9132   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9133                                             get_identifier ("__bool short"),
9134                                             bool_short_type_node));
9135   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9136                                             get_identifier ("__bool int"),
9137                                             bool_int_type_node));
9138   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9139                                             get_identifier ("__pixel"),
9140                                             pixel_type_node));
9141
9142   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
9143   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
9144   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
9145   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
9146
9147   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9148                                             get_identifier ("__vector unsigned char"),
9149                                             unsigned_V16QI_type_node));
9150   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9151                                             get_identifier ("__vector signed char"),
9152                                             V16QI_type_node));
9153   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9154                                             get_identifier ("__vector __bool char"),
9155                                             bool_V16QI_type_node));
9156
9157   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9158                                             get_identifier ("__vector unsigned short"),
9159                                             unsigned_V8HI_type_node));
9160   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9161                                             get_identifier ("__vector signed short"),
9162                                             V8HI_type_node));
9163   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9164                                             get_identifier ("__vector __bool short"),
9165                                             bool_V8HI_type_node));
9166
9167   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9168                                             get_identifier ("__vector unsigned int"),
9169                                             unsigned_V4SI_type_node));
9170   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9171                                             get_identifier ("__vector signed int"),
9172                                             V4SI_type_node));
9173   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9174                                             get_identifier ("__vector __bool int"),
9175                                             bool_V4SI_type_node));
9176
9177   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9178                                             get_identifier ("__vector float"),
9179                                             V4SF_type_node));
9180   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
9181                                             get_identifier ("__vector __pixel"),
9182                                             pixel_V8HI_type_node));
9183
9184   if (TARGET_PAIRED_FLOAT)
9185     paired_init_builtins ();
9186   if (TARGET_SPE)
9187     spe_init_builtins ();
9188   if (TARGET_ALTIVEC)
9189     altivec_init_builtins ();
9190   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT)
9191     rs6000_common_init_builtins ();
9192   if (TARGET_PPC_GFXOPT)
9193     {
9194       tree ftype = build_function_type_list (float_type_node,
9195                                              float_type_node,
9196                                              float_type_node,
9197                                              NULL_TREE);
9198       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
9199                    RS6000_BUILTIN_RECIPF);
9200
9201       ftype = build_function_type_list (float_type_node,
9202                                         float_type_node,
9203                                         NULL_TREE);
9204       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
9205                    RS6000_BUILTIN_RSQRTF);
9206     }
9207   if (TARGET_POPCNTB)
9208     {
9209       tree ftype = build_function_type_list (double_type_node,
9210                                              double_type_node,
9211                                              double_type_node,
9212                                              NULL_TREE);
9213       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
9214                    RS6000_BUILTIN_RECIP);
9215
9216     }
9217
9218 #if TARGET_XCOFF
9219   /* AIX libm provides clog as __clog.  */
9220   if (built_in_decls [BUILT_IN_CLOG])
9221     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
9222 #endif
9223
9224 #ifdef SUBTARGET_INIT_BUILTINS
9225   SUBTARGET_INIT_BUILTINS;
9226 #endif
9227 }
9228
9229 /* Search through a set of builtins and enable the mask bits.
9230    DESC is an array of builtins.
9231    SIZE is the total number of builtins.
9232    START is the builtin enum at which to start.
9233    END is the builtin enum at which to end.  */
9234 static void
9235 enable_mask_for_builtins (struct builtin_description *desc, int size,
9236                           enum rs6000_builtins start,
9237                           enum rs6000_builtins end)
9238 {
9239   int i;
9240
9241   for (i = 0; i < size; ++i)
9242     if (desc[i].code == start)
9243       break;
9244
9245   if (i == size)
9246     return;
9247
9248   for (; i < size; ++i)
9249     {
9250       /* Flip all the bits on.  */
9251       desc[i].mask = target_flags;
9252       if (desc[i].code == end)
9253         break;
9254     }
9255 }
9256
9257 static void
9258 spe_init_builtins (void)
9259 {
9260   tree endlink = void_list_node;
9261   tree puint_type_node = build_pointer_type (unsigned_type_node);
9262   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
9263   struct builtin_description *d;
9264   size_t i;
9265
9266   tree v2si_ftype_4_v2si
9267     = build_function_type
9268     (opaque_V2SI_type_node,
9269      tree_cons (NULL_TREE, opaque_V2SI_type_node,
9270                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
9271                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9272                                       tree_cons (NULL_TREE, opaque_V2SI_type_node,
9273                                                  endlink)))));
9274
9275   tree v2sf_ftype_4_v2sf
9276     = build_function_type
9277     (opaque_V2SF_type_node,
9278      tree_cons (NULL_TREE, opaque_V2SF_type_node,
9279                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
9280                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
9281                                       tree_cons (NULL_TREE, opaque_V2SF_type_node,
9282                                                  endlink)))));
9283
9284   tree int_ftype_int_v2si_v2si
9285     = build_function_type
9286     (integer_type_node,
9287      tree_cons (NULL_TREE, integer_type_node,
9288                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
9289                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9290                                       endlink))));
9291
9292   tree int_ftype_int_v2sf_v2sf
9293     = build_function_type
9294     (integer_type_node,
9295      tree_cons (NULL_TREE, integer_type_node,
9296                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
9297                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
9298                                       endlink))));
9299
9300   tree void_ftype_v2si_puint_int
9301     = build_function_type (void_type_node,
9302                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9303                                       tree_cons (NULL_TREE, puint_type_node,
9304                                                  tree_cons (NULL_TREE,
9305                                                             integer_type_node,
9306                                                             endlink))));
9307
9308   tree void_ftype_v2si_puint_char
9309     = build_function_type (void_type_node,
9310                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9311                                       tree_cons (NULL_TREE, puint_type_node,
9312                                                  tree_cons (NULL_TREE,
9313                                                             char_type_node,
9314                                                             endlink))));
9315
9316   tree void_ftype_v2si_pv2si_int
9317     = build_function_type (void_type_node,
9318                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9319                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
9320                                                  tree_cons (NULL_TREE,
9321                                                             integer_type_node,
9322                                                             endlink))));
9323
9324   tree void_ftype_v2si_pv2si_char
9325     = build_function_type (void_type_node,
9326                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9327                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
9328                                                  tree_cons (NULL_TREE,
9329                                                             char_type_node,
9330                                                             endlink))));
9331
9332   tree void_ftype_int
9333     = build_function_type (void_type_node,
9334                            tree_cons (NULL_TREE, integer_type_node, endlink));
9335
9336   tree int_ftype_void
9337     = build_function_type (integer_type_node, endlink);
9338
9339   tree v2si_ftype_pv2si_int
9340     = build_function_type (opaque_V2SI_type_node,
9341                            tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
9342                                       tree_cons (NULL_TREE, integer_type_node,
9343                                                  endlink)));
9344
9345   tree v2si_ftype_puint_int
9346     = build_function_type (opaque_V2SI_type_node,
9347                            tree_cons (NULL_TREE, puint_type_node,
9348                                       tree_cons (NULL_TREE, integer_type_node,
9349                                                  endlink)));
9350
9351   tree v2si_ftype_pushort_int
9352     = build_function_type (opaque_V2SI_type_node,
9353                            tree_cons (NULL_TREE, pushort_type_node,
9354                                       tree_cons (NULL_TREE, integer_type_node,
9355                                                  endlink)));
9356
9357   tree v2si_ftype_signed_char
9358     = build_function_type (opaque_V2SI_type_node,
9359                            tree_cons (NULL_TREE, signed_char_type_node,
9360                                       endlink));
9361
9362   /* The initialization of the simple binary and unary builtins is
9363      done in rs6000_common_init_builtins, but we have to enable the
9364      mask bits here manually because we have run out of `target_flags'
9365      bits.  We really need to redesign this mask business.  */
9366
9367   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
9368                             ARRAY_SIZE (bdesc_2arg),
9369                             SPE_BUILTIN_EVADDW,
9370                             SPE_BUILTIN_EVXOR);
9371   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
9372                             ARRAY_SIZE (bdesc_1arg),
9373                             SPE_BUILTIN_EVABS,
9374                             SPE_BUILTIN_EVSUBFUSIAAW);
9375   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
9376                             ARRAY_SIZE (bdesc_spe_predicates),
9377                             SPE_BUILTIN_EVCMPEQ,
9378                             SPE_BUILTIN_EVFSTSTLT);
9379   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
9380                             ARRAY_SIZE (bdesc_spe_evsel),
9381                             SPE_BUILTIN_EVSEL_CMPGTS,
9382                             SPE_BUILTIN_EVSEL_FSTSTEQ);
9383
9384   (*lang_hooks.decls.pushdecl)
9385     (build_decl (TYPE_DECL, get_identifier ("__ev64_opaque__"),
9386                  opaque_V2SI_type_node));
9387
9388   /* Initialize irregular SPE builtins.  */
9389
9390   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
9391   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
9392   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
9393   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
9394   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
9395   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
9396   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
9397   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
9398   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
9399   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
9400   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
9401   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
9402   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
9403   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
9404   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
9405   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
9406   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
9407   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
9408
9409   /* Loads.  */
9410   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
9411   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
9412   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
9413   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
9414   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
9415   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
9416   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
9417   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
9418   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
9419   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
9420   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
9421   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
9422   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
9423   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
9424   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
9425   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
9426   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
9427   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
9428   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
9429   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
9430   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
9431   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
9432
9433   /* Predicates.  */
9434   d = (struct builtin_description *) bdesc_spe_predicates;
9435   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
9436     {
9437       tree type;
9438
9439       switch (insn_data[d->icode].operand[1].mode)
9440         {
9441         case V2SImode:
9442           type = int_ftype_int_v2si_v2si;
9443           break;
9444         case V2SFmode:
9445           type = int_ftype_int_v2sf_v2sf;
9446           break;
9447         default:
9448           gcc_unreachable ();
9449         }
9450
9451       def_builtin (d->mask, d->name, type, d->code);
9452     }
9453
9454   /* Evsel predicates.  */
9455   d = (struct builtin_description *) bdesc_spe_evsel;
9456   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
9457     {
9458       tree type;
9459
9460       switch (insn_data[d->icode].operand[1].mode)
9461         {
9462         case V2SImode:
9463           type = v2si_ftype_4_v2si;
9464           break;
9465         case V2SFmode:
9466           type = v2sf_ftype_4_v2sf;
9467           break;
9468         default:
9469           gcc_unreachable ();
9470         }
9471
9472       def_builtin (d->mask, d->name, type, d->code);
9473     }
9474 }
9475
9476 static void
9477 paired_init_builtins (void)
9478 {
9479   const struct builtin_description *d;
9480   size_t i;
9481   tree endlink = void_list_node;
9482
9483    tree int_ftype_int_v2sf_v2sf
9484     = build_function_type
9485     (integer_type_node,
9486      tree_cons (NULL_TREE, integer_type_node,
9487                 tree_cons (NULL_TREE, V2SF_type_node,
9488                            tree_cons (NULL_TREE, V2SF_type_node,
9489                                       endlink))));
9490   tree pcfloat_type_node =
9491     build_pointer_type (build_qualified_type
9492                         (float_type_node, TYPE_QUAL_CONST));
9493
9494   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
9495                                                            long_integer_type_node,
9496                                                            pcfloat_type_node,
9497                                                            NULL_TREE);
9498   tree void_ftype_v2sf_long_pcfloat =
9499     build_function_type_list (void_type_node,
9500                               V2SF_type_node,
9501                               long_integer_type_node,
9502                               pcfloat_type_node,
9503                               NULL_TREE);
9504
9505
9506   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
9507                PAIRED_BUILTIN_LX);
9508
9509
9510   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
9511                PAIRED_BUILTIN_STX);
9512
9513   /* Predicates.  */
9514   d = bdesc_paired_preds;
9515   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
9516     {
9517       tree type;
9518
9519       switch (insn_data[d->icode].operand[1].mode)
9520         {
9521         case V2SFmode:
9522           type = int_ftype_int_v2sf_v2sf;
9523           break;
9524         default:
9525           gcc_unreachable ();
9526         }
9527
9528       def_builtin (d->mask, d->name, type, d->code);
9529     }
9530 }
9531
9532 static void
9533 altivec_init_builtins (void)
9534 {
9535   const struct builtin_description *d;
9536   const struct builtin_description_predicates *dp;
9537   size_t i;
9538   tree ftype;
9539
9540   tree pfloat_type_node = build_pointer_type (float_type_node);
9541   tree pint_type_node = build_pointer_type (integer_type_node);
9542   tree pshort_type_node = build_pointer_type (short_integer_type_node);
9543   tree pchar_type_node = build_pointer_type (char_type_node);
9544
9545   tree pvoid_type_node = build_pointer_type (void_type_node);
9546
9547   tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
9548   tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
9549   tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
9550   tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
9551
9552   tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
9553
9554   tree int_ftype_opaque
9555     = build_function_type_list (integer_type_node,
9556                                 opaque_V4SI_type_node, NULL_TREE);
9557
9558   tree opaque_ftype_opaque_int
9559     = build_function_type_list (opaque_V4SI_type_node,
9560                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
9561   tree opaque_ftype_opaque_opaque_int
9562     = build_function_type_list (opaque_V4SI_type_node,
9563                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
9564                                 integer_type_node, NULL_TREE);
9565   tree int_ftype_int_opaque_opaque
9566     = build_function_type_list (integer_type_node,
9567                                 integer_type_node, opaque_V4SI_type_node,
9568                                 opaque_V4SI_type_node, NULL_TREE);
9569   tree int_ftype_int_v4si_v4si
9570     = build_function_type_list (integer_type_node,
9571                                 integer_type_node, V4SI_type_node,
9572                                 V4SI_type_node, NULL_TREE);
9573   tree v4sf_ftype_pcfloat
9574     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
9575   tree void_ftype_pfloat_v4sf
9576     = build_function_type_list (void_type_node,
9577                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
9578   tree v4si_ftype_pcint
9579     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
9580   tree void_ftype_pint_v4si
9581     = build_function_type_list (void_type_node,
9582                                 pint_type_node, V4SI_type_node, NULL_TREE);
9583   tree v8hi_ftype_pcshort
9584     = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
9585   tree void_ftype_pshort_v8hi
9586     = build_function_type_list (void_type_node,
9587                                 pshort_type_node, V8HI_type_node, NULL_TREE);
9588   tree v16qi_ftype_pcchar
9589     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
9590   tree void_ftype_pchar_v16qi
9591     = build_function_type_list (void_type_node,
9592                                 pchar_type_node, V16QI_type_node, NULL_TREE);
9593   tree void_ftype_v4si
9594     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
9595   tree v8hi_ftype_void
9596     = build_function_type (V8HI_type_node, void_list_node);
9597   tree void_ftype_void
9598     = build_function_type (void_type_node, void_list_node);
9599   tree void_ftype_int
9600     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
9601
9602   tree opaque_ftype_long_pcvoid
9603     = build_function_type_list (opaque_V4SI_type_node,
9604                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9605   tree v16qi_ftype_long_pcvoid
9606     = build_function_type_list (V16QI_type_node,
9607                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9608   tree v8hi_ftype_long_pcvoid
9609     = build_function_type_list (V8HI_type_node,
9610                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9611   tree v4si_ftype_long_pcvoid
9612     = build_function_type_list (V4SI_type_node,
9613                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9614
9615   tree void_ftype_opaque_long_pvoid
9616     = build_function_type_list (void_type_node,
9617                                 opaque_V4SI_type_node, long_integer_type_node,
9618                                 pvoid_type_node, NULL_TREE);
9619   tree void_ftype_v4si_long_pvoid
9620     = build_function_type_list (void_type_node,
9621                                 V4SI_type_node, long_integer_type_node,
9622                                 pvoid_type_node, NULL_TREE);
9623   tree void_ftype_v16qi_long_pvoid
9624     = build_function_type_list (void_type_node,
9625                                 V16QI_type_node, long_integer_type_node,
9626                                 pvoid_type_node, NULL_TREE);
9627   tree void_ftype_v8hi_long_pvoid
9628     = build_function_type_list (void_type_node,
9629                                 V8HI_type_node, long_integer_type_node,
9630                                 pvoid_type_node, NULL_TREE);
9631   tree int_ftype_int_v8hi_v8hi
9632     = build_function_type_list (integer_type_node,
9633                                 integer_type_node, V8HI_type_node,
9634                                 V8HI_type_node, NULL_TREE);
9635   tree int_ftype_int_v16qi_v16qi
9636     = build_function_type_list (integer_type_node,
9637                                 integer_type_node, V16QI_type_node,
9638                                 V16QI_type_node, NULL_TREE);
9639   tree int_ftype_int_v4sf_v4sf
9640     = build_function_type_list (integer_type_node,
9641                                 integer_type_node, V4SF_type_node,
9642                                 V4SF_type_node, NULL_TREE);
9643   tree v4si_ftype_v4si
9644     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
9645   tree v8hi_ftype_v8hi
9646     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
9647   tree v16qi_ftype_v16qi
9648     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
9649   tree v4sf_ftype_v4sf
9650     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
9651   tree void_ftype_pcvoid_int_int
9652     = build_function_type_list (void_type_node,
9653                                 pcvoid_type_node, integer_type_node,
9654                                 integer_type_node, NULL_TREE);
9655
9656   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
9657                ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
9658   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
9659                ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
9660   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
9661                ALTIVEC_BUILTIN_LD_INTERNAL_4si);
9662   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
9663                ALTIVEC_BUILTIN_ST_INTERNAL_4si);
9664   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
9665                ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
9666   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
9667                ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
9668   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
9669                ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
9670   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
9671                ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
9672   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
9673   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
9674   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
9675   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
9676   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
9677   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
9678   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
9679   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
9680   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
9681   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
9682   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
9683   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
9684   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
9685   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
9686   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
9687   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
9688   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
9689   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
9690   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
9691   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
9692   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
9693   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
9694   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
9695   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
9696   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
9697   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
9698   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
9699   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
9700   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
9701   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
9702
9703   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
9704
9705   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
9706   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
9707   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
9708   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
9709   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
9710   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
9711   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
9712   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
9713   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
9714   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
9715
9716   /* Add the DST variants.  */
9717   d = bdesc_dst;
9718   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
9719     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
9720
9721   /* Initialize the predicates.  */
9722   dp = bdesc_altivec_preds;
9723   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
9724     {
9725       enum machine_mode mode1;
9726       tree type;
9727       bool is_overloaded = dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
9728                            && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
9729
9730       if (is_overloaded)
9731         mode1 = VOIDmode;
9732       else
9733         mode1 = insn_data[dp->icode].operand[1].mode;
9734
9735       switch (mode1)
9736         {
9737         case VOIDmode:
9738           type = int_ftype_int_opaque_opaque;
9739           break;
9740         case V4SImode:
9741           type = int_ftype_int_v4si_v4si;
9742           break;
9743         case V8HImode:
9744           type = int_ftype_int_v8hi_v8hi;
9745           break;
9746         case V16QImode:
9747           type = int_ftype_int_v16qi_v16qi;
9748           break;
9749         case V4SFmode:
9750           type = int_ftype_int_v4sf_v4sf;
9751           break;
9752         default:
9753           gcc_unreachable ();
9754         }
9755
9756       def_builtin (dp->mask, dp->name, type, dp->code);
9757     }
9758
9759   /* Initialize the abs* operators.  */
9760   d = bdesc_abs;
9761   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
9762     {
9763       enum machine_mode mode0;
9764       tree type;
9765
9766       mode0 = insn_data[d->icode].operand[0].mode;
9767
9768       switch (mode0)
9769         {
9770         case V4SImode:
9771           type = v4si_ftype_v4si;
9772           break;
9773         case V8HImode:
9774           type = v8hi_ftype_v8hi;
9775           break;
9776         case V16QImode:
9777           type = v16qi_ftype_v16qi;
9778           break;
9779         case V4SFmode:
9780           type = v4sf_ftype_v4sf;
9781           break;
9782         default:
9783           gcc_unreachable ();
9784         }
9785
9786       def_builtin (d->mask, d->name, type, d->code);
9787     }
9788
9789   if (TARGET_ALTIVEC)
9790     {
9791       tree decl;
9792
9793       /* Initialize target builtin that implements
9794          targetm.vectorize.builtin_mask_for_load.  */
9795
9796       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
9797                                    v16qi_ftype_long_pcvoid,
9798                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
9799                                    BUILT_IN_MD, NULL, NULL_TREE);
9800       TREE_READONLY (decl) = 1;
9801       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
9802       altivec_builtin_mask_for_load = decl;
9803     }
9804
9805   /* Access to the vec_init patterns.  */
9806   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
9807                                     integer_type_node, integer_type_node,
9808                                     integer_type_node, NULL_TREE);
9809   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
9810                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
9811
9812   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
9813                                     short_integer_type_node,
9814                                     short_integer_type_node,
9815                                     short_integer_type_node,
9816                                     short_integer_type_node,
9817                                     short_integer_type_node,
9818                                     short_integer_type_node,
9819                                     short_integer_type_node, NULL_TREE);
9820   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
9821                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
9822
9823   ftype = build_function_type_list (V16QI_type_node, char_type_node,
9824                                     char_type_node, char_type_node,
9825                                     char_type_node, char_type_node,
9826                                     char_type_node, char_type_node,
9827                                     char_type_node, char_type_node,
9828                                     char_type_node, char_type_node,
9829                                     char_type_node, char_type_node,
9830                                     char_type_node, char_type_node,
9831                                     char_type_node, NULL_TREE);
9832   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
9833                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
9834
9835   ftype = build_function_type_list (V4SF_type_node, float_type_node,
9836                                     float_type_node, float_type_node,
9837                                     float_type_node, NULL_TREE);
9838   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
9839                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
9840
9841   /* Access to the vec_set patterns.  */
9842   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
9843                                     intSI_type_node,
9844                                     integer_type_node, NULL_TREE);
9845   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
9846                ALTIVEC_BUILTIN_VEC_SET_V4SI);
9847
9848   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
9849                                     intHI_type_node,
9850                                     integer_type_node, NULL_TREE);
9851   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
9852                ALTIVEC_BUILTIN_VEC_SET_V8HI);
9853
9854   ftype = build_function_type_list (V8HI_type_node, V16QI_type_node,
9855                                     intQI_type_node,
9856                                     integer_type_node, NULL_TREE);
9857   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
9858                ALTIVEC_BUILTIN_VEC_SET_V16QI);
9859
9860   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
9861                                     float_type_node,
9862                                     integer_type_node, NULL_TREE);
9863   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4sf", ftype,
9864                ALTIVEC_BUILTIN_VEC_SET_V4SF);
9865
9866   /* Access to the vec_extract patterns.  */
9867   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
9868                                     integer_type_node, NULL_TREE);
9869   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
9870                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
9871
9872   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
9873                                     integer_type_node, NULL_TREE);
9874   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
9875                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
9876
9877   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
9878                                     integer_type_node, NULL_TREE);
9879   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
9880                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
9881
9882   ftype = build_function_type_list (float_type_node, V4SF_type_node,
9883                                     integer_type_node, NULL_TREE);
9884   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4sf", ftype,
9885                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
9886 }
9887
9888 static void
9889 rs6000_common_init_builtins (void)
9890 {
9891   const struct builtin_description *d;
9892   size_t i;
9893
9894   tree v2sf_ftype_v2sf_v2sf_v2sf
9895     = build_function_type_list (V2SF_type_node,
9896                                 V2SF_type_node, V2SF_type_node,
9897                                 V2SF_type_node, NULL_TREE);
9898
9899   tree v4sf_ftype_v4sf_v4sf_v16qi
9900     = build_function_type_list (V4SF_type_node,
9901                                 V4SF_type_node, V4SF_type_node,
9902                                 V16QI_type_node, NULL_TREE);
9903   tree v4si_ftype_v4si_v4si_v16qi
9904     = build_function_type_list (V4SI_type_node,
9905                                 V4SI_type_node, V4SI_type_node,
9906                                 V16QI_type_node, NULL_TREE);
9907   tree v8hi_ftype_v8hi_v8hi_v16qi
9908     = build_function_type_list (V8HI_type_node,
9909                                 V8HI_type_node, V8HI_type_node,
9910                                 V16QI_type_node, NULL_TREE);
9911   tree v16qi_ftype_v16qi_v16qi_v16qi
9912     = build_function_type_list (V16QI_type_node,
9913                                 V16QI_type_node, V16QI_type_node,
9914                                 V16QI_type_node, NULL_TREE);
9915   tree v4si_ftype_int
9916     = build_function_type_list (V4SI_type_node, integer_type_node, NULL_TREE);
9917   tree v8hi_ftype_int
9918     = build_function_type_list (V8HI_type_node, integer_type_node, NULL_TREE);
9919   tree v16qi_ftype_int
9920     = build_function_type_list (V16QI_type_node, integer_type_node, NULL_TREE);
9921   tree v8hi_ftype_v16qi
9922     = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
9923   tree v4sf_ftype_v4sf
9924     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
9925
9926   tree v2si_ftype_v2si_v2si
9927     = build_function_type_list (opaque_V2SI_type_node,
9928                                 opaque_V2SI_type_node,
9929                                 opaque_V2SI_type_node, NULL_TREE);
9930
9931   tree v2sf_ftype_v2sf_v2sf_spe
9932     = build_function_type_list (opaque_V2SF_type_node,
9933                                 opaque_V2SF_type_node,
9934                                 opaque_V2SF_type_node, NULL_TREE);
9935
9936   tree v2sf_ftype_v2sf_v2sf
9937     = build_function_type_list (V2SF_type_node,
9938                                 V2SF_type_node,
9939                                 V2SF_type_node, NULL_TREE);
9940
9941
9942   tree v2si_ftype_int_int
9943     = build_function_type_list (opaque_V2SI_type_node,
9944                                 integer_type_node, integer_type_node,
9945                                 NULL_TREE);
9946
9947   tree opaque_ftype_opaque
9948     = build_function_type_list (opaque_V4SI_type_node,
9949                                 opaque_V4SI_type_node, NULL_TREE);
9950
9951   tree v2si_ftype_v2si
9952     = build_function_type_list (opaque_V2SI_type_node,
9953                                 opaque_V2SI_type_node, NULL_TREE);
9954
9955   tree v2sf_ftype_v2sf_spe
9956     = build_function_type_list (opaque_V2SF_type_node,
9957                                 opaque_V2SF_type_node, NULL_TREE);
9958
9959   tree v2sf_ftype_v2sf
9960     = build_function_type_list (V2SF_type_node,
9961                                 V2SF_type_node, NULL_TREE);
9962
9963   tree v2sf_ftype_v2si
9964     = build_function_type_list (opaque_V2SF_type_node,
9965                                 opaque_V2SI_type_node, NULL_TREE);
9966
9967   tree v2si_ftype_v2sf
9968     = build_function_type_list (opaque_V2SI_type_node,
9969                                 opaque_V2SF_type_node, NULL_TREE);
9970
9971   tree v2si_ftype_v2si_char
9972     = build_function_type_list (opaque_V2SI_type_node,
9973                                 opaque_V2SI_type_node,
9974                                 char_type_node, NULL_TREE);
9975
9976   tree v2si_ftype_int_char
9977     = build_function_type_list (opaque_V2SI_type_node,
9978                                 integer_type_node, char_type_node, NULL_TREE);
9979
9980   tree v2si_ftype_char
9981     = build_function_type_list (opaque_V2SI_type_node,
9982                                 char_type_node, NULL_TREE);
9983
9984   tree int_ftype_int_int
9985     = build_function_type_list (integer_type_node,
9986                                 integer_type_node, integer_type_node,
9987                                 NULL_TREE);
9988
9989   tree opaque_ftype_opaque_opaque
9990     = build_function_type_list (opaque_V4SI_type_node,
9991                                 opaque_V4SI_type_node, opaque_V4SI_type_node, NULL_TREE);
9992   tree v4si_ftype_v4si_v4si
9993     = build_function_type_list (V4SI_type_node,
9994                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
9995   tree v4sf_ftype_v4si_int
9996     = build_function_type_list (V4SF_type_node,
9997                                 V4SI_type_node, integer_type_node, NULL_TREE);
9998   tree v4si_ftype_v4sf_int
9999     = build_function_type_list (V4SI_type_node,
10000                                 V4SF_type_node, integer_type_node, NULL_TREE);
10001   tree v4si_ftype_v4si_int
10002     = build_function_type_list (V4SI_type_node,
10003                                 V4SI_type_node, integer_type_node, NULL_TREE);
10004   tree v8hi_ftype_v8hi_int
10005     = build_function_type_list (V8HI_type_node,
10006                                 V8HI_type_node, integer_type_node, NULL_TREE);
10007   tree v16qi_ftype_v16qi_int
10008     = build_function_type_list (V16QI_type_node,
10009                                 V16QI_type_node, integer_type_node, NULL_TREE);
10010   tree v16qi_ftype_v16qi_v16qi_int
10011     = build_function_type_list (V16QI_type_node,
10012                                 V16QI_type_node, V16QI_type_node,
10013                                 integer_type_node, NULL_TREE);
10014   tree v8hi_ftype_v8hi_v8hi_int
10015     = build_function_type_list (V8HI_type_node,
10016                                 V8HI_type_node, V8HI_type_node,
10017                                 integer_type_node, NULL_TREE);
10018   tree v4si_ftype_v4si_v4si_int
10019     = build_function_type_list (V4SI_type_node,
10020                                 V4SI_type_node, V4SI_type_node,
10021                                 integer_type_node, NULL_TREE);
10022   tree v4sf_ftype_v4sf_v4sf_int
10023     = build_function_type_list (V4SF_type_node,
10024                                 V4SF_type_node, V4SF_type_node,
10025                                 integer_type_node, NULL_TREE);
10026   tree v4sf_ftype_v4sf_v4sf
10027     = build_function_type_list (V4SF_type_node,
10028                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
10029   tree opaque_ftype_opaque_opaque_opaque
10030     = build_function_type_list (opaque_V4SI_type_node,
10031                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
10032                                 opaque_V4SI_type_node, NULL_TREE);
10033   tree v4sf_ftype_v4sf_v4sf_v4si
10034     = build_function_type_list (V4SF_type_node,
10035                                 V4SF_type_node, V4SF_type_node,
10036                                 V4SI_type_node, NULL_TREE);
10037   tree v4sf_ftype_v4sf_v4sf_v4sf
10038     = build_function_type_list (V4SF_type_node,
10039                                 V4SF_type_node, V4SF_type_node,
10040                                 V4SF_type_node, NULL_TREE);
10041   tree v4si_ftype_v4si_v4si_v4si
10042     = build_function_type_list (V4SI_type_node,
10043                                 V4SI_type_node, V4SI_type_node,
10044                                 V4SI_type_node, NULL_TREE);
10045   tree v8hi_ftype_v8hi_v8hi
10046     = build_function_type_list (V8HI_type_node,
10047                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10048   tree v8hi_ftype_v8hi_v8hi_v8hi
10049     = build_function_type_list (V8HI_type_node,
10050                                 V8HI_type_node, V8HI_type_node,
10051                                 V8HI_type_node, NULL_TREE);
10052   tree v4si_ftype_v8hi_v8hi_v4si
10053     = build_function_type_list (V4SI_type_node,
10054                                 V8HI_type_node, V8HI_type_node,
10055                                 V4SI_type_node, NULL_TREE);
10056   tree v4si_ftype_v16qi_v16qi_v4si
10057     = build_function_type_list (V4SI_type_node,
10058                                 V16QI_type_node, V16QI_type_node,
10059                                 V4SI_type_node, NULL_TREE);
10060   tree v16qi_ftype_v16qi_v16qi
10061     = build_function_type_list (V16QI_type_node,
10062                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10063   tree v4si_ftype_v4sf_v4sf
10064     = build_function_type_list (V4SI_type_node,
10065                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
10066   tree v8hi_ftype_v16qi_v16qi
10067     = build_function_type_list (V8HI_type_node,
10068                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10069   tree v4si_ftype_v8hi_v8hi
10070     = build_function_type_list (V4SI_type_node,
10071                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10072   tree v8hi_ftype_v4si_v4si
10073     = build_function_type_list (V8HI_type_node,
10074                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
10075   tree v16qi_ftype_v8hi_v8hi
10076     = build_function_type_list (V16QI_type_node,
10077                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10078   tree v4si_ftype_v16qi_v4si
10079     = build_function_type_list (V4SI_type_node,
10080                                 V16QI_type_node, V4SI_type_node, NULL_TREE);
10081   tree v4si_ftype_v16qi_v16qi
10082     = build_function_type_list (V4SI_type_node,
10083                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10084   tree v4si_ftype_v8hi_v4si
10085     = build_function_type_list (V4SI_type_node,
10086                                 V8HI_type_node, V4SI_type_node, NULL_TREE);
10087   tree v4si_ftype_v8hi
10088     = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
10089   tree int_ftype_v4si_v4si
10090     = build_function_type_list (integer_type_node,
10091                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
10092   tree int_ftype_v4sf_v4sf
10093     = build_function_type_list (integer_type_node,
10094                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
10095   tree int_ftype_v16qi_v16qi
10096     = build_function_type_list (integer_type_node,
10097                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10098   tree int_ftype_v8hi_v8hi
10099     = build_function_type_list (integer_type_node,
10100                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10101
10102   /* Add the simple ternary operators.  */
10103   d = bdesc_3arg;
10104   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
10105     {
10106       enum machine_mode mode0, mode1, mode2, mode3;
10107       tree type;
10108       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10109                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10110
10111       if (is_overloaded)
10112         {
10113           mode0 = VOIDmode;
10114           mode1 = VOIDmode;
10115           mode2 = VOIDmode;
10116           mode3 = VOIDmode;
10117         }
10118       else
10119         {
10120           if (d->name == 0 || d->icode == CODE_FOR_nothing)
10121             continue;
10122
10123           mode0 = insn_data[d->icode].operand[0].mode;
10124           mode1 = insn_data[d->icode].operand[1].mode;
10125           mode2 = insn_data[d->icode].operand[2].mode;
10126           mode3 = insn_data[d->icode].operand[3].mode;
10127         }
10128
10129       /* When all four are of the same mode.  */
10130       if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
10131         {
10132           switch (mode0)
10133             {
10134             case VOIDmode:
10135               type = opaque_ftype_opaque_opaque_opaque;
10136               break;
10137             case V4SImode:
10138               type = v4si_ftype_v4si_v4si_v4si;
10139               break;
10140             case V4SFmode:
10141               type = v4sf_ftype_v4sf_v4sf_v4sf;
10142               break;
10143             case V8HImode:
10144               type = v8hi_ftype_v8hi_v8hi_v8hi;
10145               break;
10146             case V16QImode:
10147               type = v16qi_ftype_v16qi_v16qi_v16qi;
10148               break;
10149             case V2SFmode:
10150                 type = v2sf_ftype_v2sf_v2sf_v2sf;
10151               break;
10152             default:
10153               gcc_unreachable ();
10154             }
10155         }
10156       else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
10157         {
10158           switch (mode0)
10159             {
10160             case V4SImode:
10161               type = v4si_ftype_v4si_v4si_v16qi;
10162               break;
10163             case V4SFmode:
10164               type = v4sf_ftype_v4sf_v4sf_v16qi;
10165               break;
10166             case V8HImode:
10167               type = v8hi_ftype_v8hi_v8hi_v16qi;
10168               break;
10169             case V16QImode:
10170               type = v16qi_ftype_v16qi_v16qi_v16qi;
10171               break;
10172             default:
10173               gcc_unreachable ();
10174             }
10175         }
10176       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
10177                && mode3 == V4SImode)
10178         type = v4si_ftype_v16qi_v16qi_v4si;
10179       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
10180                && mode3 == V4SImode)
10181         type = v4si_ftype_v8hi_v8hi_v4si;
10182       else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
10183                && mode3 == V4SImode)
10184         type = v4sf_ftype_v4sf_v4sf_v4si;
10185
10186       /* vchar, vchar, vchar, 4-bit literal.  */
10187       else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
10188                && mode3 == QImode)
10189         type = v16qi_ftype_v16qi_v16qi_int;
10190
10191       /* vshort, vshort, vshort, 4-bit literal.  */
10192       else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
10193                && mode3 == QImode)
10194         type = v8hi_ftype_v8hi_v8hi_int;
10195
10196       /* vint, vint, vint, 4-bit literal.  */
10197       else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
10198                && mode3 == QImode)
10199         type = v4si_ftype_v4si_v4si_int;
10200
10201       /* vfloat, vfloat, vfloat, 4-bit literal.  */
10202       else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
10203                && mode3 == QImode)
10204         type = v4sf_ftype_v4sf_v4sf_int;
10205
10206       else
10207         gcc_unreachable ();
10208
10209       def_builtin (d->mask, d->name, type, d->code);
10210     }
10211
10212   /* Add the simple binary operators.  */
10213   d = (struct builtin_description *) bdesc_2arg;
10214   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
10215     {
10216       enum machine_mode mode0, mode1, mode2;
10217       tree type;
10218       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10219                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10220
10221       if (is_overloaded)
10222         {
10223           mode0 = VOIDmode;
10224           mode1 = VOIDmode;
10225           mode2 = VOIDmode;
10226         }
10227       else
10228         {
10229           if (d->name == 0 || d->icode == CODE_FOR_nothing)
10230             continue;
10231
10232           mode0 = insn_data[d->icode].operand[0].mode;
10233           mode1 = insn_data[d->icode].operand[1].mode;
10234           mode2 = insn_data[d->icode].operand[2].mode;
10235         }
10236
10237       /* When all three operands are of the same mode.  */
10238       if (mode0 == mode1 && mode1 == mode2)
10239         {
10240           switch (mode0)
10241             {
10242             case VOIDmode:
10243               type = opaque_ftype_opaque_opaque;
10244               break;
10245             case V4SFmode:
10246               type = v4sf_ftype_v4sf_v4sf;
10247               break;
10248             case V4SImode:
10249               type = v4si_ftype_v4si_v4si;
10250               break;
10251             case V16QImode:
10252               type = v16qi_ftype_v16qi_v16qi;
10253               break;
10254             case V8HImode:
10255               type = v8hi_ftype_v8hi_v8hi;
10256               break;
10257             case V2SImode:
10258               type = v2si_ftype_v2si_v2si;
10259               break;
10260             case V2SFmode:
10261               if (TARGET_PAIRED_FLOAT)
10262                 type = v2sf_ftype_v2sf_v2sf;
10263               else
10264                 type = v2sf_ftype_v2sf_v2sf_spe;
10265               break;
10266             case SImode:
10267               type = int_ftype_int_int;
10268               break;
10269             default:
10270               gcc_unreachable ();
10271             }
10272         }
10273
10274       /* A few other combos we really don't want to do manually.  */
10275
10276       /* vint, vfloat, vfloat.  */
10277       else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
10278         type = v4si_ftype_v4sf_v4sf;
10279
10280       /* vshort, vchar, vchar.  */
10281       else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
10282         type = v8hi_ftype_v16qi_v16qi;
10283
10284       /* vint, vshort, vshort.  */
10285       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
10286         type = v4si_ftype_v8hi_v8hi;
10287
10288       /* vshort, vint, vint.  */
10289       else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
10290         type = v8hi_ftype_v4si_v4si;
10291
10292       /* vchar, vshort, vshort.  */
10293       else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
10294         type = v16qi_ftype_v8hi_v8hi;
10295
10296       /* vint, vchar, vint.  */
10297       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
10298         type = v4si_ftype_v16qi_v4si;
10299
10300       /* vint, vchar, vchar.  */
10301       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
10302         type = v4si_ftype_v16qi_v16qi;
10303
10304       /* vint, vshort, vint.  */
10305       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
10306         type = v4si_ftype_v8hi_v4si;
10307
10308       /* vint, vint, 5-bit literal.  */
10309       else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
10310         type = v4si_ftype_v4si_int;
10311
10312       /* vshort, vshort, 5-bit literal.  */
10313       else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
10314         type = v8hi_ftype_v8hi_int;
10315
10316       /* vchar, vchar, 5-bit literal.  */
10317       else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
10318         type = v16qi_ftype_v16qi_int;
10319
10320       /* vfloat, vint, 5-bit literal.  */
10321       else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
10322         type = v4sf_ftype_v4si_int;
10323
10324       /* vint, vfloat, 5-bit literal.  */
10325       else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
10326         type = v4si_ftype_v4sf_int;
10327
10328       else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
10329         type = v2si_ftype_int_int;
10330
10331       else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
10332         type = v2si_ftype_v2si_char;
10333
10334       else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
10335         type = v2si_ftype_int_char;
10336
10337       else
10338         {
10339           /* int, x, x.  */
10340           gcc_assert (mode0 == SImode);
10341           switch (mode1)
10342             {
10343             case V4SImode:
10344               type = int_ftype_v4si_v4si;
10345               break;
10346             case V4SFmode:
10347               type = int_ftype_v4sf_v4sf;
10348               break;
10349             case V16QImode:
10350               type = int_ftype_v16qi_v16qi;
10351               break;
10352             case V8HImode:
10353               type = int_ftype_v8hi_v8hi;
10354               break;
10355             default:
10356               gcc_unreachable ();
10357             }
10358         }
10359
10360       def_builtin (d->mask, d->name, type, d->code);
10361     }
10362
10363   /* Add the simple unary operators.  */
10364   d = (struct builtin_description *) bdesc_1arg;
10365   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
10366     {
10367       enum machine_mode mode0, mode1;
10368       tree type;
10369       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10370                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10371
10372       if (is_overloaded)
10373         {
10374           mode0 = VOIDmode;
10375           mode1 = VOIDmode;
10376         }
10377       else
10378         {
10379           if (d->name == 0 || d->icode == CODE_FOR_nothing)
10380             continue;
10381
10382           mode0 = insn_data[d->icode].operand[0].mode;
10383           mode1 = insn_data[d->icode].operand[1].mode;
10384         }
10385
10386       if (mode0 == V4SImode && mode1 == QImode)
10387         type = v4si_ftype_int;
10388       else if (mode0 == V8HImode && mode1 == QImode)
10389         type = v8hi_ftype_int;
10390       else if (mode0 == V16QImode && mode1 == QImode)
10391         type = v16qi_ftype_int;
10392       else if (mode0 == VOIDmode && mode1 == VOIDmode)
10393         type = opaque_ftype_opaque;
10394       else if (mode0 == V4SFmode && mode1 == V4SFmode)
10395         type = v4sf_ftype_v4sf;
10396       else if (mode0 == V8HImode && mode1 == V16QImode)
10397         type = v8hi_ftype_v16qi;
10398       else if (mode0 == V4SImode && mode1 == V8HImode)
10399         type = v4si_ftype_v8hi;
10400       else if (mode0 == V2SImode && mode1 == V2SImode)
10401         type = v2si_ftype_v2si;
10402       else if (mode0 == V2SFmode && mode1 == V2SFmode)
10403         {
10404           if (TARGET_PAIRED_FLOAT)
10405             type = v2sf_ftype_v2sf;
10406           else
10407             type = v2sf_ftype_v2sf_spe;
10408         }
10409       else if (mode0 == V2SFmode && mode1 == V2SImode)
10410         type = v2sf_ftype_v2si;
10411       else if (mode0 == V2SImode && mode1 == V2SFmode)
10412         type = v2si_ftype_v2sf;
10413       else if (mode0 == V2SImode && mode1 == QImode)
10414         type = v2si_ftype_char;
10415       else
10416         gcc_unreachable ();
10417
10418       def_builtin (d->mask, d->name, type, d->code);
10419     }
10420 }
10421
10422 static void
10423 rs6000_init_libfuncs (void)
10424 {
10425   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
10426       && !TARGET_POWER2 && !TARGET_POWERPC)
10427     {
10428       /* AIX library routines for float->int conversion.  */
10429       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
10430       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
10431       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
10432       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
10433     }
10434
10435   if (!TARGET_IEEEQUAD)
10436       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
10437     if (!TARGET_XL_COMPAT)
10438       {
10439         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
10440         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
10441         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
10442         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
10443
10444         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
10445           {
10446             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
10447             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
10448             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
10449             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
10450             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
10451             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
10452             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
10453
10454             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
10455             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
10456             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
10457             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
10458             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
10459             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
10460             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
10461             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
10462           }
10463
10464         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
10465           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
10466       }
10467     else
10468       {
10469         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
10470         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
10471         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
10472         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
10473       }
10474   else
10475     {
10476       /* 32-bit SVR4 quad floating point routines.  */
10477
10478       set_optab_libfunc (add_optab, TFmode, "_q_add");
10479       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
10480       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
10481       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
10482       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
10483       if (TARGET_PPC_GPOPT || TARGET_POWER2)
10484         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
10485
10486       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
10487       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
10488       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
10489       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
10490       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
10491       set_optab_libfunc (le_optab, TFmode, "_q_fle");
10492
10493       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
10494       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
10495       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
10496       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
10497       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
10498       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
10499       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
10500       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
10501     }
10502 }
10503
10504 \f
10505 /* Expand a block clear operation, and return 1 if successful.  Return 0
10506    if we should let the compiler generate normal code.
10507
10508    operands[0] is the destination
10509    operands[1] is the length
10510    operands[3] is the alignment */
10511
10512 int
10513 expand_block_clear (rtx operands[])
10514 {
10515   rtx orig_dest = operands[0];
10516   rtx bytes_rtx = operands[1];
10517   rtx align_rtx = operands[3];
10518   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
10519   HOST_WIDE_INT align;
10520   HOST_WIDE_INT bytes;
10521   int offset;
10522   int clear_bytes;
10523   int clear_step;
10524
10525   /* If this is not a fixed size move, just call memcpy */
10526   if (! constp)
10527     return 0;
10528
10529   /* This must be a fixed size alignment  */
10530   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
10531   align = INTVAL (align_rtx) * BITS_PER_UNIT;
10532
10533   /* Anything to clear? */
10534   bytes = INTVAL (bytes_rtx);
10535   if (bytes <= 0)
10536     return 1;
10537
10538   /* Use the builtin memset after a point, to avoid huge code bloat.
10539      When optimize_size, avoid any significant code bloat; calling
10540      memset is about 4 instructions, so allow for one instruction to
10541      load zero and three to do clearing.  */
10542   if (TARGET_ALTIVEC && align >= 128)
10543     clear_step = 16;
10544   else if (TARGET_POWERPC64 && align >= 32)
10545     clear_step = 8;
10546   else if (TARGET_SPE && align >= 64)
10547     clear_step = 8;
10548   else
10549     clear_step = 4;
10550
10551   if (optimize_size && bytes > 3 * clear_step)
10552     return 0;
10553   if (! optimize_size && bytes > 8 * clear_step)
10554     return 0;
10555
10556   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
10557     {
10558       enum machine_mode mode = BLKmode;
10559       rtx dest;
10560
10561       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
10562         {
10563           clear_bytes = 16;
10564           mode = V4SImode;
10565         }
10566       else if (bytes >= 8 && TARGET_SPE && align >= 64)
10567         {
10568           clear_bytes = 8;
10569           mode = V2SImode;
10570         }
10571       else if (bytes >= 8 && TARGET_POWERPC64
10572                /* 64-bit loads and stores require word-aligned
10573                   displacements.  */
10574                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
10575         {
10576           clear_bytes = 8;
10577           mode = DImode;
10578         }
10579       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
10580         {                       /* move 4 bytes */
10581           clear_bytes = 4;
10582           mode = SImode;
10583         }
10584       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
10585         {                       /* move 2 bytes */
10586           clear_bytes = 2;
10587           mode = HImode;
10588         }
10589       else /* move 1 byte at a time */
10590         {
10591           clear_bytes = 1;
10592           mode = QImode;
10593         }
10594
10595       dest = adjust_address (orig_dest, mode, offset);
10596
10597       emit_move_insn (dest, CONST0_RTX (mode));
10598     }
10599
10600   return 1;
10601 }
10602
10603 \f
10604 /* Expand a block move operation, and return 1 if successful.  Return 0
10605    if we should let the compiler generate normal code.
10606
10607    operands[0] is the destination
10608    operands[1] is the source
10609    operands[2] is the length
10610    operands[3] is the alignment */
10611
10612 #define MAX_MOVE_REG 4
10613
10614 int
10615 expand_block_move (rtx operands[])
10616 {
10617   rtx orig_dest = operands[0];
10618   rtx orig_src  = operands[1];
10619   rtx bytes_rtx = operands[2];
10620   rtx align_rtx = operands[3];
10621   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
10622   int align;
10623   int bytes;
10624   int offset;
10625   int move_bytes;
10626   rtx stores[MAX_MOVE_REG];
10627   int num_reg = 0;
10628
10629   /* If this is not a fixed size move, just call memcpy */
10630   if (! constp)
10631     return 0;
10632
10633   /* This must be a fixed size alignment */
10634   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
10635   align = INTVAL (align_rtx) * BITS_PER_UNIT;
10636
10637   /* Anything to move? */
10638   bytes = INTVAL (bytes_rtx);
10639   if (bytes <= 0)
10640     return 1;
10641
10642   /* store_one_arg depends on expand_block_move to handle at least the size of
10643      reg_parm_stack_space.  */
10644   if (bytes > (TARGET_POWERPC64 ? 64 : 32))
10645     return 0;
10646
10647   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
10648     {
10649       union {
10650         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
10651         rtx (*mov) (rtx, rtx);
10652       } gen_func;
10653       enum machine_mode mode = BLKmode;
10654       rtx src, dest;
10655
10656       /* Altivec first, since it will be faster than a string move
10657          when it applies, and usually not significantly larger.  */
10658       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
10659         {
10660           move_bytes = 16;
10661           mode = V4SImode;
10662           gen_func.mov = gen_movv4si;
10663         }
10664       else if (TARGET_SPE && bytes >= 8 && align >= 64)
10665         {
10666           move_bytes = 8;
10667           mode = V2SImode;
10668           gen_func.mov = gen_movv2si;
10669         }
10670       else if (TARGET_STRING
10671           && bytes > 24         /* move up to 32 bytes at a time */
10672           && ! fixed_regs[5]
10673           && ! fixed_regs[6]
10674           && ! fixed_regs[7]
10675           && ! fixed_regs[8]
10676           && ! fixed_regs[9]
10677           && ! fixed_regs[10]
10678           && ! fixed_regs[11]
10679           && ! fixed_regs[12])
10680         {
10681           move_bytes = (bytes > 32) ? 32 : bytes;
10682           gen_func.movmemsi = gen_movmemsi_8reg;
10683         }
10684       else if (TARGET_STRING
10685                && bytes > 16    /* move up to 24 bytes at a time */
10686                && ! fixed_regs[5]
10687                && ! fixed_regs[6]
10688                && ! fixed_regs[7]
10689                && ! fixed_regs[8]
10690                && ! fixed_regs[9]
10691                && ! fixed_regs[10])
10692         {
10693           move_bytes = (bytes > 24) ? 24 : bytes;
10694           gen_func.movmemsi = gen_movmemsi_6reg;
10695         }
10696       else if (TARGET_STRING
10697                && bytes > 8     /* move up to 16 bytes at a time */
10698                && ! fixed_regs[5]
10699                && ! fixed_regs[6]
10700                && ! fixed_regs[7]
10701                && ! fixed_regs[8])
10702         {
10703           move_bytes = (bytes > 16) ? 16 : bytes;
10704           gen_func.movmemsi = gen_movmemsi_4reg;
10705         }
10706       else if (bytes >= 8 && TARGET_POWERPC64
10707                /* 64-bit loads and stores require word-aligned
10708                   displacements.  */
10709                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
10710         {
10711           move_bytes = 8;
10712           mode = DImode;
10713           gen_func.mov = gen_movdi;
10714         }
10715       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
10716         {                       /* move up to 8 bytes at a time */
10717           move_bytes = (bytes > 8) ? 8 : bytes;
10718           gen_func.movmemsi = gen_movmemsi_2reg;
10719         }
10720       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
10721         {                       /* move 4 bytes */
10722           move_bytes = 4;
10723           mode = SImode;
10724           gen_func.mov = gen_movsi;
10725         }
10726       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
10727         {                       /* move 2 bytes */
10728           move_bytes = 2;
10729           mode = HImode;
10730           gen_func.mov = gen_movhi;
10731         }
10732       else if (TARGET_STRING && bytes > 1)
10733         {                       /* move up to 4 bytes at a time */
10734           move_bytes = (bytes > 4) ? 4 : bytes;
10735           gen_func.movmemsi = gen_movmemsi_1reg;
10736         }
10737       else /* move 1 byte at a time */
10738         {
10739           move_bytes = 1;
10740           mode = QImode;
10741           gen_func.mov = gen_movqi;
10742         }
10743
10744       src = adjust_address (orig_src, mode, offset);
10745       dest = adjust_address (orig_dest, mode, offset);
10746
10747       if (mode != BLKmode)
10748         {
10749           rtx tmp_reg = gen_reg_rtx (mode);
10750
10751           emit_insn ((*gen_func.mov) (tmp_reg, src));
10752           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
10753         }
10754
10755       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
10756         {
10757           int i;
10758           for (i = 0; i < num_reg; i++)
10759             emit_insn (stores[i]);
10760           num_reg = 0;
10761         }
10762
10763       if (mode == BLKmode)
10764         {
10765           /* Move the address into scratch registers.  The movmemsi
10766              patterns require zero offset.  */
10767           if (!REG_P (XEXP (src, 0)))
10768             {
10769               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
10770               src = replace_equiv_address (src, src_reg);
10771             }
10772           set_mem_size (src, GEN_INT (move_bytes));
10773
10774           if (!REG_P (XEXP (dest, 0)))
10775             {
10776               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
10777               dest = replace_equiv_address (dest, dest_reg);
10778             }
10779           set_mem_size (dest, GEN_INT (move_bytes));
10780
10781           emit_insn ((*gen_func.movmemsi) (dest, src,
10782                                            GEN_INT (move_bytes & 31),
10783                                            align_rtx));
10784         }
10785     }
10786
10787   return 1;
10788 }
10789
10790 \f
10791 /* Return a string to perform a load_multiple operation.
10792    operands[0] is the vector.
10793    operands[1] is the source address.
10794    operands[2] is the first destination register.  */
10795
10796 const char *
10797 rs6000_output_load_multiple (rtx operands[3])
10798 {
10799   /* We have to handle the case where the pseudo used to contain the address
10800      is assigned to one of the output registers.  */
10801   int i, j;
10802   int words = XVECLEN (operands[0], 0);
10803   rtx xop[10];
10804
10805   if (XVECLEN (operands[0], 0) == 1)
10806     return "{l|lwz} %2,0(%1)";
10807
10808   for (i = 0; i < words; i++)
10809     if (refers_to_regno_p (REGNO (operands[2]) + i,
10810                            REGNO (operands[2]) + i + 1, operands[1], 0))
10811       {
10812         if (i == words-1)
10813           {
10814             xop[0] = GEN_INT (4 * (words-1));
10815             xop[1] = operands[1];
10816             xop[2] = operands[2];
10817             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
10818             return "";
10819           }
10820         else if (i == 0)
10821           {
10822             xop[0] = GEN_INT (4 * (words-1));
10823             xop[1] = operands[1];
10824             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
10825             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);
10826             return "";
10827           }
10828         else
10829           {
10830             for (j = 0; j < words; j++)
10831               if (j != i)
10832                 {
10833                   xop[0] = GEN_INT (j * 4);
10834                   xop[1] = operands[1];
10835                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
10836                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
10837                 }
10838             xop[0] = GEN_INT (i * 4);
10839             xop[1] = operands[1];
10840             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
10841             return "";
10842           }
10843       }
10844
10845   return "{lsi|lswi} %2,%1,%N0";
10846 }
10847
10848 \f
10849 /* A validation routine: say whether CODE, a condition code, and MODE
10850    match.  The other alternatives either don't make sense or should
10851    never be generated.  */
10852
10853 void
10854 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
10855 {
10856   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
10857                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
10858               && GET_MODE_CLASS (mode) == MODE_CC);
10859
10860   /* These don't make sense.  */
10861   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
10862               || mode != CCUNSmode);
10863
10864   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
10865               || mode == CCUNSmode);
10866
10867   gcc_assert (mode == CCFPmode
10868               || (code != ORDERED && code != UNORDERED
10869                   && code != UNEQ && code != LTGT
10870                   && code != UNGT && code != UNLT
10871                   && code != UNGE && code != UNLE));
10872
10873   /* These should never be generated except for
10874      flag_finite_math_only.  */
10875   gcc_assert (mode != CCFPmode
10876               || flag_finite_math_only
10877               || (code != LE && code != GE
10878                   && code != UNEQ && code != LTGT
10879                   && code != UNGT && code != UNLT));
10880
10881   /* These are invalid; the information is not there.  */
10882   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
10883 }
10884
10885 \f
10886 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
10887    mask required to convert the result of a rotate insn into a shift
10888    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
10889
10890 int
10891 includes_lshift_p (rtx shiftop, rtx andop)
10892 {
10893   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
10894
10895   shift_mask <<= INTVAL (shiftop);
10896
10897   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
10898 }
10899
10900 /* Similar, but for right shift.  */
10901
10902 int
10903 includes_rshift_p (rtx shiftop, rtx andop)
10904 {
10905   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
10906
10907   shift_mask >>= INTVAL (shiftop);
10908
10909   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
10910 }
10911
10912 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
10913    to perform a left shift.  It must have exactly SHIFTOP least
10914    significant 0's, then one or more 1's, then zero or more 0's.  */
10915
10916 int
10917 includes_rldic_lshift_p (rtx shiftop, rtx andop)
10918 {
10919   if (GET_CODE (andop) == CONST_INT)
10920     {
10921       HOST_WIDE_INT c, lsb, shift_mask;
10922
10923       c = INTVAL (andop);
10924       if (c == 0 || c == ~0)
10925         return 0;
10926
10927       shift_mask = ~0;
10928       shift_mask <<= INTVAL (shiftop);
10929
10930       /* Find the least significant one bit.  */
10931       lsb = c & -c;
10932
10933       /* It must coincide with the LSB of the shift mask.  */
10934       if (-lsb != shift_mask)
10935         return 0;
10936
10937       /* Invert to look for the next transition (if any).  */
10938       c = ~c;
10939
10940       /* Remove the low group of ones (originally low group of zeros).  */
10941       c &= -lsb;
10942
10943       /* Again find the lsb, and check we have all 1's above.  */
10944       lsb = c & -c;
10945       return c == -lsb;
10946     }
10947   else if (GET_CODE (andop) == CONST_DOUBLE
10948            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
10949     {
10950       HOST_WIDE_INT low, high, lsb;
10951       HOST_WIDE_INT shift_mask_low, shift_mask_high;
10952
10953       low = CONST_DOUBLE_LOW (andop);
10954       if (HOST_BITS_PER_WIDE_INT < 64)
10955         high = CONST_DOUBLE_HIGH (andop);
10956
10957       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
10958           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
10959         return 0;
10960
10961       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
10962         {
10963           shift_mask_high = ~0;
10964           if (INTVAL (shiftop) > 32)
10965             shift_mask_high <<= INTVAL (shiftop) - 32;
10966
10967           lsb = high & -high;
10968
10969           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
10970             return 0;
10971
10972           high = ~high;
10973           high &= -lsb;
10974
10975           lsb = high & -high;
10976           return high == -lsb;
10977         }
10978
10979       shift_mask_low = ~0;
10980       shift_mask_low <<= INTVAL (shiftop);
10981
10982       lsb = low & -low;
10983
10984       if (-lsb != shift_mask_low)
10985         return 0;
10986
10987       if (HOST_BITS_PER_WIDE_INT < 64)
10988         high = ~high;
10989       low = ~low;
10990       low &= -lsb;
10991
10992       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
10993         {
10994           lsb = high & -high;
10995           return high == -lsb;
10996         }
10997
10998       lsb = low & -low;
10999       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
11000     }
11001   else
11002     return 0;
11003 }
11004
11005 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
11006    to perform a left shift.  It must have SHIFTOP or more least
11007    significant 0's, with the remainder of the word 1's.  */
11008
11009 int
11010 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
11011 {
11012   if (GET_CODE (andop) == CONST_INT)
11013     {
11014       HOST_WIDE_INT c, lsb, shift_mask;
11015
11016       shift_mask = ~0;
11017       shift_mask <<= INTVAL (shiftop);
11018       c = INTVAL (andop);
11019
11020       /* Find the least significant one bit.  */
11021       lsb = c & -c;
11022
11023       /* It must be covered by the shift mask.
11024          This test also rejects c == 0.  */
11025       if ((lsb & shift_mask) == 0)
11026         return 0;
11027
11028       /* Check we have all 1's above the transition, and reject all 1's.  */
11029       return c == -lsb && lsb != 1;
11030     }
11031   else if (GET_CODE (andop) == CONST_DOUBLE
11032            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
11033     {
11034       HOST_WIDE_INT low, lsb, shift_mask_low;
11035
11036       low = CONST_DOUBLE_LOW (andop);
11037
11038       if (HOST_BITS_PER_WIDE_INT < 64)
11039         {
11040           HOST_WIDE_INT high, shift_mask_high;
11041
11042           high = CONST_DOUBLE_HIGH (andop);
11043
11044           if (low == 0)
11045             {
11046               shift_mask_high = ~0;
11047               if (INTVAL (shiftop) > 32)
11048                 shift_mask_high <<= INTVAL (shiftop) - 32;
11049
11050               lsb = high & -high;
11051
11052               if ((lsb & shift_mask_high) == 0)
11053                 return 0;
11054
11055               return high == -lsb;
11056             }
11057           if (high != ~0)
11058             return 0;
11059         }
11060
11061       shift_mask_low = ~0;
11062       shift_mask_low <<= INTVAL (shiftop);
11063
11064       lsb = low & -low;
11065
11066       if ((lsb & shift_mask_low) == 0)
11067         return 0;
11068
11069       return low == -lsb && lsb != 1;
11070     }
11071   else
11072     return 0;
11073 }
11074
11075 /* Return 1 if operands will generate a valid arguments to rlwimi
11076 instruction for insert with right shift in 64-bit mode.  The mask may
11077 not start on the first bit or stop on the last bit because wrap-around
11078 effects of instruction do not correspond to semantics of RTL insn.  */
11079
11080 int
11081 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
11082 {
11083   if (INTVAL (startop) > 32
11084       && INTVAL (startop) < 64
11085       && INTVAL (sizeop) > 1
11086       && INTVAL (sizeop) + INTVAL (startop) < 64
11087       && INTVAL (shiftop) > 0
11088       && INTVAL (sizeop) + INTVAL (shiftop) < 32
11089       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
11090     return 1;
11091
11092   return 0;
11093 }
11094
11095 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
11096    for lfq and stfq insns iff the registers are hard registers.   */
11097
11098 int
11099 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
11100 {
11101   /* We might have been passed a SUBREG.  */
11102   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
11103     return 0;
11104
11105   /* We might have been passed non floating point registers.  */
11106   if (!FP_REGNO_P (REGNO (reg1))
11107       || !FP_REGNO_P (REGNO (reg2)))
11108     return 0;
11109
11110   return (REGNO (reg1) == REGNO (reg2) - 1);
11111 }
11112
11113 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
11114    addr1 and addr2 must be in consecutive memory locations
11115    (addr2 == addr1 + 8).  */
11116
11117 int
11118 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
11119 {
11120   rtx addr1, addr2;
11121   unsigned int reg1, reg2;
11122   int offset1, offset2;
11123
11124   /* The mems cannot be volatile.  */
11125   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
11126     return 0;
11127
11128   addr1 = XEXP (mem1, 0);
11129   addr2 = XEXP (mem2, 0);
11130
11131   /* Extract an offset (if used) from the first addr.  */
11132   if (GET_CODE (addr1) == PLUS)
11133     {
11134       /* If not a REG, return zero.  */
11135       if (GET_CODE (XEXP (addr1, 0)) != REG)
11136         return 0;
11137       else
11138         {
11139           reg1 = REGNO (XEXP (addr1, 0));
11140           /* The offset must be constant!  */
11141           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
11142             return 0;
11143           offset1 = INTVAL (XEXP (addr1, 1));
11144         }
11145     }
11146   else if (GET_CODE (addr1) != REG)
11147     return 0;
11148   else
11149     {
11150       reg1 = REGNO (addr1);
11151       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
11152       offset1 = 0;
11153     }
11154
11155   /* And now for the second addr.  */
11156   if (GET_CODE (addr2) == PLUS)
11157     {
11158       /* If not a REG, return zero.  */
11159       if (GET_CODE (XEXP (addr2, 0)) != REG)
11160         return 0;
11161       else
11162         {
11163           reg2 = REGNO (XEXP (addr2, 0));
11164           /* The offset must be constant. */
11165           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
11166             return 0;
11167           offset2 = INTVAL (XEXP (addr2, 1));
11168         }
11169     }
11170   else if (GET_CODE (addr2) != REG)
11171     return 0;
11172   else
11173     {
11174       reg2 = REGNO (addr2);
11175       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
11176       offset2 = 0;
11177     }
11178
11179   /* Both of these must have the same base register.  */
11180   if (reg1 != reg2)
11181     return 0;
11182
11183   /* The offset for the second addr must be 8 more than the first addr.  */
11184   if (offset2 != offset1 + 8)
11185     return 0;
11186
11187   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
11188      instructions.  */
11189   return 1;
11190 }
11191 \f
11192
11193 rtx
11194 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
11195 {
11196   static bool eliminated = false;
11197   if (mode != SDmode)
11198     return assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
11199   else
11200     {
11201       rtx mem = cfun->machine->sdmode_stack_slot;
11202       gcc_assert (mem != NULL_RTX);
11203
11204       if (!eliminated)
11205         {
11206           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
11207           cfun->machine->sdmode_stack_slot = mem;
11208           eliminated = true;
11209         }
11210       return mem;
11211     }
11212 }
11213
11214 static tree
11215 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
11216 {
11217   /* Don't walk into types.  */
11218   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
11219     {
11220       *walk_subtrees = 0;
11221       return NULL_TREE;
11222     }
11223
11224   switch (TREE_CODE (*tp))
11225     {
11226     case VAR_DECL:
11227     case PARM_DECL:
11228     case FIELD_DECL:
11229     case RESULT_DECL:
11230     case REAL_CST:
11231       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
11232         return *tp;
11233       break;
11234     default:
11235       break;
11236     }
11237
11238   return NULL_TREE;
11239 }
11240
11241
11242 /* Allocate a 64-bit stack slot to be used for copying SDmode
11243    values through if this function has any SDmode references.  */
11244
11245 static void
11246 rs6000_alloc_sdmode_stack_slot (void)
11247 {
11248   tree t;
11249   basic_block bb;
11250   block_stmt_iterator bsi;
11251
11252   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
11253
11254   FOR_EACH_BB (bb)
11255     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
11256       {
11257         tree ret = walk_tree_without_duplicates (bsi_stmt_ptr (bsi),
11258                                                  rs6000_check_sdmode, NULL);
11259         if (ret)
11260           {
11261             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
11262             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
11263                                                                   SDmode, 0);
11264             return;
11265           }
11266       }
11267
11268   /* Check for any SDmode parameters of the function.  */
11269   for (t = DECL_ARGUMENTS (cfun->decl); t; t = TREE_CHAIN (t))
11270     {
11271       if (TREE_TYPE (t) == error_mark_node)
11272         continue;
11273
11274       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
11275           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
11276         {
11277           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
11278           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
11279                                                                 SDmode, 0);
11280           return;
11281         }
11282     }
11283 }
11284
11285 static void
11286 rs6000_instantiate_decls (void)
11287 {
11288   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
11289     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
11290 }
11291
11292 /* Return the register class of a scratch register needed to copy IN into
11293    or out of a register in CLASS in MODE.  If it can be done directly,
11294    NO_REGS is returned.  */
11295
11296 enum reg_class
11297 rs6000_secondary_reload_class (enum reg_class class,
11298                                enum machine_mode mode ATTRIBUTE_UNUSED,
11299                                rtx in)
11300 {
11301   int regno;
11302
11303   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
11304 #if TARGET_MACHO
11305                      && MACHOPIC_INDIRECT
11306 #endif
11307                      ))
11308     {
11309       /* We cannot copy a symbolic operand directly into anything
11310          other than BASE_REGS for TARGET_ELF.  So indicate that a
11311          register from BASE_REGS is needed as an intermediate
11312          register.
11313
11314          On Darwin, pic addresses require a load from memory, which
11315          needs a base register.  */
11316       if (class != BASE_REGS
11317           && (GET_CODE (in) == SYMBOL_REF
11318               || GET_CODE (in) == HIGH
11319               || GET_CODE (in) == LABEL_REF
11320               || GET_CODE (in) == CONST))
11321         return BASE_REGS;
11322     }
11323
11324   if (GET_CODE (in) == REG)
11325     {
11326       regno = REGNO (in);
11327       if (regno >= FIRST_PSEUDO_REGISTER)
11328         {
11329           regno = true_regnum (in);
11330           if (regno >= FIRST_PSEUDO_REGISTER)
11331             regno = -1;
11332         }
11333     }
11334   else if (GET_CODE (in) == SUBREG)
11335     {
11336       regno = true_regnum (in);
11337       if (regno >= FIRST_PSEUDO_REGISTER)
11338         regno = -1;
11339     }
11340   else
11341     regno = -1;
11342
11343   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
11344      into anything.  */
11345   if (class == GENERAL_REGS || class == BASE_REGS
11346       || (regno >= 0 && INT_REGNO_P (regno)))
11347     return NO_REGS;
11348
11349   /* Constants, memory, and FP registers can go into FP registers.  */
11350   if ((regno == -1 || FP_REGNO_P (regno))
11351       && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
11352     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
11353
11354   /* Memory, and AltiVec registers can go into AltiVec registers.  */
11355   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
11356       && class == ALTIVEC_REGS)
11357     return NO_REGS;
11358
11359   /* We can copy among the CR registers.  */
11360   if ((class == CR_REGS || class == CR0_REGS)
11361       && regno >= 0 && CR_REGNO_P (regno))
11362     return NO_REGS;
11363
11364   /* Otherwise, we need GENERAL_REGS.  */
11365   return GENERAL_REGS;
11366 }
11367 \f
11368 /* Given a comparison operation, return the bit number in CCR to test.  We
11369    know this is a valid comparison.
11370
11371    SCC_P is 1 if this is for an scc.  That means that %D will have been
11372    used instead of %C, so the bits will be in different places.
11373
11374    Return -1 if OP isn't a valid comparison for some reason.  */
11375
11376 int
11377 ccr_bit (rtx op, int scc_p)
11378 {
11379   enum rtx_code code = GET_CODE (op);
11380   enum machine_mode cc_mode;
11381   int cc_regnum;
11382   int base_bit;
11383   rtx reg;
11384
11385   if (!COMPARISON_P (op))
11386     return -1;
11387
11388   reg = XEXP (op, 0);
11389
11390   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
11391
11392   cc_mode = GET_MODE (reg);
11393   cc_regnum = REGNO (reg);
11394   base_bit = 4 * (cc_regnum - CR0_REGNO);
11395
11396   validate_condition_mode (code, cc_mode);
11397
11398   /* When generating a sCOND operation, only positive conditions are
11399      allowed.  */
11400   gcc_assert (!scc_p
11401               || code == EQ || code == GT || code == LT || code == UNORDERED
11402               || code == GTU || code == LTU);
11403
11404   switch (code)
11405     {
11406     case NE:
11407       return scc_p ? base_bit + 3 : base_bit + 2;
11408     case EQ:
11409       return base_bit + 2;
11410     case GT:  case GTU:  case UNLE:
11411       return base_bit + 1;
11412     case LT:  case LTU:  case UNGE:
11413       return base_bit;
11414     case ORDERED:  case UNORDERED:
11415       return base_bit + 3;
11416
11417     case GE:  case GEU:
11418       /* If scc, we will have done a cror to put the bit in the
11419          unordered position.  So test that bit.  For integer, this is ! LT
11420          unless this is an scc insn.  */
11421       return scc_p ? base_bit + 3 : base_bit;
11422
11423     case LE:  case LEU:
11424       return scc_p ? base_bit + 3 : base_bit + 1;
11425
11426     default:
11427       gcc_unreachable ();
11428     }
11429 }
11430 \f
11431 /* Return the GOT register.  */
11432
11433 rtx
11434 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
11435 {
11436   /* The second flow pass currently (June 1999) can't update
11437      regs_ever_live without disturbing other parts of the compiler, so
11438      update it here to make the prolog/epilogue code happy.  */
11439   if (!can_create_pseudo_p ()
11440       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
11441     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
11442
11443   current_function_uses_pic_offset_table = 1;
11444
11445   return pic_offset_table_rtx;
11446 }
11447 \f
11448 /* Function to init struct machine_function.
11449    This will be called, via a pointer variable,
11450    from push_function_context.  */
11451
11452 static struct machine_function *
11453 rs6000_init_machine_status (void)
11454 {
11455   return ggc_alloc_cleared (sizeof (machine_function));
11456 }
11457 \f
11458 /* These macros test for integers and extract the low-order bits.  */
11459 #define INT_P(X)  \
11460 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
11461  && GET_MODE (X) == VOIDmode)
11462
11463 #define INT_LOWPART(X) \
11464   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
11465
11466 int
11467 extract_MB (rtx op)
11468 {
11469   int i;
11470   unsigned long val = INT_LOWPART (op);
11471
11472   /* If the high bit is zero, the value is the first 1 bit we find
11473      from the left.  */
11474   if ((val & 0x80000000) == 0)
11475     {
11476       gcc_assert (val & 0xffffffff);
11477
11478       i = 1;
11479       while (((val <<= 1) & 0x80000000) == 0)
11480         ++i;
11481       return i;
11482     }
11483
11484   /* If the high bit is set and the low bit is not, or the mask is all
11485      1's, the value is zero.  */
11486   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
11487     return 0;
11488
11489   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
11490      from the right.  */
11491   i = 31;
11492   while (((val >>= 1) & 1) != 0)
11493     --i;
11494
11495   return i;
11496 }
11497
11498 int
11499 extract_ME (rtx op)
11500 {
11501   int i;
11502   unsigned long val = INT_LOWPART (op);
11503
11504   /* If the low bit is zero, the value is the first 1 bit we find from
11505      the right.  */
11506   if ((val & 1) == 0)
11507     {
11508       gcc_assert (val & 0xffffffff);
11509
11510       i = 30;
11511       while (((val >>= 1) & 1) == 0)
11512         --i;
11513
11514       return i;
11515     }
11516
11517   /* If the low bit is set and the high bit is not, or the mask is all
11518      1's, the value is 31.  */
11519   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
11520     return 31;
11521
11522   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
11523      from the left.  */
11524   i = 0;
11525   while (((val <<= 1) & 0x80000000) != 0)
11526     ++i;
11527
11528   return i;
11529 }
11530
11531 /* Locate some local-dynamic symbol still in use by this function
11532    so that we can print its name in some tls_ld pattern.  */
11533
11534 static const char *
11535 rs6000_get_some_local_dynamic_name (void)
11536 {
11537   rtx insn;
11538
11539   if (cfun->machine->some_ld_name)
11540     return cfun->machine->some_ld_name;
11541
11542   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
11543     if (INSN_P (insn)
11544         && for_each_rtx (&PATTERN (insn),
11545                          rs6000_get_some_local_dynamic_name_1, 0))
11546       return cfun->machine->some_ld_name;
11547
11548   gcc_unreachable ();
11549 }
11550
11551 /* Helper function for rs6000_get_some_local_dynamic_name.  */
11552
11553 static int
11554 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
11555 {
11556   rtx x = *px;
11557
11558   if (GET_CODE (x) == SYMBOL_REF)
11559     {
11560       const char *str = XSTR (x, 0);
11561       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
11562         {
11563           cfun->machine->some_ld_name = str;
11564           return 1;
11565         }
11566     }
11567
11568   return 0;
11569 }
11570
11571 /* Write out a function code label.  */
11572
11573 void
11574 rs6000_output_function_entry (FILE *file, const char *fname)
11575 {
11576   if (fname[0] != '.')
11577     {
11578       switch (DEFAULT_ABI)
11579         {
11580         default:
11581           gcc_unreachable ();
11582
11583         case ABI_AIX:
11584           if (DOT_SYMBOLS)
11585             putc ('.', file);
11586           else
11587             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
11588           break;
11589
11590         case ABI_V4:
11591         case ABI_DARWIN:
11592           break;
11593         }
11594     }
11595   if (TARGET_AIX)
11596     RS6000_OUTPUT_BASENAME (file, fname);
11597   else
11598     assemble_name (file, fname);
11599 }
11600
11601 /* Print an operand.  Recognize special options, documented below.  */
11602
11603 #if TARGET_ELF
11604 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
11605 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
11606 #else
11607 #define SMALL_DATA_RELOC "sda21"
11608 #define SMALL_DATA_REG 0
11609 #endif
11610
11611 void
11612 print_operand (FILE *file, rtx x, int code)
11613 {
11614   int i;
11615   HOST_WIDE_INT val;
11616   unsigned HOST_WIDE_INT uval;
11617
11618   switch (code)
11619     {
11620     case '.':
11621       /* Write out an instruction after the call which may be replaced
11622          with glue code by the loader.  This depends on the AIX version.  */
11623       asm_fprintf (file, RS6000_CALL_GLUE);
11624       return;
11625
11626       /* %a is output_address.  */
11627
11628     case 'A':
11629       /* If X is a constant integer whose low-order 5 bits are zero,
11630          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
11631          in the AIX assembler where "sri" with a zero shift count
11632          writes a trash instruction.  */
11633       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
11634         putc ('l', file);
11635       else
11636         putc ('r', file);
11637       return;
11638
11639     case 'b':
11640       /* If constant, low-order 16 bits of constant, unsigned.
11641          Otherwise, write normally.  */
11642       if (INT_P (x))
11643         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
11644       else
11645         print_operand (file, x, 0);
11646       return;
11647
11648     case 'B':
11649       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
11650          for 64-bit mask direction.  */
11651       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
11652       return;
11653
11654       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
11655          output_operand.  */
11656
11657     case 'c':
11658       /* X is a CR register.  Print the number of the GT bit of the CR.  */
11659       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
11660         output_operand_lossage ("invalid %%E value");
11661       else
11662         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
11663       return;
11664
11665     case 'D':
11666       /* Like 'J' but get to the GT bit only.  */
11667       gcc_assert (GET_CODE (x) == REG);
11668
11669       /* Bit 1 is GT bit.  */
11670       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
11671
11672       /* Add one for shift count in rlinm for scc.  */
11673       fprintf (file, "%d", i + 1);
11674       return;
11675
11676     case 'E':
11677       /* X is a CR register.  Print the number of the EQ bit of the CR */
11678       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
11679         output_operand_lossage ("invalid %%E value");
11680       else
11681         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
11682       return;
11683
11684     case 'f':
11685       /* X is a CR register.  Print the shift count needed to move it
11686          to the high-order four bits.  */
11687       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
11688         output_operand_lossage ("invalid %%f value");
11689       else
11690         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
11691       return;
11692
11693     case 'F':
11694       /* Similar, but print the count for the rotate in the opposite
11695          direction.  */
11696       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
11697         output_operand_lossage ("invalid %%F value");
11698       else
11699         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
11700       return;
11701
11702     case 'G':
11703       /* X is a constant integer.  If it is negative, print "m",
11704          otherwise print "z".  This is to make an aze or ame insn.  */
11705       if (GET_CODE (x) != CONST_INT)
11706         output_operand_lossage ("invalid %%G value");
11707       else if (INTVAL (x) >= 0)
11708         putc ('z', file);
11709       else
11710         putc ('m', file);
11711       return;
11712
11713     case 'h':
11714       /* If constant, output low-order five bits.  Otherwise, write
11715          normally.  */
11716       if (INT_P (x))
11717         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
11718       else
11719         print_operand (file, x, 0);
11720       return;
11721
11722     case 'H':
11723       /* If constant, output low-order six bits.  Otherwise, write
11724          normally.  */
11725       if (INT_P (x))
11726         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
11727       else
11728         print_operand (file, x, 0);
11729       return;
11730
11731     case 'I':
11732       /* Print `i' if this is a constant, else nothing.  */
11733       if (INT_P (x))
11734         putc ('i', file);
11735       return;
11736
11737     case 'j':
11738       /* Write the bit number in CCR for jump.  */
11739       i = ccr_bit (x, 0);
11740       if (i == -1)
11741         output_operand_lossage ("invalid %%j code");
11742       else
11743         fprintf (file, "%d", i);
11744       return;
11745
11746     case 'J':
11747       /* Similar, but add one for shift count in rlinm for scc and pass
11748          scc flag to `ccr_bit'.  */
11749       i = ccr_bit (x, 1);
11750       if (i == -1)
11751         output_operand_lossage ("invalid %%J code");
11752       else
11753         /* If we want bit 31, write a shift count of zero, not 32.  */
11754         fprintf (file, "%d", i == 31 ? 0 : i + 1);
11755       return;
11756
11757     case 'k':
11758       /* X must be a constant.  Write the 1's complement of the
11759          constant.  */
11760       if (! INT_P (x))
11761         output_operand_lossage ("invalid %%k value");
11762       else
11763         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
11764       return;
11765
11766     case 'K':
11767       /* X must be a symbolic constant on ELF.  Write an
11768          expression suitable for an 'addi' that adds in the low 16
11769          bits of the MEM.  */
11770       if (GET_CODE (x) != CONST)
11771         {
11772           print_operand_address (file, x);
11773           fputs ("@l", file);
11774         }
11775       else
11776         {
11777           if (GET_CODE (XEXP (x, 0)) != PLUS
11778               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
11779                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
11780               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
11781             output_operand_lossage ("invalid %%K value");
11782           print_operand_address (file, XEXP (XEXP (x, 0), 0));
11783           fputs ("@l", file);
11784           /* For GNU as, there must be a non-alphanumeric character
11785              between 'l' and the number.  The '-' is added by
11786              print_operand() already.  */
11787           if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
11788             fputs ("+", file);
11789           print_operand (file, XEXP (XEXP (x, 0), 1), 0);
11790         }
11791       return;
11792
11793       /* %l is output_asm_label.  */
11794
11795     case 'L':
11796       /* Write second word of DImode or DFmode reference.  Works on register
11797          or non-indexed memory only.  */
11798       if (GET_CODE (x) == REG)
11799         fputs (reg_names[REGNO (x) + 1], file);
11800       else if (GET_CODE (x) == MEM)
11801         {
11802           /* Handle possible auto-increment.  Since it is pre-increment and
11803              we have already done it, we can just use an offset of word.  */
11804           if (GET_CODE (XEXP (x, 0)) == PRE_INC
11805               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
11806             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
11807                                            UNITS_PER_WORD));
11808           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
11809             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
11810                                            UNITS_PER_WORD));
11811           else
11812             output_address (XEXP (adjust_address_nv (x, SImode,
11813                                                      UNITS_PER_WORD),
11814                                   0));
11815
11816           if (small_data_operand (x, GET_MODE (x)))
11817             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
11818                      reg_names[SMALL_DATA_REG]);
11819         }
11820       return;
11821
11822     case 'm':
11823       /* MB value for a mask operand.  */
11824       if (! mask_operand (x, SImode))
11825         output_operand_lossage ("invalid %%m value");
11826
11827       fprintf (file, "%d", extract_MB (x));
11828       return;
11829
11830     case 'M':
11831       /* ME value for a mask operand.  */
11832       if (! mask_operand (x, SImode))
11833         output_operand_lossage ("invalid %%M value");
11834
11835       fprintf (file, "%d", extract_ME (x));
11836       return;
11837
11838       /* %n outputs the negative of its operand.  */
11839
11840     case 'N':
11841       /* Write the number of elements in the vector times 4.  */
11842       if (GET_CODE (x) != PARALLEL)
11843         output_operand_lossage ("invalid %%N value");
11844       else
11845         fprintf (file, "%d", XVECLEN (x, 0) * 4);
11846       return;
11847
11848     case 'O':
11849       /* Similar, but subtract 1 first.  */
11850       if (GET_CODE (x) != PARALLEL)
11851         output_operand_lossage ("invalid %%O value");
11852       else
11853         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
11854       return;
11855
11856     case 'p':
11857       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
11858       if (! INT_P (x)
11859           || INT_LOWPART (x) < 0
11860           || (i = exact_log2 (INT_LOWPART (x))) < 0)
11861         output_operand_lossage ("invalid %%p value");
11862       else
11863         fprintf (file, "%d", i);
11864       return;
11865
11866     case 'P':
11867       /* The operand must be an indirect memory reference.  The result
11868          is the register name.  */
11869       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
11870           || REGNO (XEXP (x, 0)) >= 32)
11871         output_operand_lossage ("invalid %%P value");
11872       else
11873         fputs (reg_names[REGNO (XEXP (x, 0))], file);
11874       return;
11875
11876     case 'q':
11877       /* This outputs the logical code corresponding to a boolean
11878          expression.  The expression may have one or both operands
11879          negated (if one, only the first one).  For condition register
11880          logical operations, it will also treat the negated
11881          CR codes as NOTs, but not handle NOTs of them.  */
11882       {
11883         const char *const *t = 0;
11884         const char *s;
11885         enum rtx_code code = GET_CODE (x);
11886         static const char * const tbl[3][3] = {
11887           { "and", "andc", "nor" },
11888           { "or", "orc", "nand" },
11889           { "xor", "eqv", "xor" } };
11890
11891         if (code == AND)
11892           t = tbl[0];
11893         else if (code == IOR)
11894           t = tbl[1];
11895         else if (code == XOR)
11896           t = tbl[2];
11897         else
11898           output_operand_lossage ("invalid %%q value");
11899
11900         if (GET_CODE (XEXP (x, 0)) != NOT)
11901           s = t[0];
11902         else
11903           {
11904             if (GET_CODE (XEXP (x, 1)) == NOT)
11905               s = t[2];
11906             else
11907               s = t[1];
11908           }
11909
11910         fputs (s, file);
11911       }
11912       return;
11913
11914     case 'Q':
11915       if (TARGET_MFCRF)
11916         fputc (',', file);
11917         /* FALLTHRU */
11918       else
11919         return;
11920
11921     case 'R':
11922       /* X is a CR register.  Print the mask for `mtcrf'.  */
11923       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
11924         output_operand_lossage ("invalid %%R value");
11925       else
11926         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
11927       return;
11928
11929     case 's':
11930       /* Low 5 bits of 32 - value */
11931       if (! INT_P (x))
11932         output_operand_lossage ("invalid %%s value");
11933       else
11934         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
11935       return;
11936
11937     case 'S':
11938       /* PowerPC64 mask position.  All 0's is excluded.
11939          CONST_INT 32-bit mask is considered sign-extended so any
11940          transition must occur within the CONST_INT, not on the boundary.  */
11941       if (! mask64_operand (x, DImode))
11942         output_operand_lossage ("invalid %%S value");
11943
11944       uval = INT_LOWPART (x);
11945
11946       if (uval & 1)     /* Clear Left */
11947         {
11948 #if HOST_BITS_PER_WIDE_INT > 64
11949           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
11950 #endif
11951           i = 64;
11952         }
11953       else              /* Clear Right */
11954         {
11955           uval = ~uval;
11956 #if HOST_BITS_PER_WIDE_INT > 64
11957           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
11958 #endif
11959           i = 63;
11960         }
11961       while (uval != 0)
11962         --i, uval >>= 1;
11963       gcc_assert (i >= 0);
11964       fprintf (file, "%d", i);
11965       return;
11966
11967     case 't':
11968       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
11969       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
11970
11971       /* Bit 3 is OV bit.  */
11972       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
11973
11974       /* If we want bit 31, write a shift count of zero, not 32.  */
11975       fprintf (file, "%d", i == 31 ? 0 : i + 1);
11976       return;
11977
11978     case 'T':
11979       /* Print the symbolic name of a branch target register.  */
11980       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
11981                                   && REGNO (x) != CTR_REGNO))
11982         output_operand_lossage ("invalid %%T value");
11983       else if (REGNO (x) == LR_REGNO)
11984         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
11985       else
11986         fputs ("ctr", file);
11987       return;
11988
11989     case 'u':
11990       /* High-order 16 bits of constant for use in unsigned operand.  */
11991       if (! INT_P (x))
11992         output_operand_lossage ("invalid %%u value");
11993       else
11994         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
11995                  (INT_LOWPART (x) >> 16) & 0xffff);
11996       return;
11997
11998     case 'v':
11999       /* High-order 16 bits of constant for use in signed operand.  */
12000       if (! INT_P (x))
12001         output_operand_lossage ("invalid %%v value");
12002       else
12003         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
12004                  (INT_LOWPART (x) >> 16) & 0xffff);
12005       return;
12006
12007     case 'U':
12008       /* Print `u' if this has an auto-increment or auto-decrement.  */
12009       if (GET_CODE (x) == MEM
12010           && (GET_CODE (XEXP (x, 0)) == PRE_INC
12011               || GET_CODE (XEXP (x, 0)) == PRE_DEC
12012               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
12013         putc ('u', file);
12014       return;
12015
12016     case 'V':
12017       /* Print the trap code for this operand.  */
12018       switch (GET_CODE (x))
12019         {
12020         case EQ:
12021           fputs ("eq", file);   /* 4 */
12022           break;
12023         case NE:
12024           fputs ("ne", file);   /* 24 */
12025           break;
12026         case LT:
12027           fputs ("lt", file);   /* 16 */
12028           break;
12029         case LE:
12030           fputs ("le", file);   /* 20 */
12031           break;
12032         case GT:
12033           fputs ("gt", file);   /* 8 */
12034           break;
12035         case GE:
12036           fputs ("ge", file);   /* 12 */
12037           break;
12038         case LTU:
12039           fputs ("llt", file);  /* 2 */
12040           break;
12041         case LEU:
12042           fputs ("lle", file);  /* 6 */
12043           break;
12044         case GTU:
12045           fputs ("lgt", file);  /* 1 */
12046           break;
12047         case GEU:
12048           fputs ("lge", file);  /* 5 */
12049           break;
12050         default:
12051           gcc_unreachable ();
12052         }
12053       break;
12054
12055     case 'w':
12056       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
12057          normally.  */
12058       if (INT_P (x))
12059         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
12060                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
12061       else
12062         print_operand (file, x, 0);
12063       return;
12064
12065     case 'W':
12066       /* MB value for a PowerPC64 rldic operand.  */
12067       val = (GET_CODE (x) == CONST_INT
12068              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
12069
12070       if (val < 0)
12071         i = -1;
12072       else
12073         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
12074           if ((val <<= 1) < 0)
12075             break;
12076
12077 #if HOST_BITS_PER_WIDE_INT == 32
12078       if (GET_CODE (x) == CONST_INT && i >= 0)
12079         i += 32;  /* zero-extend high-part was all 0's */
12080       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
12081         {
12082           val = CONST_DOUBLE_LOW (x);
12083
12084           gcc_assert (val);
12085           if (val < 0)
12086             --i;
12087           else
12088             for ( ; i < 64; i++)
12089               if ((val <<= 1) < 0)
12090                 break;
12091         }
12092 #endif
12093
12094       fprintf (file, "%d", i + 1);
12095       return;
12096
12097     case 'X':
12098       if (GET_CODE (x) == MEM
12099           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
12100               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
12101                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
12102         putc ('x', file);
12103       return;
12104
12105     case 'Y':
12106       /* Like 'L', for third word of TImode  */
12107       if (GET_CODE (x) == REG)
12108         fputs (reg_names[REGNO (x) + 2], file);
12109       else if (GET_CODE (x) == MEM)
12110         {
12111           if (GET_CODE (XEXP (x, 0)) == PRE_INC
12112               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
12113             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
12114           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12115             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
12116           else
12117             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
12118           if (small_data_operand (x, GET_MODE (x)))
12119             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12120                      reg_names[SMALL_DATA_REG]);
12121         }
12122       return;
12123
12124     case 'z':
12125       /* X is a SYMBOL_REF.  Write out the name preceded by a
12126          period and without any trailing data in brackets.  Used for function
12127          names.  If we are configured for System V (or the embedded ABI) on
12128          the PowerPC, do not emit the period, since those systems do not use
12129          TOCs and the like.  */
12130       gcc_assert (GET_CODE (x) == SYMBOL_REF);
12131
12132       /* Mark the decl as referenced so that cgraph will output the
12133          function.  */
12134       if (SYMBOL_REF_DECL (x))
12135         mark_decl_referenced (SYMBOL_REF_DECL (x));
12136
12137       /* For macho, check to see if we need a stub.  */
12138       if (TARGET_MACHO)
12139         {
12140           const char *name = XSTR (x, 0);
12141 #if TARGET_MACHO
12142           if (MACHOPIC_INDIRECT
12143               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
12144             name = machopic_indirection_name (x, /*stub_p=*/true);
12145 #endif
12146           assemble_name (file, name);
12147         }
12148       else if (!DOT_SYMBOLS)
12149         assemble_name (file, XSTR (x, 0));
12150       else
12151         rs6000_output_function_entry (file, XSTR (x, 0));
12152       return;
12153
12154     case 'Z':
12155       /* Like 'L', for last word of TImode.  */
12156       if (GET_CODE (x) == REG)
12157         fputs (reg_names[REGNO (x) + 3], file);
12158       else if (GET_CODE (x) == MEM)
12159         {
12160           if (GET_CODE (XEXP (x, 0)) == PRE_INC
12161               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
12162             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
12163           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12164             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
12165           else
12166             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
12167           if (small_data_operand (x, GET_MODE (x)))
12168             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12169                      reg_names[SMALL_DATA_REG]);
12170         }
12171       return;
12172
12173       /* Print AltiVec or SPE memory operand.  */
12174     case 'y':
12175       {
12176         rtx tmp;
12177
12178         gcc_assert (GET_CODE (x) == MEM);
12179
12180         tmp = XEXP (x, 0);
12181
12182         /* Ugly hack because %y is overloaded.  */
12183         if ((TARGET_SPE || TARGET_E500_DOUBLE)
12184             && (GET_MODE_SIZE (GET_MODE (x)) == 8
12185                 || GET_MODE (x) == TFmode
12186                 || GET_MODE (x) == TImode))
12187           {
12188             /* Handle [reg].  */
12189             if (GET_CODE (tmp) == REG)
12190               {
12191                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
12192                 break;
12193               }
12194             /* Handle [reg+UIMM].  */
12195             else if (GET_CODE (tmp) == PLUS &&
12196                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
12197               {
12198                 int x;
12199
12200                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
12201
12202                 x = INTVAL (XEXP (tmp, 1));
12203                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
12204                 break;
12205               }
12206
12207             /* Fall through.  Must be [reg+reg].  */
12208           }
12209         if (TARGET_ALTIVEC
12210             && GET_CODE (tmp) == AND
12211             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
12212             && INTVAL (XEXP (tmp, 1)) == -16)
12213           tmp = XEXP (tmp, 0);
12214         if (GET_CODE (tmp) == REG)
12215           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
12216         else
12217           {
12218             gcc_assert (GET_CODE (tmp) == PLUS
12219                         && REG_P (XEXP (tmp, 0))
12220                         && REG_P (XEXP (tmp, 1)));
12221
12222             if (REGNO (XEXP (tmp, 0)) == 0)
12223               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
12224                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
12225             else
12226               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
12227                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
12228           }
12229         break;
12230       }
12231
12232     case 0:
12233       if (GET_CODE (x) == REG)
12234         fprintf (file, "%s", reg_names[REGNO (x)]);
12235       else if (GET_CODE (x) == MEM)
12236         {
12237           /* We need to handle PRE_INC and PRE_DEC here, since we need to
12238              know the width from the mode.  */
12239           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
12240             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
12241                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
12242           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
12243             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
12244                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
12245           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12246             output_address (XEXP (XEXP (x, 0), 1));
12247           else
12248             output_address (XEXP (x, 0));
12249         }
12250       else
12251         output_addr_const (file, x);
12252       return;
12253
12254     case '&':
12255       assemble_name (file, rs6000_get_some_local_dynamic_name ());
12256       return;
12257
12258     default:
12259       output_operand_lossage ("invalid %%xn code");
12260     }
12261 }
12262 \f
12263 /* Print the address of an operand.  */
12264
12265 void
12266 print_operand_address (FILE *file, rtx x)
12267 {
12268   if (GET_CODE (x) == REG)
12269     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
12270   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
12271            || GET_CODE (x) == LABEL_REF)
12272     {
12273       output_addr_const (file, x);
12274       if (small_data_operand (x, GET_MODE (x)))
12275         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12276                  reg_names[SMALL_DATA_REG]);
12277       else
12278         gcc_assert (!TARGET_TOC);
12279     }
12280   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
12281     {
12282       gcc_assert (REG_P (XEXP (x, 0)));
12283       if (REGNO (XEXP (x, 0)) == 0)
12284         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
12285                  reg_names[ REGNO (XEXP (x, 0)) ]);
12286       else
12287         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
12288                  reg_names[ REGNO (XEXP (x, 1)) ]);
12289     }
12290   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
12291     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
12292              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
12293 #if TARGET_ELF
12294   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
12295            && CONSTANT_P (XEXP (x, 1)))
12296     {
12297       output_addr_const (file, XEXP (x, 1));
12298       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
12299     }
12300 #endif
12301 #if TARGET_MACHO
12302   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
12303            && CONSTANT_P (XEXP (x, 1)))
12304     {
12305       fprintf (file, "lo16(");
12306       output_addr_const (file, XEXP (x, 1));
12307       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
12308     }
12309 #endif
12310   else if (legitimate_constant_pool_address_p (x))
12311     {
12312       if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
12313         {
12314           rtx contains_minus = XEXP (x, 1);
12315           rtx minus, symref;
12316           const char *name;
12317
12318           /* Find the (minus (sym) (toc)) buried in X, and temporarily
12319              turn it into (sym) for output_addr_const.  */
12320           while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
12321             contains_minus = XEXP (contains_minus, 0);
12322
12323           minus = XEXP (contains_minus, 0);
12324           symref = XEXP (minus, 0);
12325           XEXP (contains_minus, 0) = symref;
12326           if (TARGET_ELF)
12327             {
12328               char *newname;
12329
12330               name = XSTR (symref, 0);
12331               newname = alloca (strlen (name) + sizeof ("@toc"));
12332               strcpy (newname, name);
12333               strcat (newname, "@toc");
12334               XSTR (symref, 0) = newname;
12335             }
12336           output_addr_const (file, XEXP (x, 1));
12337           if (TARGET_ELF)
12338             XSTR (symref, 0) = name;
12339           XEXP (contains_minus, 0) = minus;
12340         }
12341       else
12342         output_addr_const (file, XEXP (x, 1));
12343
12344       fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
12345     }
12346   else
12347     gcc_unreachable ();
12348 }
12349 \f
12350 /* Target hook for assembling integer objects.  The PowerPC version has
12351    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
12352    is defined.  It also needs to handle DI-mode objects on 64-bit
12353    targets.  */
12354
12355 static bool
12356 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
12357 {
12358 #ifdef RELOCATABLE_NEEDS_FIXUP
12359   /* Special handling for SI values.  */
12360   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
12361     {
12362       static int recurse = 0;
12363
12364       /* For -mrelocatable, we mark all addresses that need to be fixed up
12365          in the .fixup section.  */
12366       if (TARGET_RELOCATABLE
12367           && in_section != toc_section
12368           && in_section != text_section
12369           && !unlikely_text_section_p (in_section)
12370           && !recurse
12371           && GET_CODE (x) != CONST_INT
12372           && GET_CODE (x) != CONST_DOUBLE
12373           && CONSTANT_P (x))
12374         {
12375           char buf[256];
12376
12377           recurse = 1;
12378           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
12379           fixuplabelno++;
12380           ASM_OUTPUT_LABEL (asm_out_file, buf);
12381           fprintf (asm_out_file, "\t.long\t(");
12382           output_addr_const (asm_out_file, x);
12383           fprintf (asm_out_file, ")@fixup\n");
12384           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
12385           ASM_OUTPUT_ALIGN (asm_out_file, 2);
12386           fprintf (asm_out_file, "\t.long\t");
12387           assemble_name (asm_out_file, buf);
12388           fprintf (asm_out_file, "\n\t.previous\n");
12389           recurse = 0;
12390           return true;
12391         }
12392       /* Remove initial .'s to turn a -mcall-aixdesc function
12393          address into the address of the descriptor, not the function
12394          itself.  */
12395       else if (GET_CODE (x) == SYMBOL_REF
12396                && XSTR (x, 0)[0] == '.'
12397                && DEFAULT_ABI == ABI_AIX)
12398         {
12399           const char *name = XSTR (x, 0);
12400           while (*name == '.')
12401             name++;
12402
12403           fprintf (asm_out_file, "\t.long\t%s\n", name);
12404           return true;
12405         }
12406     }
12407 #endif /* RELOCATABLE_NEEDS_FIXUP */
12408   return default_assemble_integer (x, size, aligned_p);
12409 }
12410
12411 #ifdef HAVE_GAS_HIDDEN
12412 /* Emit an assembler directive to set symbol visibility for DECL to
12413    VISIBILITY_TYPE.  */
12414
12415 static void
12416 rs6000_assemble_visibility (tree decl, int vis)
12417 {
12418   /* Functions need to have their entry point symbol visibility set as
12419      well as their descriptor symbol visibility.  */
12420   if (DEFAULT_ABI == ABI_AIX
12421       && DOT_SYMBOLS
12422       && TREE_CODE (decl) == FUNCTION_DECL)
12423     {
12424       static const char * const visibility_types[] = {
12425         NULL, "internal", "hidden", "protected"
12426       };
12427
12428       const char *name, *type;
12429
12430       name = ((* targetm.strip_name_encoding)
12431               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
12432       type = visibility_types[vis];
12433
12434       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
12435       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
12436     }
12437   else
12438     default_assemble_visibility (decl, vis);
12439 }
12440 #endif
12441 \f
12442 enum rtx_code
12443 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
12444 {
12445   /* Reversal of FP compares takes care -- an ordered compare
12446      becomes an unordered compare and vice versa.  */
12447   if (mode == CCFPmode
12448       && (!flag_finite_math_only
12449           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
12450           || code == UNEQ || code == LTGT))
12451     return reverse_condition_maybe_unordered (code);
12452   else
12453     return reverse_condition (code);
12454 }
12455
12456 /* Generate a compare for CODE.  Return a brand-new rtx that
12457    represents the result of the compare.  */
12458
12459 static rtx
12460 rs6000_generate_compare (enum rtx_code code)
12461 {
12462   enum machine_mode comp_mode;
12463   rtx compare_result;
12464
12465   if (rs6000_compare_fp_p)
12466     comp_mode = CCFPmode;
12467   else if (code == GTU || code == LTU
12468            || code == GEU || code == LEU)
12469     comp_mode = CCUNSmode;
12470   else if ((code == EQ || code == NE)
12471            && GET_CODE (rs6000_compare_op0) == SUBREG
12472            && GET_CODE (rs6000_compare_op1) == SUBREG
12473            && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op0)
12474            && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op1))
12475     /* These are unsigned values, perhaps there will be a later
12476        ordering compare that can be shared with this one.
12477        Unfortunately we cannot detect the signedness of the operands
12478        for non-subregs.  */
12479     comp_mode = CCUNSmode;
12480   else
12481     comp_mode = CCmode;
12482
12483   /* First, the compare.  */
12484   compare_result = gen_reg_rtx (comp_mode);
12485
12486   /* E500 FP compare instructions on the GPRs.  Yuck!  */
12487   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
12488       && rs6000_compare_fp_p)
12489     {
12490       rtx cmp, or_result, compare_result2;
12491       enum machine_mode op_mode = GET_MODE (rs6000_compare_op0);
12492
12493       if (op_mode == VOIDmode)
12494         op_mode = GET_MODE (rs6000_compare_op1);
12495
12496       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
12497          This explains the following mess.  */
12498
12499       switch (code)
12500         {
12501         case EQ: case UNEQ: case NE: case LTGT:
12502           switch (op_mode)
12503             {
12504             case SFmode:
12505               cmp = flag_unsafe_math_optimizations
12506                 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
12507                                    rs6000_compare_op1)
12508                 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
12509                                    rs6000_compare_op1);
12510               break;
12511
12512             case DFmode:
12513               cmp = flag_unsafe_math_optimizations
12514                 ? gen_tstdfeq_gpr (compare_result, rs6000_compare_op0,
12515                                    rs6000_compare_op1)
12516                 : gen_cmpdfeq_gpr (compare_result, rs6000_compare_op0,
12517                                    rs6000_compare_op1);
12518               break;
12519
12520             case TFmode:
12521               cmp = flag_unsafe_math_optimizations
12522                 ? gen_tsttfeq_gpr (compare_result, rs6000_compare_op0,
12523                                    rs6000_compare_op1)
12524                 : gen_cmptfeq_gpr (compare_result, rs6000_compare_op0,
12525                                    rs6000_compare_op1);
12526               break;
12527
12528             default:
12529               gcc_unreachable ();
12530             }
12531           break;
12532
12533         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
12534           switch (op_mode)
12535             {
12536             case SFmode:
12537               cmp = flag_unsafe_math_optimizations
12538                 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
12539                                    rs6000_compare_op1)
12540                 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
12541                                    rs6000_compare_op1);
12542               break;
12543
12544             case DFmode:
12545               cmp = flag_unsafe_math_optimizations
12546                 ? gen_tstdfgt_gpr (compare_result, rs6000_compare_op0,
12547                                    rs6000_compare_op1)
12548                 : gen_cmpdfgt_gpr (compare_result, rs6000_compare_op0,
12549                                    rs6000_compare_op1);
12550               break;
12551
12552             case TFmode:
12553               cmp = flag_unsafe_math_optimizations
12554                 ? gen_tsttfgt_gpr (compare_result, rs6000_compare_op0,
12555                                    rs6000_compare_op1)
12556                 : gen_cmptfgt_gpr (compare_result, rs6000_compare_op0,
12557                                    rs6000_compare_op1);
12558               break;
12559
12560             default:
12561               gcc_unreachable ();
12562             }
12563           break;
12564
12565         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
12566           switch (op_mode)
12567             {
12568             case SFmode:
12569               cmp = flag_unsafe_math_optimizations
12570                 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
12571                                    rs6000_compare_op1)
12572                 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
12573                                    rs6000_compare_op1);
12574               break;
12575
12576             case DFmode:
12577               cmp = flag_unsafe_math_optimizations
12578                 ? gen_tstdflt_gpr (compare_result, rs6000_compare_op0,
12579                                    rs6000_compare_op1)
12580                 : gen_cmpdflt_gpr (compare_result, rs6000_compare_op0,
12581                                    rs6000_compare_op1);
12582               break;
12583
12584             case TFmode:
12585               cmp = flag_unsafe_math_optimizations
12586                 ? gen_tsttflt_gpr (compare_result, rs6000_compare_op0,
12587                                    rs6000_compare_op1)
12588                 : gen_cmptflt_gpr (compare_result, rs6000_compare_op0,
12589                                    rs6000_compare_op1);
12590               break;
12591
12592             default:
12593               gcc_unreachable ();
12594             }
12595           break;
12596         default:
12597           gcc_unreachable ();
12598         }
12599
12600       /* Synthesize LE and GE from LT/GT || EQ.  */
12601       if (code == LE || code == GE || code == LEU || code == GEU)
12602         {
12603           emit_insn (cmp);
12604
12605           switch (code)
12606             {
12607             case LE: code = LT; break;
12608             case GE: code = GT; break;
12609             case LEU: code = LT; break;
12610             case GEU: code = GT; break;
12611             default: gcc_unreachable ();
12612             }
12613
12614           compare_result2 = gen_reg_rtx (CCFPmode);
12615
12616           /* Do the EQ.  */
12617           switch (op_mode)
12618             {
12619             case SFmode:
12620               cmp = flag_unsafe_math_optimizations
12621                 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
12622                                    rs6000_compare_op1)
12623                 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
12624                                    rs6000_compare_op1);
12625               break;
12626
12627             case DFmode:
12628               cmp = flag_unsafe_math_optimizations
12629                 ? gen_tstdfeq_gpr (compare_result2, rs6000_compare_op0,
12630                                    rs6000_compare_op1)
12631                 : gen_cmpdfeq_gpr (compare_result2, rs6000_compare_op0,
12632                                    rs6000_compare_op1);
12633               break;
12634
12635             case TFmode:
12636               cmp = flag_unsafe_math_optimizations
12637                 ? gen_tsttfeq_gpr (compare_result2, rs6000_compare_op0,
12638                                    rs6000_compare_op1)
12639                 : gen_cmptfeq_gpr (compare_result2, rs6000_compare_op0,
12640                                    rs6000_compare_op1);
12641               break;
12642
12643             default:
12644               gcc_unreachable ();
12645             }
12646           emit_insn (cmp);
12647
12648           /* OR them together.  */
12649           or_result = gen_reg_rtx (CCFPmode);
12650           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
12651                                            compare_result2);
12652           compare_result = or_result;
12653           code = EQ;
12654         }
12655       else
12656         {
12657           if (code == NE || code == LTGT)
12658             code = NE;
12659           else
12660             code = EQ;
12661         }
12662
12663       emit_insn (cmp);
12664     }
12665   else
12666     {
12667       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
12668          CLOBBERs to match cmptf_internal2 pattern.  */
12669       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
12670           && GET_MODE (rs6000_compare_op0) == TFmode
12671           && !TARGET_IEEEQUAD
12672           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
12673         emit_insn (gen_rtx_PARALLEL (VOIDmode,
12674           gen_rtvec (9,
12675                      gen_rtx_SET (VOIDmode,
12676                                   compare_result,
12677                                   gen_rtx_COMPARE (comp_mode,
12678                                                    rs6000_compare_op0,
12679                                                    rs6000_compare_op1)),
12680                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12681                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12682                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12683                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12684                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12685                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12686                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12687                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)))));
12688       else if (GET_CODE (rs6000_compare_op1) == UNSPEC
12689                && XINT (rs6000_compare_op1, 1) == UNSPEC_SP_TEST)
12690         {
12691           rtx op1 = XVECEXP (rs6000_compare_op1, 0, 0);
12692           comp_mode = CCEQmode;
12693           compare_result = gen_reg_rtx (CCEQmode);
12694           if (TARGET_64BIT)
12695             emit_insn (gen_stack_protect_testdi (compare_result,
12696                                                  rs6000_compare_op0, op1));
12697           else
12698             emit_insn (gen_stack_protect_testsi (compare_result,
12699                                                  rs6000_compare_op0, op1));
12700         }
12701       else
12702         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
12703                                 gen_rtx_COMPARE (comp_mode,
12704                                                  rs6000_compare_op0,
12705                                                  rs6000_compare_op1)));
12706     }
12707
12708   /* Some kinds of FP comparisons need an OR operation;
12709      under flag_finite_math_only we don't bother.  */
12710   if (rs6000_compare_fp_p
12711       && !flag_finite_math_only
12712       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
12713       && (code == LE || code == GE
12714           || code == UNEQ || code == LTGT
12715           || code == UNGT || code == UNLT))
12716     {
12717       enum rtx_code or1, or2;
12718       rtx or1_rtx, or2_rtx, compare2_rtx;
12719       rtx or_result = gen_reg_rtx (CCEQmode);
12720
12721       switch (code)
12722         {
12723         case LE: or1 = LT;  or2 = EQ;  break;
12724         case GE: or1 = GT;  or2 = EQ;  break;
12725         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
12726         case LTGT: or1 = LT;  or2 = GT;  break;
12727         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
12728         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
12729         default:  gcc_unreachable ();
12730         }
12731       validate_condition_mode (or1, comp_mode);
12732       validate_condition_mode (or2, comp_mode);
12733       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
12734       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
12735       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
12736                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
12737                                       const_true_rtx);
12738       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
12739
12740       compare_result = or_result;
12741       code = EQ;
12742     }
12743
12744   validate_condition_mode (code, GET_MODE (compare_result));
12745
12746   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
12747 }
12748
12749
12750 /* Emit the RTL for an sCOND pattern.  */
12751
12752 void
12753 rs6000_emit_sCOND (enum rtx_code code, rtx result)
12754 {
12755   rtx condition_rtx;
12756   enum machine_mode op_mode;
12757   enum rtx_code cond_code;
12758
12759   condition_rtx = rs6000_generate_compare (code);
12760   cond_code = GET_CODE (condition_rtx);
12761
12762   if (rs6000_compare_fp_p
12763       && !TARGET_FPRS && TARGET_HARD_FLOAT)
12764     {
12765       rtx t;
12766
12767       PUT_MODE (condition_rtx, SImode);
12768       t = XEXP (condition_rtx, 0);
12769
12770       gcc_assert (cond_code == NE || cond_code == EQ);
12771
12772       if (cond_code == NE)
12773         emit_insn (gen_e500_flip_gt_bit (t, t));
12774
12775       emit_insn (gen_move_from_CR_gt_bit (result, t));
12776       return;
12777     }
12778
12779   if (cond_code == NE
12780       || cond_code == GE || cond_code == LE
12781       || cond_code == GEU || cond_code == LEU
12782       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
12783     {
12784       rtx not_result = gen_reg_rtx (CCEQmode);
12785       rtx not_op, rev_cond_rtx;
12786       enum machine_mode cc_mode;
12787
12788       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
12789
12790       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
12791                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
12792       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
12793       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
12794       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
12795     }
12796
12797   op_mode = GET_MODE (rs6000_compare_op0);
12798   if (op_mode == VOIDmode)
12799     op_mode = GET_MODE (rs6000_compare_op1);
12800
12801   if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
12802     {
12803       PUT_MODE (condition_rtx, DImode);
12804       convert_move (result, condition_rtx, 0);
12805     }
12806   else
12807     {
12808       PUT_MODE (condition_rtx, SImode);
12809       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
12810     }
12811 }
12812
12813 /* Emit a branch of kind CODE to location LOC.  */
12814
12815 void
12816 rs6000_emit_cbranch (enum rtx_code code, rtx loc)
12817 {
12818   rtx condition_rtx, loc_ref;
12819
12820   condition_rtx = rs6000_generate_compare (code);
12821   loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
12822   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
12823                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
12824                                                      loc_ref, pc_rtx)));
12825 }
12826
12827 /* Return the string to output a conditional branch to LABEL, which is
12828    the operand number of the label, or -1 if the branch is really a
12829    conditional return.
12830
12831    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
12832    condition code register and its mode specifies what kind of
12833    comparison we made.
12834
12835    REVERSED is nonzero if we should reverse the sense of the comparison.
12836
12837    INSN is the insn.  */
12838
12839 char *
12840 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
12841 {
12842   static char string[64];
12843   enum rtx_code code = GET_CODE (op);
12844   rtx cc_reg = XEXP (op, 0);
12845   enum machine_mode mode = GET_MODE (cc_reg);
12846   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
12847   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12848   int really_reversed = reversed ^ need_longbranch;
12849   char *s = string;
12850   const char *ccode;
12851   const char *pred;
12852   rtx note;
12853
12854   validate_condition_mode (code, mode);
12855
12856   /* Work out which way this really branches.  We could use
12857      reverse_condition_maybe_unordered here always but this
12858      makes the resulting assembler clearer.  */
12859   if (really_reversed)
12860     {
12861       /* Reversal of FP compares takes care -- an ordered compare
12862          becomes an unordered compare and vice versa.  */
12863       if (mode == CCFPmode)
12864         code = reverse_condition_maybe_unordered (code);
12865       else
12866         code = reverse_condition (code);
12867     }
12868
12869   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
12870     {
12871       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
12872          to the GT bit.  */
12873       switch (code)
12874         {
12875         case EQ:
12876           /* Opposite of GT.  */
12877           code = GT;
12878           break;
12879
12880         case NE:
12881           code = UNLE;
12882           break;
12883
12884         default:
12885           gcc_unreachable ();
12886         }
12887     }
12888
12889   switch (code)
12890     {
12891       /* Not all of these are actually distinct opcodes, but
12892          we distinguish them for clarity of the resulting assembler.  */
12893     case NE: case LTGT:
12894       ccode = "ne"; break;
12895     case EQ: case UNEQ:
12896       ccode = "eq"; break;
12897     case GE: case GEU:
12898       ccode = "ge"; break;
12899     case GT: case GTU: case UNGT:
12900       ccode = "gt"; break;
12901     case LE: case LEU:
12902       ccode = "le"; break;
12903     case LT: case LTU: case UNLT:
12904       ccode = "lt"; break;
12905     case UNORDERED: ccode = "un"; break;
12906     case ORDERED: ccode = "nu"; break;
12907     case UNGE: ccode = "nl"; break;
12908     case UNLE: ccode = "ng"; break;
12909     default:
12910       gcc_unreachable ();
12911     }
12912
12913   /* Maybe we have a guess as to how likely the branch is.
12914      The old mnemonics don't have a way to specify this information.  */
12915   pred = "";
12916   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
12917   if (note != NULL_RTX)
12918     {
12919       /* PROB is the difference from 50%.  */
12920       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
12921
12922       /* Only hint for highly probable/improbable branches on newer
12923          cpus as static prediction overrides processor dynamic
12924          prediction.  For older cpus we may as well always hint, but
12925          assume not taken for branches that are very close to 50% as a
12926          mispredicted taken branch is more expensive than a
12927          mispredicted not-taken branch.  */
12928       if (rs6000_always_hint
12929           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
12930               && br_prob_note_reliable_p (note)))
12931         {
12932           if (abs (prob) > REG_BR_PROB_BASE / 20
12933               && ((prob > 0) ^ need_longbranch))
12934             pred = "+";
12935           else
12936             pred = "-";
12937         }
12938     }
12939
12940   if (label == NULL)
12941     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12942   else
12943     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12944
12945   /* We need to escape any '%' characters in the reg_names string.
12946      Assume they'd only be the first character....  */
12947   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
12948     *s++ = '%';
12949   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12950
12951   if (label != NULL)
12952     {
12953       /* If the branch distance was too far, we may have to use an
12954          unconditional branch to go the distance.  */
12955       if (need_longbranch)
12956         s += sprintf (s, ",$+8\n\tb %s", label);
12957       else
12958         s += sprintf (s, ",%s", label);
12959     }
12960
12961   return string;
12962 }
12963
12964 /* Return the string to flip the GT bit on a CR.  */
12965 char *
12966 output_e500_flip_gt_bit (rtx dst, rtx src)
12967 {
12968   static char string[64];
12969   int a, b;
12970
12971   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
12972               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
12973
12974   /* GT bit.  */
12975   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
12976   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
12977
12978   sprintf (string, "crnot %d,%d", a, b);
12979   return string;
12980 }
12981
12982 /* Return insn index for the vector compare instruction for given CODE,
12983    and DEST_MODE, OP_MODE. Return INSN_NOT_AVAILABLE if valid insn is
12984    not available.  */
12985
12986 static int
12987 get_vec_cmp_insn (enum rtx_code code,
12988                   enum machine_mode dest_mode,
12989                   enum machine_mode op_mode)
12990 {
12991   if (!TARGET_ALTIVEC)
12992     return INSN_NOT_AVAILABLE;
12993
12994   switch (code)
12995     {
12996     case EQ:
12997       if (dest_mode == V16QImode && op_mode == V16QImode)
12998         return UNSPEC_VCMPEQUB;
12999       if (dest_mode == V8HImode && op_mode == V8HImode)
13000         return UNSPEC_VCMPEQUH;
13001       if (dest_mode == V4SImode && op_mode == V4SImode)
13002         return UNSPEC_VCMPEQUW;
13003       if (dest_mode == V4SImode && op_mode == V4SFmode)
13004         return UNSPEC_VCMPEQFP;
13005       break;
13006     case GE:
13007       if (dest_mode == V4SImode && op_mode == V4SFmode)
13008         return UNSPEC_VCMPGEFP;
13009     case GT:
13010       if (dest_mode == V16QImode && op_mode == V16QImode)
13011         return UNSPEC_VCMPGTSB;
13012       if (dest_mode == V8HImode && op_mode == V8HImode)
13013         return UNSPEC_VCMPGTSH;
13014       if (dest_mode == V4SImode && op_mode == V4SImode)
13015         return UNSPEC_VCMPGTSW;
13016       if (dest_mode == V4SImode && op_mode == V4SFmode)
13017         return UNSPEC_VCMPGTFP;
13018       break;
13019     case GTU:
13020       if (dest_mode == V16QImode && op_mode == V16QImode)
13021         return UNSPEC_VCMPGTUB;
13022       if (dest_mode == V8HImode && op_mode == V8HImode)
13023         return UNSPEC_VCMPGTUH;
13024       if (dest_mode == V4SImode && op_mode == V4SImode)
13025         return UNSPEC_VCMPGTUW;
13026       break;
13027     default:
13028       break;
13029     }
13030   return INSN_NOT_AVAILABLE;
13031 }
13032
13033 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
13034    DMODE is expected destination mode. This is a recursive function.  */
13035
13036 static rtx
13037 rs6000_emit_vector_compare (enum rtx_code rcode,
13038                             rtx op0, rtx op1,
13039                             enum machine_mode dmode)
13040 {
13041   int vec_cmp_insn;
13042   rtx mask;
13043   enum machine_mode dest_mode;
13044   enum machine_mode op_mode = GET_MODE (op1);
13045
13046   gcc_assert (TARGET_ALTIVEC);
13047   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
13048
13049   /* Floating point vector compare instructions uses destination V4SImode.
13050      Move destination to appropriate mode later.  */
13051   if (dmode == V4SFmode)
13052     dest_mode = V4SImode;
13053   else
13054     dest_mode = dmode;
13055
13056   mask = gen_reg_rtx (dest_mode);
13057   vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
13058
13059   if (vec_cmp_insn == INSN_NOT_AVAILABLE)
13060     {
13061       bool swap_operands = false;
13062       bool try_again = false;
13063       switch (rcode)
13064         {
13065         case LT:
13066           rcode = GT;
13067           swap_operands = true;
13068           try_again = true;
13069           break;
13070         case LTU:
13071           rcode = GTU;
13072           swap_operands = true;
13073           try_again = true;
13074           break;
13075         case NE:
13076         case UNLE:
13077         case UNLT:
13078         case UNGE:
13079         case UNGT:
13080           /* Invert condition and try again.
13081              e.g., A != B becomes ~(A==B).  */
13082           {
13083             enum rtx_code rev_code;
13084             enum insn_code nor_code;
13085             rtx eq_rtx;
13086
13087             rev_code = reverse_condition_maybe_unordered (rcode);
13088             eq_rtx = rs6000_emit_vector_compare (rev_code, op0, op1,
13089                                                  dest_mode);
13090
13091             nor_code = optab_handler (one_cmpl_optab, (int)dest_mode)->insn_code;
13092             gcc_assert (nor_code != CODE_FOR_nothing);
13093             emit_insn (GEN_FCN (nor_code) (mask, eq_rtx));
13094
13095             if (dmode != dest_mode)
13096               {
13097                 rtx temp = gen_reg_rtx (dest_mode);
13098                 convert_move (temp, mask, 0);
13099                 return temp;
13100               }
13101             return mask;
13102           }
13103           break;
13104         case GE:
13105         case GEU:
13106         case LE:
13107         case LEU:
13108           /* Try GT/GTU/LT/LTU OR EQ */
13109           {
13110             rtx c_rtx, eq_rtx;
13111             enum insn_code ior_code;
13112             enum rtx_code new_code;
13113
13114             switch (rcode)
13115               {
13116               case  GE:
13117                 new_code = GT;
13118                 break;
13119
13120               case GEU:
13121                 new_code = GTU;
13122                 break;
13123
13124               case LE:
13125                 new_code = LT;
13126                 break;
13127
13128               case LEU:
13129                 new_code = LTU;
13130                 break;
13131
13132               default:
13133                 gcc_unreachable ();
13134               }
13135
13136             c_rtx = rs6000_emit_vector_compare (new_code,
13137                                                 op0, op1, dest_mode);
13138             eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
13139                                                  dest_mode);
13140
13141             ior_code = optab_handler (ior_optab, (int)dest_mode)->insn_code;
13142             gcc_assert (ior_code != CODE_FOR_nothing);
13143             emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
13144             if (dmode != dest_mode)
13145               {
13146                 rtx temp = gen_reg_rtx (dest_mode);
13147                 convert_move (temp, mask, 0);
13148                 return temp;
13149               }
13150             return mask;
13151           }
13152           break;
13153         default:
13154           gcc_unreachable ();
13155         }
13156
13157       if (try_again)
13158         {
13159           vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
13160           /* You only get two chances.  */
13161           gcc_assert (vec_cmp_insn != INSN_NOT_AVAILABLE);
13162         }
13163
13164       if (swap_operands)
13165         {
13166           rtx tmp;
13167           tmp = op0;
13168           op0 = op1;
13169           op1 = tmp;
13170         }
13171     }
13172
13173   emit_insn (gen_rtx_SET (VOIDmode, mask,
13174                           gen_rtx_UNSPEC (dest_mode,
13175                                           gen_rtvec (2, op0, op1),
13176                                           vec_cmp_insn)));
13177   if (dmode != dest_mode)
13178     {
13179       rtx temp = gen_reg_rtx (dest_mode);
13180       convert_move (temp, mask, 0);
13181       return temp;
13182     }
13183   return mask;
13184 }
13185
13186 /* Return vector select instruction for MODE. Return INSN_NOT_AVAILABLE, if
13187    valid insn doesn exist for given mode.  */
13188
13189 static int
13190 get_vsel_insn (enum machine_mode mode)
13191 {
13192   switch (mode)
13193     {
13194     case V4SImode:
13195       return UNSPEC_VSEL4SI;
13196       break;
13197     case V4SFmode:
13198       return UNSPEC_VSEL4SF;
13199       break;
13200     case V8HImode:
13201       return UNSPEC_VSEL8HI;
13202       break;
13203     case V16QImode:
13204       return UNSPEC_VSEL16QI;
13205       break;
13206     default:
13207       return INSN_NOT_AVAILABLE;
13208       break;
13209     }
13210   return INSN_NOT_AVAILABLE;
13211 }
13212
13213 /* Emit vector select insn where DEST is destination using
13214    operands OP1, OP2 and MASK.  */
13215
13216 static void
13217 rs6000_emit_vector_select (rtx dest, rtx op1, rtx op2, rtx mask)
13218 {
13219   rtx t, temp;
13220   enum machine_mode dest_mode = GET_MODE (dest);
13221   int vsel_insn_index  = get_vsel_insn (GET_MODE (dest));
13222
13223   temp = gen_reg_rtx (dest_mode);
13224
13225   /* For each vector element, select op1 when mask is 1 otherwise
13226      select op2.  */
13227   t = gen_rtx_SET (VOIDmode, temp,
13228                    gen_rtx_UNSPEC (dest_mode,
13229                                    gen_rtvec (3, op2, op1, mask),
13230                                    vsel_insn_index));
13231   emit_insn (t);
13232   emit_move_insn (dest, temp);
13233   return;
13234 }
13235
13236 /* Emit vector conditional expression.
13237    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
13238    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
13239
13240 int
13241 rs6000_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
13242                               rtx cond, rtx cc_op0, rtx cc_op1)
13243 {
13244   enum machine_mode dest_mode = GET_MODE (dest);
13245   enum rtx_code rcode = GET_CODE (cond);
13246   rtx mask;
13247
13248   if (!TARGET_ALTIVEC)
13249     return 0;
13250
13251   /* Get the vector mask for the given relational operations.  */
13252   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
13253
13254   rs6000_emit_vector_select (dest, op1, op2, mask);
13255
13256   return 1;
13257 }
13258
13259 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
13260    operands of the last comparison is nonzero/true, FALSE_COND if it
13261    is zero/false.  Return 0 if the hardware has no such operation.  */
13262
13263 int
13264 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
13265 {
13266   enum rtx_code code = GET_CODE (op);
13267   rtx op0 = rs6000_compare_op0;
13268   rtx op1 = rs6000_compare_op1;
13269   REAL_VALUE_TYPE c1;
13270   enum machine_mode compare_mode = GET_MODE (op0);
13271   enum machine_mode result_mode = GET_MODE (dest);
13272   rtx temp;
13273   bool is_against_zero;
13274
13275   /* These modes should always match.  */
13276   if (GET_MODE (op1) != compare_mode
13277       /* In the isel case however, we can use a compare immediate, so
13278          op1 may be a small constant.  */
13279       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
13280     return 0;
13281   if (GET_MODE (true_cond) != result_mode)
13282     return 0;
13283   if (GET_MODE (false_cond) != result_mode)
13284     return 0;
13285
13286   /* First, work out if the hardware can do this at all, or
13287      if it's too slow....  */
13288   if (! rs6000_compare_fp_p)
13289     {
13290       if (TARGET_ISEL)
13291         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
13292       return 0;
13293     }
13294   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
13295            && SCALAR_FLOAT_MODE_P (compare_mode))
13296     return 0;
13297
13298   is_against_zero = op1 == CONST0_RTX (compare_mode);
13299
13300   /* A floating-point subtract might overflow, underflow, or produce
13301      an inexact result, thus changing the floating-point flags, so it
13302      can't be generated if we care about that.  It's safe if one side
13303      of the construct is zero, since then no subtract will be
13304      generated.  */
13305   if (SCALAR_FLOAT_MODE_P (compare_mode)
13306       && flag_trapping_math && ! is_against_zero)
13307     return 0;
13308
13309   /* Eliminate half of the comparisons by switching operands, this
13310      makes the remaining code simpler.  */
13311   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
13312       || code == LTGT || code == LT || code == UNLE)
13313     {
13314       code = reverse_condition_maybe_unordered (code);
13315       temp = true_cond;
13316       true_cond = false_cond;
13317       false_cond = temp;
13318     }
13319
13320   /* UNEQ and LTGT take four instructions for a comparison with zero,
13321      it'll probably be faster to use a branch here too.  */
13322   if (code == UNEQ && HONOR_NANS (compare_mode))
13323     return 0;
13324
13325   if (GET_CODE (op1) == CONST_DOUBLE)
13326     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
13327
13328   /* We're going to try to implement comparisons by performing
13329      a subtract, then comparing against zero.  Unfortunately,
13330      Inf - Inf is NaN which is not zero, and so if we don't
13331      know that the operand is finite and the comparison
13332      would treat EQ different to UNORDERED, we can't do it.  */
13333   if (HONOR_INFINITIES (compare_mode)
13334       && code != GT && code != UNGE
13335       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
13336       /* Constructs of the form (a OP b ? a : b) are safe.  */
13337       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
13338           || (! rtx_equal_p (op0, true_cond)
13339               && ! rtx_equal_p (op1, true_cond))))
13340     return 0;
13341
13342   /* At this point we know we can use fsel.  */
13343
13344   /* Reduce the comparison to a comparison against zero.  */
13345   if (! is_against_zero)
13346     {
13347       temp = gen_reg_rtx (compare_mode);
13348       emit_insn (gen_rtx_SET (VOIDmode, temp,
13349                               gen_rtx_MINUS (compare_mode, op0, op1)));
13350       op0 = temp;
13351       op1 = CONST0_RTX (compare_mode);
13352     }
13353
13354   /* If we don't care about NaNs we can reduce some of the comparisons
13355      down to faster ones.  */
13356   if (! HONOR_NANS (compare_mode))
13357     switch (code)
13358       {
13359       case GT:
13360         code = LE;
13361         temp = true_cond;
13362         true_cond = false_cond;
13363         false_cond = temp;
13364         break;
13365       case UNGE:
13366         code = GE;
13367         break;
13368       case UNEQ:
13369         code = EQ;
13370         break;
13371       default:
13372         break;
13373       }
13374
13375   /* Now, reduce everything down to a GE.  */
13376   switch (code)
13377     {
13378     case GE:
13379       break;
13380
13381     case LE:
13382       temp = gen_reg_rtx (compare_mode);
13383       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
13384       op0 = temp;
13385       break;
13386
13387     case ORDERED:
13388       temp = gen_reg_rtx (compare_mode);
13389       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
13390       op0 = temp;
13391       break;
13392
13393     case EQ:
13394       temp = gen_reg_rtx (compare_mode);
13395       emit_insn (gen_rtx_SET (VOIDmode, temp,
13396                               gen_rtx_NEG (compare_mode,
13397                                            gen_rtx_ABS (compare_mode, op0))));
13398       op0 = temp;
13399       break;
13400
13401     case UNGE:
13402       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
13403       temp = gen_reg_rtx (result_mode);
13404       emit_insn (gen_rtx_SET (VOIDmode, temp,
13405                               gen_rtx_IF_THEN_ELSE (result_mode,
13406                                                     gen_rtx_GE (VOIDmode,
13407                                                                 op0, op1),
13408                                                     true_cond, false_cond)));
13409       false_cond = true_cond;
13410       true_cond = temp;
13411
13412       temp = gen_reg_rtx (compare_mode);
13413       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
13414       op0 = temp;
13415       break;
13416
13417     case GT:
13418       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
13419       temp = gen_reg_rtx (result_mode);
13420       emit_insn (gen_rtx_SET (VOIDmode, temp,
13421                               gen_rtx_IF_THEN_ELSE (result_mode,
13422                                                     gen_rtx_GE (VOIDmode,
13423                                                                 op0, op1),
13424                                                     true_cond, false_cond)));
13425       true_cond = false_cond;
13426       false_cond = temp;
13427
13428       temp = gen_reg_rtx (compare_mode);
13429       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
13430       op0 = temp;
13431       break;
13432
13433     default:
13434       gcc_unreachable ();
13435     }
13436
13437   emit_insn (gen_rtx_SET (VOIDmode, dest,
13438                           gen_rtx_IF_THEN_ELSE (result_mode,
13439                                                 gen_rtx_GE (VOIDmode,
13440                                                             op0, op1),
13441                                                 true_cond, false_cond)));
13442   return 1;
13443 }
13444
13445 /* Same as above, but for ints (isel).  */
13446
13447 static int
13448 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
13449 {
13450   rtx condition_rtx, cr;
13451
13452   /* All isel implementations thus far are 32-bits.  */
13453   if (GET_MODE (rs6000_compare_op0) != SImode)
13454     return 0;
13455
13456   /* We still have to do the compare, because isel doesn't do a
13457      compare, it just looks at the CRx bits set by a previous compare
13458      instruction.  */
13459   condition_rtx = rs6000_generate_compare (GET_CODE (op));
13460   cr = XEXP (condition_rtx, 0);
13461
13462   if (GET_MODE (cr) == CCmode)
13463     emit_insn (gen_isel_signed (dest, condition_rtx,
13464                                 true_cond, false_cond, cr));
13465   else
13466     emit_insn (gen_isel_unsigned (dest, condition_rtx,
13467                                   true_cond, false_cond, cr));
13468
13469   return 1;
13470 }
13471
13472 const char *
13473 output_isel (rtx *operands)
13474 {
13475   enum rtx_code code;
13476
13477   code = GET_CODE (operands[1]);
13478   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
13479     {
13480       PUT_CODE (operands[1], reverse_condition (code));
13481       return "isel %0,%3,%2,%j1";
13482     }
13483   else
13484     return "isel %0,%2,%3,%j1";
13485 }
13486
13487 void
13488 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
13489 {
13490   enum machine_mode mode = GET_MODE (op0);
13491   enum rtx_code c;
13492   rtx target;
13493
13494   if (code == SMAX || code == SMIN)
13495     c = GE;
13496   else
13497     c = GEU;
13498
13499   if (code == SMAX || code == UMAX)
13500     target = emit_conditional_move (dest, c, op0, op1, mode,
13501                                     op0, op1, mode, 0);
13502   else
13503     target = emit_conditional_move (dest, c, op0, op1, mode,
13504                                     op1, op0, mode, 0);
13505   gcc_assert (target);
13506   if (target != dest)
13507     emit_move_insn (dest, target);
13508 }
13509
13510 /* Emit instructions to perform a load-reserved/store-conditional operation.
13511    The operation performed is an atomic
13512    (set M (CODE:MODE M OP))
13513    If not NULL, BEFORE is atomically set to M before the operation, and
13514    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
13515    If SYNC_P then a memory barrier is emitted before the operation.
13516    Either OP or M may be wrapped in a NOT operation.  */
13517
13518 void
13519 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
13520                   rtx m, rtx op, rtx before_param, rtx after_param,
13521                   bool sync_p)
13522 {
13523   enum machine_mode used_mode;
13524   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
13525   rtx used_m;
13526   rtvec vec;
13527   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
13528   rtx shift = NULL_RTX;
13529
13530   if (sync_p)
13531     emit_insn (gen_memory_barrier ());
13532
13533   if (GET_CODE (m) == NOT)
13534     used_m = XEXP (m, 0);
13535   else
13536     used_m = m;
13537
13538   /* If this is smaller than SImode, we'll have to use SImode with
13539      adjustments.  */
13540   if (mode == QImode || mode == HImode)
13541     {
13542       rtx newop, oldop;
13543
13544       if (MEM_ALIGN (used_m) >= 32)
13545         {
13546           int ishift = 0;
13547           if (BYTES_BIG_ENDIAN)
13548             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
13549
13550           shift = GEN_INT (ishift);
13551           used_m = change_address (used_m, SImode, 0);
13552         }
13553       else
13554         {
13555           rtx addrSI, aligned_addr;
13556           int shift_mask = mode == QImode ? 0x18 : 0x10;
13557
13558           addrSI = gen_lowpart_common (SImode,
13559                                        force_reg (Pmode, XEXP (used_m, 0)));
13560           addrSI = force_reg (SImode, addrSI);
13561           shift = gen_reg_rtx (SImode);
13562
13563           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
13564                                  GEN_INT (shift_mask)));
13565           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
13566
13567           aligned_addr = expand_binop (Pmode, and_optab,
13568                                        XEXP (used_m, 0),
13569                                        GEN_INT (-4), NULL_RTX,
13570                                        1, OPTAB_LIB_WIDEN);
13571           used_m = change_address (used_m, SImode, aligned_addr);
13572           set_mem_align (used_m, 32);
13573         }
13574       /* It's safe to keep the old alias set of USED_M, because
13575          the operation is atomic and only affects the original
13576          USED_M.  */
13577       if (GET_CODE (m) == NOT)
13578         m = gen_rtx_NOT (SImode, used_m);
13579       else
13580         m = used_m;
13581
13582       if (GET_CODE (op) == NOT)
13583         {
13584           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
13585           oldop = gen_rtx_NOT (SImode, oldop);
13586         }
13587       else
13588         oldop = lowpart_subreg (SImode, op, mode);
13589
13590       switch (code)
13591         {
13592         case IOR:
13593         case XOR:
13594           newop = expand_binop (SImode, and_optab,
13595                                 oldop, GEN_INT (imask), NULL_RTX,
13596                                 1, OPTAB_LIB_WIDEN);
13597           emit_insn (gen_ashlsi3 (newop, newop, shift));
13598           break;
13599
13600         case AND:
13601           newop = expand_binop (SImode, ior_optab,
13602                                 oldop, GEN_INT (~imask), NULL_RTX,
13603                                 1, OPTAB_LIB_WIDEN);
13604           emit_insn (gen_rotlsi3 (newop, newop, shift));
13605           break;
13606
13607         case PLUS:
13608         case MINUS:
13609           {
13610             rtx mask;
13611
13612             newop = expand_binop (SImode, and_optab,
13613                                   oldop, GEN_INT (imask), NULL_RTX,
13614                                   1, OPTAB_LIB_WIDEN);
13615             emit_insn (gen_ashlsi3 (newop, newop, shift));
13616
13617             mask = gen_reg_rtx (SImode);
13618             emit_move_insn (mask, GEN_INT (imask));
13619             emit_insn (gen_ashlsi3 (mask, mask, shift));
13620
13621             if (code == PLUS)
13622               newop = gen_rtx_PLUS (SImode, m, newop);
13623             else
13624               newop = gen_rtx_MINUS (SImode, m, newop);
13625             newop = gen_rtx_AND (SImode, newop, mask);
13626             newop = gen_rtx_IOR (SImode, newop,
13627                                  gen_rtx_AND (SImode,
13628                                               gen_rtx_NOT (SImode, mask),
13629                                               m));
13630             break;
13631           }
13632
13633         default:
13634           gcc_unreachable ();
13635         }
13636
13637       if (GET_CODE (m) == NOT)
13638         {
13639           rtx mask, xorm;
13640
13641           mask = gen_reg_rtx (SImode);
13642           emit_move_insn (mask, GEN_INT (imask));
13643           emit_insn (gen_ashlsi3 (mask, mask, shift));
13644
13645           xorm = gen_rtx_XOR (SImode, used_m, mask);
13646           /* Depending on the value of 'op', the XOR or the operation might
13647              be able to be simplified away.  */
13648           newop = simplify_gen_binary (code, SImode, xorm, newop);
13649         }
13650       op = newop;
13651       used_mode = SImode;
13652       before = gen_reg_rtx (used_mode);
13653       after = gen_reg_rtx (used_mode);
13654     }
13655   else
13656     {
13657       used_mode = mode;
13658       before = before_param;
13659       after = after_param;
13660
13661       if (before == NULL_RTX)
13662         before = gen_reg_rtx (used_mode);
13663       if (after == NULL_RTX)
13664         after = gen_reg_rtx (used_mode);
13665     }
13666
13667   if ((code == PLUS || code == MINUS || GET_CODE (m) == NOT)
13668       && used_mode != mode)
13669     the_op = op;  /* Computed above.  */
13670   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
13671     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
13672   else
13673     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
13674
13675   set_after = gen_rtx_SET (VOIDmode, after, the_op);
13676   set_before = gen_rtx_SET (VOIDmode, before, used_m);
13677   set_atomic = gen_rtx_SET (VOIDmode, used_m,
13678                             gen_rtx_UNSPEC (used_mode,
13679                                             gen_rtvec (1, the_op),
13680                                             UNSPEC_SYNC_OP));
13681   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
13682
13683   if ((code == PLUS || code == MINUS) && used_mode != mode)
13684     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
13685                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
13686   else
13687     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
13688   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
13689
13690   /* Shift and mask the return values properly.  */
13691   if (used_mode != mode && before_param)
13692     {
13693       emit_insn (gen_lshrsi3 (before, before, shift));
13694       convert_move (before_param, before, 1);
13695     }
13696
13697   if (used_mode != mode && after_param)
13698     {
13699       emit_insn (gen_lshrsi3 (after, after, shift));
13700       convert_move (after_param, after, 1);
13701     }
13702
13703   /* The previous sequence will end with a branch that's dependent on
13704      the conditional store, so placing an isync will ensure that no
13705      other instructions (especially, no load or store instructions)
13706      can start before the atomic operation completes.  */
13707   if (sync_p)
13708     emit_insn (gen_isync ());
13709 }
13710
13711 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
13712    COND is true.  Mark the jump as unlikely to be taken.  */
13713
13714 static void
13715 emit_unlikely_jump (rtx cond, rtx label)
13716 {
13717   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
13718   rtx x;
13719
13720   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
13721   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
13722   REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
13723 }
13724
13725 /* A subroutine of the atomic operation splitters.  Emit a load-locked
13726    instruction in MODE.  */
13727
13728 static void
13729 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
13730 {
13731   rtx (*fn) (rtx, rtx) = NULL;
13732   if (mode == SImode)
13733     fn = gen_load_locked_si;
13734   else if (mode == DImode)
13735     fn = gen_load_locked_di;
13736   emit_insn (fn (reg, mem));
13737 }
13738
13739 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
13740    instruction in MODE.  */
13741
13742 static void
13743 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
13744 {
13745   rtx (*fn) (rtx, rtx, rtx) = NULL;
13746   if (mode == SImode)
13747     fn = gen_store_conditional_si;
13748   else if (mode == DImode)
13749     fn = gen_store_conditional_di;
13750
13751   /* Emit sync before stwcx. to address PPC405 Erratum.  */
13752   if (PPC405_ERRATUM77)
13753     emit_insn (gen_memory_barrier ());
13754
13755   emit_insn (fn (res, mem, val));
13756 }
13757
13758 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
13759    to perform.  MEM is the memory on which to operate.  VAL is the second
13760    operand of the binary operator.  BEFORE and AFTER are optional locations to
13761    return the value of MEM either before of after the operation.  SCRATCH is
13762    a scratch register.  */
13763
13764 void
13765 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
13766                        rtx before, rtx after, rtx scratch)
13767 {
13768   enum machine_mode mode = GET_MODE (mem);
13769   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
13770
13771   emit_insn (gen_memory_barrier ());
13772
13773   label = gen_label_rtx ();
13774   emit_label (label);
13775   label = gen_rtx_LABEL_REF (VOIDmode, label);
13776
13777   if (before == NULL_RTX)
13778     before = scratch;
13779   emit_load_locked (mode, before, mem);
13780
13781   if (code == NOT)
13782     x = gen_rtx_AND (mode, gen_rtx_NOT (mode, before), val);
13783   else if (code == AND)
13784     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
13785   else
13786     x = gen_rtx_fmt_ee (code, mode, before, val);
13787
13788   if (after != NULL_RTX)
13789     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
13790   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13791
13792   emit_store_conditional (mode, cond, mem, scratch);
13793
13794   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
13795   emit_unlikely_jump (x, label);
13796
13797   emit_insn (gen_isync ());
13798 }
13799
13800 /* Expand an atomic compare and swap operation.  MEM is the memory on which
13801    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
13802    value to be stored.  SCRATCH is a scratch GPR.  */
13803
13804 void
13805 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
13806                                rtx scratch)
13807 {
13808   enum machine_mode mode = GET_MODE (mem);
13809   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
13810
13811   emit_insn (gen_memory_barrier ());
13812
13813   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
13814   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
13815   emit_label (XEXP (label1, 0));
13816
13817   emit_load_locked (mode, retval, mem);
13818
13819   x = gen_rtx_COMPARE (CCmode, retval, oldval);
13820   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
13821
13822   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
13823   emit_unlikely_jump (x, label2);
13824
13825   emit_move_insn (scratch, newval);
13826   emit_store_conditional (mode, cond, mem, scratch);
13827
13828   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
13829   emit_unlikely_jump (x, label1);
13830
13831   emit_insn (gen_isync ());
13832   emit_label (XEXP (label2, 0));
13833 }
13834
13835 /* Expand an atomic test and set operation.  MEM is the memory on which
13836    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
13837
13838 void
13839 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
13840 {
13841   enum machine_mode mode = GET_MODE (mem);
13842   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
13843
13844   emit_insn (gen_memory_barrier ());
13845
13846   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
13847   emit_label (XEXP (label, 0));
13848
13849   emit_load_locked (mode, retval, mem);
13850   emit_move_insn (scratch, val);
13851   emit_store_conditional (mode, cond, mem, scratch);
13852
13853   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
13854   emit_unlikely_jump (x, label);
13855
13856   emit_insn (gen_isync ());
13857 }
13858
13859 void
13860 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
13861 {
13862   enum machine_mode mode = GET_MODE (mem);
13863   rtx addrSI, align, wdst, shift, mask;
13864   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
13865   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
13866
13867   /* Shift amount for subword relative to aligned word.  */
13868   addrSI = force_reg (SImode, gen_lowpart_common (SImode, XEXP (mem, 0)));
13869   shift = gen_reg_rtx (SImode);
13870   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
13871                          GEN_INT (shift_mask)));
13872   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
13873
13874   /* Shift and mask old value into position within word.  */
13875   oldval = convert_modes (SImode, mode, oldval, 1);
13876   oldval = expand_binop (SImode, and_optab,
13877                          oldval, GEN_INT (imask), NULL_RTX,
13878                          1, OPTAB_LIB_WIDEN);
13879   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
13880
13881   /* Shift and mask new value into position within word.  */
13882   newval = convert_modes (SImode, mode, newval, 1);
13883   newval = expand_binop (SImode, and_optab,
13884                          newval, GEN_INT (imask), NULL_RTX,
13885                          1, OPTAB_LIB_WIDEN);
13886   emit_insn (gen_ashlsi3 (newval, newval, shift));
13887
13888   /* Mask for insertion.  */
13889   mask = gen_reg_rtx (SImode);
13890   emit_move_insn (mask, GEN_INT (imask));
13891   emit_insn (gen_ashlsi3 (mask, mask, shift));
13892
13893   /* Address of aligned word containing subword.  */
13894   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
13895                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
13896   mem = change_address (mem, SImode, align);
13897   set_mem_align (mem, 32);
13898   MEM_VOLATILE_P (mem) = 1;
13899
13900   wdst = gen_reg_rtx (SImode);
13901   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
13902                                                     oldval, newval, mem));
13903
13904   emit_move_insn (dst, gen_lowpart (mode, wdst));
13905 }
13906
13907 void
13908 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
13909                                   rtx oldval, rtx newval, rtx mem,
13910                                   rtx scratch)
13911 {
13912   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
13913
13914   emit_insn (gen_memory_barrier ());
13915   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
13916   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
13917   emit_label (XEXP (label1, 0));
13918
13919   emit_load_locked (SImode, scratch, mem);
13920
13921   /* Mask subword within loaded value for comparison with oldval.
13922      Use UNSPEC_AND to avoid clobber.*/
13923   emit_insn (gen_rtx_SET (SImode, dest,
13924                           gen_rtx_UNSPEC (SImode,
13925                                           gen_rtvec (2, scratch, mask),
13926                                           UNSPEC_AND)));
13927
13928   x = gen_rtx_COMPARE (CCmode, dest, oldval);
13929   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
13930
13931   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
13932   emit_unlikely_jump (x, label2);
13933
13934   /* Clear subword within loaded value for insertion of new value.  */
13935   emit_insn (gen_rtx_SET (SImode, scratch,
13936                           gen_rtx_AND (SImode,
13937                                        gen_rtx_NOT (SImode, mask), scratch)));
13938   emit_insn (gen_iorsi3 (scratch, scratch, newval));
13939   emit_store_conditional (SImode, cond, mem, scratch);
13940
13941   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
13942   emit_unlikely_jump (x, label1);
13943
13944   emit_insn (gen_isync ());
13945   emit_label (XEXP (label2, 0));
13946 }
13947
13948
13949   /* Emit instructions to move SRC to DST.  Called by splitters for
13950    multi-register moves.  It will emit at most one instruction for
13951    each register that is accessed; that is, it won't emit li/lis pairs
13952    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
13953    register.  */
13954
13955 void
13956 rs6000_split_multireg_move (rtx dst, rtx src)
13957 {
13958   /* The register number of the first register being moved.  */
13959   int reg;
13960   /* The mode that is to be moved.  */
13961   enum machine_mode mode;
13962   /* The mode that the move is being done in, and its size.  */
13963   enum machine_mode reg_mode;
13964   int reg_mode_size;
13965   /* The number of registers that will be moved.  */
13966   int nregs;
13967
13968   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
13969   mode = GET_MODE (dst);
13970   nregs = hard_regno_nregs[reg][mode];
13971   if (FP_REGNO_P (reg))
13972     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
13973   else if (ALTIVEC_REGNO_P (reg))
13974     reg_mode = V16QImode;
13975   else if (TARGET_E500_DOUBLE && (mode == TFmode || mode == TDmode))
13976     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
13977   else
13978     reg_mode = word_mode;
13979   reg_mode_size = GET_MODE_SIZE (reg_mode);
13980
13981   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
13982
13983   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
13984     {
13985       /* Move register range backwards, if we might have destructive
13986          overlap.  */
13987       int i;
13988       for (i = nregs - 1; i >= 0; i--)
13989         emit_insn (gen_rtx_SET (VOIDmode,
13990                                 simplify_gen_subreg (reg_mode, dst, mode,
13991                                                      i * reg_mode_size),
13992                                 simplify_gen_subreg (reg_mode, src, mode,
13993                                                      i * reg_mode_size)));
13994     }
13995   else
13996     {
13997       int i;
13998       int j = -1;
13999       bool used_update = false;
14000
14001       if (MEM_P (src) && INT_REGNO_P (reg))
14002         {
14003           rtx breg;
14004
14005           if (GET_CODE (XEXP (src, 0)) == PRE_INC
14006               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
14007             {
14008               rtx delta_rtx;
14009               breg = XEXP (XEXP (src, 0), 0);
14010               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
14011                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
14012                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
14013               emit_insn (TARGET_32BIT
14014                          ? gen_addsi3 (breg, breg, delta_rtx)
14015                          : gen_adddi3 (breg, breg, delta_rtx));
14016               src = replace_equiv_address (src, breg);
14017             }
14018           else if (! rs6000_offsettable_memref_p (src))
14019             {
14020               rtx basereg;
14021               basereg = gen_rtx_REG (Pmode, reg);
14022               emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
14023               src = replace_equiv_address (src, basereg);
14024             }
14025
14026           breg = XEXP (src, 0);
14027           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
14028             breg = XEXP (breg, 0);
14029
14030           /* If the base register we are using to address memory is
14031              also a destination reg, then change that register last.  */
14032           if (REG_P (breg)
14033               && REGNO (breg) >= REGNO (dst)
14034               && REGNO (breg) < REGNO (dst) + nregs)
14035             j = REGNO (breg) - REGNO (dst);
14036         }
14037
14038       if (GET_CODE (dst) == MEM && INT_REGNO_P (reg))
14039         {
14040           rtx breg;
14041
14042           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
14043               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
14044             {
14045               rtx delta_rtx;
14046               breg = XEXP (XEXP (dst, 0), 0);
14047               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
14048                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
14049                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
14050
14051               /* We have to update the breg before doing the store.
14052                  Use store with update, if available.  */
14053
14054               if (TARGET_UPDATE)
14055                 {
14056                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
14057                   emit_insn (TARGET_32BIT
14058                              ? (TARGET_POWERPC64
14059                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
14060                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
14061                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
14062                   used_update = true;
14063                 }
14064               else
14065                 emit_insn (TARGET_32BIT
14066                            ? gen_addsi3 (breg, breg, delta_rtx)
14067                            : gen_adddi3 (breg, breg, delta_rtx));
14068               dst = replace_equiv_address (dst, breg);
14069             }
14070           else
14071             gcc_assert (rs6000_offsettable_memref_p (dst));
14072         }
14073
14074       for (i = 0; i < nregs; i++)
14075         {
14076           /* Calculate index to next subword.  */
14077           ++j;
14078           if (j == nregs)
14079             j = 0;
14080
14081           /* If compiler already emitted move of first word by
14082              store with update, no need to do anything.  */
14083           if (j == 0 && used_update)
14084             continue;
14085
14086           emit_insn (gen_rtx_SET (VOIDmode,
14087                                   simplify_gen_subreg (reg_mode, dst, mode,
14088                                                        j * reg_mode_size),
14089                                   simplify_gen_subreg (reg_mode, src, mode,
14090                                                        j * reg_mode_size)));
14091         }
14092     }
14093 }
14094
14095 \f
14096 /* This page contains routines that are used to determine what the
14097    function prologue and epilogue code will do and write them out.  */
14098
14099 /* Return the first fixed-point register that is required to be
14100    saved. 32 if none.  */
14101
14102 int
14103 first_reg_to_save (void)
14104 {
14105   int first_reg;
14106
14107   /* Find lowest numbered live register.  */
14108   for (first_reg = 13; first_reg <= 31; first_reg++)
14109     if (df_regs_ever_live_p (first_reg)
14110         && (! call_used_regs[first_reg]
14111             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
14112                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
14113                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
14114                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
14115       break;
14116
14117 #if TARGET_MACHO
14118   if (flag_pic
14119       && current_function_uses_pic_offset_table
14120       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
14121     return RS6000_PIC_OFFSET_TABLE_REGNUM;
14122 #endif
14123
14124   return first_reg;
14125 }
14126
14127 /* Similar, for FP regs.  */
14128
14129 int
14130 first_fp_reg_to_save (void)
14131 {
14132   int first_reg;
14133
14134   /* Find lowest numbered live register.  */
14135   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
14136     if (df_regs_ever_live_p (first_reg))
14137       break;
14138
14139   return first_reg;
14140 }
14141
14142 /* Similar, for AltiVec regs.  */
14143
14144 static int
14145 first_altivec_reg_to_save (void)
14146 {
14147   int i;
14148
14149   /* Stack frame remains as is unless we are in AltiVec ABI.  */
14150   if (! TARGET_ALTIVEC_ABI)
14151     return LAST_ALTIVEC_REGNO + 1;
14152
14153   /* On Darwin, the unwind routines are compiled without
14154      TARGET_ALTIVEC, and use save_world to save/restore the
14155      altivec registers when necessary.  */
14156   if (DEFAULT_ABI == ABI_DARWIN && current_function_calls_eh_return
14157       && ! TARGET_ALTIVEC)
14158     return FIRST_ALTIVEC_REGNO + 20;
14159
14160   /* Find lowest numbered live register.  */
14161   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
14162     if (df_regs_ever_live_p (i))
14163       break;
14164
14165   return i;
14166 }
14167
14168 /* Return a 32-bit mask of the AltiVec registers we need to set in
14169    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
14170    the 32-bit word is 0.  */
14171
14172 static unsigned int
14173 compute_vrsave_mask (void)
14174 {
14175   unsigned int i, mask = 0;
14176
14177   /* On Darwin, the unwind routines are compiled without
14178      TARGET_ALTIVEC, and use save_world to save/restore the
14179      call-saved altivec registers when necessary.  */
14180   if (DEFAULT_ABI == ABI_DARWIN && current_function_calls_eh_return
14181       && ! TARGET_ALTIVEC)
14182     mask |= 0xFFF;
14183
14184   /* First, find out if we use _any_ altivec registers.  */
14185   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
14186     if (df_regs_ever_live_p (i))
14187       mask |= ALTIVEC_REG_BIT (i);
14188
14189   if (mask == 0)
14190     return mask;
14191
14192   /* Next, remove the argument registers from the set.  These must
14193      be in the VRSAVE mask set by the caller, so we don't need to add
14194      them in again.  More importantly, the mask we compute here is
14195      used to generate CLOBBERs in the set_vrsave insn, and we do not
14196      wish the argument registers to die.  */
14197   for (i = cfun->args_info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
14198     mask &= ~ALTIVEC_REG_BIT (i);
14199
14200   /* Similarly, remove the return value from the set.  */
14201   {
14202     bool yes = false;
14203     diddle_return_value (is_altivec_return_reg, &yes);
14204     if (yes)
14205       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
14206   }
14207
14208   return mask;
14209 }
14210
14211 /* For a very restricted set of circumstances, we can cut down the
14212    size of prologues/epilogues by calling our own save/restore-the-world
14213    routines.  */
14214
14215 static void
14216 compute_save_world_info (rs6000_stack_t *info_ptr)
14217 {
14218   info_ptr->world_save_p = 1;
14219   info_ptr->world_save_p
14220     = (WORLD_SAVE_P (info_ptr)
14221        && DEFAULT_ABI == ABI_DARWIN
14222        && ! (current_function_calls_setjmp && flag_exceptions)
14223        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
14224        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
14225        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
14226        && info_ptr->cr_save_p);
14227
14228   /* This will not work in conjunction with sibcalls.  Make sure there
14229      are none.  (This check is expensive, but seldom executed.) */
14230   if (WORLD_SAVE_P (info_ptr))
14231     {
14232       rtx insn;
14233       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
14234         if ( GET_CODE (insn) == CALL_INSN
14235              && SIBLING_CALL_P (insn))
14236           {
14237             info_ptr->world_save_p = 0;
14238             break;
14239           }
14240     }
14241
14242   if (WORLD_SAVE_P (info_ptr))
14243     {
14244       /* Even if we're not touching VRsave, make sure there's room on the
14245          stack for it, if it looks like we're calling SAVE_WORLD, which
14246          will attempt to save it. */
14247       info_ptr->vrsave_size  = 4;
14248
14249       /* "Save" the VRsave register too if we're saving the world.  */
14250       if (info_ptr->vrsave_mask == 0)
14251         info_ptr->vrsave_mask = compute_vrsave_mask ();
14252
14253       /* Because the Darwin register save/restore routines only handle
14254          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
14255          check.  */
14256       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
14257                   && (info_ptr->first_altivec_reg_save
14258                       >= FIRST_SAVED_ALTIVEC_REGNO));
14259     }
14260   return;
14261 }
14262
14263
14264 static void
14265 is_altivec_return_reg (rtx reg, void *xyes)
14266 {
14267   bool *yes = (bool *) xyes;
14268   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
14269     *yes = true;
14270 }
14271
14272 \f
14273 /* Calculate the stack information for the current function.  This is
14274    complicated by having two separate calling sequences, the AIX calling
14275    sequence and the V.4 calling sequence.
14276
14277    AIX (and Darwin/Mac OS X) stack frames look like:
14278                                                           32-bit  64-bit
14279         SP----> +---------------------------------------+
14280                 | back chain to caller                  | 0       0
14281                 +---------------------------------------+
14282                 | saved CR                              | 4       8 (8-11)
14283                 +---------------------------------------+
14284                 | saved LR                              | 8       16
14285                 +---------------------------------------+
14286                 | reserved for compilers                | 12      24
14287                 +---------------------------------------+
14288                 | reserved for binders                  | 16      32
14289                 +---------------------------------------+
14290                 | saved TOC pointer                     | 20      40
14291                 +---------------------------------------+
14292                 | Parameter save area (P)               | 24      48
14293                 +---------------------------------------+
14294                 | Alloca space (A)                      | 24+P    etc.
14295                 +---------------------------------------+
14296                 | Local variable space (L)              | 24+P+A
14297                 +---------------------------------------+
14298                 | Float/int conversion temporary (X)    | 24+P+A+L
14299                 +---------------------------------------+
14300                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
14301                 +---------------------------------------+
14302                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
14303                 +---------------------------------------+
14304                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
14305                 +---------------------------------------+
14306                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
14307                 +---------------------------------------+
14308                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
14309                 +---------------------------------------+
14310         old SP->| back chain to caller's caller         |
14311                 +---------------------------------------+
14312
14313    The required alignment for AIX configurations is two words (i.e., 8
14314    or 16 bytes).
14315
14316
14317    V.4 stack frames look like:
14318
14319         SP----> +---------------------------------------+
14320                 | back chain to caller                  | 0
14321                 +---------------------------------------+
14322                 | caller's saved LR                     | 4
14323                 +---------------------------------------+
14324                 | Parameter save area (P)               | 8
14325                 +---------------------------------------+
14326                 | Alloca space (A)                      | 8+P
14327                 +---------------------------------------+
14328                 | Varargs save area (V)                 | 8+P+A
14329                 +---------------------------------------+
14330                 | Local variable space (L)              | 8+P+A+V
14331                 +---------------------------------------+
14332                 | Float/int conversion temporary (X)    | 8+P+A+V+L
14333                 +---------------------------------------+
14334                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
14335                 +---------------------------------------+
14336                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
14337                 +---------------------------------------+
14338                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
14339                 +---------------------------------------+
14340                 | SPE: area for 64-bit GP registers     |
14341                 +---------------------------------------+
14342                 | SPE alignment padding                 |
14343                 +---------------------------------------+
14344                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
14345                 +---------------------------------------+
14346                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
14347                 +---------------------------------------+
14348                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
14349                 +---------------------------------------+
14350         old SP->| back chain to caller's caller         |
14351                 +---------------------------------------+
14352
14353    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
14354    given.  (But note below and in sysv4.h that we require only 8 and
14355    may round up the size of our stack frame anyways.  The historical
14356    reason is early versions of powerpc-linux which didn't properly
14357    align the stack at program startup.  A happy side-effect is that
14358    -mno-eabi libraries can be used with -meabi programs.)
14359
14360    The EABI configuration defaults to the V.4 layout.  However,
14361    the stack alignment requirements may differ.  If -mno-eabi is not
14362    given, the required stack alignment is 8 bytes; if -mno-eabi is
14363    given, the required alignment is 16 bytes.  (But see V.4 comment
14364    above.)  */
14365
14366 #ifndef ABI_STACK_BOUNDARY
14367 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
14368 #endif
14369
14370 static rs6000_stack_t *
14371 rs6000_stack_info (void)
14372 {
14373   static rs6000_stack_t info;
14374   rs6000_stack_t *info_ptr = &info;
14375   int reg_size = TARGET_32BIT ? 4 : 8;
14376   int ehrd_size;
14377   int save_align;
14378   int first_gp;
14379   HOST_WIDE_INT non_fixed_size;
14380
14381   memset (&info, 0, sizeof (info));
14382
14383   if (TARGET_SPE)
14384     {
14385       /* Cache value so we don't rescan instruction chain over and over.  */
14386       if (cfun->machine->insn_chain_scanned_p == 0)
14387         cfun->machine->insn_chain_scanned_p
14388           = spe_func_has_64bit_regs_p () + 1;
14389       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
14390     }
14391
14392   /* Select which calling sequence.  */
14393   info_ptr->abi = DEFAULT_ABI;
14394
14395   /* Calculate which registers need to be saved & save area size.  */
14396   info_ptr->first_gp_reg_save = first_reg_to_save ();
14397   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
14398      even if it currently looks like we won't.  Reload may need it to
14399      get at a constant; if so, it will have already created a constant
14400      pool entry for it.  */
14401   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
14402        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
14403        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
14404       && current_function_uses_const_pool
14405       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
14406     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
14407   else
14408     first_gp = info_ptr->first_gp_reg_save;
14409
14410   info_ptr->gp_size = reg_size * (32 - first_gp);
14411
14412   /* For the SPE, we have an additional upper 32-bits on each GPR.
14413      Ideally we should save the entire 64-bits only when the upper
14414      half is used in SIMD instructions.  Since we only record
14415      registers live (not the size they are used in), this proves
14416      difficult because we'd have to traverse the instruction chain at
14417      the right time, taking reload into account.  This is a real pain,
14418      so we opt to save the GPRs in 64-bits always if but one register
14419      gets used in 64-bits.  Otherwise, all the registers in the frame
14420      get saved in 32-bits.
14421
14422      So... since when we save all GPRs (except the SP) in 64-bits, the
14423      traditional GP save area will be empty.  */
14424   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
14425     info_ptr->gp_size = 0;
14426
14427   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
14428   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
14429
14430   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
14431   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
14432                                  - info_ptr->first_altivec_reg_save);
14433
14434   /* Does this function call anything?  */
14435   info_ptr->calls_p = (! current_function_is_leaf
14436                        || cfun->machine->ra_needs_full_frame);
14437
14438   /* Determine if we need to save the link register.  */
14439   if ((DEFAULT_ABI == ABI_AIX
14440        && current_function_profile
14441        && !TARGET_PROFILE_KERNEL)
14442 #ifdef TARGET_RELOCATABLE
14443       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
14444 #endif
14445       || (info_ptr->first_fp_reg_save != 64
14446           && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
14447       || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
14448       || (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
14449       || info_ptr->calls_p
14450       || rs6000_ra_ever_killed ())
14451     {
14452       info_ptr->lr_save_p = 1;
14453       df_set_regs_ever_live (LR_REGNO, true);
14454     }
14455
14456   /* Determine if we need to save the condition code registers.  */
14457   if (df_regs_ever_live_p (CR2_REGNO)
14458       || df_regs_ever_live_p (CR3_REGNO)
14459       || df_regs_ever_live_p (CR4_REGNO))
14460     {
14461       info_ptr->cr_save_p = 1;
14462       if (DEFAULT_ABI == ABI_V4)
14463         info_ptr->cr_size = reg_size;
14464     }
14465
14466   /* If the current function calls __builtin_eh_return, then we need
14467      to allocate stack space for registers that will hold data for
14468      the exception handler.  */
14469   if (current_function_calls_eh_return)
14470     {
14471       unsigned int i;
14472       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
14473         continue;
14474
14475       /* SPE saves EH registers in 64-bits.  */
14476       ehrd_size = i * (TARGET_SPE_ABI
14477                        && info_ptr->spe_64bit_regs_used != 0
14478                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
14479     }
14480   else
14481     ehrd_size = 0;
14482
14483   /* Determine various sizes.  */
14484   info_ptr->reg_size     = reg_size;
14485   info_ptr->fixed_size   = RS6000_SAVE_AREA;
14486   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
14487   info_ptr->parm_size    = RS6000_ALIGN (current_function_outgoing_args_size,
14488                                          TARGET_ALTIVEC ? 16 : 8);
14489   if (FRAME_GROWS_DOWNWARD)
14490     info_ptr->vars_size
14491       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
14492                        + info_ptr->parm_size,
14493                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
14494          - (info_ptr->fixed_size + info_ptr->vars_size
14495             + info_ptr->parm_size);
14496
14497   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
14498     info_ptr->spe_gp_size = 8 * (32 - first_gp);
14499   else
14500     info_ptr->spe_gp_size = 0;
14501
14502   if (TARGET_ALTIVEC_ABI)
14503     info_ptr->vrsave_mask = compute_vrsave_mask ();
14504   else
14505     info_ptr->vrsave_mask = 0;
14506
14507   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
14508     info_ptr->vrsave_size  = 4;
14509   else
14510     info_ptr->vrsave_size  = 0;
14511
14512   compute_save_world_info (info_ptr);
14513
14514   /* Calculate the offsets.  */
14515   switch (DEFAULT_ABI)
14516     {
14517     case ABI_NONE:
14518     default:
14519       gcc_unreachable ();
14520
14521     case ABI_AIX:
14522     case ABI_DARWIN:
14523       info_ptr->fp_save_offset   = - info_ptr->fp_size;
14524       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
14525
14526       if (TARGET_ALTIVEC_ABI)
14527         {
14528           info_ptr->vrsave_save_offset
14529             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
14530
14531           /* Align stack so vector save area is on a quadword boundary.
14532              The padding goes above the vectors.  */
14533           if (info_ptr->altivec_size != 0)
14534             info_ptr->altivec_padding_size
14535               = info_ptr->vrsave_save_offset & 0xF;
14536           else
14537             info_ptr->altivec_padding_size = 0;
14538
14539           info_ptr->altivec_save_offset
14540             = info_ptr->vrsave_save_offset
14541             - info_ptr->altivec_padding_size
14542             - info_ptr->altivec_size;
14543           gcc_assert (info_ptr->altivec_size == 0
14544                       || info_ptr->altivec_save_offset % 16 == 0);
14545
14546           /* Adjust for AltiVec case.  */
14547           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
14548         }
14549       else
14550         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
14551       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
14552       info_ptr->lr_save_offset   = 2*reg_size;
14553       break;
14554
14555     case ABI_V4:
14556       info_ptr->fp_save_offset   = - info_ptr->fp_size;
14557       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
14558       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
14559
14560       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
14561         {
14562           /* Align stack so SPE GPR save area is aligned on a
14563              double-word boundary.  */
14564           if (info_ptr->spe_gp_size != 0)
14565             info_ptr->spe_padding_size
14566               = 8 - (-info_ptr->cr_save_offset % 8);
14567           else
14568             info_ptr->spe_padding_size = 0;
14569
14570           info_ptr->spe_gp_save_offset
14571             = info_ptr->cr_save_offset
14572             - info_ptr->spe_padding_size
14573             - info_ptr->spe_gp_size;
14574
14575           /* Adjust for SPE case.  */
14576           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
14577         }
14578       else if (TARGET_ALTIVEC_ABI)
14579         {
14580           info_ptr->vrsave_save_offset
14581             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
14582
14583           /* Align stack so vector save area is on a quadword boundary.  */
14584           if (info_ptr->altivec_size != 0)
14585             info_ptr->altivec_padding_size
14586               = 16 - (-info_ptr->vrsave_save_offset % 16);
14587           else
14588             info_ptr->altivec_padding_size = 0;
14589
14590           info_ptr->altivec_save_offset
14591             = info_ptr->vrsave_save_offset
14592             - info_ptr->altivec_padding_size
14593             - info_ptr->altivec_size;
14594
14595           /* Adjust for AltiVec case.  */
14596           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
14597         }
14598       else
14599         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
14600       info_ptr->ehrd_offset      -= ehrd_size;
14601       info_ptr->lr_save_offset   = reg_size;
14602       break;
14603     }
14604
14605   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
14606   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
14607                                          + info_ptr->gp_size
14608                                          + info_ptr->altivec_size
14609                                          + info_ptr->altivec_padding_size
14610                                          + info_ptr->spe_gp_size
14611                                          + info_ptr->spe_padding_size
14612                                          + ehrd_size
14613                                          + info_ptr->cr_size
14614                                          + info_ptr->vrsave_size,
14615                                          save_align);
14616
14617   non_fixed_size         = (info_ptr->vars_size
14618                             + info_ptr->parm_size
14619                             + info_ptr->save_size);
14620
14621   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
14622                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
14623
14624   /* Determine if we need to allocate any stack frame:
14625
14626      For AIX we need to push the stack if a frame pointer is needed
14627      (because the stack might be dynamically adjusted), if we are
14628      debugging, if we make calls, or if the sum of fp_save, gp_save,
14629      and local variables are more than the space needed to save all
14630      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
14631      + 18*8 = 288 (GPR13 reserved).
14632
14633      For V.4 we don't have the stack cushion that AIX uses, but assume
14634      that the debugger can handle stackless frames.  */
14635
14636   if (info_ptr->calls_p)
14637     info_ptr->push_p = 1;
14638
14639   else if (DEFAULT_ABI == ABI_V4)
14640     info_ptr->push_p = non_fixed_size != 0;
14641
14642   else if (frame_pointer_needed)
14643     info_ptr->push_p = 1;
14644
14645   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
14646     info_ptr->push_p = 1;
14647
14648   else
14649     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
14650
14651   /* Zero offsets if we're not saving those registers.  */
14652   if (info_ptr->fp_size == 0)
14653     info_ptr->fp_save_offset = 0;
14654
14655   if (info_ptr->gp_size == 0)
14656     info_ptr->gp_save_offset = 0;
14657
14658   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
14659     info_ptr->altivec_save_offset = 0;
14660
14661   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
14662     info_ptr->vrsave_save_offset = 0;
14663
14664   if (! TARGET_SPE_ABI
14665       || info_ptr->spe_64bit_regs_used == 0
14666       || info_ptr->spe_gp_size == 0)
14667     info_ptr->spe_gp_save_offset = 0;
14668
14669   if (! info_ptr->lr_save_p)
14670     info_ptr->lr_save_offset = 0;
14671
14672   if (! info_ptr->cr_save_p)
14673     info_ptr->cr_save_offset = 0;
14674
14675   return info_ptr;
14676 }
14677
14678 /* Return true if the current function uses any GPRs in 64-bit SIMD
14679    mode.  */
14680
14681 static bool
14682 spe_func_has_64bit_regs_p (void)
14683 {
14684   rtx insns, insn;
14685
14686   /* Functions that save and restore all the call-saved registers will
14687      need to save/restore the registers in 64-bits.  */
14688   if (current_function_calls_eh_return
14689       || current_function_calls_setjmp
14690       || current_function_has_nonlocal_goto)
14691     return true;
14692
14693   insns = get_insns ();
14694
14695   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
14696     {
14697       if (INSN_P (insn))
14698         {
14699           rtx i;
14700
14701           /* FIXME: This should be implemented with attributes...
14702
14703                  (set_attr "spe64" "true")....then,
14704                  if (get_spe64(insn)) return true;
14705
14706              It's the only reliable way to do the stuff below.  */
14707
14708           i = PATTERN (insn);
14709           if (GET_CODE (i) == SET)
14710             {
14711               enum machine_mode mode = GET_MODE (SET_SRC (i));
14712
14713               if (SPE_VECTOR_MODE (mode))
14714                 return true;
14715               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
14716                                          || mode == DDmode || mode == TDmode))
14717                 return true;
14718             }
14719         }
14720     }
14721
14722   return false;
14723 }
14724
14725 static void
14726 debug_stack_info (rs6000_stack_t *info)
14727 {
14728   const char *abi_string;
14729
14730   if (! info)
14731     info = rs6000_stack_info ();
14732
14733   fprintf (stderr, "\nStack information for function %s:\n",
14734            ((current_function_decl && DECL_NAME (current_function_decl))
14735             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
14736             : "<unknown>"));
14737
14738   switch (info->abi)
14739     {
14740     default:             abi_string = "Unknown";        break;
14741     case ABI_NONE:       abi_string = "NONE";           break;
14742     case ABI_AIX:        abi_string = "AIX";            break;
14743     case ABI_DARWIN:     abi_string = "Darwin";         break;
14744     case ABI_V4:         abi_string = "V.4";            break;
14745     }
14746
14747   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
14748
14749   if (TARGET_ALTIVEC_ABI)
14750     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
14751
14752   if (TARGET_SPE_ABI)
14753     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
14754
14755   if (info->first_gp_reg_save != 32)
14756     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
14757
14758   if (info->first_fp_reg_save != 64)
14759     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
14760
14761   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
14762     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
14763              info->first_altivec_reg_save);
14764
14765   if (info->lr_save_p)
14766     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
14767
14768   if (info->cr_save_p)
14769     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
14770
14771   if (info->vrsave_mask)
14772     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
14773
14774   if (info->push_p)
14775     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
14776
14777   if (info->calls_p)
14778     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
14779
14780   if (info->gp_save_offset)
14781     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
14782
14783   if (info->fp_save_offset)
14784     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
14785
14786   if (info->altivec_save_offset)
14787     fprintf (stderr, "\taltivec_save_offset = %5d\n",
14788              info->altivec_save_offset);
14789
14790   if (info->spe_gp_save_offset)
14791     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
14792              info->spe_gp_save_offset);
14793
14794   if (info->vrsave_save_offset)
14795     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
14796              info->vrsave_save_offset);
14797
14798   if (info->lr_save_offset)
14799     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
14800
14801   if (info->cr_save_offset)
14802     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
14803
14804   if (info->varargs_save_offset)
14805     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
14806
14807   if (info->total_size)
14808     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
14809              info->total_size);
14810
14811   if (info->vars_size)
14812     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
14813              info->vars_size);
14814
14815   if (info->parm_size)
14816     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
14817
14818   if (info->fixed_size)
14819     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
14820
14821   if (info->gp_size)
14822     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
14823
14824   if (info->spe_gp_size)
14825     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
14826
14827   if (info->fp_size)
14828     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
14829
14830   if (info->altivec_size)
14831     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
14832
14833   if (info->vrsave_size)
14834     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
14835
14836   if (info->altivec_padding_size)
14837     fprintf (stderr, "\taltivec_padding_size= %5d\n",
14838              info->altivec_padding_size);
14839
14840   if (info->spe_padding_size)
14841     fprintf (stderr, "\tspe_padding_size    = %5d\n",
14842              info->spe_padding_size);
14843
14844   if (info->cr_size)
14845     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
14846
14847   if (info->save_size)
14848     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
14849
14850   if (info->reg_size != 4)
14851     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
14852
14853   fprintf (stderr, "\n");
14854 }
14855
14856 rtx
14857 rs6000_return_addr (int count, rtx frame)
14858 {
14859   /* Currently we don't optimize very well between prolog and body
14860      code and for PIC code the code can be actually quite bad, so
14861      don't try to be too clever here.  */
14862   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
14863     {
14864       cfun->machine->ra_needs_full_frame = 1;
14865
14866       return
14867         gen_rtx_MEM
14868           (Pmode,
14869            memory_address
14870            (Pmode,
14871             plus_constant (copy_to_reg
14872                            (gen_rtx_MEM (Pmode,
14873                                          memory_address (Pmode, frame))),
14874                            RETURN_ADDRESS_OFFSET)));
14875     }
14876
14877   cfun->machine->ra_need_lr = 1;
14878   return get_hard_reg_initial_val (Pmode, LR_REGNO);
14879 }
14880
14881 /* Say whether a function is a candidate for sibcall handling or not.
14882    We do not allow indirect calls to be optimized into sibling calls.
14883    Also, we can't do it if there are any vector parameters; there's
14884    nowhere to put the VRsave code so it works; note that functions with
14885    vector parameters are required to have a prototype, so the argument
14886    type info must be available here.  (The tail recursion case can work
14887    with vector parameters, but there's no way to distinguish here.) */
14888 static bool
14889 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
14890 {
14891   tree type;
14892   if (decl)
14893     {
14894       if (TARGET_ALTIVEC_VRSAVE)
14895         {
14896           for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
14897                type; type = TREE_CHAIN (type))
14898             {
14899               if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
14900                 return false;
14901             }
14902         }
14903       if (DEFAULT_ABI == ABI_DARWIN
14904           || ((*targetm.binds_local_p) (decl)
14905               && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
14906         {
14907           tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
14908
14909           if (!lookup_attribute ("longcall", attr_list)
14910               || lookup_attribute ("shortcall", attr_list))
14911             return true;
14912         }
14913     }
14914   return false;
14915 }
14916
14917 /* NULL if INSN insn is valid within a low-overhead loop.
14918    Otherwise return why doloop cannot be applied.
14919    PowerPC uses the COUNT register for branch on table instructions.  */
14920
14921 static const char *
14922 rs6000_invalid_within_doloop (const_rtx insn)
14923 {
14924   if (CALL_P (insn))
14925     return "Function call in the loop.";
14926
14927   if (JUMP_P (insn)
14928       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
14929           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
14930     return "Computed branch in the loop.";
14931
14932   return NULL;
14933 }
14934
14935 static int
14936 rs6000_ra_ever_killed (void)
14937 {
14938   rtx top;
14939   rtx reg;
14940   rtx insn;
14941
14942   if (current_function_is_thunk)
14943     return 0;
14944
14945   /* regs_ever_live has LR marked as used if any sibcalls are present,
14946      but this should not force saving and restoring in the
14947      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
14948      clobbers LR, so that is inappropriate.  */
14949
14950   /* Also, the prologue can generate a store into LR that
14951      doesn't really count, like this:
14952
14953         move LR->R0
14954         bcl to set PIC register
14955         move LR->R31
14956         move R0->LR
14957
14958      When we're called from the epilogue, we need to avoid counting
14959      this as a store.  */
14960
14961   push_topmost_sequence ();
14962   top = get_insns ();
14963   pop_topmost_sequence ();
14964   reg = gen_rtx_REG (Pmode, LR_REGNO);
14965
14966   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
14967     {
14968       if (INSN_P (insn))
14969         {
14970           if (CALL_P (insn))
14971             {
14972               if (!SIBLING_CALL_P (insn))
14973                 return 1;
14974             }
14975           else if (find_regno_note (insn, REG_INC, LR_REGNO))
14976             return 1;
14977           else if (set_of (reg, insn) != NULL_RTX
14978                    && !prologue_epilogue_contains (insn))
14979             return 1;
14980         }
14981     }
14982   return 0;
14983 }
14984 \f
14985 /* Emit instructions needed to load the TOC register.
14986    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
14987    a constant pool; or for SVR4 -fpic.  */
14988
14989 void
14990 rs6000_emit_load_toc_table (int fromprolog)
14991 {
14992   rtx dest;
14993   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
14994
14995   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
14996     {
14997       char buf[30];
14998       rtx lab, tmp1, tmp2, got;
14999
15000       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
15001       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15002       if (flag_pic == 2)
15003         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
15004       else
15005         got = rs6000_got_sym ();
15006       tmp1 = tmp2 = dest;
15007       if (!fromprolog)
15008         {
15009           tmp1 = gen_reg_rtx (Pmode);
15010           tmp2 = gen_reg_rtx (Pmode);
15011         }
15012       emit_insn (gen_load_toc_v4_PIC_1 (lab));
15013       emit_move_insn (tmp1,
15014                              gen_rtx_REG (Pmode, LR_REGNO));
15015       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
15016       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
15017     }
15018   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
15019     {
15020       emit_insn (gen_load_toc_v4_pic_si ());
15021       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
15022     }
15023   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
15024     {
15025       char buf[30];
15026       rtx temp0 = (fromprolog
15027                    ? gen_rtx_REG (Pmode, 0)
15028                    : gen_reg_rtx (Pmode));
15029
15030       if (fromprolog)
15031         {
15032           rtx symF, symL;
15033
15034           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
15035           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15036
15037           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
15038           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15039
15040           emit_insn (gen_load_toc_v4_PIC_1 (symF));
15041           emit_move_insn (dest,
15042                           gen_rtx_REG (Pmode, LR_REGNO));
15043           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
15044         }
15045       else
15046         {
15047           rtx tocsym;
15048
15049           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
15050           emit_insn (gen_load_toc_v4_PIC_1b (tocsym));
15051           emit_move_insn (dest,
15052                           gen_rtx_REG (Pmode, LR_REGNO));
15053           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
15054         }
15055       emit_insn (gen_addsi3 (dest, temp0, dest));
15056     }
15057   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
15058     {
15059       /* This is for AIX code running in non-PIC ELF32.  */
15060       char buf[30];
15061       rtx realsym;
15062       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
15063       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15064
15065       emit_insn (gen_elf_high (dest, realsym));
15066       emit_insn (gen_elf_low (dest, dest, realsym));
15067     }
15068   else
15069     {
15070       gcc_assert (DEFAULT_ABI == ABI_AIX);
15071
15072       if (TARGET_32BIT)
15073         emit_insn (gen_load_toc_aix_si (dest));
15074       else
15075         emit_insn (gen_load_toc_aix_di (dest));
15076     }
15077 }
15078
15079 /* Emit instructions to restore the link register after determining where
15080    its value has been stored.  */
15081
15082 void
15083 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
15084 {
15085   rs6000_stack_t *info = rs6000_stack_info ();
15086   rtx operands[2];
15087
15088   operands[0] = source;
15089   operands[1] = scratch;
15090
15091   if (info->lr_save_p)
15092     {
15093       rtx frame_rtx = stack_pointer_rtx;
15094       HOST_WIDE_INT sp_offset = 0;
15095       rtx tmp;
15096
15097       if (frame_pointer_needed
15098           || current_function_calls_alloca
15099           || info->total_size > 32767)
15100         {
15101           tmp = gen_frame_mem (Pmode, frame_rtx);
15102           emit_move_insn (operands[1], tmp);
15103           frame_rtx = operands[1];
15104         }
15105       else if (info->push_p)
15106         sp_offset = info->total_size;
15107
15108       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
15109       tmp = gen_frame_mem (Pmode, tmp);
15110       emit_move_insn (tmp, operands[0]);
15111     }
15112   else
15113     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
15114 }
15115
15116 static GTY(()) alias_set_type set = -1;
15117
15118 alias_set_type
15119 get_TOC_alias_set (void)
15120 {
15121   if (set == -1)
15122     set = new_alias_set ();
15123   return set;
15124 }
15125
15126 /* This returns nonzero if the current function uses the TOC.  This is
15127    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
15128    is generated by the ABI_V4 load_toc_* patterns.  */
15129 #if TARGET_ELF
15130 static int
15131 uses_TOC (void)
15132 {
15133   rtx insn;
15134
15135   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
15136     if (INSN_P (insn))
15137       {
15138         rtx pat = PATTERN (insn);
15139         int i;
15140
15141         if (GET_CODE (pat) == PARALLEL)
15142           for (i = 0; i < XVECLEN (pat, 0); i++)
15143             {
15144               rtx sub = XVECEXP (pat, 0, i);
15145               if (GET_CODE (sub) == USE)
15146                 {
15147                   sub = XEXP (sub, 0);
15148                   if (GET_CODE (sub) == UNSPEC
15149                       && XINT (sub, 1) == UNSPEC_TOC)
15150                     return 1;
15151                 }
15152             }
15153       }
15154   return 0;
15155 }
15156 #endif
15157
15158 rtx
15159 create_TOC_reference (rtx symbol)
15160 {
15161   if (!can_create_pseudo_p ())
15162     df_set_regs_ever_live (TOC_REGISTER, true);
15163   return gen_rtx_PLUS (Pmode,
15164            gen_rtx_REG (Pmode, TOC_REGISTER),
15165              gen_rtx_CONST (Pmode,
15166                gen_rtx_MINUS (Pmode, symbol,
15167                  gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
15168 }
15169
15170 /* If _Unwind_* has been called from within the same module,
15171    toc register is not guaranteed to be saved to 40(1) on function
15172    entry.  Save it there in that case.  */
15173
15174 void
15175 rs6000_aix_emit_builtin_unwind_init (void)
15176 {
15177   rtx mem;
15178   rtx stack_top = gen_reg_rtx (Pmode);
15179   rtx opcode_addr = gen_reg_rtx (Pmode);
15180   rtx opcode = gen_reg_rtx (SImode);
15181   rtx tocompare = gen_reg_rtx (SImode);
15182   rtx no_toc_save_needed = gen_label_rtx ();
15183
15184   mem = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
15185   emit_move_insn (stack_top, mem);
15186
15187   mem = gen_frame_mem (Pmode,
15188                        gen_rtx_PLUS (Pmode, stack_top,
15189                                      GEN_INT (2 * GET_MODE_SIZE (Pmode))));
15190   emit_move_insn (opcode_addr, mem);
15191   emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
15192   emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
15193                                            : 0xE8410028, SImode));
15194
15195   do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
15196                            SImode, NULL_RTX, NULL_RTX,
15197                            no_toc_save_needed);
15198
15199   mem = gen_frame_mem (Pmode,
15200                        gen_rtx_PLUS (Pmode, stack_top,
15201                                      GEN_INT (5 * GET_MODE_SIZE (Pmode))));
15202   emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
15203   emit_label (no_toc_save_needed);
15204 }
15205 \f
15206 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
15207    and the change to the stack pointer.  */
15208
15209 static void
15210 rs6000_emit_stack_tie (void)
15211 {
15212   rtx mem = gen_frame_mem (BLKmode,
15213                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
15214
15215   emit_insn (gen_stack_tie (mem));
15216 }
15217
15218 /* Emit the correct code for allocating stack space, as insns.
15219    If COPY_R12, make sure a copy of the old frame is left in r12.
15220    The generated code may use hard register 0 as a temporary.  */
15221
15222 static void
15223 rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12)
15224 {
15225   rtx insn;
15226   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
15227   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
15228   rtx todec = gen_int_mode (-size, Pmode);
15229
15230   if (INTVAL (todec) != -size)
15231     {
15232       warning (0, "stack frame too large");
15233       emit_insn (gen_trap ());
15234       return;
15235     }
15236
15237   if (current_function_limit_stack)
15238     {
15239       if (REG_P (stack_limit_rtx)
15240           && REGNO (stack_limit_rtx) > 1
15241           && REGNO (stack_limit_rtx) <= 31)
15242         {
15243           emit_insn (TARGET_32BIT
15244                      ? gen_addsi3 (tmp_reg,
15245                                    stack_limit_rtx,
15246                                    GEN_INT (size))
15247                      : gen_adddi3 (tmp_reg,
15248                                    stack_limit_rtx,
15249                                    GEN_INT (size)));
15250
15251           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
15252                                     const0_rtx));
15253         }
15254       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
15255                && TARGET_32BIT
15256                && DEFAULT_ABI == ABI_V4)
15257         {
15258           rtx toload = gen_rtx_CONST (VOIDmode,
15259                                       gen_rtx_PLUS (Pmode,
15260                                                     stack_limit_rtx,
15261                                                     GEN_INT (size)));
15262
15263           emit_insn (gen_elf_high (tmp_reg, toload));
15264           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
15265           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
15266                                     const0_rtx));
15267         }
15268       else
15269         warning (0, "stack limit expression is not supported");
15270     }
15271
15272   if (copy_r12 || ! TARGET_UPDATE)
15273     emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
15274
15275   if (TARGET_UPDATE)
15276     {
15277       if (size > 32767)
15278         {
15279           /* Need a note here so that try_split doesn't get confused.  */
15280           if (get_last_insn () == NULL_RTX)
15281             emit_note (NOTE_INSN_DELETED);
15282           insn = emit_move_insn (tmp_reg, todec);
15283           try_split (PATTERN (insn), insn, 0);
15284           todec = tmp_reg;
15285         }
15286
15287       insn = emit_insn (TARGET_32BIT
15288                         ? gen_movsi_update (stack_reg, stack_reg,
15289                                             todec, stack_reg)
15290                         : gen_movdi_di_update (stack_reg, stack_reg,
15291                                             todec, stack_reg));
15292     }
15293   else
15294     {
15295       insn = emit_insn (TARGET_32BIT
15296                         ? gen_addsi3 (stack_reg, stack_reg, todec)
15297                         : gen_adddi3 (stack_reg, stack_reg, todec));
15298       emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
15299                       gen_rtx_REG (Pmode, 12));
15300     }
15301
15302   RTX_FRAME_RELATED_P (insn) = 1;
15303   REG_NOTES (insn) =
15304     gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
15305                        gen_rtx_SET (VOIDmode, stack_reg,
15306                                     gen_rtx_PLUS (Pmode, stack_reg,
15307                                                   GEN_INT (-size))),
15308                        REG_NOTES (insn));
15309 }
15310
15311 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
15312    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
15313    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
15314    deduce these equivalences by itself so it wasn't necessary to hold
15315    its hand so much.  */
15316
15317 static void
15318 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
15319                       rtx reg2, rtx rreg)
15320 {
15321   rtx real, temp;
15322
15323   /* copy_rtx will not make unique copies of registers, so we need to
15324      ensure we don't have unwanted sharing here.  */
15325   if (reg == reg2)
15326     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
15327
15328   if (reg == rreg)
15329     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
15330
15331   real = copy_rtx (PATTERN (insn));
15332
15333   if (reg2 != NULL_RTX)
15334     real = replace_rtx (real, reg2, rreg);
15335
15336   real = replace_rtx (real, reg,
15337                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
15338                                                         STACK_POINTER_REGNUM),
15339                                     GEN_INT (val)));
15340
15341   /* We expect that 'real' is either a SET or a PARALLEL containing
15342      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
15343      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
15344
15345   if (GET_CODE (real) == SET)
15346     {
15347       rtx set = real;
15348
15349       temp = simplify_rtx (SET_SRC (set));
15350       if (temp)
15351         SET_SRC (set) = temp;
15352       temp = simplify_rtx (SET_DEST (set));
15353       if (temp)
15354         SET_DEST (set) = temp;
15355       if (GET_CODE (SET_DEST (set)) == MEM)
15356         {
15357           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
15358           if (temp)
15359             XEXP (SET_DEST (set), 0) = temp;
15360         }
15361     }
15362   else
15363     {
15364       int i;
15365
15366       gcc_assert (GET_CODE (real) == PARALLEL);
15367       for (i = 0; i < XVECLEN (real, 0); i++)
15368         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
15369           {
15370             rtx set = XVECEXP (real, 0, i);
15371
15372             temp = simplify_rtx (SET_SRC (set));
15373             if (temp)
15374               SET_SRC (set) = temp;
15375             temp = simplify_rtx (SET_DEST (set));
15376             if (temp)
15377               SET_DEST (set) = temp;
15378             if (GET_CODE (SET_DEST (set)) == MEM)
15379               {
15380                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
15381                 if (temp)
15382                   XEXP (SET_DEST (set), 0) = temp;
15383               }
15384             RTX_FRAME_RELATED_P (set) = 1;
15385           }
15386     }
15387
15388   RTX_FRAME_RELATED_P (insn) = 1;
15389   REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
15390                                         real,
15391                                         REG_NOTES (insn));
15392 }
15393
15394 /* Returns an insn that has a vrsave set operation with the
15395    appropriate CLOBBERs.  */
15396
15397 static rtx
15398 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
15399 {
15400   int nclobs, i;
15401   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
15402   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
15403
15404   clobs[0]
15405     = gen_rtx_SET (VOIDmode,
15406                    vrsave,
15407                    gen_rtx_UNSPEC_VOLATILE (SImode,
15408                                             gen_rtvec (2, reg, vrsave),
15409                                             UNSPECV_SET_VRSAVE));
15410
15411   nclobs = 1;
15412
15413   /* We need to clobber the registers in the mask so the scheduler
15414      does not move sets to VRSAVE before sets of AltiVec registers.
15415
15416      However, if the function receives nonlocal gotos, reload will set
15417      all call saved registers live.  We will end up with:
15418
15419         (set (reg 999) (mem))
15420         (parallel [ (set (reg vrsave) (unspec blah))
15421                     (clobber (reg 999))])
15422
15423      The clobber will cause the store into reg 999 to be dead, and
15424      flow will attempt to delete an epilogue insn.  In this case, we
15425      need an unspec use/set of the register.  */
15426
15427   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
15428     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
15429       {
15430         if (!epiloguep || call_used_regs [i])
15431           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
15432                                              gen_rtx_REG (V4SImode, i));
15433         else
15434           {
15435             rtx reg = gen_rtx_REG (V4SImode, i);
15436
15437             clobs[nclobs++]
15438               = gen_rtx_SET (VOIDmode,
15439                              reg,
15440                              gen_rtx_UNSPEC (V4SImode,
15441                                              gen_rtvec (1, reg), 27));
15442           }
15443       }
15444
15445   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
15446
15447   for (i = 0; i < nclobs; ++i)
15448     XVECEXP (insn, 0, i) = clobs[i];
15449
15450   return insn;
15451 }
15452
15453 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
15454    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
15455
15456 static void
15457 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
15458                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
15459 {
15460   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
15461   rtx replacea, replaceb;
15462
15463   int_rtx = GEN_INT (offset);
15464
15465   /* Some cases that need register indexed addressing.  */
15466   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
15467       || (TARGET_E500_DOUBLE && (mode == DFmode || mode == DDmode))
15468       || (TARGET_SPE_ABI
15469           && SPE_VECTOR_MODE (mode)
15470           && !SPE_CONST_OFFSET_OK (offset)))
15471     {
15472       /* Whomever calls us must make sure r11 is available in the
15473          flow path of instructions in the prologue.  */
15474       offset_rtx = gen_rtx_REG (Pmode, 11);
15475       emit_move_insn (offset_rtx, int_rtx);
15476
15477       replacea = offset_rtx;
15478       replaceb = int_rtx;
15479     }
15480   else
15481     {
15482       offset_rtx = int_rtx;
15483       replacea = NULL_RTX;
15484       replaceb = NULL_RTX;
15485     }
15486
15487   reg = gen_rtx_REG (mode, regno);
15488   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
15489   mem = gen_frame_mem (mode, addr);
15490
15491   insn = emit_move_insn (mem, reg);
15492
15493   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
15494 }
15495
15496 /* Emit an offset memory reference suitable for a frame store, while
15497    converting to a valid addressing mode.  */
15498
15499 static rtx
15500 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
15501 {
15502   rtx int_rtx, offset_rtx;
15503
15504   int_rtx = GEN_INT (offset);
15505
15506   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
15507       || (TARGET_E500_DOUBLE && (mode == DFmode || mode == DDmode)))
15508     {
15509       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
15510       emit_move_insn (offset_rtx, int_rtx);
15511     }
15512   else
15513     offset_rtx = int_rtx;
15514
15515   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
15516 }
15517
15518 /* Look for user-defined global regs.  We should not save and restore these,
15519    and cannot use stmw/lmw if there are any in its range.  */
15520
15521 static bool
15522 no_global_regs_above (int first_greg)
15523 {
15524   int i;
15525   for (i = 0; i < 32 - first_greg; i++)
15526     if (global_regs[first_greg + i])
15527       return false;
15528   return true;
15529 }
15530
15531 #ifndef TARGET_FIX_AND_CONTINUE
15532 #define TARGET_FIX_AND_CONTINUE 0
15533 #endif
15534
15535 /* Determine whether the gp REG is really used.  */
15536
15537 static bool
15538 rs6000_reg_live_or_pic_offset_p (int reg)
15539 {
15540   return ((df_regs_ever_live_p (reg)
15541            && (!call_used_regs[reg]
15542                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
15543                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
15544           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
15545               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
15546                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
15547 }
15548
15549 /* Emit function prologue as insns.  */
15550
15551 void
15552 rs6000_emit_prologue (void)
15553 {
15554   rs6000_stack_t *info = rs6000_stack_info ();
15555   enum machine_mode reg_mode = Pmode;
15556   int reg_size = TARGET_32BIT ? 4 : 8;
15557   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
15558   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
15559   rtx frame_reg_rtx = sp_reg_rtx;
15560   rtx cr_save_rtx = NULL_RTX;
15561   rtx insn;
15562   int saving_FPRs_inline;
15563   int using_store_multiple;
15564   HOST_WIDE_INT sp_offset = 0;
15565
15566   if (TARGET_FIX_AND_CONTINUE)
15567     {
15568       /* gdb on darwin arranges to forward a function from the old
15569          address by modifying the first 5 instructions of the function
15570          to branch to the overriding function.  This is necessary to
15571          permit function pointers that point to the old function to
15572          actually forward to the new function.  */
15573       emit_insn (gen_nop ());
15574       emit_insn (gen_nop ());
15575       emit_insn (gen_nop ());
15576       emit_insn (gen_nop ());
15577       emit_insn (gen_nop ());
15578     }
15579
15580   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
15581     {
15582       reg_mode = V2SImode;
15583       reg_size = 8;
15584     }
15585
15586   using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
15587                           && (!TARGET_SPE_ABI
15588                               || info->spe_64bit_regs_used == 0)
15589                           && info->first_gp_reg_save < 31
15590                           && no_global_regs_above (info->first_gp_reg_save));
15591   saving_FPRs_inline = (info->first_fp_reg_save == 64
15592                         || FP_SAVE_INLINE (info->first_fp_reg_save)
15593                         || current_function_calls_eh_return
15594                         || cfun->machine->ra_need_lr);
15595
15596   /* For V.4, update stack before we do any saving and set back pointer.  */
15597   if (! WORLD_SAVE_P (info)
15598       && info->push_p
15599       && (DEFAULT_ABI == ABI_V4
15600           || current_function_calls_eh_return))
15601     {
15602       if (info->total_size < 32767)
15603         sp_offset = info->total_size;
15604       else
15605         frame_reg_rtx = frame_ptr_rtx;
15606       rs6000_emit_allocate_stack (info->total_size,
15607                                   (frame_reg_rtx != sp_reg_rtx
15608                                    && (info->cr_save_p
15609                                        || info->lr_save_p
15610                                        || info->first_fp_reg_save < 64
15611                                        || info->first_gp_reg_save < 32
15612                                        )));
15613       if (frame_reg_rtx != sp_reg_rtx)
15614         rs6000_emit_stack_tie ();
15615     }
15616
15617   /* Handle world saves specially here.  */
15618   if (WORLD_SAVE_P (info))
15619     {
15620       int i, j, sz;
15621       rtx treg;
15622       rtvec p;
15623       rtx reg0;
15624
15625       /* save_world expects lr in r0. */
15626       reg0 = gen_rtx_REG (Pmode, 0);
15627       if (info->lr_save_p)
15628         {
15629           insn = emit_move_insn (reg0,
15630                                  gen_rtx_REG (Pmode, LR_REGNO));
15631           RTX_FRAME_RELATED_P (insn) = 1;
15632         }
15633
15634       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
15635          assumptions about the offsets of various bits of the stack
15636          frame.  */
15637       gcc_assert (info->gp_save_offset == -220
15638                   && info->fp_save_offset == -144
15639                   && info->lr_save_offset == 8
15640                   && info->cr_save_offset == 4
15641                   && info->push_p
15642                   && info->lr_save_p
15643                   && (!current_function_calls_eh_return
15644                        || info->ehrd_offset == -432)
15645                   && info->vrsave_save_offset == -224
15646                   && info->altivec_save_offset == -416);
15647
15648       treg = gen_rtx_REG (SImode, 11);
15649       emit_move_insn (treg, GEN_INT (-info->total_size));
15650
15651       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
15652          in R11.  It also clobbers R12, so beware!  */
15653
15654       /* Preserve CR2 for save_world prologues */
15655       sz = 5;
15656       sz += 32 - info->first_gp_reg_save;
15657       sz += 64 - info->first_fp_reg_save;
15658       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
15659       p = rtvec_alloc (sz);
15660       j = 0;
15661       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
15662                                             gen_rtx_REG (SImode,
15663                                                          LR_REGNO));
15664       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
15665                                         gen_rtx_SYMBOL_REF (Pmode,
15666                                                             "*save_world"));
15667       /* We do floats first so that the instruction pattern matches
15668          properly.  */
15669       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
15670         {
15671           rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
15672           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15673                                    GEN_INT (info->fp_save_offset
15674                                             + sp_offset + 8 * i));
15675           rtx mem = gen_frame_mem (DFmode, addr);
15676
15677           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
15678         }
15679       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
15680         {
15681           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
15682           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15683                                    GEN_INT (info->altivec_save_offset
15684                                             + sp_offset + 16 * i));
15685           rtx mem = gen_frame_mem (V4SImode, addr);
15686
15687           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
15688         }
15689       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15690         {
15691           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
15692           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15693                                    GEN_INT (info->gp_save_offset
15694                                             + sp_offset + reg_size * i));
15695           rtx mem = gen_frame_mem (reg_mode, addr);
15696
15697           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
15698         }
15699
15700       {
15701         /* CR register traditionally saved as CR2.  */
15702         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
15703         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15704                                  GEN_INT (info->cr_save_offset
15705                                           + sp_offset));
15706         rtx mem = gen_frame_mem (reg_mode, addr);
15707
15708         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
15709       }
15710       /* Explain about use of R0.  */
15711       if (info->lr_save_p)
15712         {
15713           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15714                                    GEN_INT (info->lr_save_offset
15715                                             + sp_offset));
15716           rtx mem = gen_frame_mem (reg_mode, addr);
15717
15718           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
15719         }
15720       /* Explain what happens to the stack pointer.  */
15721       {
15722         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
15723         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
15724       }
15725
15726       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
15727       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
15728                             treg, GEN_INT (-info->total_size));
15729       sp_offset = info->total_size;
15730     }
15731
15732   /* If we use the link register, get it into r0.  */
15733   if (!WORLD_SAVE_P (info) && info->lr_save_p)
15734     {
15735       rtx addr, reg, mem;
15736
15737       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
15738                              gen_rtx_REG (Pmode, LR_REGNO));
15739       RTX_FRAME_RELATED_P (insn) = 1;
15740
15741       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15742                                GEN_INT (info->lr_save_offset + sp_offset));
15743       reg = gen_rtx_REG (Pmode, 0);
15744       mem = gen_rtx_MEM (Pmode, addr);
15745       /* This should not be of rs6000_sr_alias_set, because of
15746          __builtin_return_address.  */
15747
15748       insn = emit_move_insn (mem, reg);
15749       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
15750                             NULL_RTX, NULL_RTX);
15751     }
15752
15753   /* If we need to save CR, put it into r12.  */
15754   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
15755     {
15756       rtx set;
15757
15758       cr_save_rtx = gen_rtx_REG (SImode, 12);
15759       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
15760       RTX_FRAME_RELATED_P (insn) = 1;
15761       /* Now, there's no way that dwarf2out_frame_debug_expr is going
15762          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
15763          But that's OK.  All we have to do is specify that _one_ condition
15764          code register is saved in this stack slot.  The thrower's epilogue
15765          will then restore all the call-saved registers.
15766          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
15767       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
15768                          gen_rtx_REG (SImode, CR2_REGNO));
15769       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
15770                                             set,
15771                                             REG_NOTES (insn));
15772     }
15773
15774   /* Do any required saving of fpr's.  If only one or two to save, do
15775      it ourselves.  Otherwise, call function.  */
15776   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
15777     {
15778       int i;
15779       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
15780         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
15781              && ! call_used_regs[info->first_fp_reg_save+i]))
15782           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
15783                            info->first_fp_reg_save + i,
15784                            info->fp_save_offset + sp_offset + 8 * i,
15785                            info->total_size);
15786     }
15787   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
15788     {
15789       int i;
15790       char rname[30];
15791       const char *alloc_rname;
15792       rtvec p;
15793       p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
15794
15795       RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
15796                                           gen_rtx_REG (Pmode,
15797                                                        LR_REGNO));
15798       sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
15799                info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
15800       alloc_rname = ggc_strdup (rname);
15801       RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
15802                                       gen_rtx_SYMBOL_REF (Pmode,
15803                                                           alloc_rname));
15804       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
15805         {
15806           rtx addr, reg, mem;
15807           reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
15808           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15809                                GEN_INT (info->fp_save_offset
15810                                         + sp_offset + 8*i));
15811           mem = gen_frame_mem (DFmode, addr);
15812
15813           RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
15814         }
15815       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
15816       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
15817                             NULL_RTX, NULL_RTX);
15818     }
15819
15820   /* Save GPRs.  This is done as a PARALLEL if we are using
15821      the store-multiple instructions.  */
15822   if (!WORLD_SAVE_P (info) && using_store_multiple)
15823     {
15824       rtvec p;
15825       int i;
15826       p = rtvec_alloc (32 - info->first_gp_reg_save);
15827       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15828         {
15829           rtx addr, reg, mem;
15830           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
15831           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15832                                GEN_INT (info->gp_save_offset
15833                                         + sp_offset
15834                                         + reg_size * i));
15835           mem = gen_frame_mem (reg_mode, addr);
15836
15837           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
15838         }
15839       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
15840       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
15841                             NULL_RTX, NULL_RTX);
15842     }
15843    else if (!WORLD_SAVE_P (info)
15844             && TARGET_SPE_ABI
15845             && info->spe_64bit_regs_used != 0
15846             && info->first_gp_reg_save != 32)
15847      {
15848        int i;
15849        rtx spe_save_area_ptr;
15850        int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
15851                                    && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
15852                                    && !call_used_regs[STATIC_CHAIN_REGNUM]);
15853  
15854        /* Determine whether we can address all of the registers that need
15855           to be saved with an offset from the stack pointer that fits in
15856           the small const field for SPE memory instructions.  */
15857        int spe_regs_addressable_via_sp
15858          = SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
15859                                + (32 - info->first_gp_reg_save - 1) * reg_size);
15860        int spe_offset;
15861  
15862        if (spe_regs_addressable_via_sp)
15863          {
15864            spe_save_area_ptr = frame_reg_rtx;
15865            spe_offset = info->spe_gp_save_offset + sp_offset;
15866          }
15867        else
15868          {
15869            /* Make r11 point to the start of the SPE save area.  We need
15870               to be careful here if r11 is holding the static chain.  If
15871               it is, then temporarily save it in r0.  We would use r0 as
15872               our base register here, but using r0 as a base register in
15873               loads and stores means something different from what we
15874               would like.  */
15875            if (using_static_chain_p)
15876              {
15877                rtx r0 = gen_rtx_REG (Pmode, 0);
15878  
15879                gcc_assert (info->first_gp_reg_save > 11);
15880  
15881                emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
15882              }
15883  
15884            spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
15885            emit_insn (gen_addsi3 (spe_save_area_ptr, frame_reg_rtx,
15886                                   GEN_INT (info->spe_gp_save_offset + sp_offset)));
15887  
15888            spe_offset = 0;
15889          }
15890  
15891        for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15892          if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
15893            {
15894              rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
15895              rtx offset, addr, mem;
15896  
15897              /* We're doing all this to ensure that the offset fits into
15898                 the immediate offset of 'evstdd'.  */
15899              gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
15900  
15901              offset = GEN_INT (reg_size * i + spe_offset);
15902              addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
15903              mem = gen_rtx_MEM (V2SImode, addr);
15904  
15905              insn = emit_move_insn (mem, reg);
15906            
15907              rs6000_frame_related (insn, spe_save_area_ptr,
15908                                    info->spe_gp_save_offset
15909                                    + sp_offset + reg_size * i,
15910                                    offset, const0_rtx);
15911            }
15912  
15913        /* Move the static chain pointer back.  */
15914        if (using_static_chain_p && !spe_regs_addressable_via_sp)
15915          emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
15916      }
15917   else if (!WORLD_SAVE_P (info))
15918     {
15919       int i;
15920       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
15921         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
15922           {
15923             rtx addr, reg, mem;
15924             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
15925
15926             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15927                                  GEN_INT (info->gp_save_offset
15928                                           + sp_offset
15929                                           + reg_size * i));
15930             mem = gen_frame_mem (reg_mode, addr);
15931
15932             insn = emit_move_insn (mem, reg);
15933             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
15934                                   NULL_RTX, NULL_RTX);
15935           }
15936     }
15937
15938   /* ??? There's no need to emit actual instructions here, but it's the
15939      easiest way to get the frame unwind information emitted.  */
15940   if (current_function_calls_eh_return)
15941     {
15942       unsigned int i, regno;
15943
15944       /* In AIX ABI we need to pretend we save r2 here.  */
15945       if (TARGET_AIX)
15946         {
15947           rtx addr, reg, mem;
15948
15949           reg = gen_rtx_REG (reg_mode, 2);
15950           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15951                                GEN_INT (sp_offset + 5 * reg_size));
15952           mem = gen_frame_mem (reg_mode, addr);
15953
15954           insn = emit_move_insn (mem, reg);
15955           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
15956                                 NULL_RTX, NULL_RTX);
15957           PATTERN (insn) = gen_blockage ();
15958         }
15959
15960       for (i = 0; ; ++i)
15961         {
15962           regno = EH_RETURN_DATA_REGNO (i);
15963           if (regno == INVALID_REGNUM)
15964             break;
15965
15966           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
15967                            info->ehrd_offset + sp_offset
15968                            + reg_size * (int) i,
15969                            info->total_size);
15970         }
15971     }
15972
15973   /* Save CR if we use any that must be preserved.  */
15974   if (!WORLD_SAVE_P (info) && info->cr_save_p)
15975     {
15976       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15977                                GEN_INT (info->cr_save_offset + sp_offset));
15978       rtx mem = gen_frame_mem (SImode, addr);
15979       /* See the large comment above about why CR2_REGNO is used.  */
15980       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
15981
15982       /* If r12 was used to hold the original sp, copy cr into r0 now
15983          that it's free.  */
15984       if (REGNO (frame_reg_rtx) == 12)
15985         {
15986           rtx set;
15987
15988           cr_save_rtx = gen_rtx_REG (SImode, 0);
15989           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
15990           RTX_FRAME_RELATED_P (insn) = 1;
15991           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
15992           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
15993                                                 set,
15994                                                 REG_NOTES (insn));
15995
15996         }
15997       insn = emit_move_insn (mem, cr_save_rtx);
15998
15999       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16000                             NULL_RTX, NULL_RTX);
16001     }
16002
16003   /* Update stack and set back pointer unless this is V.4,
16004      for which it was done previously.  */
16005   if (!WORLD_SAVE_P (info) && info->push_p
16006       && !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return))
16007     {
16008       if (info->total_size < 32767)
16009       sp_offset = info->total_size;
16010       else
16011         frame_reg_rtx = frame_ptr_rtx;
16012       rs6000_emit_allocate_stack (info->total_size,
16013                                   (frame_reg_rtx != sp_reg_rtx
16014                                    && ((info->altivec_size != 0)
16015                                        || (info->vrsave_mask != 0)
16016                                        )));
16017       if (frame_reg_rtx != sp_reg_rtx)
16018         rs6000_emit_stack_tie ();
16019     }
16020
16021   /* Set frame pointer, if needed.  */
16022   if (frame_pointer_needed)
16023     {
16024       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
16025                              sp_reg_rtx);
16026       RTX_FRAME_RELATED_P (insn) = 1;
16027     }
16028
16029   /* Save AltiVec registers if needed.  Save here because the red zone does
16030      not include AltiVec registers.  */
16031   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
16032     {
16033       int i;
16034
16035       /* There should be a non inline version of this, for when we
16036          are saving lots of vector registers.  */
16037       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
16038         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
16039           {
16040             rtx areg, savereg, mem;
16041             int offset;
16042
16043             offset = info->altivec_save_offset + sp_offset
16044               + 16 * (i - info->first_altivec_reg_save);
16045
16046             savereg = gen_rtx_REG (V4SImode, i);
16047
16048             areg = gen_rtx_REG (Pmode, 0);
16049             emit_move_insn (areg, GEN_INT (offset));
16050
16051             /* AltiVec addressing mode is [reg+reg].  */
16052             mem = gen_frame_mem (V4SImode,
16053                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
16054
16055             insn = emit_move_insn (mem, savereg);
16056
16057             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16058                                   areg, GEN_INT (offset));
16059           }
16060     }
16061
16062   /* VRSAVE is a bit vector representing which AltiVec registers
16063      are used.  The OS uses this to determine which vector
16064      registers to save on a context switch.  We need to save
16065      VRSAVE on the stack frame, add whatever AltiVec registers we
16066      used in this function, and do the corresponding magic in the
16067      epilogue.  */
16068
16069   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
16070       && info->vrsave_mask != 0)
16071     {
16072       rtx reg, mem, vrsave;
16073       int offset;
16074
16075       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
16076          as frame_reg_rtx and r11 as the static chain pointer for
16077          nested functions.  */
16078       reg = gen_rtx_REG (SImode, 0);
16079       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
16080       if (TARGET_MACHO)
16081         emit_insn (gen_get_vrsave_internal (reg));
16082       else
16083         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
16084
16085       if (!WORLD_SAVE_P (info))
16086         {
16087           /* Save VRSAVE.  */
16088           offset = info->vrsave_save_offset + sp_offset;
16089           mem = gen_frame_mem (SImode,
16090                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
16091                                              GEN_INT (offset)));
16092           insn = emit_move_insn (mem, reg);
16093         }
16094
16095       /* Include the registers in the mask.  */
16096       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
16097
16098       insn = emit_insn (generate_set_vrsave (reg, info, 0));
16099     }
16100
16101   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
16102   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
16103       || (DEFAULT_ABI == ABI_V4
16104           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
16105           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
16106     {
16107       /* If emit_load_toc_table will use the link register, we need to save
16108          it.  We use R12 for this purpose because emit_load_toc_table
16109          can use register 0.  This allows us to use a plain 'blr' to return
16110          from the procedure more often.  */
16111       int save_LR_around_toc_setup = (TARGET_ELF
16112                                       && DEFAULT_ABI != ABI_AIX
16113                                       && flag_pic
16114                                       && ! info->lr_save_p
16115                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
16116       if (save_LR_around_toc_setup)
16117         {
16118           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
16119
16120           insn = emit_move_insn (frame_ptr_rtx, lr);
16121           RTX_FRAME_RELATED_P (insn) = 1;
16122
16123           rs6000_emit_load_toc_table (TRUE);
16124
16125           insn = emit_move_insn (lr, frame_ptr_rtx);
16126           RTX_FRAME_RELATED_P (insn) = 1;
16127         }
16128       else
16129         rs6000_emit_load_toc_table (TRUE);
16130     }
16131
16132 #if TARGET_MACHO
16133   if (DEFAULT_ABI == ABI_DARWIN
16134       && flag_pic && current_function_uses_pic_offset_table)
16135     {
16136       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
16137       rtx src = machopic_function_base_sym ();
16138
16139       /* Save and restore LR locally around this call (in R0).  */
16140       if (!info->lr_save_p)
16141         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
16142
16143       emit_insn (gen_load_macho_picbase (src));
16144
16145       emit_move_insn (gen_rtx_REG (Pmode,
16146                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
16147                       lr);
16148
16149       if (!info->lr_save_p)
16150         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
16151     }
16152 #endif
16153 }
16154
16155 /* Write function prologue.  */
16156
16157 static void
16158 rs6000_output_function_prologue (FILE *file,
16159                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
16160 {
16161   rs6000_stack_t *info = rs6000_stack_info ();
16162
16163   if (TARGET_DEBUG_STACK)
16164     debug_stack_info (info);
16165
16166   /* Write .extern for any function we will call to save and restore
16167      fp values.  */
16168   if (info->first_fp_reg_save < 64
16169       && !FP_SAVE_INLINE (info->first_fp_reg_save))
16170     fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
16171              SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
16172              RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
16173              RESTORE_FP_SUFFIX);
16174
16175   /* Write .extern for AIX common mode routines, if needed.  */
16176   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
16177     {
16178       fputs ("\t.extern __mulh\n", file);
16179       fputs ("\t.extern __mull\n", file);
16180       fputs ("\t.extern __divss\n", file);
16181       fputs ("\t.extern __divus\n", file);
16182       fputs ("\t.extern __quoss\n", file);
16183       fputs ("\t.extern __quous\n", file);
16184       common_mode_defined = 1;
16185     }
16186
16187   if (! HAVE_prologue)
16188     {
16189       start_sequence ();
16190
16191       /* A NOTE_INSN_DELETED is supposed to be at the start and end of
16192          the "toplevel" insn chain.  */
16193       emit_note (NOTE_INSN_DELETED);
16194       rs6000_emit_prologue ();
16195       emit_note (NOTE_INSN_DELETED);
16196
16197       /* Expand INSN_ADDRESSES so final() doesn't crash.  */
16198       {
16199         rtx insn;
16200         unsigned addr = 0;
16201         for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16202           {
16203             INSN_ADDRESSES_NEW (insn, addr);
16204             addr += 4;
16205           }
16206       }
16207
16208       if (TARGET_DEBUG_STACK)
16209         debug_rtx_list (get_insns (), 100);
16210       final (get_insns (), file, FALSE);
16211       end_sequence ();
16212     }
16213
16214   rs6000_pic_labelno++;
16215 }
16216
16217 /* Emit function epilogue as insns.
16218
16219    At present, dwarf2out_frame_debug_expr doesn't understand
16220    register restores, so we don't bother setting RTX_FRAME_RELATED_P
16221    anywhere in the epilogue.  Most of the insns below would in any case
16222    need special notes to explain where r11 is in relation to the stack.  */
16223
16224 void
16225 rs6000_emit_epilogue (int sibcall)
16226 {
16227   rs6000_stack_t *info;
16228   int restoring_FPRs_inline;
16229   int using_load_multiple;
16230   int using_mtcr_multiple;
16231   int use_backchain_to_restore_sp;
16232   int sp_offset = 0;
16233   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
16234   rtx frame_reg_rtx = sp_reg_rtx;
16235   enum machine_mode reg_mode = Pmode;
16236   int reg_size = TARGET_32BIT ? 4 : 8;
16237   int i;
16238
16239   info = rs6000_stack_info ();
16240
16241   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
16242     {
16243       reg_mode = V2SImode;
16244       reg_size = 8;
16245     }
16246
16247   using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
16248                          && (!TARGET_SPE_ABI
16249                              || info->spe_64bit_regs_used == 0)
16250                          && info->first_gp_reg_save < 31
16251                          && no_global_regs_above (info->first_gp_reg_save));
16252   restoring_FPRs_inline = (sibcall
16253                            || current_function_calls_eh_return
16254                            || info->first_fp_reg_save == 64
16255                            || FP_SAVE_INLINE (info->first_fp_reg_save));
16256   use_backchain_to_restore_sp = (frame_pointer_needed
16257                                  || current_function_calls_alloca
16258                                  || info->total_size > 32767);
16259   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
16260                          || rs6000_cpu == PROCESSOR_PPC603
16261                          || rs6000_cpu == PROCESSOR_PPC750
16262                          || optimize_size);
16263
16264   if (WORLD_SAVE_P (info))
16265     {
16266       int i, j;
16267       char rname[30];
16268       const char *alloc_rname;
16269       rtvec p;
16270
16271       /* eh_rest_world_r10 will return to the location saved in the LR
16272          stack slot (which is not likely to be our caller.)
16273          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
16274          rest_world is similar, except any R10 parameter is ignored.
16275          The exception-handling stuff that was here in 2.95 is no
16276          longer necessary.  */
16277
16278       p = rtvec_alloc (9
16279                        + 1
16280                        + 32 - info->first_gp_reg_save
16281                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
16282                        + 63 + 1 - info->first_fp_reg_save);
16283
16284       strcpy (rname, ((current_function_calls_eh_return) ?
16285                       "*eh_rest_world_r10" : "*rest_world"));
16286       alloc_rname = ggc_strdup (rname);
16287
16288       j = 0;
16289       RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
16290       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
16291                                         gen_rtx_REG (Pmode,
16292                                                      LR_REGNO));
16293       RTVEC_ELT (p, j++)
16294         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
16295       /* The instruction pattern requires a clobber here;
16296          it is shared with the restVEC helper. */
16297       RTVEC_ELT (p, j++)
16298         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
16299
16300       {
16301         /* CR register traditionally saved as CR2.  */
16302         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
16303         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16304                                  GEN_INT (info->cr_save_offset));
16305         rtx mem = gen_frame_mem (reg_mode, addr);
16306
16307         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16308       }
16309
16310       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16311         {
16312           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
16313           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16314                                    GEN_INT (info->gp_save_offset
16315                                             + reg_size * i));
16316           rtx mem = gen_frame_mem (reg_mode, addr);
16317
16318           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16319         }
16320       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
16321         {
16322           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
16323           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16324                                    GEN_INT (info->altivec_save_offset
16325                                             + 16 * i));
16326           rtx mem = gen_frame_mem (V4SImode, addr);
16327
16328           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16329         }
16330       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
16331         {
16332           rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
16333           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16334                                    GEN_INT (info->fp_save_offset
16335                                             + 8 * i));
16336           rtx mem = gen_frame_mem (DFmode, addr);
16337
16338           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16339         }
16340       RTVEC_ELT (p, j++)
16341         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
16342       RTVEC_ELT (p, j++)
16343         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
16344       RTVEC_ELT (p, j++)
16345         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
16346       RTVEC_ELT (p, j++)
16347         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
16348       RTVEC_ELT (p, j++)
16349         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
16350       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
16351
16352       return;
16353     }
16354
16355   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
16356   if (info->push_p)
16357     sp_offset = info->total_size;
16358
16359   /* Restore AltiVec registers if needed.  */
16360   if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
16361     {
16362       int i;
16363
16364       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
16365         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
16366           {
16367             rtx addr, areg, mem;
16368
16369             areg = gen_rtx_REG (Pmode, 0);
16370             emit_move_insn
16371               (areg, GEN_INT (info->altivec_save_offset
16372                               + sp_offset
16373                               + 16 * (i - info->first_altivec_reg_save)));
16374
16375             /* AltiVec addressing mode is [reg+reg].  */
16376             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
16377             mem = gen_frame_mem (V4SImode, addr);
16378
16379             emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
16380           }
16381     }
16382
16383   /* If we have a frame pointer, a call to alloca,  or a large stack
16384      frame, restore the old stack pointer using the backchain.  Otherwise,
16385      we know what size to update it with.  */
16386   if (use_backchain_to_restore_sp)
16387     {
16388       /* Under V.4, don't reset the stack pointer until after we're done
16389          loading the saved registers.  */
16390       if (DEFAULT_ABI == ABI_V4)
16391         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
16392
16393       emit_move_insn (frame_reg_rtx,
16394                       gen_rtx_MEM (Pmode, sp_reg_rtx));
16395       sp_offset = 0;
16396     }
16397   else if (info->push_p
16398            && DEFAULT_ABI != ABI_V4
16399            && !current_function_calls_eh_return)
16400     {
16401       emit_insn (TARGET_32BIT
16402                  ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
16403                                GEN_INT (info->total_size))
16404                  : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
16405                                GEN_INT (info->total_size)));
16406       sp_offset = 0;
16407     }
16408
16409   /* Restore VRSAVE if needed.  */
16410   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
16411       && info->vrsave_mask != 0)
16412     {
16413       rtx addr, mem, reg;
16414
16415       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16416                            GEN_INT (info->vrsave_save_offset + sp_offset));
16417       mem = gen_frame_mem (SImode, addr);
16418       reg = gen_rtx_REG (SImode, 12);
16419       emit_move_insn (reg, mem);
16420
16421       emit_insn (generate_set_vrsave (reg, info, 1));
16422     }
16423
16424   /* Get the old lr if we saved it.  */
16425   if (info->lr_save_p)
16426     {
16427       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
16428                                       info->lr_save_offset + sp_offset);
16429
16430       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
16431     }
16432
16433   /* Get the old cr if we saved it.  */
16434   if (info->cr_save_p)
16435     {
16436       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16437                                GEN_INT (info->cr_save_offset + sp_offset));
16438       rtx mem = gen_frame_mem (SImode, addr);
16439
16440       emit_move_insn (gen_rtx_REG (SImode, 12), mem);
16441     }
16442
16443   /* Set LR here to try to overlap restores below.  */
16444   if (info->lr_save_p)
16445     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
16446                     gen_rtx_REG (Pmode, 0));
16447
16448   /* Load exception handler data registers, if needed.  */
16449   if (current_function_calls_eh_return)
16450     {
16451       unsigned int i, regno;
16452
16453       if (TARGET_AIX)
16454         {
16455           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16456                                    GEN_INT (sp_offset + 5 * reg_size));
16457           rtx mem = gen_frame_mem (reg_mode, addr);
16458
16459           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
16460         }
16461
16462       for (i = 0; ; ++i)
16463         {
16464           rtx mem;
16465
16466           regno = EH_RETURN_DATA_REGNO (i);
16467           if (regno == INVALID_REGNUM)
16468             break;
16469
16470           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
16471                                       info->ehrd_offset + sp_offset
16472                                       + reg_size * (int) i);
16473
16474           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
16475         }
16476     }
16477
16478   /* Restore GPRs.  This is done as a PARALLEL if we are using
16479      the load-multiple instructions.  */
16480   if (using_load_multiple)
16481     {
16482       rtvec p;
16483       p = rtvec_alloc (32 - info->first_gp_reg_save);
16484       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16485         {
16486           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16487                                    GEN_INT (info->gp_save_offset
16488                                             + sp_offset
16489                                             + reg_size * i));
16490           rtx mem = gen_frame_mem (reg_mode, addr);
16491
16492           RTVEC_ELT (p, i) =
16493             gen_rtx_SET (VOIDmode,
16494                          gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
16495                          mem);
16496         }
16497       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
16498     }
16499   else if (TARGET_SPE_ABI
16500            && info->spe_64bit_regs_used != 0
16501            && info->first_gp_reg_save != 32)
16502     {
16503       /* Determine whether we can address all of the registers that need
16504          to be saved with an offset from the stack pointer that fits in
16505          the small const field for SPE memory instructions.  */
16506       int spe_regs_addressable_via_sp
16507         = SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
16508                               + (32 - info->first_gp_reg_save - 1) * reg_size);
16509       int spe_offset;
16510
16511       if (spe_regs_addressable_via_sp)
16512         spe_offset = info->spe_gp_save_offset + sp_offset;
16513       else
16514         {
16515           rtx old_frame_reg_rtx = frame_reg_rtx;
16516           /* Make r11 point to the start of the SPE save area.  We worried about
16517              not clobbering it when we were saving registers in the prologue.
16518              There's no need to worry here because the static chain is passed
16519              anew to every function.  */
16520           if (frame_reg_rtx == sp_reg_rtx)
16521             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
16522           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
16523                                  GEN_INT (info->spe_gp_save_offset + sp_offset)));
16524           /* Keep the invariant that frame_reg_rtx + sp_offset points
16525              at the top of the stack frame.  */
16526           sp_offset = -info->spe_gp_save_offset;
16527
16528           spe_offset = 0;
16529         }
16530
16531       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16532         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
16533           {
16534             rtx offset, addr, mem;
16535
16536             /* We're doing all this to ensure that the immediate offset
16537                fits into the immediate field of 'evldd'.  */
16538             gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
16539
16540             offset = GEN_INT (spe_offset + reg_size * i);
16541             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
16542             mem = gen_rtx_MEM (V2SImode, addr);
16543
16544             emit_move_insn (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
16545                             mem);
16546           }
16547     }
16548   else
16549     for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16550       if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
16551         {
16552           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16553                                    GEN_INT (info->gp_save_offset
16554                                             + sp_offset
16555                                             + reg_size * i));
16556           rtx mem = gen_frame_mem (reg_mode, addr);
16557
16558           emit_move_insn (gen_rtx_REG (reg_mode,
16559                                        info->first_gp_reg_save + i), mem);
16560         }
16561
16562   /* Restore fpr's if we need to do it without calling a function.  */
16563   if (restoring_FPRs_inline)
16564     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
16565       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
16566            && ! call_used_regs[info->first_fp_reg_save+i]))
16567         {
16568           rtx addr, mem;
16569           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16570                                GEN_INT (info->fp_save_offset
16571                                         + sp_offset
16572                                         + 8 * i));
16573           mem = gen_frame_mem (DFmode, addr);
16574
16575           emit_move_insn (gen_rtx_REG (DFmode,
16576                                        info->first_fp_reg_save + i),
16577                           mem);
16578         }
16579
16580   /* If we saved cr, restore it here.  Just those that were used.  */
16581   if (info->cr_save_p)
16582     {
16583       rtx r12_rtx = gen_rtx_REG (SImode, 12);
16584       int count = 0;
16585
16586       if (using_mtcr_multiple)
16587         {
16588           for (i = 0; i < 8; i++)
16589             if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
16590               count++;
16591           gcc_assert (count);
16592         }
16593
16594       if (using_mtcr_multiple && count > 1)
16595         {
16596           rtvec p;
16597           int ndx;
16598
16599           p = rtvec_alloc (count);
16600
16601           ndx = 0;
16602           for (i = 0; i < 8; i++)
16603             if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
16604               {
16605                 rtvec r = rtvec_alloc (2);
16606                 RTVEC_ELT (r, 0) = r12_rtx;
16607                 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
16608                 RTVEC_ELT (p, ndx) =
16609                   gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
16610                                gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
16611                 ndx++;
16612               }
16613           emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
16614           gcc_assert (ndx == count);
16615         }
16616       else
16617         for (i = 0; i < 8; i++)
16618           if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
16619             {
16620               emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
16621                                                            CR0_REGNO+i),
16622                                               r12_rtx));
16623             }
16624     }
16625
16626   /* If this is V.4, unwind the stack pointer after all of the loads
16627      have been done.  */
16628   if (frame_reg_rtx != sp_reg_rtx)
16629     {
16630       /* This blockage is needed so that sched doesn't decide to move
16631          the sp change before the register restores.  */
16632       rs6000_emit_stack_tie ();
16633       if (sp_offset != 0)
16634         emit_insn (gen_addsi3 (sp_reg_rtx, frame_reg_rtx,
16635                                GEN_INT (sp_offset)));
16636       else
16637         emit_move_insn (sp_reg_rtx, frame_reg_rtx);
16638     }
16639   else if (sp_offset != 0)
16640     emit_insn (TARGET_32BIT
16641                ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
16642                              GEN_INT (sp_offset))
16643                : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
16644                              GEN_INT (sp_offset)));
16645
16646   if (current_function_calls_eh_return)
16647     {
16648       rtx sa = EH_RETURN_STACKADJ_RTX;
16649       emit_insn (TARGET_32BIT
16650                  ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
16651                  : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
16652     }
16653
16654   if (!sibcall)
16655     {
16656       rtvec p;
16657       if (! restoring_FPRs_inline)
16658         p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
16659       else
16660         p = rtvec_alloc (2);
16661
16662       RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
16663       RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
16664                                       gen_rtx_REG (Pmode,
16665                                                    LR_REGNO));
16666
16667       /* If we have to restore more than two FP registers, branch to the
16668          restore function.  It will return to our caller.  */
16669       if (! restoring_FPRs_inline)
16670         {
16671           int i;
16672           char rname[30];
16673           const char *alloc_rname;
16674
16675           sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
16676                    info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
16677           alloc_rname = ggc_strdup (rname);
16678           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
16679                                           gen_rtx_SYMBOL_REF (Pmode,
16680                                                               alloc_rname));
16681
16682           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
16683             {
16684               rtx addr, mem;
16685               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
16686                                    GEN_INT (info->fp_save_offset + 8*i));
16687               mem = gen_frame_mem (DFmode, addr);
16688
16689               RTVEC_ELT (p, i+3) =
16690                 gen_rtx_SET (VOIDmode,
16691                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
16692                              mem);
16693             }
16694         }
16695
16696       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
16697     }
16698 }
16699
16700 /* Write function epilogue.  */
16701
16702 static void
16703 rs6000_output_function_epilogue (FILE *file,
16704                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
16705 {
16706   if (! HAVE_epilogue)
16707     {
16708       rtx insn = get_last_insn ();
16709       /* If the last insn was a BARRIER, we don't have to write anything except
16710          the trace table.  */
16711       if (GET_CODE (insn) == NOTE)
16712         insn = prev_nonnote_insn (insn);
16713       if (insn == 0 ||  GET_CODE (insn) != BARRIER)
16714         {
16715           /* This is slightly ugly, but at least we don't have two
16716              copies of the epilogue-emitting code.  */
16717           start_sequence ();
16718
16719           /* A NOTE_INSN_DELETED is supposed to be at the start
16720              and end of the "toplevel" insn chain.  */
16721           emit_note (NOTE_INSN_DELETED);
16722           rs6000_emit_epilogue (FALSE);
16723           emit_note (NOTE_INSN_DELETED);
16724
16725           /* Expand INSN_ADDRESSES so final() doesn't crash.  */
16726           {
16727             rtx insn;
16728             unsigned addr = 0;
16729             for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16730               {
16731                 INSN_ADDRESSES_NEW (insn, addr);
16732                 addr += 4;
16733               }
16734           }
16735
16736           if (TARGET_DEBUG_STACK)
16737             debug_rtx_list (get_insns (), 100);
16738           final (get_insns (), file, FALSE);
16739           end_sequence ();
16740         }
16741     }
16742
16743 #if TARGET_MACHO
16744   macho_branch_islands ();
16745   /* Mach-O doesn't support labels at the end of objects, so if
16746      it looks like we might want one, insert a NOP.  */
16747   {
16748     rtx insn = get_last_insn ();
16749     while (insn
16750            && NOTE_P (insn)
16751            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
16752       insn = PREV_INSN (insn);
16753     if (insn
16754         && (LABEL_P (insn)
16755             || (NOTE_P (insn)
16756                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
16757       fputs ("\tnop\n", file);
16758   }
16759 #endif
16760
16761   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
16762      on its format.
16763
16764      We don't output a traceback table if -finhibit-size-directive was
16765      used.  The documentation for -finhibit-size-directive reads
16766      ``don't output a @code{.size} assembler directive, or anything
16767      else that would cause trouble if the function is split in the
16768      middle, and the two halves are placed at locations far apart in
16769      memory.''  The traceback table has this property, since it
16770      includes the offset from the start of the function to the
16771      traceback table itself.
16772
16773      System V.4 Powerpc's (and the embedded ABI derived from it) use a
16774      different traceback table.  */
16775   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
16776       && rs6000_traceback != traceback_none && !current_function_is_thunk)
16777     {
16778       const char *fname = NULL;
16779       const char *language_string = lang_hooks.name;
16780       int fixed_parms = 0, float_parms = 0, parm_info = 0;
16781       int i;
16782       int optional_tbtab;
16783       rs6000_stack_t *info = rs6000_stack_info ();
16784
16785       if (rs6000_traceback == traceback_full)
16786         optional_tbtab = 1;
16787       else if (rs6000_traceback == traceback_part)
16788         optional_tbtab = 0;
16789       else
16790         optional_tbtab = !optimize_size && !TARGET_ELF;
16791
16792       if (optional_tbtab)
16793         {
16794           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
16795           while (*fname == '.') /* V.4 encodes . in the name */
16796             fname++;
16797
16798           /* Need label immediately before tbtab, so we can compute
16799              its offset from the function start.  */
16800           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
16801           ASM_OUTPUT_LABEL (file, fname);
16802         }
16803
16804       /* The .tbtab pseudo-op can only be used for the first eight
16805          expressions, since it can't handle the possibly variable
16806          length fields that follow.  However, if you omit the optional
16807          fields, the assembler outputs zeros for all optional fields
16808          anyways, giving each variable length field is minimum length
16809          (as defined in sys/debug.h).  Thus we can not use the .tbtab
16810          pseudo-op at all.  */
16811
16812       /* An all-zero word flags the start of the tbtab, for debuggers
16813          that have to find it by searching forward from the entry
16814          point or from the current pc.  */
16815       fputs ("\t.long 0\n", file);
16816
16817       /* Tbtab format type.  Use format type 0.  */
16818       fputs ("\t.byte 0,", file);
16819
16820       /* Language type.  Unfortunately, there does not seem to be any
16821          official way to discover the language being compiled, so we
16822          use language_string.
16823          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
16824          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
16825          a number, so for now use 9.  */
16826       if (! strcmp (language_string, "GNU C"))
16827         i = 0;
16828       else if (! strcmp (language_string, "GNU F77")
16829                || ! strcmp (language_string, "GNU F95"))
16830         i = 1;
16831       else if (! strcmp (language_string, "GNU Pascal"))
16832         i = 2;
16833       else if (! strcmp (language_string, "GNU Ada"))
16834         i = 3;
16835       else if (! strcmp (language_string, "GNU C++")
16836                || ! strcmp (language_string, "GNU Objective-C++"))
16837         i = 9;
16838       else if (! strcmp (language_string, "GNU Java"))
16839         i = 13;
16840       else if (! strcmp (language_string, "GNU Objective-C"))
16841         i = 14;
16842       else
16843         gcc_unreachable ();
16844       fprintf (file, "%d,", i);
16845
16846       /* 8 single bit fields: global linkage (not set for C extern linkage,
16847          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
16848          from start of procedure stored in tbtab, internal function, function
16849          has controlled storage, function has no toc, function uses fp,
16850          function logs/aborts fp operations.  */
16851       /* Assume that fp operations are used if any fp reg must be saved.  */
16852       fprintf (file, "%d,",
16853                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
16854
16855       /* 6 bitfields: function is interrupt handler, name present in
16856          proc table, function calls alloca, on condition directives
16857          (controls stack walks, 3 bits), saves condition reg, saves
16858          link reg.  */
16859       /* The `function calls alloca' bit seems to be set whenever reg 31 is
16860          set up as a frame pointer, even when there is no alloca call.  */
16861       fprintf (file, "%d,",
16862                ((optional_tbtab << 6)
16863                 | ((optional_tbtab & frame_pointer_needed) << 5)
16864                 | (info->cr_save_p << 1)
16865                 | (info->lr_save_p)));
16866
16867       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
16868          (6 bits).  */
16869       fprintf (file, "%d,",
16870                (info->push_p << 7) | (64 - info->first_fp_reg_save));
16871
16872       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
16873       fprintf (file, "%d,", (32 - first_reg_to_save ()));
16874
16875       if (optional_tbtab)
16876         {
16877           /* Compute the parameter info from the function decl argument
16878              list.  */
16879           tree decl;
16880           int next_parm_info_bit = 31;
16881
16882           for (decl = DECL_ARGUMENTS (current_function_decl);
16883                decl; decl = TREE_CHAIN (decl))
16884             {
16885               rtx parameter = DECL_INCOMING_RTL (decl);
16886               enum machine_mode mode = GET_MODE (parameter);
16887
16888               if (GET_CODE (parameter) == REG)
16889                 {
16890                   if (SCALAR_FLOAT_MODE_P (mode))
16891                     {
16892                       int bits;
16893
16894                       float_parms++;
16895
16896                       switch (mode)
16897                         {
16898                         case SFmode:
16899                         case SDmode:
16900                           bits = 0x2;
16901                           break;
16902
16903                         case DFmode:
16904                         case DDmode:
16905                         case TFmode:
16906                         case TDmode:
16907                           bits = 0x3;
16908                           break;
16909
16910                         default:
16911                           gcc_unreachable ();
16912                         }
16913
16914                       /* If only one bit will fit, don't or in this entry.  */
16915                       if (next_parm_info_bit > 0)
16916                         parm_info |= (bits << (next_parm_info_bit - 1));
16917                       next_parm_info_bit -= 2;
16918                     }
16919                   else
16920                     {
16921                       fixed_parms += ((GET_MODE_SIZE (mode)
16922                                        + (UNITS_PER_WORD - 1))
16923                                       / UNITS_PER_WORD);
16924                       next_parm_info_bit -= 1;
16925                     }
16926                 }
16927             }
16928         }
16929
16930       /* Number of fixed point parameters.  */
16931       /* This is actually the number of words of fixed point parameters; thus
16932          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
16933       fprintf (file, "%d,", fixed_parms);
16934
16935       /* 2 bitfields: number of floating point parameters (7 bits), parameters
16936          all on stack.  */
16937       /* This is actually the number of fp registers that hold parameters;
16938          and thus the maximum value is 13.  */
16939       /* Set parameters on stack bit if parameters are not in their original
16940          registers, regardless of whether they are on the stack?  Xlc
16941          seems to set the bit when not optimizing.  */
16942       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
16943
16944       if (! optional_tbtab)
16945         return;
16946
16947       /* Optional fields follow.  Some are variable length.  */
16948
16949       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
16950          11 double float.  */
16951       /* There is an entry for each parameter in a register, in the order that
16952          they occur in the parameter list.  Any intervening arguments on the
16953          stack are ignored.  If the list overflows a long (max possible length
16954          34 bits) then completely leave off all elements that don't fit.  */
16955       /* Only emit this long if there was at least one parameter.  */
16956       if (fixed_parms || float_parms)
16957         fprintf (file, "\t.long %d\n", parm_info);
16958
16959       /* Offset from start of code to tb table.  */
16960       fputs ("\t.long ", file);
16961       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
16962       if (TARGET_AIX)
16963         RS6000_OUTPUT_BASENAME (file, fname);
16964       else
16965         assemble_name (file, fname);
16966       putc ('-', file);
16967       rs6000_output_function_entry (file, fname);
16968       putc ('\n', file);
16969
16970       /* Interrupt handler mask.  */
16971       /* Omit this long, since we never set the interrupt handler bit
16972          above.  */
16973
16974       /* Number of CTL (controlled storage) anchors.  */
16975       /* Omit this long, since the has_ctl bit is never set above.  */
16976
16977       /* Displacement into stack of each CTL anchor.  */
16978       /* Omit this list of longs, because there are no CTL anchors.  */
16979
16980       /* Length of function name.  */
16981       if (*fname == '*')
16982         ++fname;
16983       fprintf (file, "\t.short %d\n", (int) strlen (fname));
16984
16985       /* Function name.  */
16986       assemble_string (fname, strlen (fname));
16987
16988       /* Register for alloca automatic storage; this is always reg 31.
16989          Only emit this if the alloca bit was set above.  */
16990       if (frame_pointer_needed)
16991         fputs ("\t.byte 31\n", file);
16992
16993       fputs ("\t.align 2\n", file);
16994     }
16995 }
16996 \f
16997 /* A C compound statement that outputs the assembler code for a thunk
16998    function, used to implement C++ virtual function calls with
16999    multiple inheritance.  The thunk acts as a wrapper around a virtual
17000    function, adjusting the implicit object parameter before handing
17001    control off to the real function.
17002
17003    First, emit code to add the integer DELTA to the location that
17004    contains the incoming first argument.  Assume that this argument
17005    contains a pointer, and is the one used to pass the `this' pointer
17006    in C++.  This is the incoming argument *before* the function
17007    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
17008    values of all other incoming arguments.
17009
17010    After the addition, emit code to jump to FUNCTION, which is a
17011    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
17012    not touch the return address.  Hence returning from FUNCTION will
17013    return to whoever called the current `thunk'.
17014
17015    The effect must be as if FUNCTION had been called directly with the
17016    adjusted first argument.  This macro is responsible for emitting
17017    all of the code for a thunk function; output_function_prologue()
17018    and output_function_epilogue() are not invoked.
17019
17020    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
17021    been extracted from it.)  It might possibly be useful on some
17022    targets, but probably not.
17023
17024    If you do not define this macro, the target-independent code in the
17025    C++ frontend will generate a less efficient heavyweight thunk that
17026    calls FUNCTION instead of jumping to it.  The generic approach does
17027    not support varargs.  */
17028
17029 static void
17030 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
17031                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
17032                         tree function)
17033 {
17034   rtx this, insn, funexp;
17035
17036   reload_completed = 1;
17037   epilogue_completed = 1;
17038
17039   /* Mark the end of the (empty) prologue.  */
17040   emit_note (NOTE_INSN_PROLOGUE_END);
17041
17042   /* Find the "this" pointer.  If the function returns a structure,
17043      the structure return pointer is in r3.  */
17044   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
17045     this = gen_rtx_REG (Pmode, 4);
17046   else
17047     this = gen_rtx_REG (Pmode, 3);
17048
17049   /* Apply the constant offset, if required.  */
17050   if (delta)
17051     {
17052       rtx delta_rtx = GEN_INT (delta);
17053       emit_insn (TARGET_32BIT
17054                  ? gen_addsi3 (this, this, delta_rtx)
17055                  : gen_adddi3 (this, this, delta_rtx));
17056     }
17057
17058   /* Apply the offset from the vtable, if required.  */
17059   if (vcall_offset)
17060     {
17061       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
17062       rtx tmp = gen_rtx_REG (Pmode, 12);
17063
17064       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
17065       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
17066         {
17067           emit_insn (TARGET_32BIT
17068                      ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
17069                      : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
17070           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
17071         }
17072       else
17073         {
17074           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
17075
17076           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
17077         }
17078       emit_insn (TARGET_32BIT
17079                  ? gen_addsi3 (this, this, tmp)
17080                  : gen_adddi3 (this, this, tmp));
17081     }
17082
17083   /* Generate a tail call to the target function.  */
17084   if (!TREE_USED (function))
17085     {
17086       assemble_external (function);
17087       TREE_USED (function) = 1;
17088     }
17089   funexp = XEXP (DECL_RTL (function), 0);
17090   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
17091
17092 #if TARGET_MACHO
17093   if (MACHOPIC_INDIRECT)
17094     funexp = machopic_indirect_call_target (funexp);
17095 #endif
17096
17097   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
17098      generate sibcall RTL explicitly.  */
17099   insn = emit_call_insn (
17100            gen_rtx_PARALLEL (VOIDmode,
17101              gen_rtvec (4,
17102                         gen_rtx_CALL (VOIDmode,
17103                                       funexp, const0_rtx),
17104                         gen_rtx_USE (VOIDmode, const0_rtx),
17105                         gen_rtx_USE (VOIDmode,
17106                                      gen_rtx_REG (SImode,
17107                                                   LR_REGNO)),
17108                         gen_rtx_RETURN (VOIDmode))));
17109   SIBLING_CALL_P (insn) = 1;
17110   emit_barrier ();
17111
17112   /* Run just enough of rest_of_compilation to get the insns emitted.
17113      There's not really enough bulk here to make other passes such as
17114      instruction scheduling worth while.  Note that use_thunk calls
17115      assemble_start_function and assemble_end_function.  */
17116   insn = get_insns ();
17117   insn_locators_alloc ();
17118   shorten_branches (insn);
17119   final_start_function (insn, file, 1);
17120   final (insn, file, 1);
17121   final_end_function ();
17122
17123   reload_completed = 0;
17124   epilogue_completed = 0;
17125 }
17126 \f
17127 /* A quick summary of the various types of 'constant-pool tables'
17128    under PowerPC:
17129
17130    Target       Flags           Name            One table per
17131    AIX          (none)          AIX TOC         object file
17132    AIX          -mfull-toc      AIX TOC         object file
17133    AIX          -mminimal-toc   AIX minimal TOC translation unit
17134    SVR4/EABI    (none)          SVR4 SDATA      object file
17135    SVR4/EABI    -fpic           SVR4 pic        object file
17136    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
17137    SVR4/EABI    -mrelocatable   EABI TOC        function
17138    SVR4/EABI    -maix           AIX TOC         object file
17139    SVR4/EABI    -maix -mminimal-toc
17140                                 AIX minimal TOC translation unit
17141
17142    Name                 Reg.    Set by  entries       contains:
17143                                         made by  addrs? fp?     sum?
17144
17145    AIX TOC              2       crt0    as       Y      option  option
17146    AIX minimal TOC      30      prolog  gcc      Y      Y       option
17147    SVR4 SDATA           13      crt0    gcc      N      Y       N
17148    SVR4 pic             30      prolog  ld       Y      not yet N
17149    SVR4 PIC             30      prolog  gcc      Y      option  option
17150    EABI TOC             30      prolog  gcc      Y      option  option
17151
17152 */
17153
17154 /* Hash functions for the hash table.  */
17155
17156 static unsigned
17157 rs6000_hash_constant (rtx k)
17158 {
17159   enum rtx_code code = GET_CODE (k);
17160   enum machine_mode mode = GET_MODE (k);
17161   unsigned result = (code << 3) ^ mode;
17162   const char *format;
17163   int flen, fidx;
17164
17165   format = GET_RTX_FORMAT (code);
17166   flen = strlen (format);
17167   fidx = 0;
17168
17169   switch (code)
17170     {
17171     case LABEL_REF:
17172       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
17173
17174     case CONST_DOUBLE:
17175       if (mode != VOIDmode)
17176         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
17177       flen = 2;
17178       break;
17179
17180     case CODE_LABEL:
17181       fidx = 3;
17182       break;
17183
17184     default:
17185       break;
17186     }
17187
17188   for (; fidx < flen; fidx++)
17189     switch (format[fidx])
17190       {
17191       case 's':
17192         {
17193           unsigned i, len;
17194           const char *str = XSTR (k, fidx);
17195           len = strlen (str);
17196           result = result * 613 + len;
17197           for (i = 0; i < len; i++)
17198             result = result * 613 + (unsigned) str[i];
17199           break;
17200         }
17201       case 'u':
17202       case 'e':
17203         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
17204         break;
17205       case 'i':
17206       case 'n':
17207         result = result * 613 + (unsigned) XINT (k, fidx);
17208         break;
17209       case 'w':
17210         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
17211           result = result * 613 + (unsigned) XWINT (k, fidx);
17212         else
17213           {
17214             size_t i;
17215             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
17216               result = result * 613 + (unsigned) (XWINT (k, fidx)
17217                                                   >> CHAR_BIT * i);
17218           }
17219         break;
17220       case '0':
17221         break;
17222       default:
17223         gcc_unreachable ();
17224       }
17225
17226   return result;
17227 }
17228
17229 static unsigned
17230 toc_hash_function (const void *hash_entry)
17231 {
17232   const struct toc_hash_struct *thc =
17233     (const struct toc_hash_struct *) hash_entry;
17234   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
17235 }
17236
17237 /* Compare H1 and H2 for equivalence.  */
17238
17239 static int
17240 toc_hash_eq (const void *h1, const void *h2)
17241 {
17242   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
17243   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
17244
17245   if (((const struct toc_hash_struct *) h1)->key_mode
17246       != ((const struct toc_hash_struct *) h2)->key_mode)
17247     return 0;
17248
17249   return rtx_equal_p (r1, r2);
17250 }
17251
17252 /* These are the names given by the C++ front-end to vtables, and
17253    vtable-like objects.  Ideally, this logic should not be here;
17254    instead, there should be some programmatic way of inquiring as
17255    to whether or not an object is a vtable.  */
17256
17257 #define VTABLE_NAME_P(NAME)                             \
17258   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
17259   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
17260   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
17261   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
17262   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
17263
17264 void
17265 rs6000_output_symbol_ref (FILE *file, rtx x)
17266 {
17267   /* Currently C++ toc references to vtables can be emitted before it
17268      is decided whether the vtable is public or private.  If this is
17269      the case, then the linker will eventually complain that there is
17270      a reference to an unknown section.  Thus, for vtables only,
17271      we emit the TOC reference to reference the symbol and not the
17272      section.  */
17273   const char *name = XSTR (x, 0);
17274
17275   if (VTABLE_NAME_P (name))
17276     {
17277       RS6000_OUTPUT_BASENAME (file, name);
17278     }
17279   else
17280     assemble_name (file, name);
17281 }
17282
17283 /* Output a TOC entry.  We derive the entry name from what is being
17284    written.  */
17285
17286 void
17287 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
17288 {
17289   char buf[256];
17290   const char *name = buf;
17291   const char *real_name;
17292   rtx base = x;
17293   HOST_WIDE_INT offset = 0;
17294
17295   gcc_assert (!TARGET_NO_TOC);
17296
17297   /* When the linker won't eliminate them, don't output duplicate
17298      TOC entries (this happens on AIX if there is any kind of TOC,
17299      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
17300      CODE_LABELs.  */
17301   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
17302     {
17303       struct toc_hash_struct *h;
17304       void * * found;
17305
17306       /* Create toc_hash_table.  This can't be done at OVERRIDE_OPTIONS
17307          time because GGC is not initialized at that point.  */
17308       if (toc_hash_table == NULL)
17309         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
17310                                           toc_hash_eq, NULL);
17311
17312       h = ggc_alloc (sizeof (*h));
17313       h->key = x;
17314       h->key_mode = mode;
17315       h->labelno = labelno;
17316
17317       found = htab_find_slot (toc_hash_table, h, 1);
17318       if (*found == NULL)
17319         *found = h;
17320       else  /* This is indeed a duplicate.
17321                Set this label equal to that label.  */
17322         {
17323           fputs ("\t.set ", file);
17324           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
17325           fprintf (file, "%d,", labelno);
17326           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
17327           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
17328                                               found)->labelno));
17329           return;
17330         }
17331     }
17332
17333   /* If we're going to put a double constant in the TOC, make sure it's
17334      aligned properly when strict alignment is on.  */
17335   if (GET_CODE (x) == CONST_DOUBLE
17336       && STRICT_ALIGNMENT
17337       && GET_MODE_BITSIZE (mode) >= 64
17338       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
17339     ASM_OUTPUT_ALIGN (file, 3);
17340   }
17341
17342   (*targetm.asm_out.internal_label) (file, "LC", labelno);
17343
17344   /* Handle FP constants specially.  Note that if we have a minimal
17345      TOC, things we put here aren't actually in the TOC, so we can allow
17346      FP constants.  */
17347   if (GET_CODE (x) == CONST_DOUBLE &&
17348       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
17349     {
17350       REAL_VALUE_TYPE rv;
17351       long k[4];
17352
17353       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
17354       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
17355         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
17356       else
17357         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
17358
17359       if (TARGET_64BIT)
17360         {
17361           if (TARGET_MINIMAL_TOC)
17362             fputs (DOUBLE_INT_ASM_OP, file);
17363           else
17364             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
17365                      k[0] & 0xffffffff, k[1] & 0xffffffff,
17366                      k[2] & 0xffffffff, k[3] & 0xffffffff);
17367           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
17368                    k[0] & 0xffffffff, k[1] & 0xffffffff,
17369                    k[2] & 0xffffffff, k[3] & 0xffffffff);
17370           return;
17371         }
17372       else
17373         {
17374           if (TARGET_MINIMAL_TOC)
17375             fputs ("\t.long ", file);
17376           else
17377             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
17378                      k[0] & 0xffffffff, k[1] & 0xffffffff,
17379                      k[2] & 0xffffffff, k[3] & 0xffffffff);
17380           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
17381                    k[0] & 0xffffffff, k[1] & 0xffffffff,
17382                    k[2] & 0xffffffff, k[3] & 0xffffffff);
17383           return;
17384         }
17385     }
17386   else if (GET_CODE (x) == CONST_DOUBLE &&
17387            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
17388     {
17389       REAL_VALUE_TYPE rv;
17390       long k[2];
17391
17392       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
17393
17394       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
17395         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
17396       else
17397         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
17398
17399       if (TARGET_64BIT)
17400         {
17401           if (TARGET_MINIMAL_TOC)
17402             fputs (DOUBLE_INT_ASM_OP, file);
17403           else
17404             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
17405                      k[0] & 0xffffffff, k[1] & 0xffffffff);
17406           fprintf (file, "0x%lx%08lx\n",
17407                    k[0] & 0xffffffff, k[1] & 0xffffffff);
17408           return;
17409         }
17410       else
17411         {
17412           if (TARGET_MINIMAL_TOC)
17413             fputs ("\t.long ", file);
17414           else
17415             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
17416                      k[0] & 0xffffffff, k[1] & 0xffffffff);
17417           fprintf (file, "0x%lx,0x%lx\n",
17418                    k[0] & 0xffffffff, k[1] & 0xffffffff);
17419           return;
17420         }
17421     }
17422   else if (GET_CODE (x) == CONST_DOUBLE &&
17423            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
17424     {
17425       REAL_VALUE_TYPE rv;
17426       long l;
17427
17428       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
17429       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
17430         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
17431       else
17432         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
17433
17434       if (TARGET_64BIT)
17435         {
17436           if (TARGET_MINIMAL_TOC)
17437             fputs (DOUBLE_INT_ASM_OP, file);
17438           else
17439             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
17440           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
17441           return;
17442         }
17443       else
17444         {
17445           if (TARGET_MINIMAL_TOC)
17446             fputs ("\t.long ", file);
17447           else
17448             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
17449           fprintf (file, "0x%lx\n", l & 0xffffffff);
17450           return;
17451         }
17452     }
17453   else if (GET_MODE (x) == VOIDmode
17454            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
17455     {
17456       unsigned HOST_WIDE_INT low;
17457       HOST_WIDE_INT high;
17458
17459       if (GET_CODE (x) == CONST_DOUBLE)
17460         {
17461           low = CONST_DOUBLE_LOW (x);
17462           high = CONST_DOUBLE_HIGH (x);
17463         }
17464       else
17465 #if HOST_BITS_PER_WIDE_INT == 32
17466         {
17467           low = INTVAL (x);
17468           high = (low & 0x80000000) ? ~0 : 0;
17469         }
17470 #else
17471         {
17472           low = INTVAL (x) & 0xffffffff;
17473           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
17474         }
17475 #endif
17476
17477       /* TOC entries are always Pmode-sized, but since this
17478          is a bigendian machine then if we're putting smaller
17479          integer constants in the TOC we have to pad them.
17480          (This is still a win over putting the constants in
17481          a separate constant pool, because then we'd have
17482          to have both a TOC entry _and_ the actual constant.)
17483
17484          For a 32-bit target, CONST_INT values are loaded and shifted
17485          entirely within `low' and can be stored in one TOC entry.  */
17486
17487       /* It would be easy to make this work, but it doesn't now.  */
17488       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
17489
17490       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
17491         {
17492 #if HOST_BITS_PER_WIDE_INT == 32
17493           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
17494                          POINTER_SIZE, &low, &high, 0);
17495 #else
17496           low |= high << 32;
17497           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
17498           high = (HOST_WIDE_INT) low >> 32;
17499           low &= 0xffffffff;
17500 #endif
17501         }
17502
17503       if (TARGET_64BIT)
17504         {
17505           if (TARGET_MINIMAL_TOC)
17506             fputs (DOUBLE_INT_ASM_OP, file);
17507           else
17508             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
17509                      (long) high & 0xffffffff, (long) low & 0xffffffff);
17510           fprintf (file, "0x%lx%08lx\n",
17511                    (long) high & 0xffffffff, (long) low & 0xffffffff);
17512           return;
17513         }
17514       else
17515         {
17516           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
17517             {
17518               if (TARGET_MINIMAL_TOC)
17519                 fputs ("\t.long ", file);
17520               else
17521                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
17522                          (long) high & 0xffffffff, (long) low & 0xffffffff);
17523               fprintf (file, "0x%lx,0x%lx\n",
17524                        (long) high & 0xffffffff, (long) low & 0xffffffff);
17525             }
17526           else
17527             {
17528               if (TARGET_MINIMAL_TOC)
17529                 fputs ("\t.long ", file);
17530               else
17531                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
17532               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
17533             }
17534           return;
17535         }
17536     }
17537
17538   if (GET_CODE (x) == CONST)
17539     {
17540       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS);
17541
17542       base = XEXP (XEXP (x, 0), 0);
17543       offset = INTVAL (XEXP (XEXP (x, 0), 1));
17544     }
17545
17546   switch (GET_CODE (base))
17547     {
17548     case SYMBOL_REF:
17549       name = XSTR (base, 0);
17550       break;
17551
17552     case LABEL_REF:
17553       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
17554                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
17555       break;
17556
17557     case CODE_LABEL:
17558       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
17559       break;
17560
17561     default:
17562       gcc_unreachable ();
17563     }
17564
17565   real_name = (*targetm.strip_name_encoding) (name);
17566   if (TARGET_MINIMAL_TOC)
17567     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
17568   else
17569     {
17570       fprintf (file, "\t.tc %s", real_name);
17571
17572       if (offset < 0)
17573         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
17574       else if (offset)
17575         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
17576
17577       fputs ("[TC],", file);
17578     }
17579
17580   /* Currently C++ toc references to vtables can be emitted before it
17581      is decided whether the vtable is public or private.  If this is
17582      the case, then the linker will eventually complain that there is
17583      a TOC reference to an unknown section.  Thus, for vtables only,
17584      we emit the TOC reference to reference the symbol and not the
17585      section.  */
17586   if (VTABLE_NAME_P (name))
17587     {
17588       RS6000_OUTPUT_BASENAME (file, name);
17589       if (offset < 0)
17590         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
17591       else if (offset > 0)
17592         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
17593     }
17594   else
17595     output_addr_const (file, x);
17596   putc ('\n', file);
17597 }
17598 \f
17599 /* Output an assembler pseudo-op to write an ASCII string of N characters
17600    starting at P to FILE.
17601
17602    On the RS/6000, we have to do this using the .byte operation and
17603    write out special characters outside the quoted string.
17604    Also, the assembler is broken; very long strings are truncated,
17605    so we must artificially break them up early.  */
17606
17607 void
17608 output_ascii (FILE *file, const char *p, int n)
17609 {
17610   char c;
17611   int i, count_string;
17612   const char *for_string = "\t.byte \"";
17613   const char *for_decimal = "\t.byte ";
17614   const char *to_close = NULL;
17615
17616   count_string = 0;
17617   for (i = 0; i < n; i++)
17618     {
17619       c = *p++;
17620       if (c >= ' ' && c < 0177)
17621         {
17622           if (for_string)
17623             fputs (for_string, file);
17624           putc (c, file);
17625
17626           /* Write two quotes to get one.  */
17627           if (c == '"')
17628             {
17629               putc (c, file);
17630               ++count_string;
17631             }
17632
17633           for_string = NULL;
17634           for_decimal = "\"\n\t.byte ";
17635           to_close = "\"\n";
17636           ++count_string;
17637
17638           if (count_string >= 512)
17639             {
17640               fputs (to_close, file);
17641
17642               for_string = "\t.byte \"";
17643               for_decimal = "\t.byte ";
17644               to_close = NULL;
17645               count_string = 0;
17646             }
17647         }
17648       else
17649         {
17650           if (for_decimal)
17651             fputs (for_decimal, file);
17652           fprintf (file, "%d", c);
17653
17654           for_string = "\n\t.byte \"";
17655           for_decimal = ", ";
17656           to_close = "\n";
17657           count_string = 0;
17658         }
17659     }
17660
17661   /* Now close the string if we have written one.  Then end the line.  */
17662   if (to_close)
17663     fputs (to_close, file);
17664 }
17665 \f
17666 /* Generate a unique section name for FILENAME for a section type
17667    represented by SECTION_DESC.  Output goes into BUF.
17668
17669    SECTION_DESC can be any string, as long as it is different for each
17670    possible section type.
17671
17672    We name the section in the same manner as xlc.  The name begins with an
17673    underscore followed by the filename (after stripping any leading directory
17674    names) with the last period replaced by the string SECTION_DESC.  If
17675    FILENAME does not contain a period, SECTION_DESC is appended to the end of
17676    the name.  */
17677
17678 void
17679 rs6000_gen_section_name (char **buf, const char *filename,
17680                          const char *section_desc)
17681 {
17682   const char *q, *after_last_slash, *last_period = 0;
17683   char *p;
17684   int len;
17685
17686   after_last_slash = filename;
17687   for (q = filename; *q; q++)
17688     {
17689       if (*q == '/')
17690         after_last_slash = q + 1;
17691       else if (*q == '.')
17692         last_period = q;
17693     }
17694
17695   len = strlen (after_last_slash) + strlen (section_desc) + 2;
17696   *buf = (char *) xmalloc (len);
17697
17698   p = *buf;
17699   *p++ = '_';
17700
17701   for (q = after_last_slash; *q; q++)
17702     {
17703       if (q == last_period)
17704         {
17705           strcpy (p, section_desc);
17706           p += strlen (section_desc);
17707           break;
17708         }
17709
17710       else if (ISALNUM (*q))
17711         *p++ = *q;
17712     }
17713
17714   if (last_period == 0)
17715     strcpy (p, section_desc);
17716   else
17717     *p = '\0';
17718 }
17719 \f
17720 /* Emit profile function.  */
17721
17722 void
17723 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
17724 {
17725   /* Non-standard profiling for kernels, which just saves LR then calls
17726      _mcount without worrying about arg saves.  The idea is to change
17727      the function prologue as little as possible as it isn't easy to
17728      account for arg save/restore code added just for _mcount.  */
17729   if (TARGET_PROFILE_KERNEL)
17730     return;
17731
17732   if (DEFAULT_ABI == ABI_AIX)
17733     {
17734 #ifndef NO_PROFILE_COUNTERS
17735 # define NO_PROFILE_COUNTERS 0
17736 #endif
17737       if (NO_PROFILE_COUNTERS)
17738         emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
17739       else
17740         {
17741           char buf[30];
17742           const char *label_name;
17743           rtx fun;
17744
17745           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
17746           label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
17747           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
17748
17749           emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
17750                              fun, Pmode);
17751         }
17752     }
17753   else if (DEFAULT_ABI == ABI_DARWIN)
17754     {
17755       const char *mcount_name = RS6000_MCOUNT;
17756       int caller_addr_regno = LR_REGNO;
17757
17758       /* Be conservative and always set this, at least for now.  */
17759       current_function_uses_pic_offset_table = 1;
17760
17761 #if TARGET_MACHO
17762       /* For PIC code, set up a stub and collect the caller's address
17763          from r0, which is where the prologue puts it.  */
17764       if (MACHOPIC_INDIRECT
17765           && current_function_uses_pic_offset_table)
17766         caller_addr_regno = 0;
17767 #endif
17768       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
17769                          0, VOIDmode, 1,
17770                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
17771     }
17772 }
17773
17774 /* Write function profiler code.  */
17775
17776 void
17777 output_function_profiler (FILE *file, int labelno)
17778 {
17779   char buf[100];
17780
17781   switch (DEFAULT_ABI)
17782     {
17783     default:
17784       gcc_unreachable ();
17785
17786     case ABI_V4:
17787       if (!TARGET_32BIT)
17788         {
17789           warning (0, "no profiling of 64-bit code for this ABI");
17790           return;
17791         }
17792       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
17793       fprintf (file, "\tmflr %s\n", reg_names[0]);
17794       if (NO_PROFILE_COUNTERS)
17795         {
17796           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
17797                        reg_names[0], reg_names[1]);
17798         }
17799       else if (TARGET_SECURE_PLT && flag_pic)
17800         {
17801           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
17802                        reg_names[0], reg_names[1]);
17803           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
17804           asm_fprintf (file, "\t{cau|addis} %s,%s,",
17805                        reg_names[12], reg_names[12]);
17806           assemble_name (file, buf);
17807           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
17808           assemble_name (file, buf);
17809           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
17810         }
17811       else if (flag_pic == 1)
17812         {
17813           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
17814           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
17815                        reg_names[0], reg_names[1]);
17816           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
17817           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
17818           assemble_name (file, buf);
17819           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
17820         }
17821       else if (flag_pic > 1)
17822         {
17823           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
17824                        reg_names[0], reg_names[1]);
17825           /* Now, we need to get the address of the label.  */
17826           fputs ("\tbcl 20,31,1f\n\t.long ", file);
17827           assemble_name (file, buf);
17828           fputs ("-.\n1:", file);
17829           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
17830           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
17831                        reg_names[0], reg_names[11]);
17832           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
17833                        reg_names[0], reg_names[0], reg_names[11]);
17834         }
17835       else
17836         {
17837           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
17838           assemble_name (file, buf);
17839           fputs ("@ha\n", file);
17840           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
17841                        reg_names[0], reg_names[1]);
17842           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
17843           assemble_name (file, buf);
17844           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
17845         }
17846
17847       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
17848       fprintf (file, "\tbl %s%s\n",
17849                RS6000_MCOUNT, flag_pic ? "@plt" : "");
17850       break;
17851
17852     case ABI_AIX:
17853     case ABI_DARWIN:
17854       if (!TARGET_PROFILE_KERNEL)
17855         {
17856           /* Don't do anything, done in output_profile_hook ().  */
17857         }
17858       else
17859         {
17860           gcc_assert (!TARGET_32BIT);
17861
17862           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
17863           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
17864
17865           if (cfun->static_chain_decl != NULL)
17866             {
17867               asm_fprintf (file, "\tstd %s,24(%s)\n",
17868                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
17869               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
17870               asm_fprintf (file, "\tld %s,24(%s)\n",
17871                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
17872             }
17873           else
17874             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
17875         }
17876       break;
17877     }
17878 }
17879
17880 \f
17881
17882 /* The following variable value is the last issued insn.  */
17883
17884 static rtx last_scheduled_insn;
17885
17886 /* The following variable helps to balance issuing of load and
17887    store instructions */
17888
17889 static int load_store_pendulum;
17890
17891 /* Power4 load update and store update instructions are cracked into a
17892    load or store and an integer insn which are executed in the same cycle.
17893    Branches have their own dispatch slot which does not count against the
17894    GCC issue rate, but it changes the program flow so there are no other
17895    instructions to issue in this cycle.  */
17896
17897 static int
17898 rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
17899                        int verbose ATTRIBUTE_UNUSED,
17900                        rtx insn, int more)
17901 {
17902   last_scheduled_insn = insn;
17903   if (GET_CODE (PATTERN (insn)) == USE
17904       || GET_CODE (PATTERN (insn)) == CLOBBER)
17905     {
17906       cached_can_issue_more = more;
17907       return cached_can_issue_more;
17908     }
17909
17910   if (insn_terminates_group_p (insn, current_group))
17911     {
17912       cached_can_issue_more = 0;
17913       return cached_can_issue_more;
17914     }
17915
17916   /* If no reservation, but reach here */
17917   if (recog_memoized (insn) < 0)
17918     return more;
17919
17920   if (rs6000_sched_groups)
17921     {
17922       if (is_microcoded_insn (insn))
17923         cached_can_issue_more = 0;
17924       else if (is_cracked_insn (insn))
17925         cached_can_issue_more = more > 2 ? more - 2 : 0;
17926       else
17927         cached_can_issue_more = more - 1;
17928
17929       return cached_can_issue_more;
17930     }
17931
17932   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
17933     return 0;
17934
17935   cached_can_issue_more = more - 1;
17936   return cached_can_issue_more;
17937 }
17938
17939 /* Adjust the cost of a scheduling dependency.  Return the new cost of
17940    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
17941
17942 static int
17943 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
17944 {
17945   enum attr_type attr_type;
17946
17947   if (! recog_memoized (insn))
17948     return 0;
17949
17950   switch (REG_NOTE_KIND (link))
17951     {
17952     case REG_DEP_TRUE:
17953       {
17954         /* Data dependency; DEP_INSN writes a register that INSN reads
17955            some cycles later.  */
17956
17957         /* Separate a load from a narrower, dependent store.  */
17958         if (rs6000_sched_groups
17959             && GET_CODE (PATTERN (insn)) == SET
17960             && GET_CODE (PATTERN (dep_insn)) == SET
17961             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
17962             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
17963             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
17964                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
17965           return cost + 14;
17966
17967         attr_type = get_attr_type (insn);
17968
17969         switch (attr_type)
17970           {
17971           case TYPE_JMPREG:
17972             /* Tell the first scheduling pass about the latency between
17973                a mtctr and bctr (and mtlr and br/blr).  The first
17974                scheduling pass will not know about this latency since
17975                the mtctr instruction, which has the latency associated
17976                to it, will be generated by reload.  */
17977             return TARGET_POWER ? 5 : 4;
17978           case TYPE_BRANCH:
17979             /* Leave some extra cycles between a compare and its
17980                dependent branch, to inhibit expensive mispredicts.  */
17981             if ((rs6000_cpu_attr == CPU_PPC603
17982                  || rs6000_cpu_attr == CPU_PPC604
17983                  || rs6000_cpu_attr == CPU_PPC604E
17984                  || rs6000_cpu_attr == CPU_PPC620
17985                  || rs6000_cpu_attr == CPU_PPC630
17986                  || rs6000_cpu_attr == CPU_PPC750
17987                  || rs6000_cpu_attr == CPU_PPC7400
17988                  || rs6000_cpu_attr == CPU_PPC7450
17989                  || rs6000_cpu_attr == CPU_POWER4
17990                  || rs6000_cpu_attr == CPU_POWER5
17991                  || rs6000_cpu_attr == CPU_CELL)
17992                 && recog_memoized (dep_insn)
17993                 && (INSN_CODE (dep_insn) >= 0))
17994
17995               switch (get_attr_type (dep_insn))
17996                 {
17997                 case TYPE_CMP:
17998                 case TYPE_COMPARE:
17999                 case TYPE_DELAYED_COMPARE:
18000                 case TYPE_IMUL_COMPARE:
18001                 case TYPE_LMUL_COMPARE:
18002                 case TYPE_FPCOMPARE:
18003                 case TYPE_CR_LOGICAL:
18004                 case TYPE_DELAYED_CR:
18005                     return cost + 2;
18006                 default:
18007                   break;
18008                 }
18009             break;
18010
18011           case TYPE_STORE:
18012           case TYPE_STORE_U:
18013           case TYPE_STORE_UX:
18014           case TYPE_FPSTORE:
18015           case TYPE_FPSTORE_U:
18016           case TYPE_FPSTORE_UX:
18017             if ((rs6000_cpu == PROCESSOR_POWER6)
18018                 && recog_memoized (dep_insn)
18019                 && (INSN_CODE (dep_insn) >= 0))
18020               {
18021
18022                 if (GET_CODE (PATTERN (insn)) != SET)
18023                   /* If this happens, we have to extend this to schedule
18024                      optimally.  Return default for now.  */
18025                   return cost;
18026
18027                 /* Adjust the cost for the case where the value written
18028                    by a fixed point operation is used as the address
18029                    gen value on a store. */
18030                 switch (get_attr_type (dep_insn))
18031                   {
18032                   case TYPE_LOAD:
18033                   case TYPE_LOAD_U:
18034                   case TYPE_LOAD_UX:
18035                   case TYPE_CNTLZ:
18036                     {
18037                       if (! store_data_bypass_p (dep_insn, insn))
18038                         return 4;
18039                       break;
18040                     }
18041                   case TYPE_LOAD_EXT:
18042                   case TYPE_LOAD_EXT_U:
18043                   case TYPE_LOAD_EXT_UX:
18044                   case TYPE_VAR_SHIFT_ROTATE:
18045                   case TYPE_VAR_DELAYED_COMPARE:
18046                     {
18047                       if (! store_data_bypass_p (dep_insn, insn))
18048                         return 6;
18049                       break;
18050                       }
18051                   case TYPE_INTEGER:
18052                   case TYPE_COMPARE:
18053                   case TYPE_FAST_COMPARE:
18054                   case TYPE_EXTS:
18055                   case TYPE_SHIFT:
18056                   case TYPE_INSERT_WORD:
18057                   case TYPE_INSERT_DWORD:
18058                   case TYPE_FPLOAD_U:
18059                   case TYPE_FPLOAD_UX:
18060                   case TYPE_STORE_U:
18061                   case TYPE_STORE_UX:
18062                   case TYPE_FPSTORE_U:
18063                   case TYPE_FPSTORE_UX:
18064                     {
18065                       if (! store_data_bypass_p (dep_insn, insn))
18066                         return 3;
18067                       break;
18068                     }
18069                   case TYPE_IMUL:
18070                   case TYPE_IMUL2:
18071                   case TYPE_IMUL3:
18072                   case TYPE_LMUL:
18073                   case TYPE_IMUL_COMPARE:
18074                   case TYPE_LMUL_COMPARE:
18075                     {
18076                       if (! store_data_bypass_p (dep_insn, insn))
18077                         return 17;
18078                       break;
18079                     }
18080                   case TYPE_IDIV:
18081                     {
18082                       if (! store_data_bypass_p (dep_insn, insn))
18083                         return 45;
18084                       break;
18085                     }
18086                   case TYPE_LDIV:
18087                     {
18088                       if (! store_data_bypass_p (dep_insn, insn))
18089                         return 57;
18090                       break;
18091                     }
18092                   default:
18093                     break;
18094                   }
18095               }
18096               break;
18097
18098           case TYPE_LOAD:
18099           case TYPE_LOAD_U:
18100           case TYPE_LOAD_UX:
18101           case TYPE_LOAD_EXT:
18102           case TYPE_LOAD_EXT_U:
18103           case TYPE_LOAD_EXT_UX:
18104             if ((rs6000_cpu == PROCESSOR_POWER6)
18105                 && recog_memoized (dep_insn)
18106                 && (INSN_CODE (dep_insn) >= 0))
18107               {
18108
18109                 /* Adjust the cost for the case where the value written
18110                    by a fixed point instruction is used within the address
18111                    gen portion of a subsequent load(u)(x) */
18112                 switch (get_attr_type (dep_insn))
18113                   {
18114                   case TYPE_LOAD:
18115                   case TYPE_LOAD_U:
18116                   case TYPE_LOAD_UX:
18117                   case TYPE_CNTLZ:
18118                     {
18119                       if (set_to_load_agen (dep_insn, insn))
18120                         return 4;
18121                       break;
18122                     }
18123                   case TYPE_LOAD_EXT:
18124                   case TYPE_LOAD_EXT_U:
18125                   case TYPE_LOAD_EXT_UX:
18126                   case TYPE_VAR_SHIFT_ROTATE:
18127                   case TYPE_VAR_DELAYED_COMPARE:
18128                     {
18129                       if (set_to_load_agen (dep_insn, insn))
18130                         return 6;
18131                       break;
18132                     }
18133                   case TYPE_INTEGER:
18134                   case TYPE_COMPARE:
18135                   case TYPE_FAST_COMPARE:
18136                   case TYPE_EXTS:
18137                   case TYPE_SHIFT:
18138                   case TYPE_INSERT_WORD:
18139                   case TYPE_INSERT_DWORD:
18140                   case TYPE_FPLOAD_U:
18141                   case TYPE_FPLOAD_UX:
18142                   case TYPE_STORE_U:
18143                   case TYPE_STORE_UX:
18144                   case TYPE_FPSTORE_U:
18145                   case TYPE_FPSTORE_UX:
18146                     {
18147                       if (set_to_load_agen (dep_insn, insn))
18148                         return 3;
18149                       break;
18150                     }
18151                   case TYPE_IMUL:
18152                   case TYPE_IMUL2:
18153                   case TYPE_IMUL3:
18154                   case TYPE_LMUL:
18155                   case TYPE_IMUL_COMPARE:
18156                   case TYPE_LMUL_COMPARE:
18157                     {
18158                       if (set_to_load_agen (dep_insn, insn))
18159                         return 17;
18160                       break;
18161                     }
18162                   case TYPE_IDIV:
18163                     {
18164                       if (set_to_load_agen (dep_insn, insn))
18165                         return 45;
18166                       break;
18167                     }
18168                   case TYPE_LDIV:
18169                     {
18170                       if (set_to_load_agen (dep_insn, insn))
18171                         return 57;
18172                       break;
18173                     }
18174                   default:
18175                     break;
18176                   }
18177               }
18178             break;
18179
18180           case TYPE_FPLOAD:
18181             if ((rs6000_cpu == PROCESSOR_POWER6)
18182                 && recog_memoized (dep_insn)
18183                 && (INSN_CODE (dep_insn) >= 0)
18184                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
18185               return 2;
18186
18187           default:
18188             break;
18189           }
18190
18191       /* Fall out to return default cost.  */
18192       }
18193       break;
18194
18195     case REG_DEP_OUTPUT:
18196       /* Output dependency; DEP_INSN writes a register that INSN writes some
18197          cycles later.  */
18198       if ((rs6000_cpu == PROCESSOR_POWER6)
18199           && recog_memoized (dep_insn)
18200           && (INSN_CODE (dep_insn) >= 0))
18201         {
18202           attr_type = get_attr_type (insn);
18203
18204           switch (attr_type)
18205             {
18206             case TYPE_FP:
18207               if (get_attr_type (dep_insn) == TYPE_FP)
18208                 return 1;
18209               break;
18210             case TYPE_FPLOAD:
18211               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
18212                 return 2;
18213               break;
18214             default:
18215               break;
18216             }
18217         }
18218     case REG_DEP_ANTI:
18219       /* Anti dependency; DEP_INSN reads a register that INSN writes some
18220          cycles later.  */
18221       return 0;
18222
18223     default:
18224       gcc_unreachable ();
18225     }
18226
18227   return cost;
18228 }
18229
18230 /* The function returns a true if INSN is microcoded.
18231    Return false otherwise.  */
18232
18233 static bool
18234 is_microcoded_insn (rtx insn)
18235 {
18236   if (!insn || !INSN_P (insn)
18237       || GET_CODE (PATTERN (insn)) == USE
18238       || GET_CODE (PATTERN (insn)) == CLOBBER)
18239     return false;
18240
18241   if (rs6000_cpu_attr == CPU_CELL)
18242     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
18243
18244   if (rs6000_sched_groups)
18245     {
18246       enum attr_type type = get_attr_type (insn);
18247       if (type == TYPE_LOAD_EXT_U
18248           || type == TYPE_LOAD_EXT_UX
18249           || type == TYPE_LOAD_UX
18250           || type == TYPE_STORE_UX
18251           || type == TYPE_MFCR)
18252         return true;
18253     }
18254
18255   return false;
18256 }
18257
18258 /* The function returns true if INSN is cracked into 2 instructions
18259    by the processor (and therefore occupies 2 issue slots).  */
18260
18261 static bool
18262 is_cracked_insn (rtx insn)
18263 {
18264   if (!insn || !INSN_P (insn)
18265       || GET_CODE (PATTERN (insn)) == USE
18266       || GET_CODE (PATTERN (insn)) == CLOBBER)
18267     return false;
18268
18269   if (rs6000_sched_groups)
18270     {
18271       enum attr_type type = get_attr_type (insn);
18272       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
18273           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
18274           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
18275           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
18276           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
18277           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
18278           || type == TYPE_IDIV || type == TYPE_LDIV
18279           || type == TYPE_INSERT_WORD)
18280         return true;
18281     }
18282
18283   return false;
18284 }
18285
18286 /* The function returns true if INSN can be issued only from
18287    the branch slot.  */
18288
18289 static bool
18290 is_branch_slot_insn (rtx insn)
18291 {
18292   if (!insn || !INSN_P (insn)
18293       || GET_CODE (PATTERN (insn)) == USE
18294       || GET_CODE (PATTERN (insn)) == CLOBBER)
18295     return false;
18296
18297   if (rs6000_sched_groups)
18298     {
18299       enum attr_type type = get_attr_type (insn);
18300       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
18301         return true;
18302       return false;
18303     }
18304
18305   return false;
18306 }
18307
18308 /* The function returns true if out_inst sets a value that is
18309    used in the address generation computation of in_insn */
18310 static bool
18311 set_to_load_agen (rtx out_insn, rtx in_insn)
18312 {
18313   rtx out_set, in_set;
18314
18315   /* For performance reasons, only handle the simple case where
18316      both loads are a single_set. */
18317   out_set = single_set (out_insn);
18318   if (out_set)
18319     {
18320       in_set = single_set (in_insn);
18321       if (in_set)
18322         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
18323     }
18324
18325   return false;
18326 }
18327
18328 /* The function returns true if the target storage location of
18329    out_insn is adjacent to the target storage location of in_insn */
18330 /* Return 1 if memory locations are adjacent.  */
18331
18332 static bool
18333 adjacent_mem_locations (rtx insn1, rtx insn2)
18334 {
18335
18336   rtx a = get_store_dest (PATTERN (insn1));
18337   rtx b = get_store_dest (PATTERN (insn2));
18338
18339   if ((GET_CODE (XEXP (a, 0)) == REG
18340        || (GET_CODE (XEXP (a, 0)) == PLUS
18341            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
18342       && (GET_CODE (XEXP (b, 0)) == REG
18343           || (GET_CODE (XEXP (b, 0)) == PLUS
18344               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
18345     {
18346       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
18347       rtx reg0, reg1;
18348
18349       if (GET_CODE (XEXP (a, 0)) == PLUS)
18350         {
18351           reg0 = XEXP (XEXP (a, 0), 0);
18352           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
18353         }
18354       else
18355         reg0 = XEXP (a, 0);
18356
18357       if (GET_CODE (XEXP (b, 0)) == PLUS)
18358         {
18359           reg1 = XEXP (XEXP (b, 0), 0);
18360           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
18361         }
18362       else
18363         reg1 = XEXP (b, 0);
18364
18365       val_diff = val1 - val0;
18366
18367       return ((REGNO (reg0) == REGNO (reg1))
18368               && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
18369                   || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
18370     }
18371
18372   return false;
18373 }
18374
18375 /* A C statement (sans semicolon) to update the integer scheduling
18376    priority INSN_PRIORITY (INSN). Increase the priority to execute the
18377    INSN earlier, reduce the priority to execute INSN later.  Do not
18378    define this macro if you do not need to adjust the scheduling
18379    priorities of insns.  */
18380
18381 static int
18382 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
18383 {
18384   /* On machines (like the 750) which have asymmetric integer units,
18385      where one integer unit can do multiply and divides and the other
18386      can't, reduce the priority of multiply/divide so it is scheduled
18387      before other integer operations.  */
18388
18389 #if 0
18390   if (! INSN_P (insn))
18391     return priority;
18392
18393   if (GET_CODE (PATTERN (insn)) == USE)
18394     return priority;
18395
18396   switch (rs6000_cpu_attr) {
18397   case CPU_PPC750:
18398     switch (get_attr_type (insn))
18399       {
18400       default:
18401         break;
18402
18403       case TYPE_IMUL:
18404       case TYPE_IDIV:
18405         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
18406                  priority, priority);
18407         if (priority >= 0 && priority < 0x01000000)
18408           priority >>= 3;
18409         break;
18410       }
18411   }
18412 #endif
18413
18414   if (insn_must_be_first_in_group (insn)
18415       && reload_completed
18416       && current_sched_info->sched_max_insns_priority
18417       && rs6000_sched_restricted_insns_priority)
18418     {
18419
18420       /* Prioritize insns that can be dispatched only in the first
18421          dispatch slot.  */
18422       if (rs6000_sched_restricted_insns_priority == 1)
18423         /* Attach highest priority to insn. This means that in
18424            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
18425            precede 'priority' (critical path) considerations.  */
18426         return current_sched_info->sched_max_insns_priority;
18427       else if (rs6000_sched_restricted_insns_priority == 2)
18428         /* Increase priority of insn by a minimal amount. This means that in
18429            haifa-sched.c:ready_sort(), only 'priority' (critical path)
18430            considerations precede dispatch-slot restriction considerations.  */
18431         return (priority + 1);
18432     }
18433
18434   if (rs6000_cpu == PROCESSOR_POWER6
18435       && ((load_store_pendulum == -2 && is_load_insn (insn))
18436           || (load_store_pendulum == 2 && is_store_insn (insn))))
18437     /* Attach highest priority to insn if the scheduler has just issued two
18438        stores and this instruction is a load, or two loads and this instruction
18439        is a store. Power6 wants loads and stores scheduled alternately
18440        when possible */
18441     return current_sched_info->sched_max_insns_priority;
18442
18443   return priority;
18444 }
18445
18446 /* Return true if the instruction is nonpipelined on the Cell. */
18447 static bool
18448 is_nonpipeline_insn (rtx insn)
18449 {
18450   enum attr_type type;
18451   if (!insn || !INSN_P (insn)
18452       || GET_CODE (PATTERN (insn)) == USE
18453       || GET_CODE (PATTERN (insn)) == CLOBBER)
18454     return false;
18455
18456   type = get_attr_type (insn);
18457   if (type == TYPE_IMUL
18458       || type == TYPE_IMUL2
18459       || type == TYPE_IMUL3
18460       || type == TYPE_LMUL
18461       || type == TYPE_IDIV
18462       || type == TYPE_LDIV
18463       || type == TYPE_SDIV
18464       || type == TYPE_DDIV
18465       || type == TYPE_SSQRT
18466       || type == TYPE_DSQRT
18467       || type == TYPE_MFCR
18468       || type == TYPE_MFCRF
18469       || type == TYPE_MFJMPR)
18470     {
18471       return true;
18472     }
18473   return false;
18474 }
18475
18476
18477 /* Return how many instructions the machine can issue per cycle.  */
18478
18479 static int
18480 rs6000_issue_rate (void)
18481 {
18482   /* Use issue rate of 1 for first scheduling pass to decrease degradation.  */
18483   if (!reload_completed)
18484     return 1;
18485
18486   switch (rs6000_cpu_attr) {
18487   case CPU_RIOS1:  /* ? */
18488   case CPU_RS64A:
18489   case CPU_PPC601: /* ? */
18490   case CPU_PPC7450:
18491     return 3;
18492   case CPU_PPC440:
18493   case CPU_PPC603:
18494   case CPU_PPC750:
18495   case CPU_PPC7400:
18496   case CPU_PPC8540:
18497   case CPU_CELL:
18498   case CPU_PPCE300C2:
18499   case CPU_PPCE300C3:
18500     return 2;
18501   case CPU_RIOS2:
18502   case CPU_PPC604:
18503   case CPU_PPC604E:
18504   case CPU_PPC620:
18505   case CPU_PPC630:
18506     return 4;
18507   case CPU_POWER4:
18508   case CPU_POWER5:
18509   case CPU_POWER6:
18510     return 5;
18511   default:
18512     return 1;
18513   }
18514 }
18515
18516 /* Return how many instructions to look ahead for better insn
18517    scheduling.  */
18518
18519 static int
18520 rs6000_use_sched_lookahead (void)
18521 {
18522   if (rs6000_cpu_attr == CPU_PPC8540)
18523     return 4;
18524   if (rs6000_cpu_attr == CPU_CELL)
18525     return (reload_completed ? 8 : 0);
18526   return 0;
18527 }
18528
18529 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
18530 static int
18531 rs6000_use_sched_lookahead_guard (rtx insn)
18532 {
18533   if (rs6000_cpu_attr != CPU_CELL)
18534     return 1;
18535
18536    if (insn == NULL_RTX || !INSN_P (insn))
18537      abort ();
18538
18539   if (!reload_completed
18540       || is_nonpipeline_insn (insn)
18541       || is_microcoded_insn (insn))
18542     return 0;
18543
18544   return 1;
18545 }
18546
18547 /* Determine is PAT refers to memory.  */
18548
18549 static bool
18550 is_mem_ref (rtx pat)
18551 {
18552   const char * fmt;
18553   int i, j;
18554   bool ret = false;
18555
18556   /* stack_tie does not produce any real memory traffic.  */
18557   if (GET_CODE (pat) == UNSPEC
18558       && XINT (pat, 1) == UNSPEC_TIE)
18559     return false;
18560
18561   if (GET_CODE (pat) == MEM)
18562     return true;
18563
18564   /* Recursively process the pattern.  */
18565   fmt = GET_RTX_FORMAT (GET_CODE (pat));
18566
18567   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
18568     {
18569       if (fmt[i] == 'e')
18570         ret |= is_mem_ref (XEXP (pat, i));
18571       else if (fmt[i] == 'E')
18572         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
18573           ret |= is_mem_ref (XVECEXP (pat, i, j));
18574     }
18575
18576   return ret;
18577 }
18578
18579 /* Determine if PAT is a PATTERN of a load insn.  */
18580
18581 static bool
18582 is_load_insn1 (rtx pat)
18583 {
18584   if (!pat || pat == NULL_RTX)
18585     return false;
18586
18587   if (GET_CODE (pat) == SET)
18588     return is_mem_ref (SET_SRC (pat));
18589
18590   if (GET_CODE (pat) == PARALLEL)
18591     {
18592       int i;
18593
18594       for (i = 0; i < XVECLEN (pat, 0); i++)
18595         if (is_load_insn1 (XVECEXP (pat, 0, i)))
18596           return true;
18597     }
18598
18599   return false;
18600 }
18601
18602 /* Determine if INSN loads from memory.  */
18603
18604 static bool
18605 is_load_insn (rtx insn)
18606 {
18607   if (!insn || !INSN_P (insn))
18608     return false;
18609
18610   if (GET_CODE (insn) == CALL_INSN)
18611     return false;
18612
18613   return is_load_insn1 (PATTERN (insn));
18614 }
18615
18616 /* Determine if PAT is a PATTERN of a store insn.  */
18617
18618 static bool
18619 is_store_insn1 (rtx pat)
18620 {
18621   if (!pat || pat == NULL_RTX)
18622     return false;
18623
18624   if (GET_CODE (pat) == SET)
18625     return is_mem_ref (SET_DEST (pat));
18626
18627   if (GET_CODE (pat) == PARALLEL)
18628     {
18629       int i;
18630
18631       for (i = 0; i < XVECLEN (pat, 0); i++)
18632         if (is_store_insn1 (XVECEXP (pat, 0, i)))
18633           return true;
18634     }
18635
18636   return false;
18637 }
18638
18639 /* Determine if INSN stores to memory.  */
18640
18641 static bool
18642 is_store_insn (rtx insn)
18643 {
18644   if (!insn || !INSN_P (insn))
18645     return false;
18646
18647   return is_store_insn1 (PATTERN (insn));
18648 }
18649
18650 /* Return the dest of a store insn.  */
18651
18652 static rtx
18653 get_store_dest (rtx pat)
18654 {
18655   gcc_assert (is_store_insn1 (pat));
18656
18657   if (GET_CODE (pat) == SET)
18658     return SET_DEST (pat);
18659   else if (GET_CODE (pat) == PARALLEL)
18660     {
18661       int i;
18662
18663       for (i = 0; i < XVECLEN (pat, 0); i++)
18664         {
18665           rtx inner_pat = XVECEXP (pat, 0, i);
18666           if (GET_CODE (inner_pat) == SET
18667               && is_mem_ref (SET_DEST (inner_pat)))
18668             return inner_pat;
18669         }
18670     }
18671   /* We shouldn't get here, because we should have either a simple
18672      store insn or a store with update which are covered above.  */
18673   gcc_unreachable();
18674 }
18675
18676 /* Returns whether the dependence between INSN and NEXT is considered
18677    costly by the given target.  */
18678
18679 static bool
18680 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
18681 {
18682   rtx insn;
18683   rtx next;
18684
18685   /* If the flag is not enabled - no dependence is considered costly;
18686      allow all dependent insns in the same group.
18687      This is the most aggressive option.  */
18688   if (rs6000_sched_costly_dep == no_dep_costly)
18689     return false;
18690
18691   /* If the flag is set to 1 - a dependence is always considered costly;
18692      do not allow dependent instructions in the same group.
18693      This is the most conservative option.  */
18694   if (rs6000_sched_costly_dep == all_deps_costly)
18695     return true;
18696
18697   insn = DEP_PRO (dep);
18698   next = DEP_CON (dep);
18699
18700   if (rs6000_sched_costly_dep == store_to_load_dep_costly
18701       && is_load_insn (next)
18702       && is_store_insn (insn))
18703     /* Prevent load after store in the same group.  */
18704     return true;
18705
18706   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
18707       && is_load_insn (next)
18708       && is_store_insn (insn)
18709       && DEP_TYPE (dep) == REG_DEP_TRUE)
18710      /* Prevent load after store in the same group if it is a true
18711         dependence.  */
18712      return true;
18713
18714   /* The flag is set to X; dependences with latency >= X are considered costly,
18715      and will not be scheduled in the same group.  */
18716   if (rs6000_sched_costly_dep <= max_dep_latency
18717       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
18718     return true;
18719
18720   return false;
18721 }
18722
18723 /* Return the next insn after INSN that is found before TAIL is reached,
18724    skipping any "non-active" insns - insns that will not actually occupy
18725    an issue slot.  Return NULL_RTX if such an insn is not found.  */
18726
18727 static rtx
18728 get_next_active_insn (rtx insn, rtx tail)
18729 {
18730   if (insn == NULL_RTX || insn == tail)
18731     return NULL_RTX;
18732
18733   while (1)
18734     {
18735       insn = NEXT_INSN (insn);
18736       if (insn == NULL_RTX || insn == tail)
18737         return NULL_RTX;
18738
18739       if (CALL_P (insn)
18740           || JUMP_P (insn)
18741           || (NONJUMP_INSN_P (insn)
18742               && GET_CODE (PATTERN (insn)) != USE
18743               && GET_CODE (PATTERN (insn)) != CLOBBER
18744               && INSN_CODE (insn) != CODE_FOR_stack_tie))
18745         break;
18746     }
18747   return insn;
18748 }
18749
18750 /* We are about to begin issuing insns for this clock cycle. */
18751
18752 static int
18753 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
18754                         rtx *ready ATTRIBUTE_UNUSED,
18755                         int *pn_ready ATTRIBUTE_UNUSED,
18756                         int clock_var ATTRIBUTE_UNUSED)
18757 {
18758   int n_ready = *pn_ready;
18759
18760   if (sched_verbose)
18761     fprintf (dump, "// rs6000_sched_reorder :\n");
18762
18763   /* Reorder the ready list, if the second to last ready insn
18764      is a nonepipeline insn.  */
18765   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
18766   {
18767     if (is_nonpipeline_insn (ready[n_ready - 1])
18768         && (recog_memoized (ready[n_ready - 2]) > 0))
18769       /* Simply swap first two insns.  */
18770       {
18771         rtx tmp = ready[n_ready - 1];
18772         ready[n_ready - 1] = ready[n_ready - 2];
18773         ready[n_ready - 2] = tmp;
18774       }
18775   }
18776
18777   if (rs6000_cpu == PROCESSOR_POWER6)
18778     load_store_pendulum = 0;
18779
18780   return rs6000_issue_rate ();
18781 }
18782
18783 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
18784
18785 static int
18786 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
18787                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
18788 {
18789   if (sched_verbose)
18790     fprintf (dump, "// rs6000_sched_reorder2 :\n");
18791
18792   /* For Power6, we need to handle some special cases to try and keep the
18793      store queue from overflowing and triggering expensive flushes.
18794
18795      This code monitors how load and store instructions are being issued
18796      and skews the ready list one way or the other to increase the likelihood
18797      that a desired instruction is issued at the proper time.
18798
18799      A couple of things are done.  First, we maintain a "load_store_pendulum"
18800      to track the current state of load/store issue.
18801
18802        - If the pendulum is at zero, then no loads or stores have been
18803          issued in the current cycle so we do nothing.
18804
18805        - If the pendulum is 1, then a single load has been issued in this
18806          cycle and we attempt to locate another load in the ready list to
18807          issue with it.
18808
18809        - If the pendulum is -2, then two stores have already been
18810          issued in this cycle, so we increase the priority of the first load
18811          in the ready list to increase it's likelihood of being chosen first
18812          in the next cycle.
18813
18814        - If the pendulum is -1, then a single store has been issued in this
18815          cycle and we attempt to locate another store in the ready list to
18816          issue with it, preferring a store to an adjacent memory location to
18817          facilitate store pairing in the store queue.
18818
18819        - If the pendulum is 2, then two loads have already been
18820          issued in this cycle, so we increase the priority of the first store
18821          in the ready list to increase it's likelihood of being chosen first
18822          in the next cycle.
18823
18824        - If the pendulum < -2 or > 2, then do nothing.
18825
18826        Note: This code covers the most common scenarios.  There exist non
18827              load/store instructions which make use of the LSU and which
18828              would need to be accounted for to strictly model the behavior
18829              of the machine.  Those instructions are currently unaccounted
18830              for to help minimize compile time overhead of this code.
18831    */
18832   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
18833     {
18834       int pos;
18835       int i;
18836       rtx tmp;
18837
18838       if (is_store_insn (last_scheduled_insn))
18839         /* Issuing a store, swing the load_store_pendulum to the left */
18840         load_store_pendulum--;
18841       else if (is_load_insn (last_scheduled_insn))
18842         /* Issuing a load, swing the load_store_pendulum to the right */
18843         load_store_pendulum++;
18844       else
18845         return cached_can_issue_more;
18846
18847       /* If the pendulum is balanced, or there is only one instruction on
18848          the ready list, then all is well, so return. */
18849       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
18850         return cached_can_issue_more;
18851
18852       if (load_store_pendulum == 1)
18853         {
18854           /* A load has been issued in this cycle.  Scan the ready list
18855              for another load to issue with it */
18856           pos = *pn_ready-1;
18857
18858           while (pos >= 0)
18859             {
18860               if (is_load_insn (ready[pos]))
18861                 {
18862                   /* Found a load.  Move it to the head of the ready list,
18863                      and adjust it's priority so that it is more likely to
18864                      stay there */
18865                   tmp = ready[pos];
18866                   for (i=pos; i<*pn_ready-1; i++)
18867                     ready[i] = ready[i + 1];
18868                   ready[*pn_ready-1] = tmp;
18869                   if INSN_PRIORITY_KNOWN (tmp)
18870                     INSN_PRIORITY (tmp)++;
18871                   break;
18872                 }
18873               pos--;
18874             }
18875         }
18876       else if (load_store_pendulum == -2)
18877         {
18878           /* Two stores have been issued in this cycle.  Increase the
18879              priority of the first load in the ready list to favor it for
18880              issuing in the next cycle. */
18881           pos = *pn_ready-1;
18882
18883           while (pos >= 0)
18884             {
18885               if (is_load_insn (ready[pos])
18886                   && INSN_PRIORITY_KNOWN (ready[pos]))
18887                 {
18888                   INSN_PRIORITY (ready[pos])++;
18889
18890                   /* Adjust the pendulum to account for the fact that a load
18891                      was found and increased in priority.  This is to prevent
18892                      increasing the priority of multiple loads */
18893                   load_store_pendulum--;
18894
18895                   break;
18896                 }
18897               pos--;
18898             }
18899         }
18900       else if (load_store_pendulum == -1)
18901         {
18902           /* A store has been issued in this cycle.  Scan the ready list for
18903              another store to issue with it, preferring a store to an adjacent
18904              memory location */
18905           int first_store_pos = -1;
18906
18907           pos = *pn_ready-1;
18908
18909           while (pos >= 0)
18910             {
18911               if (is_store_insn (ready[pos]))
18912                 {
18913                   /* Maintain the index of the first store found on the
18914                      list */
18915                   if (first_store_pos == -1)
18916                     first_store_pos = pos;
18917
18918                   if (is_store_insn (last_scheduled_insn)
18919                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
18920                     {
18921                       /* Found an adjacent store.  Move it to the head of the
18922                          ready list, and adjust it's priority so that it is
18923                          more likely to stay there */
18924                       tmp = ready[pos];
18925                       for (i=pos; i<*pn_ready-1; i++)
18926                         ready[i] = ready[i + 1];
18927                       ready[*pn_ready-1] = tmp;
18928                       if INSN_PRIORITY_KNOWN (tmp)
18929                         INSN_PRIORITY (tmp)++;
18930                       first_store_pos = -1;
18931
18932                       break;
18933                     };
18934                 }
18935               pos--;
18936             }
18937
18938           if (first_store_pos >= 0)
18939             {
18940               /* An adjacent store wasn't found, but a non-adjacent store was,
18941                  so move the non-adjacent store to the front of the ready
18942                  list, and adjust its priority so that it is more likely to
18943                  stay there. */
18944               tmp = ready[first_store_pos];
18945               for (i=first_store_pos; i<*pn_ready-1; i++)
18946                 ready[i] = ready[i + 1];
18947               ready[*pn_ready-1] = tmp;
18948               if INSN_PRIORITY_KNOWN (tmp)
18949                 INSN_PRIORITY (tmp)++;
18950             }
18951         }
18952       else if (load_store_pendulum == 2)
18953        {
18954            /* Two loads have been issued in this cycle.  Increase the priority
18955               of the first store in the ready list to favor it for issuing in
18956               the next cycle. */
18957           pos = *pn_ready-1;
18958
18959           while (pos >= 0)
18960             {
18961               if (is_store_insn (ready[pos])
18962                   && INSN_PRIORITY_KNOWN (ready[pos]))
18963                 {
18964                   INSN_PRIORITY (ready[pos])++;
18965
18966                   /* Adjust the pendulum to account for the fact that a store
18967                      was found and increased in priority.  This is to prevent
18968                      increasing the priority of multiple stores */
18969                   load_store_pendulum++;
18970
18971                   break;
18972                 }
18973               pos--;
18974             }
18975         }
18976     }
18977
18978   return cached_can_issue_more;
18979 }
18980
18981 /* Return whether the presence of INSN causes a dispatch group termination
18982    of group WHICH_GROUP.
18983
18984    If WHICH_GROUP == current_group, this function will return true if INSN
18985    causes the termination of the current group (i.e, the dispatch group to
18986    which INSN belongs). This means that INSN will be the last insn in the
18987    group it belongs to.
18988
18989    If WHICH_GROUP == previous_group, this function will return true if INSN
18990    causes the termination of the previous group (i.e, the dispatch group that
18991    precedes the group to which INSN belongs).  This means that INSN will be
18992    the first insn in the group it belongs to).  */
18993
18994 static bool
18995 insn_terminates_group_p (rtx insn, enum group_termination which_group)
18996 {
18997   bool first, last;
18998
18999   if (! insn)
19000     return false;
19001
19002   first = insn_must_be_first_in_group (insn);
19003   last = insn_must_be_last_in_group (insn);
19004
19005   if (first && last)
19006     return true;
19007
19008   if (which_group == current_group)
19009     return last;
19010   else if (which_group == previous_group)
19011     return first;
19012
19013   return false;
19014 }
19015
19016
19017 static bool
19018 insn_must_be_first_in_group (rtx insn)
19019 {
19020   enum attr_type type;
19021
19022   if (!insn
19023       || insn == NULL_RTX
19024       || GET_CODE (insn) == NOTE
19025       || GET_CODE (PATTERN (insn)) == USE
19026       || GET_CODE (PATTERN (insn)) == CLOBBER)
19027     return false;
19028
19029   switch (rs6000_cpu)
19030     {
19031     case PROCESSOR_POWER5:
19032       if (is_cracked_insn (insn))
19033         return true;
19034     case PROCESSOR_POWER4:
19035       if (is_microcoded_insn (insn))
19036         return true;
19037
19038       if (!rs6000_sched_groups)
19039         return false;
19040
19041       type = get_attr_type (insn);
19042
19043       switch (type)
19044         {
19045         case TYPE_MFCR:
19046         case TYPE_MFCRF:
19047         case TYPE_MTCR:
19048         case TYPE_DELAYED_CR:
19049         case TYPE_CR_LOGICAL:
19050         case TYPE_MTJMPR:
19051         case TYPE_MFJMPR:
19052         case TYPE_IDIV:
19053         case TYPE_LDIV:
19054         case TYPE_LOAD_L:
19055         case TYPE_STORE_C:
19056         case TYPE_ISYNC:
19057         case TYPE_SYNC:
19058           return true;
19059         default:
19060           break;
19061         }
19062       break;
19063     case PROCESSOR_POWER6:
19064       type = get_attr_type (insn);
19065
19066       switch (type)
19067         {
19068         case TYPE_INSERT_DWORD:
19069         case TYPE_EXTS:
19070         case TYPE_CNTLZ:
19071         case TYPE_SHIFT:
19072         case TYPE_VAR_SHIFT_ROTATE:
19073         case TYPE_TRAP:
19074         case TYPE_IMUL:
19075         case TYPE_IMUL2:
19076         case TYPE_IMUL3:
19077         case TYPE_LMUL:
19078         case TYPE_IDIV:
19079         case TYPE_INSERT_WORD:
19080         case TYPE_DELAYED_COMPARE:
19081         case TYPE_IMUL_COMPARE:
19082         case TYPE_LMUL_COMPARE:
19083         case TYPE_FPCOMPARE:
19084         case TYPE_MFCR:
19085         case TYPE_MTCR:
19086         case TYPE_MFJMPR:
19087         case TYPE_MTJMPR:
19088         case TYPE_ISYNC:
19089         case TYPE_SYNC:
19090         case TYPE_LOAD_L:
19091         case TYPE_STORE_C:
19092         case TYPE_LOAD_U:
19093         case TYPE_LOAD_UX:
19094         case TYPE_LOAD_EXT_UX:
19095         case TYPE_STORE_U:
19096         case TYPE_STORE_UX:
19097         case TYPE_FPLOAD_U:
19098         case TYPE_FPLOAD_UX:
19099         case TYPE_FPSTORE_U:
19100         case TYPE_FPSTORE_UX:
19101           return true;
19102         default:
19103           break;
19104         }
19105       break;
19106     default:
19107       break;
19108     }
19109
19110   return false;
19111 }
19112
19113 static bool
19114 insn_must_be_last_in_group (rtx insn)
19115 {
19116   enum attr_type type;
19117
19118   if (!insn
19119       || insn == NULL_RTX
19120       || GET_CODE (insn) == NOTE
19121       || GET_CODE (PATTERN (insn)) == USE
19122       || GET_CODE (PATTERN (insn)) == CLOBBER)
19123     return false;
19124
19125   switch (rs6000_cpu) {
19126   case PROCESSOR_POWER4:
19127   case PROCESSOR_POWER5:
19128     if (is_microcoded_insn (insn))
19129       return true;
19130
19131     if (is_branch_slot_insn (insn))
19132       return true;
19133
19134     break;
19135   case PROCESSOR_POWER6:
19136     type = get_attr_type (insn);
19137
19138     switch (type)
19139       {
19140       case TYPE_EXTS:
19141       case TYPE_CNTLZ:
19142       case TYPE_SHIFT:
19143       case TYPE_VAR_SHIFT_ROTATE:
19144       case TYPE_TRAP:
19145       case TYPE_IMUL:
19146       case TYPE_IMUL2:
19147       case TYPE_IMUL3:
19148       case TYPE_LMUL:
19149       case TYPE_IDIV:
19150       case TYPE_DELAYED_COMPARE:
19151       case TYPE_IMUL_COMPARE:
19152       case TYPE_LMUL_COMPARE:
19153       case TYPE_FPCOMPARE:
19154       case TYPE_MFCR:
19155       case TYPE_MTCR:
19156       case TYPE_MFJMPR:
19157       case TYPE_MTJMPR:
19158       case TYPE_ISYNC:
19159       case TYPE_SYNC:
19160       case TYPE_LOAD_L:
19161       case TYPE_STORE_C:
19162         return true;
19163       default:
19164         break;
19165     }
19166     break;
19167   default:
19168     break;
19169   }
19170
19171   return false;
19172 }
19173
19174 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
19175    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
19176
19177 static bool
19178 is_costly_group (rtx *group_insns, rtx next_insn)
19179 {
19180   int i;
19181   int issue_rate = rs6000_issue_rate ();
19182
19183   for (i = 0; i < issue_rate; i++)
19184     {
19185       sd_iterator_def sd_it;
19186       dep_t dep;
19187       rtx insn = group_insns[i];
19188
19189       if (!insn)
19190         continue;
19191
19192       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
19193         {
19194           rtx next = DEP_CON (dep);
19195
19196           if (next == next_insn
19197               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
19198             return true;
19199         }
19200     }
19201
19202   return false;
19203 }
19204
19205 /* Utility of the function redefine_groups.
19206    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
19207    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
19208    to keep it "far" (in a separate group) from GROUP_INSNS, following
19209    one of the following schemes, depending on the value of the flag
19210    -minsert_sched_nops = X:
19211    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
19212        in order to force NEXT_INSN into a separate group.
19213    (2) X < sched_finish_regroup_exact: insert exactly X nops.
19214    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
19215    insertion (has a group just ended, how many vacant issue slots remain in the
19216    last group, and how many dispatch groups were encountered so far).  */
19217
19218 static int
19219 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
19220                  rtx next_insn, bool *group_end, int can_issue_more,
19221                  int *group_count)
19222 {
19223   rtx nop;
19224   bool force;
19225   int issue_rate = rs6000_issue_rate ();
19226   bool end = *group_end;
19227   int i;
19228
19229   if (next_insn == NULL_RTX)
19230     return can_issue_more;
19231
19232   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
19233     return can_issue_more;
19234
19235   force = is_costly_group (group_insns, next_insn);
19236   if (!force)
19237     return can_issue_more;
19238
19239   if (sched_verbose > 6)
19240     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
19241              *group_count ,can_issue_more);
19242
19243   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
19244     {
19245       if (*group_end)
19246         can_issue_more = 0;
19247
19248       /* Since only a branch can be issued in the last issue_slot, it is
19249          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
19250          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
19251          in this case the last nop will start a new group and the branch
19252          will be forced to the new group.  */
19253       if (can_issue_more && !is_branch_slot_insn (next_insn))
19254         can_issue_more--;
19255
19256       while (can_issue_more > 0)
19257         {
19258           nop = gen_nop ();
19259           emit_insn_before (nop, next_insn);
19260           can_issue_more--;
19261         }
19262
19263       *group_end = true;
19264       return 0;
19265     }
19266
19267   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
19268     {
19269       int n_nops = rs6000_sched_insert_nops;
19270
19271       /* Nops can't be issued from the branch slot, so the effective
19272          issue_rate for nops is 'issue_rate - 1'.  */
19273       if (can_issue_more == 0)
19274         can_issue_more = issue_rate;
19275       can_issue_more--;
19276       if (can_issue_more == 0)
19277         {
19278           can_issue_more = issue_rate - 1;
19279           (*group_count)++;
19280           end = true;
19281           for (i = 0; i < issue_rate; i++)
19282             {
19283               group_insns[i] = 0;
19284             }
19285         }
19286
19287       while (n_nops > 0)
19288         {
19289           nop = gen_nop ();
19290           emit_insn_before (nop, next_insn);
19291           if (can_issue_more == issue_rate - 1) /* new group begins */
19292             end = false;
19293           can_issue_more--;
19294           if (can_issue_more == 0)
19295             {
19296               can_issue_more = issue_rate - 1;
19297               (*group_count)++;
19298               end = true;
19299               for (i = 0; i < issue_rate; i++)
19300                 {
19301                   group_insns[i] = 0;
19302                 }
19303             }
19304           n_nops--;
19305         }
19306
19307       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
19308       can_issue_more++;
19309
19310       /* Is next_insn going to start a new group?  */
19311       *group_end
19312         = (end
19313            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
19314            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
19315            || (can_issue_more < issue_rate &&
19316                insn_terminates_group_p (next_insn, previous_group)));
19317       if (*group_end && end)
19318         (*group_count)--;
19319
19320       if (sched_verbose > 6)
19321         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
19322                  *group_count, can_issue_more);
19323       return can_issue_more;
19324     }
19325
19326   return can_issue_more;
19327 }
19328
19329 /* This function tries to synch the dispatch groups that the compiler "sees"
19330    with the dispatch groups that the processor dispatcher is expected to
19331    form in practice.  It tries to achieve this synchronization by forcing the
19332    estimated processor grouping on the compiler (as opposed to the function
19333    'pad_goups' which tries to force the scheduler's grouping on the processor).
19334
19335    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
19336    examines the (estimated) dispatch groups that will be formed by the processor
19337    dispatcher.  It marks these group boundaries to reflect the estimated
19338    processor grouping, overriding the grouping that the scheduler had marked.
19339    Depending on the value of the flag '-minsert-sched-nops' this function can
19340    force certain insns into separate groups or force a certain distance between
19341    them by inserting nops, for example, if there exists a "costly dependence"
19342    between the insns.
19343
19344    The function estimates the group boundaries that the processor will form as
19345    follows:  It keeps track of how many vacant issue slots are available after
19346    each insn.  A subsequent insn will start a new group if one of the following
19347    4 cases applies:
19348    - no more vacant issue slots remain in the current dispatch group.
19349    - only the last issue slot, which is the branch slot, is vacant, but the next
19350      insn is not a branch.
19351    - only the last 2 or less issue slots, including the branch slot, are vacant,
19352      which means that a cracked insn (which occupies two issue slots) can't be
19353      issued in this group.
19354    - less than 'issue_rate' slots are vacant, and the next insn always needs to
19355      start a new group.  */
19356
19357 static int
19358 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
19359 {
19360   rtx insn, next_insn;
19361   int issue_rate;
19362   int can_issue_more;
19363   int slot, i;
19364   bool group_end;
19365   int group_count = 0;
19366   rtx *group_insns;
19367
19368   /* Initialize.  */
19369   issue_rate = rs6000_issue_rate ();
19370   group_insns = alloca (issue_rate * sizeof (rtx));
19371   for (i = 0; i < issue_rate; i++)
19372     {
19373       group_insns[i] = 0;
19374     }
19375   can_issue_more = issue_rate;
19376   slot = 0;
19377   insn = get_next_active_insn (prev_head_insn, tail);
19378   group_end = false;
19379
19380   while (insn != NULL_RTX)
19381     {
19382       slot = (issue_rate - can_issue_more);
19383       group_insns[slot] = insn;
19384       can_issue_more =
19385         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
19386       if (insn_terminates_group_p (insn, current_group))
19387         can_issue_more = 0;
19388
19389       next_insn = get_next_active_insn (insn, tail);
19390       if (next_insn == NULL_RTX)
19391         return group_count + 1;
19392
19393       /* Is next_insn going to start a new group?  */
19394       group_end
19395         = (can_issue_more == 0
19396            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
19397            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
19398            || (can_issue_more < issue_rate &&
19399                insn_terminates_group_p (next_insn, previous_group)));
19400
19401       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
19402                                         next_insn, &group_end, can_issue_more,
19403                                         &group_count);
19404
19405       if (group_end)
19406         {
19407           group_count++;
19408           can_issue_more = 0;
19409           for (i = 0; i < issue_rate; i++)
19410             {
19411               group_insns[i] = 0;
19412             }
19413         }
19414
19415       if (GET_MODE (next_insn) == TImode && can_issue_more)
19416         PUT_MODE (next_insn, VOIDmode);
19417       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
19418         PUT_MODE (next_insn, TImode);
19419
19420       insn = next_insn;
19421       if (can_issue_more == 0)
19422         can_issue_more = issue_rate;
19423     } /* while */
19424
19425   return group_count;
19426 }
19427
19428 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
19429    dispatch group boundaries that the scheduler had marked.  Pad with nops
19430    any dispatch groups which have vacant issue slots, in order to force the
19431    scheduler's grouping on the processor dispatcher.  The function
19432    returns the number of dispatch groups found.  */
19433
19434 static int
19435 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
19436 {
19437   rtx insn, next_insn;
19438   rtx nop;
19439   int issue_rate;
19440   int can_issue_more;
19441   int group_end;
19442   int group_count = 0;
19443
19444   /* Initialize issue_rate.  */
19445   issue_rate = rs6000_issue_rate ();
19446   can_issue_more = issue_rate;
19447
19448   insn = get_next_active_insn (prev_head_insn, tail);
19449   next_insn = get_next_active_insn (insn, tail);
19450
19451   while (insn != NULL_RTX)
19452     {
19453       can_issue_more =
19454         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
19455
19456       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
19457
19458       if (next_insn == NULL_RTX)
19459         break;
19460
19461       if (group_end)
19462         {
19463           /* If the scheduler had marked group termination at this location
19464              (between insn and next_indn), and neither insn nor next_insn will
19465              force group termination, pad the group with nops to force group
19466              termination.  */
19467           if (can_issue_more
19468               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
19469               && !insn_terminates_group_p (insn, current_group)
19470               && !insn_terminates_group_p (next_insn, previous_group))
19471             {
19472               if (!is_branch_slot_insn (next_insn))
19473                 can_issue_more--;
19474
19475               while (can_issue_more)
19476                 {
19477                   nop = gen_nop ();
19478                   emit_insn_before (nop, next_insn);
19479                   can_issue_more--;
19480                 }
19481             }
19482
19483           can_issue_more = issue_rate;
19484           group_count++;
19485         }
19486
19487       insn = next_insn;
19488       next_insn = get_next_active_insn (insn, tail);
19489     }
19490
19491   return group_count;
19492 }
19493
19494 /* We're beginning a new block.  Initialize data structures as necessary.  */
19495
19496 static void
19497 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
19498                      int sched_verbose ATTRIBUTE_UNUSED,
19499                      int max_ready ATTRIBUTE_UNUSED)
19500 {
19501   last_scheduled_insn = NULL_RTX;
19502   load_store_pendulum = 0;
19503 }
19504
19505 /* The following function is called at the end of scheduling BB.
19506    After reload, it inserts nops at insn group bundling.  */
19507
19508 static void
19509 rs6000_sched_finish (FILE *dump, int sched_verbose)
19510 {
19511   int n_groups;
19512
19513   if (sched_verbose)
19514     fprintf (dump, "=== Finishing schedule.\n");
19515
19516   if (reload_completed && rs6000_sched_groups)
19517     {
19518       if (rs6000_sched_insert_nops == sched_finish_none)
19519         return;
19520
19521       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
19522         n_groups = pad_groups (dump, sched_verbose,
19523                                current_sched_info->prev_head,
19524                                current_sched_info->next_tail);
19525       else
19526         n_groups = redefine_groups (dump, sched_verbose,
19527                                     current_sched_info->prev_head,
19528                                     current_sched_info->next_tail);
19529
19530       if (sched_verbose >= 6)
19531         {
19532           fprintf (dump, "ngroups = %d\n", n_groups);
19533           print_rtl (dump, current_sched_info->prev_head);
19534           fprintf (dump, "Done finish_sched\n");
19535         }
19536     }
19537 }
19538 \f
19539 /* Length in units of the trampoline for entering a nested function.  */
19540
19541 int
19542 rs6000_trampoline_size (void)
19543 {
19544   int ret = 0;
19545
19546   switch (DEFAULT_ABI)
19547     {
19548     default:
19549       gcc_unreachable ();
19550
19551     case ABI_AIX:
19552       ret = (TARGET_32BIT) ? 12 : 24;
19553       break;
19554
19555     case ABI_DARWIN:
19556     case ABI_V4:
19557       ret = (TARGET_32BIT) ? 40 : 48;
19558       break;
19559     }
19560
19561   return ret;
19562 }
19563
19564 /* Emit RTL insns to initialize the variable parts of a trampoline.
19565    FNADDR is an RTX for the address of the function's pure code.
19566    CXT is an RTX for the static chain value for the function.  */
19567
19568 void
19569 rs6000_initialize_trampoline (rtx addr, rtx fnaddr, rtx cxt)
19570 {
19571   int regsize = (TARGET_32BIT) ? 4 : 8;
19572   rtx ctx_reg = force_reg (Pmode, cxt);
19573
19574   switch (DEFAULT_ABI)
19575     {
19576     default:
19577       gcc_unreachable ();
19578
19579 /* Macros to shorten the code expansions below.  */
19580 #define MEM_DEREF(addr) gen_rtx_MEM (Pmode, memory_address (Pmode, addr))
19581 #define MEM_PLUS(addr,offset) \
19582   gen_rtx_MEM (Pmode, memory_address (Pmode, plus_constant (addr, offset)))
19583
19584     /* Under AIX, just build the 3 word function descriptor */
19585     case ABI_AIX:
19586       {
19587         rtx fn_reg = gen_reg_rtx (Pmode);
19588         rtx toc_reg = gen_reg_rtx (Pmode);
19589         emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
19590         emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
19591         emit_move_insn (MEM_DEREF (addr), fn_reg);
19592         emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
19593         emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
19594       }
19595       break;
19596
19597     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
19598     case ABI_DARWIN:
19599     case ABI_V4:
19600       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
19601                          FALSE, VOIDmode, 4,
19602                          addr, Pmode,
19603                          GEN_INT (rs6000_trampoline_size ()), SImode,
19604                          fnaddr, Pmode,
19605                          ctx_reg, Pmode);
19606       break;
19607     }
19608
19609   return;
19610 }
19611
19612 \f
19613 /* Table of valid machine attributes.  */
19614
19615 const struct attribute_spec rs6000_attribute_table[] =
19616 {
19617   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
19618   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute },
19619   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
19620   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
19621   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
19622   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
19623 #ifdef SUBTARGET_ATTRIBUTE_TABLE
19624   SUBTARGET_ATTRIBUTE_TABLE,
19625 #endif
19626   { NULL,        0, 0, false, false, false, NULL }
19627 };
19628
19629 /* Handle the "altivec" attribute.  The attribute may have
19630    arguments as follows:
19631
19632         __attribute__((altivec(vector__)))
19633         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
19634         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
19635
19636   and may appear more than once (e.g., 'vector bool char') in a
19637   given declaration.  */
19638
19639 static tree
19640 rs6000_handle_altivec_attribute (tree *node,
19641                                  tree name ATTRIBUTE_UNUSED,
19642                                  tree args,
19643                                  int flags ATTRIBUTE_UNUSED,
19644                                  bool *no_add_attrs)
19645 {
19646   tree type = *node, result = NULL_TREE;
19647   enum machine_mode mode;
19648   int unsigned_p;
19649   char altivec_type
19650     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
19651         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
19652        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
19653        : '?');
19654
19655   while (POINTER_TYPE_P (type)
19656          || TREE_CODE (type) == FUNCTION_TYPE
19657          || TREE_CODE (type) == METHOD_TYPE
19658          || TREE_CODE (type) == ARRAY_TYPE)
19659     type = TREE_TYPE (type);
19660
19661   mode = TYPE_MODE (type);
19662
19663   /* Check for invalid AltiVec type qualifiers.  */
19664   if (type == long_unsigned_type_node || type == long_integer_type_node)
19665     {
19666     if (TARGET_64BIT)
19667       error ("use of %<long%> in AltiVec types is invalid for 64-bit code");
19668     else if (rs6000_warn_altivec_long)
19669       warning (0, "use of %<long%> in AltiVec types is deprecated; use %<int%>");
19670     }
19671   else if (type == long_long_unsigned_type_node
19672            || type == long_long_integer_type_node)
19673     error ("use of %<long long%> in AltiVec types is invalid");
19674   else if (type == double_type_node)
19675     error ("use of %<double%> in AltiVec types is invalid");
19676   else if (type == long_double_type_node)
19677     error ("use of %<long double%> in AltiVec types is invalid");
19678   else if (type == boolean_type_node)
19679     error ("use of boolean types in AltiVec types is invalid");
19680   else if (TREE_CODE (type) == COMPLEX_TYPE)
19681     error ("use of %<complex%> in AltiVec types is invalid");
19682   else if (DECIMAL_FLOAT_MODE_P (mode))
19683     error ("use of decimal floating point types in AltiVec types is invalid");
19684
19685   switch (altivec_type)
19686     {
19687     case 'v':
19688       unsigned_p = TYPE_UNSIGNED (type);
19689       switch (mode)
19690         {
19691         case SImode:
19692           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
19693           break;
19694         case HImode:
19695           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
19696           break;
19697         case QImode:
19698           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
19699           break;
19700         case SFmode: result = V4SF_type_node; break;
19701           /* If the user says 'vector int bool', we may be handed the 'bool'
19702              attribute _before_ the 'vector' attribute, and so select the
19703              proper type in the 'b' case below.  */
19704         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
19705           result = type;
19706         default: break;
19707         }
19708       break;
19709     case 'b':
19710       switch (mode)
19711         {
19712         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
19713         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
19714         case QImode: case V16QImode: result = bool_V16QI_type_node;
19715         default: break;
19716         }
19717       break;
19718     case 'p':
19719       switch (mode)
19720         {
19721         case V8HImode: result = pixel_V8HI_type_node;
19722         default: break;
19723         }
19724     default: break;
19725     }
19726
19727   if (result && result != type && TYPE_READONLY (type))
19728     result = build_qualified_type (result, TYPE_QUAL_CONST);
19729
19730   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
19731
19732   if (result)
19733     *node = reconstruct_complex_type (*node, result);
19734
19735   return NULL_TREE;
19736 }
19737
19738 /* AltiVec defines four built-in scalar types that serve as vector
19739    elements; we must teach the compiler how to mangle them.  */
19740
19741 static const char *
19742 rs6000_mangle_type (const_tree type)
19743 {
19744   type = TYPE_MAIN_VARIANT (type);
19745
19746   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
19747       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
19748     return NULL;
19749
19750   if (type == bool_char_type_node) return "U6__boolc";
19751   if (type == bool_short_type_node) return "U6__bools";
19752   if (type == pixel_type_node) return "u7__pixel";
19753   if (type == bool_int_type_node) return "U6__booli";
19754
19755   /* Mangle IBM extended float long double as `g' (__float128) on
19756      powerpc*-linux where long-double-64 previously was the default.  */
19757   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
19758       && TARGET_ELF
19759       && TARGET_LONG_DOUBLE_128
19760       && !TARGET_IEEEQUAD)
19761     return "g";
19762
19763   /* For all other types, use normal C++ mangling.  */
19764   return NULL;
19765 }
19766
19767 /* Handle a "longcall" or "shortcall" attribute; arguments as in
19768    struct attribute_spec.handler.  */
19769
19770 static tree
19771 rs6000_handle_longcall_attribute (tree *node, tree name,
19772                                   tree args ATTRIBUTE_UNUSED,
19773                                   int flags ATTRIBUTE_UNUSED,
19774                                   bool *no_add_attrs)
19775 {
19776   if (TREE_CODE (*node) != FUNCTION_TYPE
19777       && TREE_CODE (*node) != FIELD_DECL
19778       && TREE_CODE (*node) != TYPE_DECL)
19779     {
19780       warning (OPT_Wattributes, "%qs attribute only applies to functions",
19781                IDENTIFIER_POINTER (name));
19782       *no_add_attrs = true;
19783     }
19784
19785   return NULL_TREE;
19786 }
19787
19788 /* Set longcall attributes on all functions declared when
19789    rs6000_default_long_calls is true.  */
19790 static void
19791 rs6000_set_default_type_attributes (tree type)
19792 {
19793   if (rs6000_default_long_calls
19794       && (TREE_CODE (type) == FUNCTION_TYPE
19795           || TREE_CODE (type) == METHOD_TYPE))
19796     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
19797                                         NULL_TREE,
19798                                         TYPE_ATTRIBUTES (type));
19799
19800 #if TARGET_MACHO
19801   darwin_set_default_type_attributes (type);
19802 #endif
19803 }
19804
19805 /* Return a reference suitable for calling a function with the
19806    longcall attribute.  */
19807
19808 rtx
19809 rs6000_longcall_ref (rtx call_ref)
19810 {
19811   const char *call_name;
19812   tree node;
19813
19814   if (GET_CODE (call_ref) != SYMBOL_REF)
19815     return call_ref;
19816
19817   /* System V adds '.' to the internal name, so skip them.  */
19818   call_name = XSTR (call_ref, 0);
19819   if (*call_name == '.')
19820     {
19821       while (*call_name == '.')
19822         call_name++;
19823
19824       node = get_identifier (call_name);
19825       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
19826     }
19827
19828   return force_reg (Pmode, call_ref);
19829 }
19830 \f
19831 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
19832 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
19833 #endif
19834
19835 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
19836    struct attribute_spec.handler.  */
19837 static tree
19838 rs6000_handle_struct_attribute (tree *node, tree name,
19839                                 tree args ATTRIBUTE_UNUSED,
19840                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
19841 {
19842   tree *type = NULL;
19843   if (DECL_P (*node))
19844     {
19845       if (TREE_CODE (*node) == TYPE_DECL)
19846         type = &TREE_TYPE (*node);
19847     }
19848   else
19849     type = node;
19850
19851   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
19852                  || TREE_CODE (*type) == UNION_TYPE)))
19853     {
19854       warning (OPT_Wattributes, "%qs attribute ignored", IDENTIFIER_POINTER (name));
19855       *no_add_attrs = true;
19856     }
19857
19858   else if ((is_attribute_p ("ms_struct", name)
19859             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
19860            || ((is_attribute_p ("gcc_struct", name)
19861                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
19862     {
19863       warning (OPT_Wattributes, "%qs incompatible attribute ignored",
19864                IDENTIFIER_POINTER (name));
19865       *no_add_attrs = true;
19866     }
19867
19868   return NULL_TREE;
19869 }
19870
19871 static bool
19872 rs6000_ms_bitfield_layout_p (const_tree record_type)
19873 {
19874   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
19875           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
19876     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
19877 }
19878 \f
19879 #ifdef USING_ELFOS_H
19880
19881 /* A get_unnamed_section callback, used for switching to toc_section.  */
19882
19883 static void
19884 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
19885 {
19886   if (DEFAULT_ABI == ABI_AIX
19887       && TARGET_MINIMAL_TOC
19888       && !TARGET_RELOCATABLE)
19889     {
19890       if (!toc_initialized)
19891         {
19892           toc_initialized = 1;
19893           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
19894           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
19895           fprintf (asm_out_file, "\t.tc ");
19896           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
19897           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
19898           fprintf (asm_out_file, "\n");
19899
19900           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
19901           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
19902           fprintf (asm_out_file, " = .+32768\n");
19903         }
19904       else
19905         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
19906     }
19907   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
19908     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
19909   else
19910     {
19911       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
19912       if (!toc_initialized)
19913         {
19914           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
19915           fprintf (asm_out_file, " = .+32768\n");
19916           toc_initialized = 1;
19917         }
19918     }
19919 }
19920
19921 /* Implement TARGET_ASM_INIT_SECTIONS.  */
19922
19923 static void
19924 rs6000_elf_asm_init_sections (void)
19925 {
19926   toc_section
19927     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
19928
19929   sdata2_section
19930     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
19931                            SDATA2_SECTION_ASM_OP);
19932 }
19933
19934 /* Implement TARGET_SELECT_RTX_SECTION.  */
19935
19936 static section *
19937 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
19938                                unsigned HOST_WIDE_INT align)
19939 {
19940   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
19941     return toc_section;
19942   else
19943     return default_elf_select_rtx_section (mode, x, align);
19944 }
19945 \f
19946 /* For a SYMBOL_REF, set generic flags and then perform some
19947    target-specific processing.
19948
19949    When the AIX ABI is requested on a non-AIX system, replace the
19950    function name with the real name (with a leading .) rather than the
19951    function descriptor name.  This saves a lot of overriding code to
19952    read the prefixes.  */
19953
19954 static void
19955 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
19956 {
19957   default_encode_section_info (decl, rtl, first);
19958
19959   if (first
19960       && TREE_CODE (decl) == FUNCTION_DECL
19961       && !TARGET_AIX
19962       && DEFAULT_ABI == ABI_AIX)
19963     {
19964       rtx sym_ref = XEXP (rtl, 0);
19965       size_t len = strlen (XSTR (sym_ref, 0));
19966       char *str = alloca (len + 2);
19967       str[0] = '.';
19968       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
19969       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
19970     }
19971 }
19972
19973 static inline bool
19974 compare_section_name (const char *section, const char *template)
19975 {
19976   int len;
19977
19978   len = strlen (template);
19979   return (strncmp (section, template, len) == 0
19980           && (section[len] == 0 || section[len] == '.'));
19981 }
19982
19983 bool
19984 rs6000_elf_in_small_data_p (const_tree decl)
19985 {
19986   if (rs6000_sdata == SDATA_NONE)
19987     return false;
19988
19989   /* We want to merge strings, so we never consider them small data.  */
19990   if (TREE_CODE (decl) == STRING_CST)
19991     return false;
19992
19993   /* Functions are never in the small data area.  */
19994   if (TREE_CODE (decl) == FUNCTION_DECL)
19995     return false;
19996
19997   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
19998     {
19999       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
20000       if (compare_section_name (section, ".sdata")
20001           || compare_section_name (section, ".sdata2")
20002           || compare_section_name (section, ".gnu.linkonce.s")
20003           || compare_section_name (section, ".sbss")
20004           || compare_section_name (section, ".sbss2")
20005           || compare_section_name (section, ".gnu.linkonce.sb")
20006           || strcmp (section, ".PPC.EMB.sdata0") == 0
20007           || strcmp (section, ".PPC.EMB.sbss0") == 0)
20008         return true;
20009     }
20010   else
20011     {
20012       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
20013
20014       if (size > 0
20015           && (unsigned HOST_WIDE_INT) size <= g_switch_value
20016           /* If it's not public, and we're not going to reference it there,
20017              there's no need to put it in the small data section.  */
20018           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
20019         return true;
20020     }
20021
20022   return false;
20023 }
20024
20025 #endif /* USING_ELFOS_H */
20026 \f
20027 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
20028
20029 static bool
20030 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
20031 {
20032   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
20033 }
20034 \f
20035 /* Return a REG that occurs in ADDR with coefficient 1.
20036    ADDR can be effectively incremented by incrementing REG.
20037
20038    r0 is special and we must not select it as an address
20039    register by this routine since our caller will try to
20040    increment the returned register via an "la" instruction.  */
20041
20042 rtx
20043 find_addr_reg (rtx addr)
20044 {
20045   while (GET_CODE (addr) == PLUS)
20046     {
20047       if (GET_CODE (XEXP (addr, 0)) == REG
20048           && REGNO (XEXP (addr, 0)) != 0)
20049         addr = XEXP (addr, 0);
20050       else if (GET_CODE (XEXP (addr, 1)) == REG
20051                && REGNO (XEXP (addr, 1)) != 0)
20052         addr = XEXP (addr, 1);
20053       else if (CONSTANT_P (XEXP (addr, 0)))
20054         addr = XEXP (addr, 1);
20055       else if (CONSTANT_P (XEXP (addr, 1)))
20056         addr = XEXP (addr, 0);
20057       else
20058         gcc_unreachable ();
20059     }
20060   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
20061   return addr;
20062 }
20063
20064 void
20065 rs6000_fatal_bad_address (rtx op)
20066 {
20067   fatal_insn ("bad address", op);
20068 }
20069
20070 #if TARGET_MACHO
20071
20072 static tree branch_island_list = 0;
20073
20074 /* Remember to generate a branch island for far calls to the given
20075    function.  */
20076
20077 static void
20078 add_compiler_branch_island (tree label_name, tree function_name,
20079                             int line_number)
20080 {
20081   tree branch_island = build_tree_list (function_name, label_name);
20082   TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
20083   TREE_CHAIN (branch_island) = branch_island_list;
20084   branch_island_list = branch_island;
20085 }
20086
20087 #define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND)     TREE_VALUE (BRANCH_ISLAND)
20088 #define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND)  TREE_PURPOSE (BRANCH_ISLAND)
20089 #define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND)    \
20090                 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
20091
20092 /* Generate far-jump branch islands for everything on the
20093    branch_island_list.  Invoked immediately after the last instruction
20094    of the epilogue has been emitted; the branch-islands must be
20095    appended to, and contiguous with, the function body.  Mach-O stubs
20096    are generated in machopic_output_stub().  */
20097
20098 static void
20099 macho_branch_islands (void)
20100 {
20101   char tmp_buf[512];
20102   tree branch_island;
20103
20104   for (branch_island = branch_island_list;
20105        branch_island;
20106        branch_island = TREE_CHAIN (branch_island))
20107     {
20108       const char *label =
20109         IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
20110       const char *name  =
20111         IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
20112       char name_buf[512];
20113       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
20114       if (name[0] == '*' || name[0] == '&')
20115         strcpy (name_buf, name+1);
20116       else
20117         {
20118           name_buf[0] = '_';
20119           strcpy (name_buf+1, name);
20120         }
20121       strcpy (tmp_buf, "\n");
20122       strcat (tmp_buf, label);
20123 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
20124       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
20125         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
20126 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
20127       if (flag_pic)
20128         {
20129           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
20130           strcat (tmp_buf, label);
20131           strcat (tmp_buf, "_pic\n");
20132           strcat (tmp_buf, label);
20133           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
20134
20135           strcat (tmp_buf, "\taddis r11,r11,ha16(");
20136           strcat (tmp_buf, name_buf);
20137           strcat (tmp_buf, " - ");
20138           strcat (tmp_buf, label);
20139           strcat (tmp_buf, "_pic)\n");
20140
20141           strcat (tmp_buf, "\tmtlr r0\n");
20142
20143           strcat (tmp_buf, "\taddi r12,r11,lo16(");
20144           strcat (tmp_buf, name_buf);
20145           strcat (tmp_buf, " - ");
20146           strcat (tmp_buf, label);
20147           strcat (tmp_buf, "_pic)\n");
20148
20149           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
20150         }
20151       else
20152         {
20153           strcat (tmp_buf, ":\nlis r12,hi16(");
20154           strcat (tmp_buf, name_buf);
20155           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
20156           strcat (tmp_buf, name_buf);
20157           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
20158         }
20159       output_asm_insn (tmp_buf, 0);
20160 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
20161       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
20162         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
20163 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
20164     }
20165
20166   branch_island_list = 0;
20167 }
20168
20169 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
20170    already there or not.  */
20171
20172 static int
20173 no_previous_def (tree function_name)
20174 {
20175   tree branch_island;
20176   for (branch_island = branch_island_list;
20177        branch_island;
20178        branch_island = TREE_CHAIN (branch_island))
20179     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
20180       return 0;
20181   return 1;
20182 }
20183
20184 /* GET_PREV_LABEL gets the label name from the previous definition of
20185    the function.  */
20186
20187 static tree
20188 get_prev_label (tree function_name)
20189 {
20190   tree branch_island;
20191   for (branch_island = branch_island_list;
20192        branch_island;
20193        branch_island = TREE_CHAIN (branch_island))
20194     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
20195       return BRANCH_ISLAND_LABEL_NAME (branch_island);
20196   return 0;
20197 }
20198
20199 #ifndef DARWIN_LINKER_GENERATES_ISLANDS
20200 #define DARWIN_LINKER_GENERATES_ISLANDS 0
20201 #endif
20202
20203 /* KEXTs still need branch islands.  */
20204 #define DARWIN_GENERATE_ISLANDS (!DARWIN_LINKER_GENERATES_ISLANDS \
20205                                  || flag_mkernel || flag_apple_kext)
20206
20207 /* INSN is either a function call or a millicode call.  It may have an
20208    unconditional jump in its delay slot.
20209
20210    CALL_DEST is the routine we are calling.  */
20211
20212 char *
20213 output_call (rtx insn, rtx *operands, int dest_operand_number,
20214              int cookie_operand_number)
20215 {
20216   static char buf[256];
20217   if (DARWIN_GENERATE_ISLANDS
20218       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
20219       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
20220     {
20221       tree labelname;
20222       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
20223
20224       if (no_previous_def (funname))
20225         {
20226           rtx label_rtx = gen_label_rtx ();
20227           char *label_buf, temp_buf[256];
20228           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
20229                                        CODE_LABEL_NUMBER (label_rtx));
20230           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
20231           labelname = get_identifier (label_buf);
20232           add_compiler_branch_island (labelname, funname, insn_line (insn));
20233         }
20234       else
20235         labelname = get_prev_label (funname);
20236
20237       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
20238          instruction will reach 'foo', otherwise link as 'bl L42'".
20239          "L42" should be a 'branch island', that will do a far jump to
20240          'foo'.  Branch islands are generated in
20241          macho_branch_islands().  */
20242       sprintf (buf, "jbsr %%z%d,%.246s",
20243                dest_operand_number, IDENTIFIER_POINTER (labelname));
20244     }
20245   else
20246     sprintf (buf, "bl %%z%d", dest_operand_number);
20247   return buf;
20248 }
20249
20250 /* Generate PIC and indirect symbol stubs.  */
20251
20252 void
20253 machopic_output_stub (FILE *file, const char *symb, const char *stub)
20254 {
20255   unsigned int length;
20256   char *symbol_name, *lazy_ptr_name;
20257   char *local_label_0;
20258   static int label = 0;
20259
20260   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
20261   symb = (*targetm.strip_name_encoding) (symb);
20262
20263
20264   length = strlen (symb);
20265   symbol_name = alloca (length + 32);
20266   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
20267
20268   lazy_ptr_name = alloca (length + 32);
20269   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
20270
20271   if (flag_pic == 2)
20272     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
20273   else
20274     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
20275
20276   if (flag_pic == 2)
20277     {
20278       fprintf (file, "\t.align 5\n");
20279
20280       fprintf (file, "%s:\n", stub);
20281       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
20282
20283       label++;
20284       local_label_0 = alloca (sizeof ("\"L00000000000$spb\""));
20285       sprintf (local_label_0, "\"L%011d$spb\"", label);
20286
20287       fprintf (file, "\tmflr r0\n");
20288       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
20289       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
20290       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
20291                lazy_ptr_name, local_label_0);
20292       fprintf (file, "\tmtlr r0\n");
20293       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
20294                (TARGET_64BIT ? "ldu" : "lwzu"),
20295                lazy_ptr_name, local_label_0);
20296       fprintf (file, "\tmtctr r12\n");
20297       fprintf (file, "\tbctr\n");
20298     }
20299   else
20300     {
20301       fprintf (file, "\t.align 4\n");
20302
20303       fprintf (file, "%s:\n", stub);
20304       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
20305
20306       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
20307       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
20308                (TARGET_64BIT ? "ldu" : "lwzu"),
20309                lazy_ptr_name);
20310       fprintf (file, "\tmtctr r12\n");
20311       fprintf (file, "\tbctr\n");
20312     }
20313
20314   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
20315   fprintf (file, "%s:\n", lazy_ptr_name);
20316   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
20317   fprintf (file, "%sdyld_stub_binding_helper\n",
20318            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
20319 }
20320
20321 /* Legitimize PIC addresses.  If the address is already
20322    position-independent, we return ORIG.  Newly generated
20323    position-independent addresses go into a reg.  This is REG if non
20324    zero, otherwise we allocate register(s) as necessary.  */
20325
20326 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
20327
20328 rtx
20329 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
20330                                         rtx reg)
20331 {
20332   rtx base, offset;
20333
20334   if (reg == NULL && ! reload_in_progress && ! reload_completed)
20335     reg = gen_reg_rtx (Pmode);
20336
20337   if (GET_CODE (orig) == CONST)
20338     {
20339       rtx reg_temp;
20340
20341       if (GET_CODE (XEXP (orig, 0)) == PLUS
20342           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
20343         return orig;
20344
20345       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
20346
20347       /* Use a different reg for the intermediate value, as
20348          it will be marked UNCHANGING.  */
20349       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
20350       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
20351                                                      Pmode, reg_temp);
20352       offset =
20353         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
20354                                                 Pmode, reg);
20355
20356       if (GET_CODE (offset) == CONST_INT)
20357         {
20358           if (SMALL_INT (offset))
20359             return plus_constant (base, INTVAL (offset));
20360           else if (! reload_in_progress && ! reload_completed)
20361             offset = force_reg (Pmode, offset);
20362           else
20363             {
20364               rtx mem = force_const_mem (Pmode, orig);
20365               return machopic_legitimize_pic_address (mem, Pmode, reg);
20366             }
20367         }
20368       return gen_rtx_PLUS (Pmode, base, offset);
20369     }
20370
20371   /* Fall back on generic machopic code.  */
20372   return machopic_legitimize_pic_address (orig, mode, reg);
20373 }
20374
20375 /* Output a .machine directive for the Darwin assembler, and call
20376    the generic start_file routine.  */
20377
20378 static void
20379 rs6000_darwin_file_start (void)
20380 {
20381   static const struct
20382   {
20383     const char *arg;
20384     const char *name;
20385     int if_set;
20386   } mapping[] = {
20387     { "ppc64", "ppc64", MASK_64BIT },
20388     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
20389     { "power4", "ppc970", 0 },
20390     { "G5", "ppc970", 0 },
20391     { "7450", "ppc7450", 0 },
20392     { "7400", "ppc7400", MASK_ALTIVEC },
20393     { "G4", "ppc7400", 0 },
20394     { "750", "ppc750", 0 },
20395     { "740", "ppc750", 0 },
20396     { "G3", "ppc750", 0 },
20397     { "604e", "ppc604e", 0 },
20398     { "604", "ppc604", 0 },
20399     { "603e", "ppc603", 0 },
20400     { "603", "ppc603", 0 },
20401     { "601", "ppc601", 0 },
20402     { NULL, "ppc", 0 } };
20403   const char *cpu_id = "";
20404   size_t i;
20405
20406   rs6000_file_start ();
20407   darwin_file_start ();
20408
20409   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
20410   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
20411     if (rs6000_select[i].set_arch_p && rs6000_select[i].string
20412         && rs6000_select[i].string[0] != '\0')
20413       cpu_id = rs6000_select[i].string;
20414
20415   /* Look through the mapping array.  Pick the first name that either
20416      matches the argument, has a bit set in IF_SET that is also set
20417      in the target flags, or has a NULL name.  */
20418
20419   i = 0;
20420   while (mapping[i].arg != NULL
20421          && strcmp (mapping[i].arg, cpu_id) != 0
20422          && (mapping[i].if_set & target_flags) == 0)
20423     i++;
20424
20425   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
20426 }
20427
20428 #endif /* TARGET_MACHO */
20429
20430 #if TARGET_ELF
20431 static int
20432 rs6000_elf_reloc_rw_mask (void)
20433 {
20434   if (flag_pic)
20435     return 3;
20436   else if (DEFAULT_ABI == ABI_AIX)
20437     return 2;
20438   else
20439     return 0;
20440 }
20441
20442 /* Record an element in the table of global constructors.  SYMBOL is
20443    a SYMBOL_REF of the function to be called; PRIORITY is a number
20444    between 0 and MAX_INIT_PRIORITY.
20445
20446    This differs from default_named_section_asm_out_constructor in
20447    that we have special handling for -mrelocatable.  */
20448
20449 static void
20450 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
20451 {
20452   const char *section = ".ctors";
20453   char buf[16];
20454
20455   if (priority != DEFAULT_INIT_PRIORITY)
20456     {
20457       sprintf (buf, ".ctors.%.5u",
20458                /* Invert the numbering so the linker puts us in the proper
20459                   order; constructors are run from right to left, and the
20460                   linker sorts in increasing order.  */
20461                MAX_INIT_PRIORITY - priority);
20462       section = buf;
20463     }
20464
20465   switch_to_section (get_section (section, SECTION_WRITE, NULL));
20466   assemble_align (POINTER_SIZE);
20467
20468   if (TARGET_RELOCATABLE)
20469     {
20470       fputs ("\t.long (", asm_out_file);
20471       output_addr_const (asm_out_file, symbol);
20472       fputs (")@fixup\n", asm_out_file);
20473     }
20474   else
20475     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
20476 }
20477
20478 static void
20479 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
20480 {
20481   const char *section = ".dtors";
20482   char buf[16];
20483
20484   if (priority != DEFAULT_INIT_PRIORITY)
20485     {
20486       sprintf (buf, ".dtors.%.5u",
20487                /* Invert the numbering so the linker puts us in the proper
20488                   order; constructors are run from right to left, and the
20489                   linker sorts in increasing order.  */
20490                MAX_INIT_PRIORITY - priority);
20491       section = buf;
20492     }
20493
20494   switch_to_section (get_section (section, SECTION_WRITE, NULL));
20495   assemble_align (POINTER_SIZE);
20496
20497   if (TARGET_RELOCATABLE)
20498     {
20499       fputs ("\t.long (", asm_out_file);
20500       output_addr_const (asm_out_file, symbol);
20501       fputs (")@fixup\n", asm_out_file);
20502     }
20503   else
20504     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
20505 }
20506
20507 void
20508 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
20509 {
20510   if (TARGET_64BIT)
20511     {
20512       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
20513       ASM_OUTPUT_LABEL (file, name);
20514       fputs (DOUBLE_INT_ASM_OP, file);
20515       rs6000_output_function_entry (file, name);
20516       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
20517       if (DOT_SYMBOLS)
20518         {
20519           fputs ("\t.size\t", file);
20520           assemble_name (file, name);
20521           fputs (",24\n\t.type\t.", file);
20522           assemble_name (file, name);
20523           fputs (",@function\n", file);
20524           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
20525             {
20526               fputs ("\t.globl\t.", file);
20527               assemble_name (file, name);
20528               putc ('\n', file);
20529             }
20530         }
20531       else
20532         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
20533       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
20534       rs6000_output_function_entry (file, name);
20535       fputs (":\n", file);
20536       return;
20537     }
20538
20539   if (TARGET_RELOCATABLE
20540       && !TARGET_SECURE_PLT
20541       && (get_pool_size () != 0 || current_function_profile)
20542       && uses_TOC ())
20543     {
20544       char buf[256];
20545
20546       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
20547
20548       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
20549       fprintf (file, "\t.long ");
20550       assemble_name (file, buf);
20551       putc ('-', file);
20552       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
20553       assemble_name (file, buf);
20554       putc ('\n', file);
20555     }
20556
20557   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
20558   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
20559
20560   if (DEFAULT_ABI == ABI_AIX)
20561     {
20562       const char *desc_name, *orig_name;
20563
20564       orig_name = (*targetm.strip_name_encoding) (name);
20565       desc_name = orig_name;
20566       while (*desc_name == '.')
20567         desc_name++;
20568
20569       if (TREE_PUBLIC (decl))
20570         fprintf (file, "\t.globl %s\n", desc_name);
20571
20572       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
20573       fprintf (file, "%s:\n", desc_name);
20574       fprintf (file, "\t.long %s\n", orig_name);
20575       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
20576       if (DEFAULT_ABI == ABI_AIX)
20577         fputs ("\t.long 0\n", file);
20578       fprintf (file, "\t.previous\n");
20579     }
20580   ASM_OUTPUT_LABEL (file, name);
20581 }
20582
20583 static void
20584 rs6000_elf_end_indicate_exec_stack (void)
20585 {
20586   if (TARGET_32BIT)
20587     file_end_indicate_exec_stack ();
20588 }
20589 #endif
20590
20591 #if TARGET_XCOFF
20592 static void
20593 rs6000_xcoff_asm_output_anchor (rtx symbol)
20594 {
20595   char buffer[100];
20596
20597   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
20598            SYMBOL_REF_BLOCK_OFFSET (symbol));
20599   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
20600 }
20601
20602 static void
20603 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
20604 {
20605   fputs (GLOBAL_ASM_OP, stream);
20606   RS6000_OUTPUT_BASENAME (stream, name);
20607   putc ('\n', stream);
20608 }
20609
20610 /* A get_unnamed_decl callback, used for read-only sections.  PTR
20611    points to the section string variable.  */
20612
20613 static void
20614 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
20615 {
20616   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
20617            *(const char *const *) directive,
20618            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
20619 }
20620
20621 /* Likewise for read-write sections.  */
20622
20623 static void
20624 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
20625 {
20626   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
20627            *(const char *const *) directive,
20628            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
20629 }
20630
20631 /* A get_unnamed_section callback, used for switching to toc_section.  */
20632
20633 static void
20634 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
20635 {
20636   if (TARGET_MINIMAL_TOC)
20637     {
20638       /* toc_section is always selected at least once from
20639          rs6000_xcoff_file_start, so this is guaranteed to
20640          always be defined once and only once in each file.  */
20641       if (!toc_initialized)
20642         {
20643           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
20644           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
20645           toc_initialized = 1;
20646         }
20647       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
20648                (TARGET_32BIT ? "" : ",3"));
20649     }
20650   else
20651     fputs ("\t.toc\n", asm_out_file);
20652 }
20653
20654 /* Implement TARGET_ASM_INIT_SECTIONS.  */
20655
20656 static void
20657 rs6000_xcoff_asm_init_sections (void)
20658 {
20659   read_only_data_section
20660     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
20661                            &xcoff_read_only_section_name);
20662
20663   private_data_section
20664     = get_unnamed_section (SECTION_WRITE,
20665                            rs6000_xcoff_output_readwrite_section_asm_op,
20666                            &xcoff_private_data_section_name);
20667
20668   read_only_private_data_section
20669     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
20670                            &xcoff_private_data_section_name);
20671
20672   toc_section
20673     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
20674
20675   readonly_data_section = read_only_data_section;
20676   exception_section = data_section;
20677 }
20678
20679 static int
20680 rs6000_xcoff_reloc_rw_mask (void)
20681 {
20682   return 3;
20683 }
20684
20685 static void
20686 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
20687                                 tree decl ATTRIBUTE_UNUSED)
20688 {
20689   int smclass;
20690   static const char * const suffix[3] = { "PR", "RO", "RW" };
20691
20692   if (flags & SECTION_CODE)
20693     smclass = 0;
20694   else if (flags & SECTION_WRITE)
20695     smclass = 2;
20696   else
20697     smclass = 1;
20698
20699   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
20700            (flags & SECTION_CODE) ? "." : "",
20701            name, suffix[smclass], flags & SECTION_ENTSIZE);
20702 }
20703
20704 static section *
20705 rs6000_xcoff_select_section (tree decl, int reloc,
20706                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
20707 {
20708   if (decl_readonly_section (decl, reloc))
20709     {
20710       if (TREE_PUBLIC (decl))
20711         return read_only_data_section;
20712       else
20713         return read_only_private_data_section;
20714     }
20715   else
20716     {
20717       if (TREE_PUBLIC (decl))
20718         return data_section;
20719       else
20720         return private_data_section;
20721     }
20722 }
20723
20724 static void
20725 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
20726 {
20727   const char *name;
20728
20729   /* Use select_section for private and uninitialized data.  */
20730   if (!TREE_PUBLIC (decl)
20731       || DECL_COMMON (decl)
20732       || DECL_INITIAL (decl) == NULL_TREE
20733       || DECL_INITIAL (decl) == error_mark_node
20734       || (flag_zero_initialized_in_bss
20735           && initializer_zerop (DECL_INITIAL (decl))))
20736     return;
20737
20738   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
20739   name = (*targetm.strip_name_encoding) (name);
20740   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
20741 }
20742
20743 /* Select section for constant in constant pool.
20744
20745    On RS/6000, all constants are in the private read-only data area.
20746    However, if this is being placed in the TOC it must be output as a
20747    toc entry.  */
20748
20749 static section *
20750 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
20751                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
20752 {
20753   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
20754     return toc_section;
20755   else
20756     return read_only_private_data_section;
20757 }
20758
20759 /* Remove any trailing [DS] or the like from the symbol name.  */
20760
20761 static const char *
20762 rs6000_xcoff_strip_name_encoding (const char *name)
20763 {
20764   size_t len;
20765   if (*name == '*')
20766     name++;
20767   len = strlen (name);
20768   if (name[len - 1] == ']')
20769     return ggc_alloc_string (name, len - 4);
20770   else
20771     return name;
20772 }
20773
20774 /* Section attributes.  AIX is always PIC.  */
20775
20776 static unsigned int
20777 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
20778 {
20779   unsigned int align;
20780   unsigned int flags = default_section_type_flags (decl, name, reloc);
20781
20782   /* Align to at least UNIT size.  */
20783   if (flags & SECTION_CODE)
20784     align = MIN_UNITS_PER_WORD;
20785   else
20786     /* Increase alignment of large objects if not already stricter.  */
20787     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
20788                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
20789                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
20790
20791   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
20792 }
20793
20794 /* Output at beginning of assembler file.
20795
20796    Initialize the section names for the RS/6000 at this point.
20797
20798    Specify filename, including full path, to assembler.
20799
20800    We want to go into the TOC section so at least one .toc will be emitted.
20801    Also, in order to output proper .bs/.es pairs, we need at least one static
20802    [RW] section emitted.
20803
20804    Finally, declare mcount when profiling to make the assembler happy.  */
20805
20806 static void
20807 rs6000_xcoff_file_start (void)
20808 {
20809   rs6000_gen_section_name (&xcoff_bss_section_name,
20810                            main_input_filename, ".bss_");
20811   rs6000_gen_section_name (&xcoff_private_data_section_name,
20812                            main_input_filename, ".rw_");
20813   rs6000_gen_section_name (&xcoff_read_only_section_name,
20814                            main_input_filename, ".ro_");
20815
20816   fputs ("\t.file\t", asm_out_file);
20817   output_quoted_string (asm_out_file, main_input_filename);
20818   fputc ('\n', asm_out_file);
20819   if (write_symbols != NO_DEBUG)
20820     switch_to_section (private_data_section);
20821   switch_to_section (text_section);
20822   if (profile_flag)
20823     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
20824   rs6000_file_start ();
20825 }
20826
20827 /* Output at end of assembler file.
20828    On the RS/6000, referencing data should automatically pull in text.  */
20829
20830 static void
20831 rs6000_xcoff_file_end (void)
20832 {
20833   switch_to_section (text_section);
20834   fputs ("_section_.text:\n", asm_out_file);
20835   switch_to_section (data_section);
20836   fputs (TARGET_32BIT
20837          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
20838          asm_out_file);
20839 }
20840 #endif /* TARGET_XCOFF */
20841
20842 /* Compute a (partial) cost for rtx X.  Return true if the complete
20843    cost has been computed, and false if subexpressions should be
20844    scanned.  In either case, *TOTAL contains the cost result.  */
20845
20846 static bool
20847 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
20848 {
20849   enum machine_mode mode = GET_MODE (x);
20850
20851   switch (code)
20852     {
20853       /* On the RS/6000, if it is valid in the insn, it is free.  */
20854     case CONST_INT:
20855       if (((outer_code == SET
20856             || outer_code == PLUS
20857             || outer_code == MINUS)
20858            && (satisfies_constraint_I (x)
20859                || satisfies_constraint_L (x)))
20860           || (outer_code == AND
20861               && (satisfies_constraint_K (x)
20862                   || (mode == SImode
20863                       ? satisfies_constraint_L (x)
20864                       : satisfies_constraint_J (x))
20865                   || mask_operand (x, mode)
20866                   || (mode == DImode
20867                       && mask64_operand (x, DImode))))
20868           || ((outer_code == IOR || outer_code == XOR)
20869               && (satisfies_constraint_K (x)
20870                   || (mode == SImode
20871                       ? satisfies_constraint_L (x)
20872                       : satisfies_constraint_J (x))))
20873           || outer_code == ASHIFT
20874           || outer_code == ASHIFTRT
20875           || outer_code == LSHIFTRT
20876           || outer_code == ROTATE
20877           || outer_code == ROTATERT
20878           || outer_code == ZERO_EXTRACT
20879           || (outer_code == MULT
20880               && satisfies_constraint_I (x))
20881           || ((outer_code == DIV || outer_code == UDIV
20882                || outer_code == MOD || outer_code == UMOD)
20883               && exact_log2 (INTVAL (x)) >= 0)
20884           || (outer_code == COMPARE
20885               && (satisfies_constraint_I (x)
20886                   || satisfies_constraint_K (x)))
20887           || (outer_code == EQ
20888               && (satisfies_constraint_I (x)
20889                   || satisfies_constraint_K (x)
20890                   || (mode == SImode
20891                       ? satisfies_constraint_L (x)
20892                       : satisfies_constraint_J (x))))
20893           || (outer_code == GTU
20894               && satisfies_constraint_I (x))
20895           || (outer_code == LTU
20896               && satisfies_constraint_P (x)))
20897         {
20898           *total = 0;
20899           return true;
20900         }
20901       else if ((outer_code == PLUS
20902                 && reg_or_add_cint_operand (x, VOIDmode))
20903                || (outer_code == MINUS
20904                    && reg_or_sub_cint_operand (x, VOIDmode))
20905                || ((outer_code == SET
20906                     || outer_code == IOR
20907                     || outer_code == XOR)
20908                    && (INTVAL (x)
20909                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
20910         {
20911           *total = COSTS_N_INSNS (1);
20912           return true;
20913         }
20914       /* FALLTHRU */
20915
20916     case CONST_DOUBLE:
20917       if (mode == DImode && code == CONST_DOUBLE)
20918         {
20919           if ((outer_code == IOR || outer_code == XOR)
20920               && CONST_DOUBLE_HIGH (x) == 0
20921               && (CONST_DOUBLE_LOW (x)
20922                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
20923             {
20924               *total = 0;
20925               return true;
20926             }
20927           else if ((outer_code == AND && and64_2_operand (x, DImode))
20928                    || ((outer_code == SET
20929                         || outer_code == IOR
20930                         || outer_code == XOR)
20931                        && CONST_DOUBLE_HIGH (x) == 0))
20932             {
20933               *total = COSTS_N_INSNS (1);
20934               return true;
20935             }
20936         }
20937       /* FALLTHRU */
20938
20939     case CONST:
20940     case HIGH:
20941     case SYMBOL_REF:
20942     case MEM:
20943       /* When optimizing for size, MEM should be slightly more expensive
20944          than generating address, e.g., (plus (reg) (const)).
20945          L1 cache latency is about two instructions.  */
20946       *total = optimize_size ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
20947       return true;
20948
20949     case LABEL_REF:
20950       *total = 0;
20951       return true;
20952
20953     case PLUS:
20954       if (mode == DFmode)
20955         {
20956           if (GET_CODE (XEXP (x, 0)) == MULT)
20957             {
20958               /* FNMA accounted in outer NEG.  */
20959               if (outer_code == NEG)
20960                 *total = rs6000_cost->dmul - rs6000_cost->fp;
20961               else
20962                 *total = rs6000_cost->dmul;
20963             }
20964           else
20965             *total = rs6000_cost->fp;
20966         }
20967       else if (mode == SFmode)
20968         {
20969           /* FNMA accounted in outer NEG.  */
20970           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
20971             *total = 0;
20972           else
20973             *total = rs6000_cost->fp;
20974         }
20975       else
20976         *total = COSTS_N_INSNS (1);
20977       return false;
20978
20979     case MINUS:
20980       if (mode == DFmode)
20981         {
20982           if (GET_CODE (XEXP (x, 0)) == MULT
20983               || GET_CODE (XEXP (x, 1)) == MULT)
20984             {
20985               /* FNMA accounted in outer NEG.  */
20986               if (outer_code == NEG)
20987                 *total = rs6000_cost->dmul - rs6000_cost->fp;
20988               else
20989                 *total = rs6000_cost->dmul;
20990             }
20991           else
20992             *total = rs6000_cost->fp;
20993         }
20994       else if (mode == SFmode)
20995         {
20996           /* FNMA accounted in outer NEG.  */
20997           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
20998             *total = 0;
20999           else
21000             *total = rs6000_cost->fp;
21001         }
21002       else
21003         *total = COSTS_N_INSNS (1);
21004       return false;
21005
21006     case MULT:
21007       if (GET_CODE (XEXP (x, 1)) == CONST_INT
21008           && satisfies_constraint_I (XEXP (x, 1)))
21009         {
21010           if (INTVAL (XEXP (x, 1)) >= -256
21011               && INTVAL (XEXP (x, 1)) <= 255)
21012             *total = rs6000_cost->mulsi_const9;
21013           else
21014             *total = rs6000_cost->mulsi_const;
21015         }
21016       /* FMA accounted in outer PLUS/MINUS.  */
21017       else if ((mode == DFmode || mode == SFmode)
21018                && (outer_code == PLUS || outer_code == MINUS))
21019         *total = 0;
21020       else if (mode == DFmode)
21021         *total = rs6000_cost->dmul;
21022       else if (mode == SFmode)
21023         *total = rs6000_cost->fp;
21024       else if (mode == DImode)
21025         *total = rs6000_cost->muldi;
21026       else
21027         *total = rs6000_cost->mulsi;
21028       return false;
21029
21030     case DIV:
21031     case MOD:
21032       if (FLOAT_MODE_P (mode))
21033         {
21034           *total = mode == DFmode ? rs6000_cost->ddiv
21035                                   : rs6000_cost->sdiv;
21036           return false;
21037         }
21038       /* FALLTHRU */
21039
21040     case UDIV:
21041     case UMOD:
21042       if (GET_CODE (XEXP (x, 1)) == CONST_INT
21043           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
21044         {
21045           if (code == DIV || code == MOD)
21046             /* Shift, addze */
21047             *total = COSTS_N_INSNS (2);
21048           else
21049             /* Shift */
21050             *total = COSTS_N_INSNS (1);
21051         }
21052       else
21053         {
21054           if (GET_MODE (XEXP (x, 1)) == DImode)
21055             *total = rs6000_cost->divdi;
21056           else
21057             *total = rs6000_cost->divsi;
21058         }
21059       /* Add in shift and subtract for MOD. */
21060       if (code == MOD || code == UMOD)
21061         *total += COSTS_N_INSNS (2);
21062       return false;
21063
21064     case CTZ:
21065     case FFS:
21066       *total = COSTS_N_INSNS (4);
21067       return false;
21068
21069     case POPCOUNT:
21070       *total = COSTS_N_INSNS (6);
21071       return false;
21072
21073     case NOT:
21074       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
21075         {
21076           *total = 0;
21077           return false;
21078         }
21079       /* FALLTHRU */
21080
21081     case AND:
21082     case CLZ:
21083     case IOR:
21084     case XOR:
21085     case ZERO_EXTRACT:
21086       *total = COSTS_N_INSNS (1);
21087       return false;
21088
21089     case ASHIFT:
21090     case ASHIFTRT:
21091     case LSHIFTRT:
21092     case ROTATE:
21093     case ROTATERT:
21094       /* Handle mul_highpart.  */
21095       if (outer_code == TRUNCATE
21096           && GET_CODE (XEXP (x, 0)) == MULT)
21097         {
21098           if (mode == DImode)
21099             *total = rs6000_cost->muldi;
21100           else
21101             *total = rs6000_cost->mulsi;
21102           return true;
21103         }
21104       else if (outer_code == AND)
21105         *total = 0;
21106       else
21107         *total = COSTS_N_INSNS (1);
21108       return false;
21109
21110     case SIGN_EXTEND:
21111     case ZERO_EXTEND:
21112       if (GET_CODE (XEXP (x, 0)) == MEM)
21113         *total = 0;
21114       else
21115         *total = COSTS_N_INSNS (1);
21116       return false;
21117
21118     case COMPARE:
21119     case NEG:
21120     case ABS:
21121       if (!FLOAT_MODE_P (mode))
21122         {
21123           *total = COSTS_N_INSNS (1);
21124           return false;
21125         }
21126       /* FALLTHRU */
21127
21128     case FLOAT:
21129     case UNSIGNED_FLOAT:
21130     case FIX:
21131     case UNSIGNED_FIX:
21132     case FLOAT_TRUNCATE:
21133       *total = rs6000_cost->fp;
21134       return false;
21135
21136     case FLOAT_EXTEND:
21137       if (mode == DFmode)
21138         *total = 0;
21139       else
21140         *total = rs6000_cost->fp;
21141       return false;
21142
21143     case UNSPEC:
21144       switch (XINT (x, 1))
21145         {
21146         case UNSPEC_FRSP:
21147           *total = rs6000_cost->fp;
21148           return true;
21149
21150         default:
21151           break;
21152         }
21153       break;
21154
21155     case CALL:
21156     case IF_THEN_ELSE:
21157       if (optimize_size)
21158         {
21159           *total = COSTS_N_INSNS (1);
21160           return true;
21161         }
21162       else if (FLOAT_MODE_P (mode)
21163                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
21164         {
21165           *total = rs6000_cost->fp;
21166           return false;
21167         }
21168       break;
21169
21170     case EQ:
21171     case GTU:
21172     case LTU:
21173       /* Carry bit requires mode == Pmode.
21174          NEG or PLUS already counted so only add one.  */
21175       if (mode == Pmode
21176           && (outer_code == NEG || outer_code == PLUS))
21177         {
21178           *total = COSTS_N_INSNS (1);
21179           return true;
21180         }
21181       if (outer_code == SET)
21182         {
21183           if (XEXP (x, 1) == const0_rtx)
21184             {
21185               *total = COSTS_N_INSNS (2);
21186               return true;
21187             }
21188           else if (mode == Pmode)
21189             {
21190               *total = COSTS_N_INSNS (3);
21191               return false;
21192             }
21193         }
21194       /* FALLTHRU */
21195
21196     case GT:
21197     case LT:
21198     case UNORDERED:
21199       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
21200         {
21201           *total = COSTS_N_INSNS (2);
21202           return true;
21203         }
21204       /* CC COMPARE.  */
21205       if (outer_code == COMPARE)
21206         {
21207           *total = 0;
21208           return true;
21209         }
21210       break;
21211
21212     default:
21213       break;
21214     }
21215
21216   return false;
21217 }
21218
21219 /* A C expression returning the cost of moving data from a register of class
21220    CLASS1 to one of CLASS2.  */
21221
21222 int
21223 rs6000_register_move_cost (enum machine_mode mode,
21224                            enum reg_class from, enum reg_class to)
21225 {
21226   /*  Moves from/to GENERAL_REGS.  */
21227   if (reg_classes_intersect_p (to, GENERAL_REGS)
21228       || reg_classes_intersect_p (from, GENERAL_REGS))
21229     {
21230       if (! reg_classes_intersect_p (to, GENERAL_REGS))
21231         from = to;
21232
21233       if (from == FLOAT_REGS || from == ALTIVEC_REGS)
21234         return (rs6000_memory_move_cost (mode, from, 0)
21235                 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
21236
21237       /* It's more expensive to move CR_REGS than CR0_REGS because of the
21238          shift.  */
21239       else if (from == CR_REGS)
21240         return 4;
21241
21242       else
21243         /* A move will cost one instruction per GPR moved.  */
21244         return 2 * hard_regno_nregs[0][mode];
21245     }
21246
21247   /* Moving between two similar registers is just one instruction.  */
21248   else if (reg_classes_intersect_p (to, from))
21249     return (mode == TFmode || mode == TDmode) ? 4 : 2;
21250
21251   /* Everything else has to go through GENERAL_REGS.  */
21252   else
21253     return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
21254             + rs6000_register_move_cost (mode, from, GENERAL_REGS));
21255 }
21256
21257 /* A C expressions returning the cost of moving data of MODE from a register to
21258    or from memory.  */
21259
21260 int
21261 rs6000_memory_move_cost (enum machine_mode mode, enum reg_class class,
21262                          int in ATTRIBUTE_UNUSED)
21263 {
21264   if (reg_classes_intersect_p (class, GENERAL_REGS))
21265     return 4 * hard_regno_nregs[0][mode];
21266   else if (reg_classes_intersect_p (class, FLOAT_REGS))
21267     return 4 * hard_regno_nregs[32][mode];
21268   else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
21269     return 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
21270   else
21271     return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
21272 }
21273
21274 /* Returns a code for a target-specific builtin that implements
21275    reciprocal of the function, or NULL_TREE if not available.  */
21276
21277 static tree
21278 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
21279                            bool sqrt ATTRIBUTE_UNUSED)
21280 {
21281   if (! (TARGET_RECIP && TARGET_PPC_GFXOPT && !optimize_size
21282          && flag_finite_math_only && !flag_trapping_math
21283          && flag_unsafe_math_optimizations))
21284     return NULL_TREE;
21285
21286   if (md_fn)
21287     return NULL_TREE;
21288   else
21289     switch (fn)
21290       {
21291       case BUILT_IN_SQRTF:
21292         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
21293
21294       default:
21295         return NULL_TREE;
21296       }
21297 }
21298
21299 /* Newton-Raphson approximation of single-precision floating point divide n/d.
21300    Assumes no trapping math and finite arguments.  */
21301
21302 void
21303 rs6000_emit_swdivsf (rtx dst, rtx n, rtx d)
21304 {
21305   rtx x0, e0, e1, y1, u0, v0, one;
21306
21307   x0 = gen_reg_rtx (SFmode);
21308   e0 = gen_reg_rtx (SFmode);
21309   e1 = gen_reg_rtx (SFmode);
21310   y1 = gen_reg_rtx (SFmode);
21311   u0 = gen_reg_rtx (SFmode);
21312   v0 = gen_reg_rtx (SFmode);
21313   one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
21314
21315   /* x0 = 1./d estimate */
21316   emit_insn (gen_rtx_SET (VOIDmode, x0,
21317                           gen_rtx_UNSPEC (SFmode, gen_rtvec (1, d),
21318                                           UNSPEC_FRES)));
21319   /* e0 = 1. - d * x0 */
21320   emit_insn (gen_rtx_SET (VOIDmode, e0,
21321                           gen_rtx_MINUS (SFmode, one,
21322                                          gen_rtx_MULT (SFmode, d, x0))));
21323   /* e1 = e0 + e0 * e0 */
21324   emit_insn (gen_rtx_SET (VOIDmode, e1,
21325                           gen_rtx_PLUS (SFmode,
21326                                         gen_rtx_MULT (SFmode, e0, e0), e0)));
21327   /* y1 = x0 + e1 * x0 */
21328   emit_insn (gen_rtx_SET (VOIDmode, y1,
21329                           gen_rtx_PLUS (SFmode,
21330                                         gen_rtx_MULT (SFmode, e1, x0), x0)));
21331   /* u0 = n * y1 */
21332   emit_insn (gen_rtx_SET (VOIDmode, u0,
21333                           gen_rtx_MULT (SFmode, n, y1)));
21334   /* v0 = n - d * u0 */
21335   emit_insn (gen_rtx_SET (VOIDmode, v0,
21336                           gen_rtx_MINUS (SFmode, n,
21337                                          gen_rtx_MULT (SFmode, d, u0))));
21338   /* dst = u0 + v0 * y1 */
21339   emit_insn (gen_rtx_SET (VOIDmode, dst,
21340                           gen_rtx_PLUS (SFmode,
21341                                         gen_rtx_MULT (SFmode, v0, y1), u0)));
21342 }
21343
21344 /* Newton-Raphson approximation of double-precision floating point divide n/d.
21345    Assumes no trapping math and finite arguments.  */
21346
21347 void
21348 rs6000_emit_swdivdf (rtx dst, rtx n, rtx d)
21349 {
21350   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
21351
21352   x0 = gen_reg_rtx (DFmode);
21353   e0 = gen_reg_rtx (DFmode);
21354   e1 = gen_reg_rtx (DFmode);
21355   e2 = gen_reg_rtx (DFmode);
21356   y1 = gen_reg_rtx (DFmode);
21357   y2 = gen_reg_rtx (DFmode);
21358   y3 = gen_reg_rtx (DFmode);
21359   u0 = gen_reg_rtx (DFmode);
21360   v0 = gen_reg_rtx (DFmode);
21361   one = force_reg (DFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, DFmode));
21362
21363   /* x0 = 1./d estimate */
21364   emit_insn (gen_rtx_SET (VOIDmode, x0,
21365                           gen_rtx_UNSPEC (DFmode, gen_rtvec (1, d),
21366                                           UNSPEC_FRES)));
21367   /* e0 = 1. - d * x0 */
21368   emit_insn (gen_rtx_SET (VOIDmode, e0,
21369                           gen_rtx_MINUS (DFmode, one,
21370                                          gen_rtx_MULT (SFmode, d, x0))));
21371   /* y1 = x0 + e0 * x0 */
21372   emit_insn (gen_rtx_SET (VOIDmode, y1,
21373                           gen_rtx_PLUS (DFmode,
21374                                         gen_rtx_MULT (DFmode, e0, x0), x0)));
21375   /* e1 = e0 * e0 */
21376   emit_insn (gen_rtx_SET (VOIDmode, e1,
21377                           gen_rtx_MULT (DFmode, e0, e0)));
21378   /* y2 = y1 + e1 * y1 */
21379   emit_insn (gen_rtx_SET (VOIDmode, y2,
21380                           gen_rtx_PLUS (DFmode,
21381                                         gen_rtx_MULT (DFmode, e1, y1), y1)));
21382   /* e2 = e1 * e1 */
21383   emit_insn (gen_rtx_SET (VOIDmode, e2,
21384                           gen_rtx_MULT (DFmode, e1, e1)));
21385   /* y3 = y2 + e2 * y2 */
21386   emit_insn (gen_rtx_SET (VOIDmode, y3,
21387                           gen_rtx_PLUS (DFmode,
21388                                         gen_rtx_MULT (DFmode, e2, y2), y2)));
21389   /* u0 = n * y3 */
21390   emit_insn (gen_rtx_SET (VOIDmode, u0,
21391                           gen_rtx_MULT (DFmode, n, y3)));
21392   /* v0 = n - d * u0 */
21393   emit_insn (gen_rtx_SET (VOIDmode, v0,
21394                           gen_rtx_MINUS (DFmode, n,
21395                                          gen_rtx_MULT (DFmode, d, u0))));
21396   /* dst = u0 + v0 * y3 */
21397   emit_insn (gen_rtx_SET (VOIDmode, dst,
21398                           gen_rtx_PLUS (DFmode,
21399                                         gen_rtx_MULT (DFmode, v0, y3), u0)));
21400 }
21401
21402
21403 /* Newton-Raphson approximation of single-precision floating point rsqrt.
21404    Assumes no trapping math and finite arguments.  */
21405
21406 void
21407 rs6000_emit_swrsqrtsf (rtx dst, rtx src)
21408 {
21409   rtx x0, x1, x2, y1, u0, u1, u2, v0, v1, v2, t0,
21410     half, one, halfthree, c1, cond, label;
21411
21412   x0 = gen_reg_rtx (SFmode);
21413   x1 = gen_reg_rtx (SFmode);
21414   x2 = gen_reg_rtx (SFmode);
21415   y1 = gen_reg_rtx (SFmode);
21416   u0 = gen_reg_rtx (SFmode);
21417   u1 = gen_reg_rtx (SFmode);
21418   u2 = gen_reg_rtx (SFmode);
21419   v0 = gen_reg_rtx (SFmode);
21420   v1 = gen_reg_rtx (SFmode);
21421   v2 = gen_reg_rtx (SFmode);
21422   t0 = gen_reg_rtx (SFmode);
21423   halfthree = gen_reg_rtx (SFmode);
21424   cond = gen_rtx_REG (CCFPmode, CR1_REGNO);
21425   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
21426
21427   /* check 0.0, 1.0, NaN, Inf by testing src * src = src */
21428   emit_insn (gen_rtx_SET (VOIDmode, t0,
21429                           gen_rtx_MULT (SFmode, src, src)));
21430
21431   emit_insn (gen_rtx_SET (VOIDmode, cond,
21432                           gen_rtx_COMPARE (CCFPmode, t0, src)));
21433   c1 = gen_rtx_EQ (VOIDmode, cond, const0_rtx);
21434   emit_unlikely_jump (c1, label);
21435
21436   half = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconsthalf, SFmode));
21437   one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
21438
21439   /* halfthree = 1.5 = 1.0 + 0.5 */
21440   emit_insn (gen_rtx_SET (VOIDmode, halfthree,
21441                           gen_rtx_PLUS (SFmode, one, half)));
21442
21443   /* x0 = rsqrt estimate */
21444   emit_insn (gen_rtx_SET (VOIDmode, x0,
21445                           gen_rtx_UNSPEC (SFmode, gen_rtvec (1, src),
21446                                           UNSPEC_RSQRT)));
21447
21448   /* y1 = 0.5 * src = 1.5 * src - src -> fewer constants */
21449   emit_insn (gen_rtx_SET (VOIDmode, y1,
21450                           gen_rtx_MINUS (SFmode,
21451                                          gen_rtx_MULT (SFmode, src, halfthree),
21452                                          src)));
21453
21454   /* x1 = x0 * (1.5 - y1 * (x0 * x0)) */
21455   emit_insn (gen_rtx_SET (VOIDmode, u0,
21456                           gen_rtx_MULT (SFmode, x0, x0)));
21457   emit_insn (gen_rtx_SET (VOIDmode, v0,
21458                           gen_rtx_MINUS (SFmode,
21459                                          halfthree,
21460                                          gen_rtx_MULT (SFmode, y1, u0))));
21461   emit_insn (gen_rtx_SET (VOIDmode, x1,
21462                           gen_rtx_MULT (SFmode, x0, v0)));
21463
21464   /* x2 = x1 * (1.5 - y1 * (x1 * x1)) */
21465   emit_insn (gen_rtx_SET (VOIDmode, u1,
21466                           gen_rtx_MULT (SFmode, x1, x1)));
21467   emit_insn (gen_rtx_SET (VOIDmode, v1,
21468                           gen_rtx_MINUS (SFmode,
21469                                          halfthree,
21470                                          gen_rtx_MULT (SFmode, y1, u1))));
21471   emit_insn (gen_rtx_SET (VOIDmode, x2,
21472                           gen_rtx_MULT (SFmode, x1, v1)));
21473
21474   /* dst = x2 * (1.5 - y1 * (x2 * x2)) */
21475   emit_insn (gen_rtx_SET (VOIDmode, u2,
21476                           gen_rtx_MULT (SFmode, x2, x2)));
21477   emit_insn (gen_rtx_SET (VOIDmode, v2,
21478                           gen_rtx_MINUS (SFmode,
21479                                          halfthree,
21480                                          gen_rtx_MULT (SFmode, y1, u2))));
21481   emit_insn (gen_rtx_SET (VOIDmode, dst,
21482                           gen_rtx_MULT (SFmode, x2, v2)));
21483
21484   emit_label (XEXP (label, 0));
21485 }
21486
21487 /* Emit popcount intrinsic on TARGET_POPCNTB targets.  DST is the
21488    target, and SRC is the argument operand.  */
21489
21490 void
21491 rs6000_emit_popcount (rtx dst, rtx src)
21492 {
21493   enum machine_mode mode = GET_MODE (dst);
21494   rtx tmp1, tmp2;
21495
21496   tmp1 = gen_reg_rtx (mode);
21497
21498   if (mode == SImode)
21499     {
21500       emit_insn (gen_popcntbsi2 (tmp1, src));
21501       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
21502                            NULL_RTX, 0);
21503       tmp2 = force_reg (SImode, tmp2);
21504       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
21505     }
21506   else
21507     {
21508       emit_insn (gen_popcntbdi2 (tmp1, src));
21509       tmp2 = expand_mult (DImode, tmp1,
21510                           GEN_INT ((HOST_WIDE_INT)
21511                                    0x01010101 << 32 | 0x01010101),
21512                           NULL_RTX, 0);
21513       tmp2 = force_reg (DImode, tmp2);
21514       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
21515     }
21516 }
21517
21518
21519 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
21520    target, and SRC is the argument operand.  */
21521
21522 void
21523 rs6000_emit_parity (rtx dst, rtx src)
21524 {
21525   enum machine_mode mode = GET_MODE (dst);
21526   rtx tmp;
21527
21528   tmp = gen_reg_rtx (mode);
21529   if (mode == SImode)
21530     {
21531       /* Is mult+shift >= shift+xor+shift+xor?  */
21532       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
21533         {
21534           rtx tmp1, tmp2, tmp3, tmp4;
21535
21536           tmp1 = gen_reg_rtx (SImode);
21537           emit_insn (gen_popcntbsi2 (tmp1, src));
21538
21539           tmp2 = gen_reg_rtx (SImode);
21540           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
21541           tmp3 = gen_reg_rtx (SImode);
21542           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
21543
21544           tmp4 = gen_reg_rtx (SImode);
21545           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
21546           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
21547         }
21548       else
21549         rs6000_emit_popcount (tmp, src);
21550       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
21551     }
21552   else
21553     {
21554       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
21555       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
21556         {
21557           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
21558
21559           tmp1 = gen_reg_rtx (DImode);
21560           emit_insn (gen_popcntbdi2 (tmp1, src));
21561
21562           tmp2 = gen_reg_rtx (DImode);
21563           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
21564           tmp3 = gen_reg_rtx (DImode);
21565           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
21566
21567           tmp4 = gen_reg_rtx (DImode);
21568           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
21569           tmp5 = gen_reg_rtx (DImode);
21570           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
21571
21572           tmp6 = gen_reg_rtx (DImode);
21573           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
21574           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
21575         }
21576       else
21577         rs6000_emit_popcount (tmp, src);
21578       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
21579     }
21580 }
21581
21582 /* Return an RTX representing where to find the function value of a
21583    function returning MODE.  */
21584 static rtx
21585 rs6000_complex_function_value (enum machine_mode mode)
21586 {
21587   unsigned int regno;
21588   rtx r1, r2;
21589   enum machine_mode inner = GET_MODE_INNER (mode);
21590   unsigned int inner_bytes = GET_MODE_SIZE (inner);
21591
21592   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
21593     regno = FP_ARG_RETURN;
21594   else
21595     {
21596       regno = GP_ARG_RETURN;
21597
21598       /* 32-bit is OK since it'll go in r3/r4.  */
21599       if (TARGET_32BIT && inner_bytes >= 4)
21600         return gen_rtx_REG (mode, regno);
21601     }
21602
21603   if (inner_bytes >= 8)
21604     return gen_rtx_REG (mode, regno);
21605
21606   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
21607                           const0_rtx);
21608   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
21609                           GEN_INT (inner_bytes));
21610   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
21611 }
21612
21613 /* Define how to find the value returned by a function.
21614    VALTYPE is the data type of the value (as a tree).
21615    If the precise function being called is known, FUNC is its FUNCTION_DECL;
21616    otherwise, FUNC is 0.
21617
21618    On the SPE, both FPs and vectors are returned in r3.
21619
21620    On RS/6000 an integer value is in r3 and a floating-point value is in
21621    fp1, unless -msoft-float.  */
21622
21623 rtx
21624 rs6000_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
21625 {
21626   enum machine_mode mode;
21627   unsigned int regno;
21628
21629   /* Special handling for structs in darwin64.  */
21630   if (rs6000_darwin64_abi
21631       && TYPE_MODE (valtype) == BLKmode
21632       && TREE_CODE (valtype) == RECORD_TYPE
21633       && int_size_in_bytes (valtype) > 0)
21634     {
21635       CUMULATIVE_ARGS valcum;
21636       rtx valret;
21637
21638       valcum.words = 0;
21639       valcum.fregno = FP_ARG_MIN_REG;
21640       valcum.vregno = ALTIVEC_ARG_MIN_REG;
21641       /* Do a trial code generation as if this were going to be passed as
21642          an argument; if any part goes in memory, we return NULL.  */
21643       valret = rs6000_darwin64_record_arg (&valcum, valtype, 1, true);
21644       if (valret)
21645         return valret;
21646       /* Otherwise fall through to standard ABI rules.  */
21647     }
21648
21649   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
21650     {
21651       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
21652       return gen_rtx_PARALLEL (DImode,
21653         gen_rtvec (2,
21654                    gen_rtx_EXPR_LIST (VOIDmode,
21655                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
21656                                       const0_rtx),
21657                    gen_rtx_EXPR_LIST (VOIDmode,
21658                                       gen_rtx_REG (SImode,
21659                                                    GP_ARG_RETURN + 1),
21660                                       GEN_INT (4))));
21661     }
21662   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
21663     {
21664       return gen_rtx_PARALLEL (DCmode,
21665         gen_rtvec (4,
21666                    gen_rtx_EXPR_LIST (VOIDmode,
21667                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
21668                                       const0_rtx),
21669                    gen_rtx_EXPR_LIST (VOIDmode,
21670                                       gen_rtx_REG (SImode,
21671                                                    GP_ARG_RETURN + 1),
21672                                       GEN_INT (4)),
21673                    gen_rtx_EXPR_LIST (VOIDmode,
21674                                       gen_rtx_REG (SImode,
21675                                                    GP_ARG_RETURN + 2),
21676                                       GEN_INT (8)),
21677                    gen_rtx_EXPR_LIST (VOIDmode,
21678                                       gen_rtx_REG (SImode,
21679                                                    GP_ARG_RETURN + 3),
21680                                       GEN_INT (12))));
21681     }
21682
21683   mode = TYPE_MODE (valtype);
21684   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
21685       || POINTER_TYPE_P (valtype))
21686     mode = TARGET_32BIT ? SImode : DImode;
21687
21688   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
21689     /* _Decimal128 must use an even/odd register pair.  */
21690     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
21691   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS)
21692     regno = FP_ARG_RETURN;
21693   else if (TREE_CODE (valtype) == COMPLEX_TYPE
21694            && targetm.calls.split_complex_arg)
21695     return rs6000_complex_function_value (mode);
21696   else if (TREE_CODE (valtype) == VECTOR_TYPE
21697            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
21698            && ALTIVEC_VECTOR_MODE (mode))
21699     regno = ALTIVEC_ARG_RETURN;
21700   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
21701            && (mode == DFmode || mode == DDmode || mode == DCmode
21702                || mode == TFmode || mode == TDmode || mode == TCmode))
21703     return spe_build_register_parallel (mode, GP_ARG_RETURN);
21704   else
21705     regno = GP_ARG_RETURN;
21706
21707   return gen_rtx_REG (mode, regno);
21708 }
21709
21710 /* Define how to find the value returned by a library function
21711    assuming the value has mode MODE.  */
21712 rtx
21713 rs6000_libcall_value (enum machine_mode mode)
21714 {
21715   unsigned int regno;
21716
21717   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
21718     {
21719       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
21720       return gen_rtx_PARALLEL (DImode,
21721         gen_rtvec (2,
21722                    gen_rtx_EXPR_LIST (VOIDmode,
21723                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
21724                                       const0_rtx),
21725                    gen_rtx_EXPR_LIST (VOIDmode,
21726                                       gen_rtx_REG (SImode,
21727                                                    GP_ARG_RETURN + 1),
21728                                       GEN_INT (4))));
21729     }
21730
21731   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
21732     /* _Decimal128 must use an even/odd register pair.  */
21733     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
21734   else if (SCALAR_FLOAT_MODE_P (mode)
21735            && TARGET_HARD_FLOAT && TARGET_FPRS)
21736     regno = FP_ARG_RETURN;
21737   else if (ALTIVEC_VECTOR_MODE (mode)
21738            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
21739     regno = ALTIVEC_ARG_RETURN;
21740   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
21741     return rs6000_complex_function_value (mode);
21742   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
21743            && (mode == DFmode || mode == DDmode || mode == DCmode
21744                || mode == TFmode || mode == TDmode || mode == TCmode))
21745     return spe_build_register_parallel (mode, GP_ARG_RETURN);
21746   else
21747     regno = GP_ARG_RETURN;
21748
21749   return gen_rtx_REG (mode, regno);
21750 }
21751
21752 /* Define the offset between two registers, FROM to be eliminated and its
21753    replacement TO, at the start of a routine.  */
21754 HOST_WIDE_INT
21755 rs6000_initial_elimination_offset (int from, int to)
21756 {
21757   rs6000_stack_t *info = rs6000_stack_info ();
21758   HOST_WIDE_INT offset;
21759
21760   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
21761     offset = info->push_p ? 0 : -info->total_size;
21762   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
21763     {
21764       offset = info->push_p ? 0 : -info->total_size;
21765       if (FRAME_GROWS_DOWNWARD)
21766         offset += info->fixed_size + info->vars_size + info->parm_size;
21767     }
21768   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
21769     offset = FRAME_GROWS_DOWNWARD
21770              ? info->fixed_size + info->vars_size + info->parm_size
21771              : 0;
21772   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
21773     offset = info->total_size;
21774   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
21775     offset = info->push_p ? info->total_size : 0;
21776   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
21777     offset = 0;
21778   else
21779     gcc_unreachable ();
21780
21781   return offset;
21782 }
21783
21784 /* Return true if TYPE is a SPE or AltiVec opaque type.  */
21785
21786 static bool
21787 rs6000_is_opaque_type (const_tree type)
21788 {
21789   return (type == opaque_V2SI_type_node
21790               || type == opaque_V2SF_type_node
21791               || type == opaque_p_V2SI_type_node
21792               || type == opaque_V4SI_type_node);
21793 }
21794
21795 static rtx
21796 rs6000_dwarf_register_span (rtx reg)
21797 {
21798   unsigned regno;
21799
21800   if (TARGET_SPE
21801       && (SPE_VECTOR_MODE (GET_MODE (reg))
21802           || (TARGET_E500_DOUBLE
21803               && (GET_MODE (reg) == DFmode || GET_MODE (reg) == DDmode))))
21804     ;
21805   else
21806     return NULL_RTX;
21807
21808   regno = REGNO (reg);
21809
21810   /* The duality of the SPE register size wreaks all kinds of havoc.
21811      This is a way of distinguishing r0 in 32-bits from r0 in
21812      64-bits.  */
21813   return
21814     gen_rtx_PARALLEL (VOIDmode,
21815                       BYTES_BIG_ENDIAN
21816                       ? gen_rtvec (2,
21817                                    gen_rtx_REG (SImode, regno + 1200),
21818                                    gen_rtx_REG (SImode, regno))
21819                       : gen_rtvec (2,
21820                                    gen_rtx_REG (SImode, regno),
21821                                    gen_rtx_REG (SImode, regno + 1200)));
21822 }
21823
21824 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
21825
21826 static void
21827 rs6000_init_dwarf_reg_sizes_extra (tree address)
21828 {
21829   if (TARGET_SPE)
21830     {
21831       int i;
21832       enum machine_mode mode = TYPE_MODE (char_type_node);
21833       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, 0);
21834       rtx mem = gen_rtx_MEM (BLKmode, addr);
21835       rtx value = gen_int_mode (4, mode);
21836
21837       for (i = 1201; i < 1232; i++)
21838         {
21839           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
21840           HOST_WIDE_INT offset
21841             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
21842
21843           emit_move_insn (adjust_address (mem, mode, offset), value);
21844         }
21845     }
21846 }
21847
21848 /* Map internal gcc register numbers to DWARF2 register numbers.  */
21849
21850 unsigned int
21851 rs6000_dbx_register_number (unsigned int regno)
21852 {
21853   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
21854     return regno;
21855   if (regno == MQ_REGNO)
21856     return 100;
21857   if (regno == LR_REGNO)
21858     return 108;
21859   if (regno == CTR_REGNO)
21860     return 109;
21861   if (CR_REGNO_P (regno))
21862     return regno - CR0_REGNO + 86;
21863   if (regno == XER_REGNO)
21864     return 101;
21865   if (ALTIVEC_REGNO_P (regno))
21866     return regno - FIRST_ALTIVEC_REGNO + 1124;
21867   if (regno == VRSAVE_REGNO)
21868     return 356;
21869   if (regno == VSCR_REGNO)
21870     return 67;
21871   if (regno == SPE_ACC_REGNO)
21872     return 99;
21873   if (regno == SPEFSCR_REGNO)
21874     return 612;
21875   /* SPE high reg number.  We get these values of regno from
21876      rs6000_dwarf_register_span.  */
21877   gcc_assert (regno >= 1200 && regno < 1232);
21878   return regno;
21879 }
21880
21881 /* target hook eh_return_filter_mode */
21882 static enum machine_mode
21883 rs6000_eh_return_filter_mode (void)
21884 {
21885   return TARGET_32BIT ? SImode : word_mode;
21886 }
21887
21888 /* Target hook for scalar_mode_supported_p.  */
21889 static bool
21890 rs6000_scalar_mode_supported_p (enum machine_mode mode)
21891 {
21892   if (DECIMAL_FLOAT_MODE_P (mode))
21893     return true;
21894   else
21895     return default_scalar_mode_supported_p (mode);
21896 }
21897
21898 /* Target hook for vector_mode_supported_p.  */
21899 static bool
21900 rs6000_vector_mode_supported_p (enum machine_mode mode)
21901 {
21902
21903   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
21904     return true;
21905
21906   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
21907     return true;
21908
21909   else if (TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
21910     return true;
21911
21912   else
21913     return false;
21914 }
21915
21916 /* Target hook for invalid_arg_for_unprototyped_fn. */
21917 static const char *
21918 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
21919 {
21920   return (!rs6000_darwin64_abi
21921           && typelist == 0
21922           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
21923           && (funcdecl == NULL_TREE
21924               || (TREE_CODE (funcdecl) == FUNCTION_DECL
21925                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
21926           ? N_("AltiVec argument passed to unprototyped function")
21927           : NULL;
21928 }
21929
21930 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
21931    setup by using __stack_chk_fail_local hidden function instead of
21932    calling __stack_chk_fail directly.  Otherwise it is better to call
21933    __stack_chk_fail directly.  */
21934
21935 static tree
21936 rs6000_stack_protect_fail (void)
21937 {
21938   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
21939          ? default_hidden_stack_protect_fail ()
21940          : default_external_stack_protect_fail ();
21941 }
21942
21943 #include "gt-rs6000.h"