OSDN Git Service

Fix PR bootstrap/40118
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / rs6000.c
1 /* Subroutines used for code generation on IBM RS/6000.
2    Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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 "gimple.h"
56 #include "tree-flow.h"
57 #include "intl.h"
58 #include "params.h"
59 #include "tm-constrs.h"
60 #if TARGET_XCOFF
61 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
62 #endif
63 #if TARGET_MACHO
64 #include "gstab.h"  /* for N_SLINE */
65 #endif
66
67 #ifndef TARGET_NO_PROTOTYPE
68 #define TARGET_NO_PROTOTYPE 0
69 #endif
70
71 #define min(A,B)        ((A) < (B) ? (A) : (B))
72 #define max(A,B)        ((A) > (B) ? (A) : (B))
73
74 /* Structure used to define the rs6000 stack */
75 typedef struct rs6000_stack {
76   int first_gp_reg_save;        /* first callee saved GP register used */
77   int first_fp_reg_save;        /* first callee saved FP register used */
78   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
79   int lr_save_p;                /* true if the link reg needs to be saved */
80   int cr_save_p;                /* true if the CR reg needs to be saved */
81   unsigned int vrsave_mask;     /* mask of vec registers to save */
82   int push_p;                   /* true if we need to allocate stack space */
83   int calls_p;                  /* true if the function makes any calls */
84   int world_save_p;             /* true if we're saving *everything*:
85                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
86   enum rs6000_abi abi;          /* which ABI to use */
87   int gp_save_offset;           /* offset to save GP regs from initial SP */
88   int fp_save_offset;           /* offset to save FP regs from initial SP */
89   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
90   int lr_save_offset;           /* offset to save LR from initial SP */
91   int cr_save_offset;           /* offset to save CR from initial SP */
92   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
93   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
94   int varargs_save_offset;      /* offset to save the varargs registers */
95   int ehrd_offset;              /* offset to EH return data */
96   int reg_size;                 /* register size (4 or 8) */
97   HOST_WIDE_INT vars_size;      /* variable save area size */
98   int parm_size;                /* outgoing parameter size */
99   int save_size;                /* save area size */
100   int fixed_size;               /* fixed size of stack frame */
101   int gp_size;                  /* size of saved GP registers */
102   int fp_size;                  /* size of saved FP registers */
103   int altivec_size;             /* size of saved AltiVec registers */
104   int cr_size;                  /* size to hold CR if not in save_size */
105   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
106   int altivec_padding_size;     /* size of altivec alignment padding if
107                                    not in save_size */
108   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
109   int spe_padding_size;
110   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
111   int spe_64bit_regs_used;
112 } rs6000_stack_t;
113
114 /* A C structure for machine-specific, per-function data.
115    This is added to the cfun structure.  */
116 typedef struct GTY(()) machine_function
117 {
118   /* 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 /* Always emit branch hint bits.  */
147 static GTY(()) bool rs6000_always_hint;
148
149 /* Schedule instructions for group formation.  */
150 static GTY(()) bool rs6000_sched_groups;
151
152 /* Align branch targets.  */
153 static GTY(()) bool rs6000_align_branch_targets;
154
155 /* Support for -msched-costly-dep option.  */
156 const char *rs6000_sched_costly_dep_str;
157 enum rs6000_dependence_cost rs6000_sched_costly_dep;
158
159 /* Support for -minsert-sched-nops option.  */
160 const char *rs6000_sched_insert_nops_str;
161 enum rs6000_nop_insertion rs6000_sched_insert_nops;
162
163 /* Support targetm.vectorize.builtin_mask_for_load.  */
164 static GTY(()) tree altivec_builtin_mask_for_load;
165
166 /* Size of long double.  */
167 int rs6000_long_double_type_size;
168
169 /* IEEE quad extended precision long double. */
170 int rs6000_ieeequad;
171
172 /* Nonzero to use AltiVec ABI.  */
173 int rs6000_altivec_abi;
174
175 /* Nonzero if we want SPE SIMD instructions.  */
176 int rs6000_spe;
177
178 /* Nonzero if we want SPE ABI extensions.  */
179 int rs6000_spe_abi;
180
181 /* Nonzero to use isel instructions.  */
182 int rs6000_isel;
183
184 /* Nonzero if floating point operations are done in the GPRs.  */
185 int rs6000_float_gprs = 0;
186
187 /* Nonzero if we want Darwin's struct-by-value-in-regs ABI.  */
188 int rs6000_darwin64_abi;
189
190 /* Set to nonzero once AIX common-mode calls have been defined.  */
191 static GTY(()) int common_mode_defined;
192
193 /* Label number of label created for -mrelocatable, to call to so we can
194    get the address of the GOT section */
195 int rs6000_pic_labelno;
196
197 #ifdef USING_ELFOS_H
198 /* Which abi to adhere to */
199 const char *rs6000_abi_name;
200
201 /* Semantics of the small data area */
202 enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
203
204 /* Which small data model to use */
205 const char *rs6000_sdata_name = (char *)0;
206
207 /* Counter for labels which are to be placed in .fixup.  */
208 int fixuplabelno = 0;
209 #endif
210
211 /* Bit size of immediate TLS offsets and string from which it is decoded.  */
212 int rs6000_tls_size = 32;
213 const char *rs6000_tls_size_string;
214
215 /* ABI enumeration available for subtarget to use.  */
216 enum rs6000_abi rs6000_current_abi;
217
218 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
219 int dot_symbols;
220
221 /* Debug flags */
222 const char *rs6000_debug_name;
223 int rs6000_debug_stack;         /* debug stack applications */
224 int rs6000_debug_arg;           /* debug argument handling */
225
226 /* Value is TRUE if register/mode pair is acceptable.  */
227 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
228
229 /* Built in types.  */
230
231 tree rs6000_builtin_types[RS6000_BTI_MAX];
232 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
233
234 const char *rs6000_traceback_name;
235 static enum {
236   traceback_default = 0,
237   traceback_none,
238   traceback_part,
239   traceback_full
240 } rs6000_traceback;
241
242 /* Flag to say the TOC is initialized */
243 int toc_initialized;
244 char toc_label_name[10];
245
246 /* Cached value of rs6000_variable_issue. This is cached in
247    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
248 static short cached_can_issue_more;
249
250 static GTY(()) section *read_only_data_section;
251 static GTY(()) section *private_data_section;
252 static GTY(()) section *read_only_private_data_section;
253 static GTY(()) section *sdata2_section;
254 static GTY(()) section *toc_section;
255
256 /* Control alignment for fields within structures.  */
257 /* String from -malign-XXXXX.  */
258 int rs6000_alignment_flags;
259
260 /* True for any options that were explicitly set.  */
261 struct {
262   bool aix_struct_ret;          /* True if -maix-struct-ret was used.  */
263   bool alignment;               /* True if -malign- was used.  */
264   bool spe_abi;                 /* True if -mabi=spe/no-spe was used.  */
265   bool altivec_abi;             /* True if -mabi=altivec/no-altivec used.  */
266   bool spe;                     /* True if -mspe= was used.  */
267   bool float_gprs;              /* True if -mfloat-gprs= was used.  */
268   bool isel;                    /* True if -misel was used. */
269   bool long_double;             /* True if -mlong-double- was used.  */
270   bool ieee;                    /* True if -mabi=ieee/ibmlongdouble used.  */
271   bool vrsave;                  /* True if -mvrsave was used.  */
272 } rs6000_explicit_options;
273
274 struct builtin_description
275 {
276   /* mask is not const because we're going to alter it below.  This
277      nonsense will go away when we rewrite the -march infrastructure
278      to give us more target flag bits.  */
279   unsigned int mask;
280   const enum insn_code icode;
281   const char *const name;
282   const enum rs6000_builtins code;
283 };
284 \f
285 /* Target cpu costs.  */
286
287 struct processor_costs {
288   const int mulsi;        /* cost of SImode multiplication.  */
289   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
290   const int mulsi_const9; /* cost of SImode mult by short constant.  */
291   const int muldi;        /* cost of DImode multiplication.  */
292   const int divsi;        /* cost of SImode division.  */
293   const int divdi;        /* cost of DImode division.  */
294   const int fp;           /* cost of simple SFmode and DFmode insns.  */
295   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
296   const int sdiv;         /* cost of SFmode division (fdivs).  */
297   const int ddiv;         /* cost of DFmode division (fdiv).  */
298   const int cache_line_size;    /* cache line size in bytes. */
299   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
300   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
301   const int simultaneous_prefetches; /* number of parallel prefetch
302                                         operations.  */
303 };
304
305 const struct processor_costs *rs6000_cost;
306
307 /* Processor costs (relative to an add) */
308
309 /* Instruction size costs on 32bit processors.  */
310 static const
311 struct processor_costs size32_cost = {
312   COSTS_N_INSNS (1),    /* mulsi */
313   COSTS_N_INSNS (1),    /* mulsi_const */
314   COSTS_N_INSNS (1),    /* mulsi_const9 */
315   COSTS_N_INSNS (1),    /* muldi */
316   COSTS_N_INSNS (1),    /* divsi */
317   COSTS_N_INSNS (1),    /* divdi */
318   COSTS_N_INSNS (1),    /* fp */
319   COSTS_N_INSNS (1),    /* dmul */
320   COSTS_N_INSNS (1),    /* sdiv */
321   COSTS_N_INSNS (1),    /* ddiv */
322   32,
323   0,
324   0,
325   0,
326 };
327
328 /* Instruction size costs on 64bit processors.  */
329 static const
330 struct processor_costs size64_cost = {
331   COSTS_N_INSNS (1),    /* mulsi */
332   COSTS_N_INSNS (1),    /* mulsi_const */
333   COSTS_N_INSNS (1),    /* mulsi_const9 */
334   COSTS_N_INSNS (1),    /* muldi */
335   COSTS_N_INSNS (1),    /* divsi */
336   COSTS_N_INSNS (1),    /* divdi */
337   COSTS_N_INSNS (1),    /* fp */
338   COSTS_N_INSNS (1),    /* dmul */
339   COSTS_N_INSNS (1),    /* sdiv */
340   COSTS_N_INSNS (1),    /* ddiv */
341   128,
342   0,
343   0,
344   0,
345 };
346
347 /* Instruction costs on RIOS1 processors.  */
348 static const
349 struct processor_costs rios1_cost = {
350   COSTS_N_INSNS (5),    /* mulsi */
351   COSTS_N_INSNS (4),    /* mulsi_const */
352   COSTS_N_INSNS (3),    /* mulsi_const9 */
353   COSTS_N_INSNS (5),    /* muldi */
354   COSTS_N_INSNS (19),   /* divsi */
355   COSTS_N_INSNS (19),   /* divdi */
356   COSTS_N_INSNS (2),    /* fp */
357   COSTS_N_INSNS (2),    /* dmul */
358   COSTS_N_INSNS (19),   /* sdiv */
359   COSTS_N_INSNS (19),   /* ddiv */
360   128,                  /* cache line size */
361   64,                   /* l1 cache */
362   512,                  /* l2 cache */
363   0,                    /* streams */
364 };
365
366 /* Instruction costs on RIOS2 processors.  */
367 static const
368 struct processor_costs rios2_cost = {
369   COSTS_N_INSNS (2),    /* mulsi */
370   COSTS_N_INSNS (2),    /* mulsi_const */
371   COSTS_N_INSNS (2),    /* mulsi_const9 */
372   COSTS_N_INSNS (2),    /* muldi */
373   COSTS_N_INSNS (13),   /* divsi */
374   COSTS_N_INSNS (13),   /* divdi */
375   COSTS_N_INSNS (2),    /* fp */
376   COSTS_N_INSNS (2),    /* dmul */
377   COSTS_N_INSNS (17),   /* sdiv */
378   COSTS_N_INSNS (17),   /* ddiv */
379   256,                  /* cache line size */
380   256,                  /* l1 cache */
381   1024,                 /* l2 cache */
382   0,                    /* streams */
383 };
384
385 /* Instruction costs on RS64A processors.  */
386 static const
387 struct processor_costs rs64a_cost = {
388   COSTS_N_INSNS (20),   /* mulsi */
389   COSTS_N_INSNS (12),   /* mulsi_const */
390   COSTS_N_INSNS (8),    /* mulsi_const9 */
391   COSTS_N_INSNS (34),   /* muldi */
392   COSTS_N_INSNS (65),   /* divsi */
393   COSTS_N_INSNS (67),   /* divdi */
394   COSTS_N_INSNS (4),    /* fp */
395   COSTS_N_INSNS (4),    /* dmul */
396   COSTS_N_INSNS (31),   /* sdiv */
397   COSTS_N_INSNS (31),   /* ddiv */
398   128,                  /* cache line size */
399   128,                  /* l1 cache */
400   2048,                 /* l2 cache */
401   1,                    /* streams */
402 };
403
404 /* Instruction costs on MPCCORE processors.  */
405 static const
406 struct processor_costs mpccore_cost = {
407   COSTS_N_INSNS (2),    /* mulsi */
408   COSTS_N_INSNS (2),    /* mulsi_const */
409   COSTS_N_INSNS (2),    /* mulsi_const9 */
410   COSTS_N_INSNS (2),    /* muldi */
411   COSTS_N_INSNS (6),    /* divsi */
412   COSTS_N_INSNS (6),    /* divdi */
413   COSTS_N_INSNS (4),    /* fp */
414   COSTS_N_INSNS (5),    /* dmul */
415   COSTS_N_INSNS (10),   /* sdiv */
416   COSTS_N_INSNS (17),   /* ddiv */
417   32,                   /* cache line size */
418   4,                    /* l1 cache */
419   16,                   /* l2 cache */
420   1,                    /* streams */
421 };
422
423 /* Instruction costs on PPC403 processors.  */
424 static const
425 struct processor_costs ppc403_cost = {
426   COSTS_N_INSNS (4),    /* mulsi */
427   COSTS_N_INSNS (4),    /* mulsi_const */
428   COSTS_N_INSNS (4),    /* mulsi_const9 */
429   COSTS_N_INSNS (4),    /* muldi */
430   COSTS_N_INSNS (33),   /* divsi */
431   COSTS_N_INSNS (33),   /* divdi */
432   COSTS_N_INSNS (11),   /* fp */
433   COSTS_N_INSNS (11),   /* dmul */
434   COSTS_N_INSNS (11),   /* sdiv */
435   COSTS_N_INSNS (11),   /* ddiv */
436   32,                   /* cache line size */
437   4,                    /* l1 cache */
438   16,                   /* l2 cache */
439   1,                    /* streams */
440 };
441
442 /* Instruction costs on PPC405 processors.  */
443 static const
444 struct processor_costs ppc405_cost = {
445   COSTS_N_INSNS (5),    /* mulsi */
446   COSTS_N_INSNS (4),    /* mulsi_const */
447   COSTS_N_INSNS (3),    /* mulsi_const9 */
448   COSTS_N_INSNS (5),    /* muldi */
449   COSTS_N_INSNS (35),   /* divsi */
450   COSTS_N_INSNS (35),   /* divdi */
451   COSTS_N_INSNS (11),   /* fp */
452   COSTS_N_INSNS (11),   /* dmul */
453   COSTS_N_INSNS (11),   /* sdiv */
454   COSTS_N_INSNS (11),   /* ddiv */
455   32,                   /* cache line size */
456   16,                   /* l1 cache */
457   128,                  /* l2 cache */
458   1,                    /* streams */
459 };
460
461 /* Instruction costs on PPC440 processors.  */
462 static const
463 struct processor_costs ppc440_cost = {
464   COSTS_N_INSNS (3),    /* mulsi */
465   COSTS_N_INSNS (2),    /* mulsi_const */
466   COSTS_N_INSNS (2),    /* mulsi_const9 */
467   COSTS_N_INSNS (3),    /* muldi */
468   COSTS_N_INSNS (34),   /* divsi */
469   COSTS_N_INSNS (34),   /* divdi */
470   COSTS_N_INSNS (5),    /* fp */
471   COSTS_N_INSNS (5),    /* dmul */
472   COSTS_N_INSNS (19),   /* sdiv */
473   COSTS_N_INSNS (33),   /* ddiv */
474   32,                   /* cache line size */
475   32,                   /* l1 cache */
476   256,                  /* l2 cache */
477   1,                    /* streams */
478 };
479
480 /* Instruction costs on PPC601 processors.  */
481 static const
482 struct processor_costs ppc601_cost = {
483   COSTS_N_INSNS (5),    /* mulsi */
484   COSTS_N_INSNS (5),    /* mulsi_const */
485   COSTS_N_INSNS (5),    /* mulsi_const9 */
486   COSTS_N_INSNS (5),    /* muldi */
487   COSTS_N_INSNS (36),   /* divsi */
488   COSTS_N_INSNS (36),   /* divdi */
489   COSTS_N_INSNS (4),    /* fp */
490   COSTS_N_INSNS (5),    /* dmul */
491   COSTS_N_INSNS (17),   /* sdiv */
492   COSTS_N_INSNS (31),   /* ddiv */
493   32,                   /* cache line size */
494   32,                   /* l1 cache */
495   256,                  /* l2 cache */
496   1,                    /* streams */
497 };
498
499 /* Instruction costs on PPC603 processors.  */
500 static const
501 struct processor_costs ppc603_cost = {
502   COSTS_N_INSNS (5),    /* mulsi */
503   COSTS_N_INSNS (3),    /* mulsi_const */
504   COSTS_N_INSNS (2),    /* mulsi_const9 */
505   COSTS_N_INSNS (5),    /* muldi */
506   COSTS_N_INSNS (37),   /* divsi */
507   COSTS_N_INSNS (37),   /* divdi */
508   COSTS_N_INSNS (3),    /* fp */
509   COSTS_N_INSNS (4),    /* dmul */
510   COSTS_N_INSNS (18),   /* sdiv */
511   COSTS_N_INSNS (33),   /* ddiv */
512   32,                   /* cache line size */
513   8,                    /* l1 cache */
514   64,                   /* l2 cache */
515   1,                    /* streams */
516 };
517
518 /* Instruction costs on PPC604 processors.  */
519 static const
520 struct processor_costs ppc604_cost = {
521   COSTS_N_INSNS (4),    /* mulsi */
522   COSTS_N_INSNS (4),    /* mulsi_const */
523   COSTS_N_INSNS (4),    /* mulsi_const9 */
524   COSTS_N_INSNS (4),    /* muldi */
525   COSTS_N_INSNS (20),   /* divsi */
526   COSTS_N_INSNS (20),   /* divdi */
527   COSTS_N_INSNS (3),    /* fp */
528   COSTS_N_INSNS (3),    /* dmul */
529   COSTS_N_INSNS (18),   /* sdiv */
530   COSTS_N_INSNS (32),   /* ddiv */
531   32,                   /* cache line size */
532   16,                   /* l1 cache */
533   512,                  /* l2 cache */
534   1,                    /* streams */
535 };
536
537 /* Instruction costs on PPC604e processors.  */
538 static const
539 struct processor_costs ppc604e_cost = {
540   COSTS_N_INSNS (2),    /* mulsi */
541   COSTS_N_INSNS (2),    /* mulsi_const */
542   COSTS_N_INSNS (2),    /* mulsi_const9 */
543   COSTS_N_INSNS (2),    /* muldi */
544   COSTS_N_INSNS (20),   /* divsi */
545   COSTS_N_INSNS (20),   /* divdi */
546   COSTS_N_INSNS (3),    /* fp */
547   COSTS_N_INSNS (3),    /* dmul */
548   COSTS_N_INSNS (18),   /* sdiv */
549   COSTS_N_INSNS (32),   /* ddiv */
550   32,                   /* cache line size */
551   32,                   /* l1 cache */
552   1024,                 /* l2 cache */
553   1,                    /* streams */
554 };
555
556 /* Instruction costs on PPC620 processors.  */
557 static const
558 struct processor_costs ppc620_cost = {
559   COSTS_N_INSNS (5),    /* mulsi */
560   COSTS_N_INSNS (4),    /* mulsi_const */
561   COSTS_N_INSNS (3),    /* mulsi_const9 */
562   COSTS_N_INSNS (7),    /* muldi */
563   COSTS_N_INSNS (21),   /* divsi */
564   COSTS_N_INSNS (37),   /* divdi */
565   COSTS_N_INSNS (3),    /* fp */
566   COSTS_N_INSNS (3),    /* dmul */
567   COSTS_N_INSNS (18),   /* sdiv */
568   COSTS_N_INSNS (32),   /* ddiv */
569   128,                  /* cache line size */
570   32,                   /* l1 cache */
571   1024,                 /* l2 cache */
572   1,                    /* streams */
573 };
574
575 /* Instruction costs on PPC630 processors.  */
576 static const
577 struct processor_costs ppc630_cost = {
578   COSTS_N_INSNS (5),    /* mulsi */
579   COSTS_N_INSNS (4),    /* mulsi_const */
580   COSTS_N_INSNS (3),    /* mulsi_const9 */
581   COSTS_N_INSNS (7),    /* muldi */
582   COSTS_N_INSNS (21),   /* divsi */
583   COSTS_N_INSNS (37),   /* divdi */
584   COSTS_N_INSNS (3),    /* fp */
585   COSTS_N_INSNS (3),    /* dmul */
586   COSTS_N_INSNS (17),   /* sdiv */
587   COSTS_N_INSNS (21),   /* ddiv */
588   128,                  /* cache line size */
589   64,                   /* l1 cache */
590   1024,                 /* l2 cache */
591   1,                    /* streams */
592 };
593
594 /* Instruction costs on Cell processor.  */
595 /* COSTS_N_INSNS (1) ~ one add.  */
596 static const
597 struct processor_costs ppccell_cost = {
598   COSTS_N_INSNS (9/2)+2,    /* mulsi */
599   COSTS_N_INSNS (6/2),    /* mulsi_const */
600   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
601   COSTS_N_INSNS (15/2)+2,   /* muldi */
602   COSTS_N_INSNS (38/2),   /* divsi */
603   COSTS_N_INSNS (70/2),   /* divdi */
604   COSTS_N_INSNS (10/2),   /* fp */
605   COSTS_N_INSNS (10/2),   /* dmul */
606   COSTS_N_INSNS (74/2),   /* sdiv */
607   COSTS_N_INSNS (74/2),   /* ddiv */
608   128,                  /* cache line size */
609   32,                   /* l1 cache */
610   512,                  /* l2 cache */
611   6,                    /* streams */
612 };
613
614 /* Instruction costs on PPC750 and PPC7400 processors.  */
615 static const
616 struct processor_costs ppc750_cost = {
617   COSTS_N_INSNS (5),    /* mulsi */
618   COSTS_N_INSNS (3),    /* mulsi_const */
619   COSTS_N_INSNS (2),    /* mulsi_const9 */
620   COSTS_N_INSNS (5),    /* muldi */
621   COSTS_N_INSNS (17),   /* divsi */
622   COSTS_N_INSNS (17),   /* divdi */
623   COSTS_N_INSNS (3),    /* fp */
624   COSTS_N_INSNS (3),    /* dmul */
625   COSTS_N_INSNS (17),   /* sdiv */
626   COSTS_N_INSNS (31),   /* ddiv */
627   32,                   /* cache line size */
628   32,                   /* l1 cache */
629   512,                  /* l2 cache */
630   1,                    /* streams */
631 };
632
633 /* Instruction costs on PPC7450 processors.  */
634 static const
635 struct processor_costs ppc7450_cost = {
636   COSTS_N_INSNS (4),    /* mulsi */
637   COSTS_N_INSNS (3),    /* mulsi_const */
638   COSTS_N_INSNS (3),    /* mulsi_const9 */
639   COSTS_N_INSNS (4),    /* muldi */
640   COSTS_N_INSNS (23),   /* divsi */
641   COSTS_N_INSNS (23),   /* divdi */
642   COSTS_N_INSNS (5),    /* fp */
643   COSTS_N_INSNS (5),    /* dmul */
644   COSTS_N_INSNS (21),   /* sdiv */
645   COSTS_N_INSNS (35),   /* ddiv */
646   32,                   /* cache line size */
647   32,                   /* l1 cache */
648   1024,                 /* l2 cache */
649   1,                    /* streams */
650 };
651
652 /* Instruction costs on PPC8540 processors.  */
653 static const
654 struct processor_costs ppc8540_cost = {
655   COSTS_N_INSNS (4),    /* mulsi */
656   COSTS_N_INSNS (4),    /* mulsi_const */
657   COSTS_N_INSNS (4),    /* mulsi_const9 */
658   COSTS_N_INSNS (4),    /* muldi */
659   COSTS_N_INSNS (19),   /* divsi */
660   COSTS_N_INSNS (19),   /* divdi */
661   COSTS_N_INSNS (4),    /* fp */
662   COSTS_N_INSNS (4),    /* dmul */
663   COSTS_N_INSNS (29),   /* sdiv */
664   COSTS_N_INSNS (29),   /* ddiv */
665   32,                   /* cache line size */
666   32,                   /* l1 cache */
667   256,                  /* l2 cache */
668   1,                    /* prefetch streams /*/
669 };
670
671 /* Instruction costs on E300C2 and E300C3 cores.  */
672 static const
673 struct processor_costs ppce300c2c3_cost = {
674   COSTS_N_INSNS (4),    /* mulsi */
675   COSTS_N_INSNS (4),    /* mulsi_const */
676   COSTS_N_INSNS (4),    /* mulsi_const9 */
677   COSTS_N_INSNS (4),    /* muldi */
678   COSTS_N_INSNS (19),   /* divsi */
679   COSTS_N_INSNS (19),   /* divdi */
680   COSTS_N_INSNS (3),    /* fp */
681   COSTS_N_INSNS (4),    /* dmul */
682   COSTS_N_INSNS (18),   /* sdiv */
683   COSTS_N_INSNS (33),   /* ddiv */
684   32,
685   16,                   /* l1 cache */
686   16,                   /* l2 cache */
687   1,                    /* prefetch streams /*/
688 };
689
690 /* Instruction costs on PPCE500MC processors.  */
691 static const
692 struct processor_costs ppce500mc_cost = {
693   COSTS_N_INSNS (4),    /* mulsi */
694   COSTS_N_INSNS (4),    /* mulsi_const */
695   COSTS_N_INSNS (4),    /* mulsi_const9 */
696   COSTS_N_INSNS (4),    /* muldi */
697   COSTS_N_INSNS (14),   /* divsi */
698   COSTS_N_INSNS (14),   /* divdi */
699   COSTS_N_INSNS (8),    /* fp */
700   COSTS_N_INSNS (10),   /* dmul */
701   COSTS_N_INSNS (36),   /* sdiv */
702   COSTS_N_INSNS (66),   /* ddiv */
703   64,                   /* cache line size */
704   32,                   /* l1 cache */
705   128,                  /* l2 cache */
706   1,                    /* prefetch streams /*/
707 };
708
709 /* Instruction costs on POWER4 and POWER5 processors.  */
710 static const
711 struct processor_costs power4_cost = {
712   COSTS_N_INSNS (3),    /* mulsi */
713   COSTS_N_INSNS (2),    /* mulsi_const */
714   COSTS_N_INSNS (2),    /* mulsi_const9 */
715   COSTS_N_INSNS (4),    /* muldi */
716   COSTS_N_INSNS (18),   /* divsi */
717   COSTS_N_INSNS (34),   /* divdi */
718   COSTS_N_INSNS (3),    /* fp */
719   COSTS_N_INSNS (3),    /* dmul */
720   COSTS_N_INSNS (17),   /* sdiv */
721   COSTS_N_INSNS (17),   /* ddiv */
722   128,                  /* cache line size */
723   32,                   /* l1 cache */
724   1024,                 /* l2 cache */
725   8,                    /* prefetch streams /*/
726 };
727
728 /* Instruction costs on POWER6 processors.  */
729 static const
730 struct processor_costs power6_cost = {
731   COSTS_N_INSNS (8),    /* mulsi */
732   COSTS_N_INSNS (8),    /* mulsi_const */
733   COSTS_N_INSNS (8),    /* mulsi_const9 */
734   COSTS_N_INSNS (8),    /* muldi */
735   COSTS_N_INSNS (22),   /* divsi */
736   COSTS_N_INSNS (28),   /* divdi */
737   COSTS_N_INSNS (3),    /* fp */
738   COSTS_N_INSNS (3),    /* dmul */
739   COSTS_N_INSNS (13),   /* sdiv */
740   COSTS_N_INSNS (16),   /* ddiv */
741   128,                  /* cache line size */
742   64,                   /* l1 cache */
743   2048,                 /* l2 cache */
744   16,                   /* prefetch streams */
745 };
746
747 \f
748 static bool rs6000_function_ok_for_sibcall (tree, tree);
749 static const char *rs6000_invalid_within_doloop (const_rtx);
750 static rtx rs6000_generate_compare (rtx, enum machine_mode);
751 static void rs6000_emit_stack_tie (void);
752 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
753 static bool spe_func_has_64bit_regs_p (void);
754 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
755                              int, HOST_WIDE_INT);
756 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
757 static void rs6000_emit_allocate_stack (HOST_WIDE_INT, int, int);
758 static unsigned rs6000_hash_constant (rtx);
759 static unsigned toc_hash_function (const void *);
760 static int toc_hash_eq (const void *, const void *);
761 static bool constant_pool_expr_p (rtx);
762 static bool legitimate_small_data_p (enum machine_mode, rtx);
763 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
764 static struct machine_function * rs6000_init_machine_status (void);
765 static bool rs6000_assemble_integer (rtx, unsigned int, int);
766 static bool no_global_regs_above (int, bool);
767 #ifdef HAVE_GAS_HIDDEN
768 static void rs6000_assemble_visibility (tree, int);
769 #endif
770 static int rs6000_ra_ever_killed (void);
771 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
772 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
773 static bool rs6000_ms_bitfield_layout_p (const_tree);
774 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
775 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
776 static const char *rs6000_mangle_type (const_tree);
777 extern const struct attribute_spec rs6000_attribute_table[];
778 static void rs6000_set_default_type_attributes (tree);
779 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
780 static void rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
781 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
782                                    enum machine_mode, bool, bool, bool);
783 static bool rs6000_reg_live_or_pic_offset_p (int);
784 static int rs6000_savres_strategy (rs6000_stack_t *, bool, int, int);
785 static void rs6000_restore_saved_cr (rtx, int);
786 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
787 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
788 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
789                                     tree);
790 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
791 static bool rs6000_return_in_memory (const_tree, const_tree);
792 static void rs6000_file_start (void);
793 #if TARGET_ELF
794 static int rs6000_elf_reloc_rw_mask (void);
795 static void rs6000_elf_asm_out_constructor (rtx, int);
796 static void rs6000_elf_asm_out_destructor (rtx, int);
797 static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
798 static void rs6000_elf_asm_init_sections (void);
799 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
800                                                unsigned HOST_WIDE_INT);
801 static void rs6000_elf_encode_section_info (tree, rtx, int)
802      ATTRIBUTE_UNUSED;
803 #endif
804 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
805 static void rs6000_alloc_sdmode_stack_slot (void);
806 static void rs6000_instantiate_decls (void);
807 #if TARGET_XCOFF
808 static void rs6000_xcoff_asm_output_anchor (rtx);
809 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
810 static void rs6000_xcoff_asm_init_sections (void);
811 static int rs6000_xcoff_reloc_rw_mask (void);
812 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
813 static section *rs6000_xcoff_select_section (tree, int,
814                                              unsigned HOST_WIDE_INT);
815 static void rs6000_xcoff_unique_section (tree, int);
816 static section *rs6000_xcoff_select_rtx_section
817   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
818 static const char * rs6000_xcoff_strip_name_encoding (const char *);
819 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
820 static void rs6000_xcoff_file_start (void);
821 static void rs6000_xcoff_file_end (void);
822 #endif
823 static int rs6000_variable_issue (FILE *, int, rtx, int);
824 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
825 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
826 static void rs6000_sched_init (FILE *, int, int);
827 static bool is_microcoded_insn (rtx);
828 static bool is_nonpipeline_insn (rtx);
829 static bool is_cracked_insn (rtx);
830 static bool is_branch_slot_insn (rtx);
831 static bool is_load_insn (rtx);
832 static rtx get_store_dest (rtx pat);
833 static bool is_store_insn (rtx);
834 static bool set_to_load_agen (rtx,rtx);
835 static bool adjacent_mem_locations (rtx,rtx);
836 static int rs6000_adjust_priority (rtx, int);
837 static int rs6000_issue_rate (void);
838 static bool rs6000_is_costly_dependence (dep_t, int, int);
839 static rtx get_next_active_insn (rtx, rtx);
840 static bool insn_terminates_group_p (rtx , enum group_termination);
841 static bool insn_must_be_first_in_group (rtx);
842 static bool insn_must_be_last_in_group (rtx);
843 static bool is_costly_group (rtx *, rtx);
844 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
845 static int redefine_groups (FILE *, int, rtx, rtx);
846 static int pad_groups (FILE *, int, rtx, rtx);
847 static void rs6000_sched_finish (FILE *, int);
848 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
849 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
850 static int rs6000_use_sched_lookahead (void);
851 static int rs6000_use_sched_lookahead_guard (rtx);
852 static void * rs6000_alloc_sched_context (void);
853 static void rs6000_init_sched_context (void *, bool);
854 static void rs6000_set_sched_context (void *);
855 static void rs6000_free_sched_context (void *);
856 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
857 static tree rs6000_builtin_mask_for_load (void);
858 static tree rs6000_builtin_mul_widen_even (tree);
859 static tree rs6000_builtin_mul_widen_odd (tree);
860 static tree rs6000_builtin_conversion (enum tree_code, tree);
861 static tree rs6000_builtin_vec_perm (tree, tree *);
862
863 static void def_builtin (int, const char *, tree, int);
864 static bool rs6000_vector_alignment_reachable (const_tree, bool);
865 static void rs6000_init_builtins (void);
866 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
867 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
868 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
869 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
870 static void altivec_init_builtins (void);
871 static void rs6000_common_init_builtins (void);
872 static void rs6000_init_libfuncs (void);
873
874 static void paired_init_builtins (void);
875 static rtx paired_expand_builtin (tree, rtx, bool *);
876 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
877 static rtx paired_expand_stv_builtin (enum insn_code, tree);
878 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
879
880 static void enable_mask_for_builtins (struct builtin_description *, int,
881                                       enum rs6000_builtins,
882                                       enum rs6000_builtins);
883 static void spe_init_builtins (void);
884 static rtx spe_expand_builtin (tree, rtx, bool *);
885 static rtx spe_expand_stv_builtin (enum insn_code, tree);
886 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
887 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
888 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
889 static rs6000_stack_t *rs6000_stack_info (void);
890 static void debug_stack_info (rs6000_stack_t *);
891
892 static rtx altivec_expand_builtin (tree, rtx, bool *);
893 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
894 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
895 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
896 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
897 static rtx altivec_expand_predicate_builtin (enum insn_code,
898                                              const char *, tree, rtx);
899 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
900 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
901 static rtx altivec_expand_vec_set_builtin (tree);
902 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
903 static int get_element_number (tree, tree);
904 static bool rs6000_handle_option (size_t, const char *, int);
905 static void rs6000_parse_tls_size_option (void);
906 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
907 static int first_altivec_reg_to_save (void);
908 static unsigned int compute_vrsave_mask (void);
909 static void compute_save_world_info (rs6000_stack_t *info_ptr);
910 static void is_altivec_return_reg (rtx, void *);
911 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
912 int easy_vector_constant (rtx, enum machine_mode);
913 static rtx rs6000_dwarf_register_span (rtx);
914 static void rs6000_init_dwarf_reg_sizes_extra (tree);
915 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
916 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
917 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
918 static rtx rs6000_tls_get_addr (void);
919 static rtx rs6000_got_sym (void);
920 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
921 static const char *rs6000_get_some_local_dynamic_name (void);
922 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
923 static rtx rs6000_complex_function_value (enum machine_mode);
924 static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
925                                     enum machine_mode, tree);
926 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
927                                                       HOST_WIDE_INT);
928 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
929                                                         tree, HOST_WIDE_INT);
930 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
931                                               HOST_WIDE_INT,
932                                               rtx[], int *);
933 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
934                                                 const_tree, HOST_WIDE_INT,
935                                                 rtx[], int *);
936 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, int, bool);
937 static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
938 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
939 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
940                                     enum machine_mode, tree,
941                                     int *, int);
942 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
943                                       const_tree, bool);
944 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
945                                      tree, bool);
946 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
947 #if TARGET_MACHO
948 static void macho_branch_islands (void);
949 static int no_previous_def (tree function_name);
950 static tree get_prev_label (tree function_name);
951 static void rs6000_darwin_file_start (void);
952 #endif
953
954 static tree rs6000_build_builtin_va_list (void);
955 static void rs6000_va_start (tree, rtx);
956 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
957 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
958 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
959 static bool rs6000_vector_mode_supported_p (enum machine_mode);
960 static int get_vec_cmp_insn (enum rtx_code, enum machine_mode,
961                              enum machine_mode);
962 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
963                                        enum machine_mode);
964 static int get_vsel_insn (enum machine_mode);
965 static void rs6000_emit_vector_select (rtx, rtx, rtx, rtx);
966 static tree rs6000_stack_protect_fail (void);
967
968 const int INSN_NOT_AVAILABLE = -1;
969 static enum machine_mode rs6000_eh_return_filter_mode (void);
970
971 /* Hash table stuff for keeping track of TOC entries.  */
972
973 struct GTY(()) toc_hash_struct
974 {
975   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
976      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
977   rtx key;
978   enum machine_mode key_mode;
979   int labelno;
980 };
981
982 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
983 \f
984 /* Default register names.  */
985 char rs6000_reg_names[][8] =
986 {
987       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
988       "8",  "9", "10", "11", "12", "13", "14", "15",
989      "16", "17", "18", "19", "20", "21", "22", "23",
990      "24", "25", "26", "27", "28", "29", "30", "31",
991       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
992       "8",  "9", "10", "11", "12", "13", "14", "15",
993      "16", "17", "18", "19", "20", "21", "22", "23",
994      "24", "25", "26", "27", "28", "29", "30", "31",
995      "mq", "lr", "ctr","ap",
996       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
997       "xer",
998       /* AltiVec registers.  */
999       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
1000       "8",  "9",  "10", "11", "12", "13", "14", "15",
1001       "16", "17", "18", "19", "20", "21", "22", "23",
1002       "24", "25", "26", "27", "28", "29", "30", "31",
1003       "vrsave", "vscr",
1004       /* SPE registers.  */
1005       "spe_acc", "spefscr",
1006       /* Soft frame pointer.  */
1007       "sfp"
1008 };
1009
1010 #ifdef TARGET_REGNAMES
1011 static const char alt_reg_names[][8] =
1012 {
1013    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1014    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1015   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1016   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1017    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1018    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1019   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1020   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1021     "mq",    "lr",  "ctr",   "ap",
1022   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1023    "xer",
1024   /* AltiVec registers.  */
1025    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1026    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1027   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1028   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1029   "vrsave", "vscr",
1030   /* SPE registers.  */
1031   "spe_acc", "spefscr",
1032   /* Soft frame pointer.  */
1033   "sfp"
1034 };
1035 #endif
1036 \f
1037 #ifndef MASK_STRICT_ALIGN
1038 #define MASK_STRICT_ALIGN 0
1039 #endif
1040 #ifndef TARGET_PROFILE_KERNEL
1041 #define TARGET_PROFILE_KERNEL 0
1042 #endif
1043
1044 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1045 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1046 \f
1047 /* Initialize the GCC target structure.  */
1048 #undef TARGET_ATTRIBUTE_TABLE
1049 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1050 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1051 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1052
1053 #undef TARGET_ASM_ALIGNED_DI_OP
1054 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1055
1056 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1057    for non-ELF systems.  */
1058 #ifndef OBJECT_FORMAT_ELF
1059 #if TARGET_XCOFF
1060 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1061    64-bit targets.  */
1062 #undef TARGET_ASM_UNALIGNED_HI_OP
1063 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1064 #undef TARGET_ASM_UNALIGNED_SI_OP
1065 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1066 #undef TARGET_ASM_UNALIGNED_DI_OP
1067 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1068 #else
1069 /* For Darwin.  */
1070 #undef TARGET_ASM_UNALIGNED_HI_OP
1071 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1072 #undef TARGET_ASM_UNALIGNED_SI_OP
1073 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1074 #undef TARGET_ASM_UNALIGNED_DI_OP
1075 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1076 #undef TARGET_ASM_ALIGNED_DI_OP
1077 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1078 #endif
1079 #endif
1080
1081 /* This hook deals with fixups for relocatable code and DI-mode objects
1082    in 64-bit code.  */
1083 #undef TARGET_ASM_INTEGER
1084 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1085
1086 #ifdef HAVE_GAS_HIDDEN
1087 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1088 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1089 #endif
1090
1091 #undef TARGET_HAVE_TLS
1092 #define TARGET_HAVE_TLS HAVE_AS_TLS
1093
1094 #undef TARGET_CANNOT_FORCE_CONST_MEM
1095 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
1096
1097 #undef TARGET_ASM_FUNCTION_PROLOGUE
1098 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1099 #undef TARGET_ASM_FUNCTION_EPILOGUE
1100 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1101
1102 #undef TARGET_LEGITIMIZE_ADDRESS
1103 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1104
1105 #undef  TARGET_SCHED_VARIABLE_ISSUE
1106 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1107
1108 #undef TARGET_SCHED_ISSUE_RATE
1109 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1110 #undef TARGET_SCHED_ADJUST_COST
1111 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1112 #undef TARGET_SCHED_ADJUST_PRIORITY
1113 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1114 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1115 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1116 #undef TARGET_SCHED_INIT
1117 #define TARGET_SCHED_INIT rs6000_sched_init
1118 #undef TARGET_SCHED_FINISH
1119 #define TARGET_SCHED_FINISH rs6000_sched_finish
1120 #undef TARGET_SCHED_REORDER
1121 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1122 #undef TARGET_SCHED_REORDER2
1123 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1124
1125 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1126 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1127
1128 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1129 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1130
1131 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1132 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1133 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1134 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1135 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1136 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1137 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1138 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1139
1140 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1141 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1142 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1143 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1144 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1145 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1146 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1147 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1148 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1149 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1150
1151 #undef TARGET_VECTOR_ALIGNMENT_REACHABLE
1152 #define TARGET_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1153
1154 #undef TARGET_INIT_BUILTINS
1155 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1156
1157 #undef TARGET_EXPAND_BUILTIN
1158 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1159
1160 #undef TARGET_MANGLE_TYPE
1161 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1162
1163 #undef TARGET_INIT_LIBFUNCS
1164 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1165
1166 #if TARGET_MACHO
1167 #undef TARGET_BINDS_LOCAL_P
1168 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1169 #endif
1170
1171 #undef TARGET_MS_BITFIELD_LAYOUT_P
1172 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1173
1174 #undef TARGET_ASM_OUTPUT_MI_THUNK
1175 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1176
1177 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1178 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1179
1180 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1181 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1182
1183 #undef TARGET_INVALID_WITHIN_DOLOOP
1184 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1185
1186 #undef TARGET_RTX_COSTS
1187 #define TARGET_RTX_COSTS rs6000_rtx_costs
1188 #undef TARGET_ADDRESS_COST
1189 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1190
1191 #undef TARGET_DWARF_REGISTER_SPAN
1192 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1193
1194 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1195 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1196
1197 /* On rs6000, function arguments are promoted, as are function return
1198    values.  */
1199 #undef TARGET_PROMOTE_FUNCTION_ARGS
1200 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
1201 #undef TARGET_PROMOTE_FUNCTION_RETURN
1202 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
1203
1204 #undef TARGET_RETURN_IN_MEMORY
1205 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1206
1207 #undef TARGET_SETUP_INCOMING_VARARGS
1208 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1209
1210 /* Always strict argument naming on rs6000.  */
1211 #undef TARGET_STRICT_ARGUMENT_NAMING
1212 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1213 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1214 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1215 #undef TARGET_SPLIT_COMPLEX_ARG
1216 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1217 #undef TARGET_MUST_PASS_IN_STACK
1218 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1219 #undef TARGET_PASS_BY_REFERENCE
1220 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1221 #undef TARGET_ARG_PARTIAL_BYTES
1222 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1223
1224 #undef TARGET_BUILD_BUILTIN_VA_LIST
1225 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1226
1227 #undef TARGET_EXPAND_BUILTIN_VA_START
1228 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1229
1230 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1231 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1232
1233 #undef TARGET_EH_RETURN_FILTER_MODE
1234 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1235
1236 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1237 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1238
1239 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1240 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1241
1242 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1243 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1244
1245 #undef TARGET_HANDLE_OPTION
1246 #define TARGET_HANDLE_OPTION rs6000_handle_option
1247
1248 #undef TARGET_DEFAULT_TARGET_FLAGS
1249 #define TARGET_DEFAULT_TARGET_FLAGS \
1250   (TARGET_DEFAULT)
1251
1252 #undef TARGET_STACK_PROTECT_FAIL
1253 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1254
1255 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1256    The PowerPC architecture requires only weak consistency among
1257    processors--that is, memory accesses between processors need not be
1258    sequentially consistent and memory accesses among processors can occur
1259    in any order. The ability to order memory accesses weakly provides
1260    opportunities for more efficient use of the system bus. Unless a
1261    dependency exists, the 604e allows read operations to precede store
1262    operations.  */
1263 #undef TARGET_RELAXED_ORDERING
1264 #define TARGET_RELAXED_ORDERING true
1265
1266 #ifdef HAVE_AS_TLS
1267 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1268 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1269 #endif
1270
1271 /* Use a 32-bit anchor range.  This leads to sequences like:
1272
1273         addis   tmp,anchor,high
1274         add     dest,tmp,low
1275
1276    where tmp itself acts as an anchor, and can be shared between
1277    accesses to the same 64k page.  */
1278 #undef TARGET_MIN_ANCHOR_OFFSET
1279 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1280 #undef TARGET_MAX_ANCHOR_OFFSET
1281 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1282 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1283 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1284
1285 #undef TARGET_BUILTIN_RECIPROCAL
1286 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1287
1288 #undef TARGET_EXPAND_TO_RTL_HOOK
1289 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1290
1291 #undef TARGET_INSTANTIATE_DECLS
1292 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1293
1294 struct gcc_target targetm = TARGET_INITIALIZER;
1295 \f
1296
1297 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1298    MODE.  */
1299 static int
1300 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1301 {
1302   /* The GPRs can hold any mode, but values bigger than one register
1303      cannot go past R31.  */
1304   if (INT_REGNO_P (regno))
1305     return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1);
1306
1307   /* The float registers can only hold floating modes and DImode.
1308      This excludes the 32-bit decimal float mode for now.  */
1309   if (FP_REGNO_P (regno))
1310     return
1311       ((SCALAR_FLOAT_MODE_P (mode)
1312        && (mode != TDmode || (regno % 2) == 0)
1313        && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1))
1314       || (GET_MODE_CLASS (mode) == MODE_INT
1315           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1316       || (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1317            && PAIRED_VECTOR_MODE (mode)));
1318
1319   /* The CR register can only hold CC modes.  */
1320   if (CR_REGNO_P (regno))
1321     return GET_MODE_CLASS (mode) == MODE_CC;
1322
1323   if (XER_REGNO_P (regno))
1324     return mode == PSImode;
1325
1326   /* AltiVec only in AldyVec registers.  */
1327   if (ALTIVEC_REGNO_P (regno))
1328     return ALTIVEC_VECTOR_MODE (mode);
1329
1330   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1331   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1332     return 1;
1333
1334   /* We cannot put TImode anywhere except general register and it must be
1335      able to fit within the register set.  */
1336
1337   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1338 }
1339
1340 /* Initialize rs6000_hard_regno_mode_ok_p table.  */
1341 static void
1342 rs6000_init_hard_regno_mode_ok (void)
1343 {
1344   int r, m;
1345
1346   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
1347     for (m = 0; m < NUM_MACHINE_MODES; ++m)
1348       if (rs6000_hard_regno_mode_ok (r, (enum machine_mode) m))
1349         rs6000_hard_regno_mode_ok_p[m][r] = true;
1350 }
1351
1352 #if TARGET_MACHO
1353 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
1354
1355 static void
1356 darwin_rs6000_override_options (void)
1357 {
1358   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
1359      off.  */
1360   rs6000_altivec_abi = 1;
1361   TARGET_ALTIVEC_VRSAVE = 1;
1362   if (DEFAULT_ABI == ABI_DARWIN)
1363   {
1364     if (MACHO_DYNAMIC_NO_PIC_P)
1365       {
1366         if (flag_pic)
1367             warning (0, "-mdynamic-no-pic overrides -fpic or -fPIC");
1368         flag_pic = 0;
1369       }
1370     else if (flag_pic == 1)
1371       {
1372         flag_pic = 2;
1373       }
1374   }
1375   if (TARGET_64BIT && ! TARGET_POWERPC64)
1376     {
1377       target_flags |= MASK_POWERPC64;
1378       warning (0, "-m64 requires PowerPC64 architecture, enabling");
1379     }
1380   if (flag_mkernel)
1381     {
1382       rs6000_default_long_calls = 1;
1383       target_flags |= MASK_SOFT_FLOAT;
1384     }
1385
1386   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
1387      Altivec.  */
1388   if (!flag_mkernel && !flag_apple_kext
1389       && TARGET_64BIT
1390       && ! (target_flags_explicit & MASK_ALTIVEC))
1391     target_flags |= MASK_ALTIVEC;
1392
1393   /* Unless the user (not the configurer) has explicitly overridden
1394      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
1395      G4 unless targetting the kernel.  */
1396   if (!flag_mkernel
1397       && !flag_apple_kext
1398       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
1399       && ! (target_flags_explicit & MASK_ALTIVEC)
1400       && ! rs6000_select[1].string)
1401     {
1402       target_flags |= MASK_ALTIVEC;
1403     }
1404 }
1405 #endif
1406
1407 /* If not otherwise specified by a target, make 'long double' equivalent to
1408    'double'.  */
1409
1410 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
1411 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
1412 #endif
1413
1414 /* Override command line options.  Mostly we process the processor
1415    type and sometimes adjust other TARGET_ options.  */
1416
1417 void
1418 rs6000_override_options (const char *default_cpu)
1419 {
1420   size_t i, j;
1421   struct rs6000_cpu_select *ptr;
1422   int set_masks;
1423
1424   /* Simplifications for entries below.  */
1425
1426   enum {
1427     POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1428     POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1429   };
1430
1431   /* This table occasionally claims that a processor does not support
1432      a particular feature even though it does, but the feature is slower
1433      than the alternative.  Thus, it shouldn't be relied on as a
1434      complete description of the processor's support.
1435
1436      Please keep this list in order, and don't forget to update the
1437      documentation in invoke.texi when adding a new processor or
1438      flag.  */
1439   static struct ptt
1440     {
1441       const char *const name;           /* Canonical processor name.  */
1442       const enum processor_type processor; /* Processor type enum value.  */
1443       const int target_enable;  /* Target flags to enable.  */
1444     } const processor_target_table[]
1445       = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1446          {"403", PROCESSOR_PPC403,
1447           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1448          {"405", PROCESSOR_PPC405,
1449           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1450          {"405fp", PROCESSOR_PPC405,
1451           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1452          {"440", PROCESSOR_PPC440,
1453           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1454          {"440fp", PROCESSOR_PPC440,
1455           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1456          {"464", PROCESSOR_PPC440,
1457           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1458          {"464fp", PROCESSOR_PPC440,
1459           POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1460          {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
1461          {"601", PROCESSOR_PPC601,
1462           MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1463          {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1464          {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1465          {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1466          {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1467          {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1468          {"620", PROCESSOR_PPC620,
1469           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1470          {"630", PROCESSOR_PPC630,
1471           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1472          {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1473          {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1474          {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1475          {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1476          {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1477          {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1478          {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1479          {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN},
1480          /* 8548 has a dummy entry for now.  */
1481          {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN},
1482          {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1483          {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK},
1484          {"e500mc", PROCESSOR_PPCE500MC, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1485          {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1486          {"970", PROCESSOR_POWER4,
1487           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1488          {"cell", PROCESSOR_CELL,
1489           POWERPC_7400_MASK  | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1490          {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1491          {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1492          {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1493          {"G4",  PROCESSOR_PPC7450, POWERPC_7400_MASK},
1494          {"G5", PROCESSOR_POWER4,
1495           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1496          {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1497          {"power2", PROCESSOR_POWER,
1498           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1499          {"power3", PROCESSOR_PPC630,
1500           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1501          {"power4", PROCESSOR_POWER4,
1502           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1503           | MASK_MFCRF},
1504          {"power5", PROCESSOR_POWER5,
1505           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1506           | MASK_MFCRF | MASK_POPCNTB},
1507          {"power5+", PROCESSOR_POWER5,
1508           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1509           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
1510          {"power6", PROCESSOR_POWER6,
1511           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1512           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP},
1513          {"power6x", PROCESSOR_POWER6,
1514           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1515           | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
1516           | MASK_MFPGPR},
1517          {"power7", PROCESSOR_POWER5,
1518           POWERPC_7400_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_MFCRF
1519           | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP},
1520          {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1521          {"powerpc64", PROCESSOR_POWERPC64,
1522           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1523          {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1524          {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1525          {"rios2", PROCESSOR_RIOS2,
1526           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1527          {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1528          {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1529          {"rs64", PROCESSOR_RS64A,
1530           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
1531       };
1532
1533   const size_t ptt_size = ARRAY_SIZE (processor_target_table);
1534
1535   /* Some OSs don't support saving the high part of 64-bit registers on
1536      context switch.  Other OSs don't support saving Altivec registers.
1537      On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
1538      settings; if the user wants either, the user must explicitly specify
1539      them and we won't interfere with the user's specification.  */
1540
1541   enum {
1542     POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1543     POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1544                      | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1545                      | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1546                      | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP)
1547   };
1548
1549   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
1550 #ifdef OS_MISSING_POWERPC64
1551   if (OS_MISSING_POWERPC64)
1552     set_masks &= ~MASK_POWERPC64;
1553 #endif
1554 #ifdef OS_MISSING_ALTIVEC
1555   if (OS_MISSING_ALTIVEC)
1556     set_masks &= ~MASK_ALTIVEC;
1557 #endif
1558
1559   /* Don't override by the processor default if given explicitly.  */
1560   set_masks &= ~target_flags_explicit;
1561
1562   /* Identify the processor type.  */
1563   rs6000_select[0].string = default_cpu;
1564   rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
1565
1566   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
1567     {
1568       ptr = &rs6000_select[i];
1569       if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1570         {
1571           for (j = 0; j < ptt_size; j++)
1572             if (! strcmp (ptr->string, processor_target_table[j].name))
1573               {
1574                 if (ptr->set_tune_p)
1575                   rs6000_cpu = processor_target_table[j].processor;
1576
1577                 if (ptr->set_arch_p)
1578                   {
1579                     target_flags &= ~set_masks;
1580                     target_flags |= (processor_target_table[j].target_enable
1581                                      & set_masks);
1582                   }
1583                 break;
1584               }
1585
1586           if (j == ptt_size)
1587             error ("bad value (%s) for %s switch", ptr->string, ptr->name);
1588         }
1589     }
1590
1591   if ((TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC)
1592       && !rs6000_explicit_options.isel)
1593     rs6000_isel = 1;
1594
1595   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
1596       || rs6000_cpu == PROCESSOR_PPCE500MC)
1597     {
1598       if (TARGET_ALTIVEC)
1599         error ("AltiVec not supported in this target");
1600       if (TARGET_SPE)
1601         error ("Spe not supported in this target");
1602     }
1603
1604   /* Disable Cell microcode if we are optimizing for the Cell
1605      and not optimizing for size.  */
1606   if (rs6000_gen_cell_microcode == -1)
1607     rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
1608                                   && !optimize_size);
1609
1610   /* If we are optimizing big endian systems for space, use the load/store
1611      multiple and string instructions unless we are not generating
1612      Cell microcode.  */
1613   if (BYTES_BIG_ENDIAN && optimize_size && !rs6000_gen_cell_microcode)
1614     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
1615
1616   /* Don't allow -mmultiple or -mstring on little endian systems
1617      unless the cpu is a 750, because the hardware doesn't support the
1618      instructions used in little endian mode, and causes an alignment
1619      trap.  The 750 does not cause an alignment trap (except when the
1620      target is unaligned).  */
1621
1622   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
1623     {
1624       if (TARGET_MULTIPLE)
1625         {
1626           target_flags &= ~MASK_MULTIPLE;
1627           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
1628             warning (0, "-mmultiple is not supported on little endian systems");
1629         }
1630
1631       if (TARGET_STRING)
1632         {
1633           target_flags &= ~MASK_STRING;
1634           if ((target_flags_explicit & MASK_STRING) != 0)
1635             warning (0, "-mstring is not supported on little endian systems");
1636         }
1637     }
1638
1639   /* Set debug flags */
1640   if (rs6000_debug_name)
1641     {
1642       if (! strcmp (rs6000_debug_name, "all"))
1643         rs6000_debug_stack = rs6000_debug_arg = 1;
1644       else if (! strcmp (rs6000_debug_name, "stack"))
1645         rs6000_debug_stack = 1;
1646       else if (! strcmp (rs6000_debug_name, "arg"))
1647         rs6000_debug_arg = 1;
1648       else
1649         error ("unknown -mdebug-%s switch", rs6000_debug_name);
1650     }
1651
1652   if (rs6000_traceback_name)
1653     {
1654       if (! strncmp (rs6000_traceback_name, "full", 4))
1655         rs6000_traceback = traceback_full;
1656       else if (! strncmp (rs6000_traceback_name, "part", 4))
1657         rs6000_traceback = traceback_part;
1658       else if (! strncmp (rs6000_traceback_name, "no", 2))
1659         rs6000_traceback = traceback_none;
1660       else
1661         error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
1662                rs6000_traceback_name);
1663     }
1664
1665   if (!rs6000_explicit_options.long_double)
1666     rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1667
1668 #ifndef POWERPC_LINUX
1669   if (!rs6000_explicit_options.ieee)
1670     rs6000_ieeequad = 1;
1671 #endif
1672
1673   /* Enable Altivec ABI for AIX -maltivec.  */
1674   if (TARGET_XCOFF && TARGET_ALTIVEC)
1675     rs6000_altivec_abi = 1;
1676
1677   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
1678      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
1679      be explicitly overridden in either case.  */
1680   if (TARGET_ELF)
1681     {
1682       if (!rs6000_explicit_options.altivec_abi
1683           && (TARGET_64BIT || TARGET_ALTIVEC))
1684         rs6000_altivec_abi = 1;
1685
1686       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
1687       if (!rs6000_explicit_options.vrsave)
1688         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
1689     }
1690
1691   /* Set the Darwin64 ABI as default for 64-bit Darwin.  */
1692   if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1693     {
1694       rs6000_darwin64_abi = 1;
1695 #if TARGET_MACHO
1696       darwin_one_byte_bool = 1;
1697 #endif
1698       /* Default to natural alignment, for better performance.  */
1699       rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1700     }
1701
1702   /* Place FP constants in the constant pool instead of TOC
1703      if section anchors enabled.  */
1704   if (flag_section_anchors)
1705     TARGET_NO_FP_IN_TOC = 1;
1706
1707   /* Handle -mtls-size option.  */
1708   rs6000_parse_tls_size_option ();
1709
1710 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1711   SUBTARGET_OVERRIDE_OPTIONS;
1712 #endif
1713 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
1714   SUBSUBTARGET_OVERRIDE_OPTIONS;
1715 #endif
1716 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
1717   SUB3TARGET_OVERRIDE_OPTIONS;
1718 #endif
1719
1720   if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC)
1721     {
1722       /* The e500 and e500mc do not have string instructions, and we set
1723          MASK_STRING above when optimizing for size.  */
1724       if ((target_flags & MASK_STRING) != 0)
1725         target_flags = target_flags & ~MASK_STRING;
1726     }
1727   else if (rs6000_select[1].string != NULL)
1728     {
1729       /* For the powerpc-eabispe configuration, we set all these by
1730          default, so let's unset them if we manually set another
1731          CPU that is not the E500.  */
1732       if (!rs6000_explicit_options.spe_abi)
1733         rs6000_spe_abi = 0;
1734       if (!rs6000_explicit_options.spe)
1735         rs6000_spe = 0;
1736       if (!rs6000_explicit_options.float_gprs)
1737         rs6000_float_gprs = 0;
1738       if (!rs6000_explicit_options.isel)
1739         rs6000_isel = 0;
1740     }
1741
1742   /* Detect invalid option combinations with E500.  */
1743   CHECK_E500_OPTIONS;
1744
1745   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
1746                         && rs6000_cpu != PROCESSOR_POWER5
1747                         && rs6000_cpu != PROCESSOR_POWER6
1748                         && rs6000_cpu != PROCESSOR_CELL);
1749   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
1750                          || rs6000_cpu == PROCESSOR_POWER5);
1751   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
1752                                  || rs6000_cpu == PROCESSOR_POWER5
1753                                  || rs6000_cpu == PROCESSOR_POWER6);
1754
1755   rs6000_sched_restricted_insns_priority
1756     = (rs6000_sched_groups ? 1 : 0);
1757
1758   /* Handle -msched-costly-dep option.  */
1759   rs6000_sched_costly_dep
1760     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
1761
1762   if (rs6000_sched_costly_dep_str)
1763     {
1764       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
1765         rs6000_sched_costly_dep = no_dep_costly;
1766       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
1767         rs6000_sched_costly_dep = all_deps_costly;
1768       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
1769         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
1770       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
1771         rs6000_sched_costly_dep = store_to_load_dep_costly;
1772       else
1773         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
1774                                    atoi (rs6000_sched_costly_dep_str));
1775     }
1776
1777   /* Handle -minsert-sched-nops option.  */
1778   rs6000_sched_insert_nops
1779     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
1780
1781   if (rs6000_sched_insert_nops_str)
1782     {
1783       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
1784         rs6000_sched_insert_nops = sched_finish_none;
1785       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
1786         rs6000_sched_insert_nops = sched_finish_pad_groups;
1787       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
1788         rs6000_sched_insert_nops = sched_finish_regroup_exact;
1789       else
1790         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
1791                                     atoi (rs6000_sched_insert_nops_str));
1792     }
1793
1794 #ifdef TARGET_REGNAMES
1795   /* If the user desires alternate register names, copy in the
1796      alternate names now.  */
1797   if (TARGET_REGNAMES)
1798     memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
1799 #endif
1800
1801   /* Set aix_struct_return last, after the ABI is determined.
1802      If -maix-struct-return or -msvr4-struct-return was explicitly
1803      used, don't override with the ABI default.  */
1804   if (!rs6000_explicit_options.aix_struct_ret)
1805     aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
1806
1807   if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
1808     REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
1809
1810   if (TARGET_TOC)
1811     ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
1812
1813   /* We can only guarantee the availability of DI pseudo-ops when
1814      assembling for 64-bit targets.  */
1815   if (!TARGET_64BIT)
1816     {
1817       targetm.asm_out.aligned_op.di = NULL;
1818       targetm.asm_out.unaligned_op.di = NULL;
1819     }
1820
1821   /* Set branch target alignment, if not optimizing for size.  */
1822   if (!optimize_size)
1823     {
1824       /* Cell wants to be aligned 8byte for dual issue. */
1825       if (rs6000_cpu == PROCESSOR_CELL)
1826         {
1827           if (align_functions <= 0)
1828             align_functions = 8;
1829           if (align_jumps <= 0)
1830             align_jumps = 8;
1831           if (align_loops <= 0)
1832             align_loops = 8;
1833         }
1834       if (rs6000_align_branch_targets)
1835         {
1836           if (align_functions <= 0)
1837             align_functions = 16;
1838           if (align_jumps <= 0)
1839             align_jumps = 16;
1840           if (align_loops <= 0)
1841             align_loops = 16;
1842         }
1843       if (align_jumps_max_skip <= 0)
1844         align_jumps_max_skip = 15;
1845       if (align_loops_max_skip <= 0)
1846         align_loops_max_skip = 15;
1847     }
1848
1849   /* Arrange to save and restore machine status around nested functions.  */
1850   init_machine_status = rs6000_init_machine_status;
1851
1852   /* We should always be splitting complex arguments, but we can't break
1853      Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
1854   if (DEFAULT_ABI != ABI_AIX)
1855     targetm.calls.split_complex_arg = NULL;
1856
1857   /* Initialize rs6000_cost with the appropriate target costs.  */
1858   if (optimize_size)
1859     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
1860   else
1861     switch (rs6000_cpu)
1862       {
1863       case PROCESSOR_RIOS1:
1864         rs6000_cost = &rios1_cost;
1865         break;
1866
1867       case PROCESSOR_RIOS2:
1868         rs6000_cost = &rios2_cost;
1869         break;
1870
1871       case PROCESSOR_RS64A:
1872         rs6000_cost = &rs64a_cost;
1873         break;
1874
1875       case PROCESSOR_MPCCORE:
1876         rs6000_cost = &mpccore_cost;
1877         break;
1878
1879       case PROCESSOR_PPC403:
1880         rs6000_cost = &ppc403_cost;
1881         break;
1882
1883       case PROCESSOR_PPC405:
1884         rs6000_cost = &ppc405_cost;
1885         break;
1886
1887       case PROCESSOR_PPC440:
1888         rs6000_cost = &ppc440_cost;
1889         break;
1890
1891       case PROCESSOR_PPC601:
1892         rs6000_cost = &ppc601_cost;
1893         break;
1894
1895       case PROCESSOR_PPC603:
1896         rs6000_cost = &ppc603_cost;
1897         break;
1898
1899       case PROCESSOR_PPC604:
1900         rs6000_cost = &ppc604_cost;
1901         break;
1902
1903       case PROCESSOR_PPC604e:
1904         rs6000_cost = &ppc604e_cost;
1905         break;
1906
1907       case PROCESSOR_PPC620:
1908         rs6000_cost = &ppc620_cost;
1909         break;
1910
1911       case PROCESSOR_PPC630:
1912         rs6000_cost = &ppc630_cost;
1913         break;
1914
1915       case PROCESSOR_CELL:
1916         rs6000_cost = &ppccell_cost;
1917         break;
1918
1919       case PROCESSOR_PPC750:
1920       case PROCESSOR_PPC7400:
1921         rs6000_cost = &ppc750_cost;
1922         break;
1923
1924       case PROCESSOR_PPC7450:
1925         rs6000_cost = &ppc7450_cost;
1926         break;
1927
1928       case PROCESSOR_PPC8540:
1929         rs6000_cost = &ppc8540_cost;
1930         break;
1931
1932       case PROCESSOR_PPCE300C2:
1933       case PROCESSOR_PPCE300C3:
1934         rs6000_cost = &ppce300c2c3_cost;
1935         break;
1936
1937       case PROCESSOR_PPCE500MC:
1938         rs6000_cost = &ppce500mc_cost;
1939         break;
1940
1941       case PROCESSOR_POWER4:
1942       case PROCESSOR_POWER5:
1943         rs6000_cost = &power4_cost;
1944         break;
1945
1946       case PROCESSOR_POWER6:
1947         rs6000_cost = &power6_cost;
1948         break;
1949
1950       default:
1951         gcc_unreachable ();
1952       }
1953
1954   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
1955     set_param_value ("simultaneous-prefetches",
1956                      rs6000_cost->simultaneous_prefetches);
1957   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
1958     set_param_value ("l1-cache-size", rs6000_cost->l1_cache_size);
1959   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
1960     set_param_value ("l1-cache-line-size", rs6000_cost->cache_line_size);
1961   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
1962     set_param_value ("l2-cache-size", rs6000_cost->l2_cache_size);
1963
1964   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
1965      can be optimized to ap = __builtin_next_arg (0).  */
1966   if (DEFAULT_ABI != ABI_V4)
1967     targetm.expand_builtin_va_start = NULL;
1968
1969   /* Set up single/double float flags.  
1970      If TARGET_HARD_FLOAT is set, but neither single or double is set, 
1971      then set both flags. */
1972   if (TARGET_HARD_FLOAT && TARGET_FPRS 
1973       && rs6000_single_float == 0 && rs6000_double_float == 0)
1974     rs6000_single_float = rs6000_double_float = 1;
1975
1976   /* Reset single and double FP flags if target is E500. */
1977   if (TARGET_E500) 
1978   {
1979     rs6000_single_float = rs6000_double_float = 0;
1980     if (TARGET_E500_SINGLE)
1981       rs6000_single_float = 1; 
1982     if (TARGET_E500_DOUBLE)
1983       rs6000_single_float = rs6000_double_float = 1;
1984   }
1985
1986   /* If not explicitly specified via option, decide whether to generate indexed
1987      load/store instructions.  */
1988   if (TARGET_AVOID_XFORM == -1)
1989     /* Avoid indexed addressing when targeting Power6 in order to avoid
1990      the DERAT mispredict penalty.  */
1991     TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB);
1992
1993   rs6000_init_hard_regno_mode_ok ();
1994 }
1995
1996 /* Implement targetm.vectorize.builtin_mask_for_load.  */
1997 static tree
1998 rs6000_builtin_mask_for_load (void)
1999 {
2000   if (TARGET_ALTIVEC)
2001     return altivec_builtin_mask_for_load;
2002   else
2003     return 0;
2004 }
2005
2006 /* Implement targetm.vectorize.builtin_conversion.
2007    Returns a decl of a function that implements conversion of an integer vector
2008    into a floating-point vector, or vice-versa. TYPE is the type of the integer
2009    side of the conversion.
2010    Return NULL_TREE if it is not available.  */
2011 static tree
2012 rs6000_builtin_conversion (enum tree_code code, tree type)
2013 {
2014   if (!TARGET_ALTIVEC)
2015     return NULL_TREE;
2016
2017   switch (code)
2018     {
2019     case FIX_TRUNC_EXPR:
2020       switch (TYPE_MODE (type))
2021         {
2022         case V4SImode:
2023           return TYPE_UNSIGNED (type)
2024             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VCTUXS]
2025             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VCTSXS];
2026         default:
2027           return NULL_TREE;
2028         }
2029
2030     case FLOAT_EXPR:
2031       switch (TYPE_MODE (type))
2032         {
2033         case V4SImode:
2034           return TYPE_UNSIGNED (type)
2035             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VCFUX]
2036             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VCFSX];
2037         default:
2038           return NULL_TREE;
2039         }
2040
2041     default:
2042       return NULL_TREE;
2043     }
2044 }
2045
2046 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
2047 static tree
2048 rs6000_builtin_mul_widen_even (tree type)
2049 {
2050   if (!TARGET_ALTIVEC)
2051     return NULL_TREE;
2052
2053   switch (TYPE_MODE (type))
2054     {
2055     case V8HImode:
2056       return TYPE_UNSIGNED (type)
2057             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH]
2058             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
2059
2060     case V16QImode:
2061       return TYPE_UNSIGNED (type)
2062             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB]
2063             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
2064     default:
2065       return NULL_TREE;
2066     }
2067 }
2068
2069 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
2070 static tree
2071 rs6000_builtin_mul_widen_odd (tree type)
2072 {
2073   if (!TARGET_ALTIVEC)
2074     return NULL_TREE;
2075
2076   switch (TYPE_MODE (type))
2077     {
2078     case V8HImode:
2079       return TYPE_UNSIGNED (type)
2080             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH]
2081             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
2082
2083     case V16QImode:
2084       return TYPE_UNSIGNED (type)
2085             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB]
2086             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
2087     default:
2088       return NULL_TREE;
2089     }
2090 }
2091
2092
2093 /* Return true iff, data reference of TYPE can reach vector alignment (16)
2094    after applying N number of iterations.  This routine does not determine
2095    how may iterations are required to reach desired alignment.  */
2096
2097 static bool
2098 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
2099 {
2100   if (is_packed)
2101     return false;
2102
2103   if (TARGET_32BIT)
2104     {
2105       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
2106         return true;
2107
2108       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
2109         return true;
2110
2111       return false;
2112     }
2113   else
2114     {
2115       if (TARGET_MACHO)
2116         return false;
2117
2118       /* Assuming that all other types are naturally aligned. CHECKME!  */
2119       return true;
2120     }
2121 }
2122
2123 /* Implement targetm.vectorize.builtin_vec_perm.  */
2124 tree
2125 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
2126 {
2127   tree d;
2128
2129   *mask_element_type = unsigned_char_type_node;
2130
2131   switch (TYPE_MODE (type))
2132     {
2133     case V16QImode:
2134       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI];
2135       break;
2136
2137     case V8HImode:
2138       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI];
2139       break;
2140
2141     case V4SImode:
2142       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI];
2143       break;
2144
2145     case V4SFmode:
2146       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
2147       break;
2148
2149     default:
2150       return NULL_TREE;
2151     }
2152
2153   gcc_assert (d);
2154   return d;
2155 }
2156
2157 /* Handle generic options of the form -mfoo=yes/no.
2158    NAME is the option name.
2159    VALUE is the option value.
2160    FLAG is the pointer to the flag where to store a 1 or 0, depending on
2161    whether the option value is 'yes' or 'no' respectively.  */
2162 static void
2163 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
2164 {
2165   if (value == 0)
2166     return;
2167   else if (!strcmp (value, "yes"))
2168     *flag = 1;
2169   else if (!strcmp (value, "no"))
2170     *flag = 0;
2171   else
2172     error ("unknown -m%s= option specified: '%s'", name, value);
2173 }
2174
2175 /* Validate and record the size specified with the -mtls-size option.  */
2176
2177 static void
2178 rs6000_parse_tls_size_option (void)
2179 {
2180   if (rs6000_tls_size_string == 0)
2181     return;
2182   else if (strcmp (rs6000_tls_size_string, "16") == 0)
2183     rs6000_tls_size = 16;
2184   else if (strcmp (rs6000_tls_size_string, "32") == 0)
2185     rs6000_tls_size = 32;
2186   else if (strcmp (rs6000_tls_size_string, "64") == 0)
2187     rs6000_tls_size = 64;
2188   else
2189     error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
2190 }
2191
2192 void
2193 optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
2194 {
2195   if (DEFAULT_ABI == ABI_DARWIN)
2196     /* The Darwin libraries never set errno, so we might as well
2197        avoid calling them when that's the only reason we would.  */
2198     flag_errno_math = 0;
2199
2200   /* Double growth factor to counter reduced min jump length.  */
2201   set_param_value ("max-grow-copy-bb-insns", 16);
2202
2203   /* Enable section anchors by default.
2204      Skip section anchors for Objective C and Objective C++
2205      until front-ends fixed.  */
2206   if (!TARGET_MACHO && lang_hooks.name[4] != 'O')
2207     flag_section_anchors = 2;
2208 }
2209
2210 static enum fpu_type_t
2211 rs6000_parse_fpu_option (const char *option)
2212 {
2213   if (!strcmp("none", option)) return FPU_NONE;
2214   if (!strcmp("sp_lite", option)) return FPU_SF_LITE;
2215   if (!strcmp("dp_lite", option)) return FPU_DF_LITE;
2216   if (!strcmp("sp_full", option)) return FPU_SF_FULL;
2217   if (!strcmp("dp_full", option)) return FPU_DF_FULL;
2218   error("unknown value %s for -mfpu", option);
2219   return FPU_NONE;
2220 }
2221
2222 /* Implement TARGET_HANDLE_OPTION.  */
2223
2224 static bool
2225 rs6000_handle_option (size_t code, const char *arg, int value)
2226 {
2227   enum fpu_type_t fpu_type = FPU_NONE;
2228
2229   switch (code)
2230     {
2231     case OPT_mno_power:
2232       target_flags &= ~(MASK_POWER | MASK_POWER2
2233                         | MASK_MULTIPLE | MASK_STRING);
2234       target_flags_explicit |= (MASK_POWER | MASK_POWER2
2235                                 | MASK_MULTIPLE | MASK_STRING);
2236       break;
2237     case OPT_mno_powerpc:
2238       target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
2239                         | MASK_PPC_GFXOPT | MASK_POWERPC64);
2240       target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
2241                                 | MASK_PPC_GFXOPT | MASK_POWERPC64);
2242       break;
2243     case OPT_mfull_toc:
2244       target_flags &= ~MASK_MINIMAL_TOC;
2245       TARGET_NO_FP_IN_TOC = 0;
2246       TARGET_NO_SUM_IN_TOC = 0;
2247       target_flags_explicit |= MASK_MINIMAL_TOC;
2248 #ifdef TARGET_USES_SYSV4_OPT
2249       /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
2250          just the same as -mminimal-toc.  */
2251       target_flags |= MASK_MINIMAL_TOC;
2252       target_flags_explicit |= MASK_MINIMAL_TOC;
2253 #endif
2254       break;
2255
2256 #ifdef TARGET_USES_SYSV4_OPT
2257     case OPT_mtoc:
2258       /* Make -mtoc behave like -mminimal-toc.  */
2259       target_flags |= MASK_MINIMAL_TOC;
2260       target_flags_explicit |= MASK_MINIMAL_TOC;
2261       break;
2262 #endif
2263
2264 #ifdef TARGET_USES_AIX64_OPT
2265     case OPT_maix64:
2266 #else
2267     case OPT_m64:
2268 #endif
2269       target_flags |= MASK_POWERPC64 | MASK_POWERPC;
2270       target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
2271       target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
2272       break;
2273
2274 #ifdef TARGET_USES_AIX64_OPT
2275     case OPT_maix32:
2276 #else
2277     case OPT_m32:
2278 #endif
2279       target_flags &= ~MASK_POWERPC64;
2280       target_flags_explicit |= MASK_POWERPC64;
2281       break;
2282
2283     case OPT_minsert_sched_nops_:
2284       rs6000_sched_insert_nops_str = arg;
2285       break;
2286
2287     case OPT_mminimal_toc:
2288       if (value == 1)
2289         {
2290           TARGET_NO_FP_IN_TOC = 0;
2291           TARGET_NO_SUM_IN_TOC = 0;
2292         }
2293       break;
2294
2295     case OPT_mpower:
2296       if (value == 1)
2297         {
2298           target_flags |= (MASK_MULTIPLE | MASK_STRING);
2299           target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
2300         }
2301       break;
2302
2303     case OPT_mpower2:
2304       if (value == 1)
2305         {
2306           target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
2307           target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
2308         }
2309       break;
2310
2311     case OPT_mpowerpc_gpopt:
2312     case OPT_mpowerpc_gfxopt:
2313       if (value == 1)
2314         {
2315           target_flags |= MASK_POWERPC;
2316           target_flags_explicit |= MASK_POWERPC;
2317         }
2318       break;
2319
2320     case OPT_maix_struct_return:
2321     case OPT_msvr4_struct_return:
2322       rs6000_explicit_options.aix_struct_ret = true;
2323       break;
2324
2325     case OPT_mvrsave:
2326       rs6000_explicit_options.vrsave = true;
2327       TARGET_ALTIVEC_VRSAVE = value;
2328       break;
2329
2330     case OPT_mvrsave_:
2331       rs6000_explicit_options.vrsave = true;
2332       rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
2333       break;
2334
2335     case OPT_misel:
2336       rs6000_explicit_options.isel = true;
2337       rs6000_isel = value;
2338       break;
2339
2340     case OPT_misel_:
2341       rs6000_explicit_options.isel = true;
2342       rs6000_parse_yes_no_option ("isel", arg, &(rs6000_isel));
2343       break;
2344
2345     case OPT_mspe:
2346       rs6000_explicit_options.spe = true;
2347       rs6000_spe = value;
2348       break;
2349
2350     case OPT_mspe_:
2351       rs6000_explicit_options.spe = true;
2352       rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
2353       break;
2354
2355     case OPT_mdebug_:
2356       rs6000_debug_name = arg;
2357       break;
2358
2359 #ifdef TARGET_USES_SYSV4_OPT
2360     case OPT_mcall_:
2361       rs6000_abi_name = arg;
2362       break;
2363
2364     case OPT_msdata_:
2365       rs6000_sdata_name = arg;
2366       break;
2367
2368     case OPT_mtls_size_:
2369       rs6000_tls_size_string = arg;
2370       break;
2371
2372     case OPT_mrelocatable:
2373       if (value == 1)
2374         {
2375           target_flags |= MASK_MINIMAL_TOC;
2376           target_flags_explicit |= MASK_MINIMAL_TOC;
2377           TARGET_NO_FP_IN_TOC = 1;
2378         }
2379       break;
2380
2381     case OPT_mrelocatable_lib:
2382       if (value == 1)
2383         {
2384           target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
2385           target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
2386           TARGET_NO_FP_IN_TOC = 1;
2387         }
2388       else
2389         {
2390           target_flags &= ~MASK_RELOCATABLE;
2391           target_flags_explicit |= MASK_RELOCATABLE;
2392         }
2393       break;
2394 #endif
2395
2396     case OPT_mabi_:
2397       if (!strcmp (arg, "altivec"))
2398         {
2399           rs6000_explicit_options.altivec_abi = true;
2400           rs6000_altivec_abi = 1;
2401
2402           /* Enabling the AltiVec ABI turns off the SPE ABI.  */
2403           rs6000_spe_abi = 0;
2404         }
2405       else if (! strcmp (arg, "no-altivec"))
2406         {
2407           rs6000_explicit_options.altivec_abi = true;
2408           rs6000_altivec_abi = 0;
2409         }
2410       else if (! strcmp (arg, "spe"))
2411         {
2412           rs6000_explicit_options.spe_abi = true;
2413           rs6000_spe_abi = 1;
2414           rs6000_altivec_abi = 0;
2415           if (!TARGET_SPE_ABI)
2416             error ("not configured for ABI: '%s'", arg);
2417         }
2418       else if (! strcmp (arg, "no-spe"))
2419         {
2420           rs6000_explicit_options.spe_abi = true;
2421           rs6000_spe_abi = 0;
2422         }
2423
2424       /* These are here for testing during development only, do not
2425          document in the manual please.  */
2426       else if (! strcmp (arg, "d64"))
2427         {
2428           rs6000_darwin64_abi = 1;
2429           warning (0, "Using darwin64 ABI");
2430         }
2431       else if (! strcmp (arg, "d32"))
2432         {
2433           rs6000_darwin64_abi = 0;
2434           warning (0, "Using old darwin ABI");
2435         }
2436
2437       else if (! strcmp (arg, "ibmlongdouble"))
2438         {
2439           rs6000_explicit_options.ieee = true;
2440           rs6000_ieeequad = 0;
2441           warning (0, "Using IBM extended precision long double");
2442         }
2443       else if (! strcmp (arg, "ieeelongdouble"))
2444         {
2445           rs6000_explicit_options.ieee = true;
2446           rs6000_ieeequad = 1;
2447           warning (0, "Using IEEE extended precision long double");
2448         }
2449
2450       else
2451         {
2452           error ("unknown ABI specified: '%s'", arg);
2453           return false;
2454         }
2455       break;
2456
2457     case OPT_mcpu_:
2458       rs6000_select[1].string = arg;
2459       break;
2460
2461     case OPT_mtune_:
2462       rs6000_select[2].string = arg;
2463       break;
2464
2465     case OPT_mtraceback_:
2466       rs6000_traceback_name = arg;
2467       break;
2468
2469     case OPT_mfloat_gprs_:
2470       rs6000_explicit_options.float_gprs = true;
2471       if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
2472         rs6000_float_gprs = 1;
2473       else if (! strcmp (arg, "double"))
2474         rs6000_float_gprs = 2;
2475       else if (! strcmp (arg, "no"))
2476         rs6000_float_gprs = 0;
2477       else
2478         {
2479           error ("invalid option for -mfloat-gprs: '%s'", arg);
2480           return false;
2481         }
2482       break;
2483
2484     case OPT_mlong_double_:
2485       rs6000_explicit_options.long_double = true;
2486       rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2487       if (value != 64 && value != 128)
2488         {
2489           error ("Unknown switch -mlong-double-%s", arg);
2490           rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2491           return false;
2492         }
2493       else
2494         rs6000_long_double_type_size = value;
2495       break;
2496
2497     case OPT_msched_costly_dep_:
2498       rs6000_sched_costly_dep_str = arg;
2499       break;
2500
2501     case OPT_malign_:
2502       rs6000_explicit_options.alignment = true;
2503       if (! strcmp (arg, "power"))
2504         {
2505           /* On 64-bit Darwin, power alignment is ABI-incompatible with
2506              some C library functions, so warn about it. The flag may be
2507              useful for performance studies from time to time though, so
2508              don't disable it entirely.  */
2509           if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
2510             warning (0, "-malign-power is not supported for 64-bit Darwin;"
2511                      " it is incompatible with the installed C and C++ libraries");
2512           rs6000_alignment_flags = MASK_ALIGN_POWER;
2513         }
2514       else if (! strcmp (arg, "natural"))
2515         rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2516       else
2517         {
2518           error ("unknown -malign-XXXXX option specified: '%s'", arg);
2519           return false;
2520         }
2521       break;
2522
2523     case OPT_msingle_float:
2524       if (!TARGET_SINGLE_FPU) 
2525         warning (0, "-msingle-float option equivalent to -mhard-float");
2526       /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
2527       rs6000_double_float = 0;
2528       target_flags &= ~MASK_SOFT_FLOAT;
2529       target_flags_explicit |= MASK_SOFT_FLOAT;
2530       break;
2531
2532     case OPT_mdouble_float:
2533       /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
2534       rs6000_single_float = 1;
2535       target_flags &= ~MASK_SOFT_FLOAT;
2536       target_flags_explicit |= MASK_SOFT_FLOAT;
2537       break;
2538
2539     case OPT_msimple_fpu:
2540       if (!TARGET_SINGLE_FPU) 
2541         warning (0, "-msimple-fpu option ignored");
2542       break;
2543
2544     case OPT_mhard_float:
2545       /* -mhard_float implies -msingle-float and -mdouble-float. */
2546       rs6000_single_float = rs6000_double_float = 1;
2547       break;
2548
2549     case OPT_msoft_float:
2550       /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
2551       rs6000_single_float = rs6000_double_float = 0;
2552       break;
2553
2554     case OPT_mfpu_:
2555       fpu_type = rs6000_parse_fpu_option(arg);
2556       if (fpu_type != FPU_NONE) 
2557       /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on HARD_FLOAT. */
2558       {
2559         target_flags &= ~MASK_SOFT_FLOAT;
2560         target_flags_explicit |= MASK_SOFT_FLOAT;
2561         rs6000_xilinx_fpu = 1;
2562         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_SF_FULL) 
2563         rs6000_single_float = 1;
2564         if (fpu_type == FPU_DF_LITE || fpu_type == FPU_DF_FULL) 
2565           rs6000_single_float = rs6000_double_float = 1;
2566         if (fpu_type == FPU_SF_LITE || fpu_type == FPU_DF_LITE) 
2567           rs6000_simple_fpu = 1;
2568       }
2569       else
2570       {
2571         /* -mfpu=none is equivalent to -msoft-float */
2572         target_flags |= MASK_SOFT_FLOAT;
2573         target_flags_explicit |= MASK_SOFT_FLOAT;
2574         rs6000_single_float = rs6000_double_float = 0;
2575       }
2576       break;
2577     }
2578   return true;
2579 }
2580 \f
2581 /* Do anything needed at the start of the asm file.  */
2582
2583 static void
2584 rs6000_file_start (void)
2585 {
2586   size_t i;
2587   char buffer[80];
2588   const char *start = buffer;
2589   struct rs6000_cpu_select *ptr;
2590   const char *default_cpu = TARGET_CPU_DEFAULT;
2591   FILE *file = asm_out_file;
2592
2593   default_file_start ();
2594
2595 #ifdef TARGET_BI_ARCH
2596   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
2597     default_cpu = 0;
2598 #endif
2599
2600   if (flag_verbose_asm)
2601     {
2602       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
2603       rs6000_select[0].string = default_cpu;
2604
2605       for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
2606         {
2607           ptr = &rs6000_select[i];
2608           if (ptr->string != (char *)0 && ptr->string[0] != '\0')
2609             {
2610               fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
2611               start = "";
2612             }
2613         }
2614
2615       if (PPC405_ERRATUM77)
2616         {
2617           fprintf (file, "%s PPC405CR_ERRATUM77", start);
2618           start = "";
2619         }
2620
2621 #ifdef USING_ELFOS_H
2622       switch (rs6000_sdata)
2623         {
2624         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
2625         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
2626         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
2627         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
2628         }
2629
2630       if (rs6000_sdata && g_switch_value)
2631         {
2632           fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
2633                    g_switch_value);
2634           start = "";
2635         }
2636 #endif
2637
2638       if (*start == '\0')
2639         putc ('\n', file);
2640     }
2641
2642 #ifdef HAVE_AS_GNU_ATTRIBUTE
2643   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
2644     {
2645       fprintf (file, "\t.gnu_attribute 4, %d\n",
2646                ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1 
2647                 : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3 
2648                 : 2));
2649       fprintf (file, "\t.gnu_attribute 8, %d\n",
2650                (TARGET_ALTIVEC_ABI ? 2
2651                 : TARGET_SPE_ABI ? 3
2652                 : 1));
2653       fprintf (file, "\t.gnu_attribute 12, %d\n",
2654                aix_struct_return ? 2 : 1);
2655
2656     }
2657 #endif
2658
2659   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
2660     {
2661       switch_to_section (toc_section);
2662       switch_to_section (text_section);
2663     }
2664 }
2665
2666 \f
2667 /* Return nonzero if this function is known to have a null epilogue.  */
2668
2669 int
2670 direct_return (void)
2671 {
2672   if (reload_completed)
2673     {
2674       rs6000_stack_t *info = rs6000_stack_info ();
2675
2676       if (info->first_gp_reg_save == 32
2677           && info->first_fp_reg_save == 64
2678           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
2679           && ! info->lr_save_p
2680           && ! info->cr_save_p
2681           && info->vrsave_mask == 0
2682           && ! info->push_p)
2683         return 1;
2684     }
2685
2686   return 0;
2687 }
2688
2689 /* Return the number of instructions it takes to form a constant in an
2690    integer register.  */
2691
2692 int
2693 num_insns_constant_wide (HOST_WIDE_INT value)
2694 {
2695   /* signed constant loadable with {cal|addi} */
2696   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
2697     return 1;
2698
2699   /* constant loadable with {cau|addis} */
2700   else if ((value & 0xffff) == 0
2701            && (value >> 31 == -1 || value >> 31 == 0))
2702     return 1;
2703
2704 #if HOST_BITS_PER_WIDE_INT == 64
2705   else if (TARGET_POWERPC64)
2706     {
2707       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
2708       HOST_WIDE_INT high = value >> 31;
2709
2710       if (high == 0 || high == -1)
2711         return 2;
2712
2713       high >>= 1;
2714
2715       if (low == 0)
2716         return num_insns_constant_wide (high) + 1;
2717       else
2718         return (num_insns_constant_wide (high)
2719                 + num_insns_constant_wide (low) + 1);
2720     }
2721 #endif
2722
2723   else
2724     return 2;
2725 }
2726
2727 int
2728 num_insns_constant (rtx op, enum machine_mode mode)
2729 {
2730   HOST_WIDE_INT low, high;
2731
2732   switch (GET_CODE (op))
2733     {
2734     case CONST_INT:
2735 #if HOST_BITS_PER_WIDE_INT == 64
2736       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
2737           && mask64_operand (op, mode))
2738         return 2;
2739       else
2740 #endif
2741         return num_insns_constant_wide (INTVAL (op));
2742
2743       case CONST_DOUBLE:
2744         if (mode == SFmode || mode == SDmode)
2745           {
2746             long l;
2747             REAL_VALUE_TYPE rv;
2748
2749             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2750             if (DECIMAL_FLOAT_MODE_P (mode))
2751               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
2752             else
2753               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
2754             return num_insns_constant_wide ((HOST_WIDE_INT) l);
2755           }
2756
2757         if (mode == VOIDmode || mode == DImode)
2758           {
2759             high = CONST_DOUBLE_HIGH (op);
2760             low  = CONST_DOUBLE_LOW (op);
2761           }
2762         else
2763           {
2764             long l[2];
2765             REAL_VALUE_TYPE rv;
2766
2767             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2768             if (DECIMAL_FLOAT_MODE_P (mode))
2769               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
2770             else
2771               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
2772             high = l[WORDS_BIG_ENDIAN == 0];
2773             low  = l[WORDS_BIG_ENDIAN != 0];
2774           }
2775
2776         if (TARGET_32BIT)
2777           return (num_insns_constant_wide (low)
2778                   + num_insns_constant_wide (high));
2779         else
2780           {
2781             if ((high == 0 && low >= 0)
2782                 || (high == -1 && low < 0))
2783               return num_insns_constant_wide (low);
2784
2785             else if (mask64_operand (op, mode))
2786               return 2;
2787
2788             else if (low == 0)
2789               return num_insns_constant_wide (high) + 1;
2790
2791             else
2792               return (num_insns_constant_wide (high)
2793                       + num_insns_constant_wide (low) + 1);
2794           }
2795
2796     default:
2797       gcc_unreachable ();
2798     }
2799 }
2800
2801 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
2802    If the mode of OP is MODE_VECTOR_INT, this simply returns the
2803    corresponding element of the vector, but for V4SFmode and V2SFmode,
2804    the corresponding "float" is interpreted as an SImode integer.  */
2805
2806 HOST_WIDE_INT
2807 const_vector_elt_as_int (rtx op, unsigned int elt)
2808 {
2809   rtx tmp = CONST_VECTOR_ELT (op, elt);
2810   if (GET_MODE (op) == V4SFmode
2811       || GET_MODE (op) == V2SFmode)
2812     tmp = gen_lowpart (SImode, tmp);
2813   return INTVAL (tmp);
2814 }
2815
2816 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
2817    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
2818    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
2819    all items are set to the same value and contain COPIES replicas of the
2820    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
2821    operand and the others are set to the value of the operand's msb.  */
2822
2823 static bool
2824 vspltis_constant (rtx op, unsigned step, unsigned copies)
2825 {
2826   enum machine_mode mode = GET_MODE (op);
2827   enum machine_mode inner = GET_MODE_INNER (mode);
2828
2829   unsigned i;
2830   unsigned nunits = GET_MODE_NUNITS (mode);
2831   unsigned bitsize = GET_MODE_BITSIZE (inner);
2832   unsigned mask = GET_MODE_MASK (inner);
2833
2834   HOST_WIDE_INT val = const_vector_elt_as_int (op, nunits - 1);
2835   HOST_WIDE_INT splat_val = val;
2836   HOST_WIDE_INT msb_val = val > 0 ? 0 : -1;
2837
2838   /* Construct the value to be splatted, if possible.  If not, return 0.  */
2839   for (i = 2; i <= copies; i *= 2)
2840     {
2841       HOST_WIDE_INT small_val;
2842       bitsize /= 2;
2843       small_val = splat_val >> bitsize;
2844       mask >>= bitsize;
2845       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
2846         return false;
2847       splat_val = small_val;
2848     }
2849
2850   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
2851   if (EASY_VECTOR_15 (splat_val))
2852     ;
2853
2854   /* Also check if we can splat, and then add the result to itself.  Do so if
2855      the value is positive, of if the splat instruction is using OP's mode;
2856      for splat_val < 0, the splat and the add should use the same mode.  */
2857   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
2858            && (splat_val >= 0 || (step == 1 && copies == 1)))
2859     ;
2860
2861   else
2862     return false;
2863
2864   /* Check if VAL is present in every STEP-th element, and the
2865      other elements are filled with its most significant bit.  */
2866   for (i = 0; i < nunits - 1; ++i)
2867     {
2868       HOST_WIDE_INT desired_val;
2869       if (((i + 1) & (step - 1)) == 0)
2870         desired_val = val;
2871       else
2872         desired_val = msb_val;
2873
2874       if (desired_val != const_vector_elt_as_int (op, i))
2875         return false;
2876     }
2877
2878   return true;
2879 }
2880
2881
2882 /* Return true if OP is of the given MODE and can be synthesized
2883    with a vspltisb, vspltish or vspltisw.  */
2884
2885 bool
2886 easy_altivec_constant (rtx op, enum machine_mode mode)
2887 {
2888   unsigned step, copies;
2889
2890   if (mode == VOIDmode)
2891     mode = GET_MODE (op);
2892   else if (mode != GET_MODE (op))
2893     return false;
2894
2895   /* Start with a vspltisw.  */
2896   step = GET_MODE_NUNITS (mode) / 4;
2897   copies = 1;
2898
2899   if (vspltis_constant (op, step, copies))
2900     return true;
2901
2902   /* Then try with a vspltish.  */
2903   if (step == 1)
2904     copies <<= 1;
2905   else
2906     step >>= 1;
2907
2908   if (vspltis_constant (op, step, copies))
2909     return true;
2910
2911   /* And finally a vspltisb.  */
2912   if (step == 1)
2913     copies <<= 1;
2914   else
2915     step >>= 1;
2916
2917   if (vspltis_constant (op, step, copies))
2918     return true;
2919
2920   return false;
2921 }
2922
2923 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
2924    result is OP.  Abort if it is not possible.  */
2925
2926 rtx
2927 gen_easy_altivec_constant (rtx op)
2928 {
2929   enum machine_mode mode = GET_MODE (op);
2930   int nunits = GET_MODE_NUNITS (mode);
2931   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
2932   unsigned step = nunits / 4;
2933   unsigned copies = 1;
2934
2935   /* Start with a vspltisw.  */
2936   if (vspltis_constant (op, step, copies))
2937     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
2938
2939   /* Then try with a vspltish.  */
2940   if (step == 1)
2941     copies <<= 1;
2942   else
2943     step >>= 1;
2944
2945   if (vspltis_constant (op, step, copies))
2946     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
2947
2948   /* And finally a vspltisb.  */
2949   if (step == 1)
2950     copies <<= 1;
2951   else
2952     step >>= 1;
2953
2954   if (vspltis_constant (op, step, copies))
2955     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
2956
2957   gcc_unreachable ();
2958 }
2959
2960 const char *
2961 output_vec_const_move (rtx *operands)
2962 {
2963   int cst, cst2;
2964   enum machine_mode mode;
2965   rtx dest, vec;
2966
2967   dest = operands[0];
2968   vec = operands[1];
2969   mode = GET_MODE (dest);
2970
2971   if (TARGET_ALTIVEC)
2972     {
2973       rtx splat_vec;
2974       if (zero_constant (vec, mode))
2975         return "vxor %0,%0,%0";
2976
2977       splat_vec = gen_easy_altivec_constant (vec);
2978       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
2979       operands[1] = XEXP (splat_vec, 0);
2980       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
2981         return "#";
2982
2983       switch (GET_MODE (splat_vec))
2984         {
2985         case V4SImode:
2986           return "vspltisw %0,%1";
2987
2988         case V8HImode:
2989           return "vspltish %0,%1";
2990
2991         case V16QImode:
2992           return "vspltisb %0,%1";
2993
2994         default:
2995           gcc_unreachable ();
2996         }
2997     }
2998
2999   gcc_assert (TARGET_SPE);
3000
3001   /* Vector constant 0 is handled as a splitter of V2SI, and in the
3002      pattern of V1DI, V4HI, and V2SF.
3003
3004      FIXME: We should probably return # and add post reload
3005      splitters for these, but this way is so easy ;-).  */
3006   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
3007   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
3008   operands[1] = CONST_VECTOR_ELT (vec, 0);
3009   operands[2] = CONST_VECTOR_ELT (vec, 1);
3010   if (cst == cst2)
3011     return "li %0,%1\n\tevmergelo %0,%0,%0";
3012   else
3013     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
3014 }
3015
3016 /* Initialize TARGET of vector PAIRED to VALS.  */
3017
3018 void
3019 paired_expand_vector_init (rtx target, rtx vals)
3020 {
3021   enum machine_mode mode = GET_MODE (target);
3022   int n_elts = GET_MODE_NUNITS (mode);
3023   int n_var = 0;
3024   rtx x, new_rtx, tmp, constant_op, op1, op2;
3025   int i;
3026
3027   for (i = 0; i < n_elts; ++i)
3028     {
3029       x = XVECEXP (vals, 0, i);
3030       if (!CONSTANT_P (x))
3031         ++n_var;
3032     }
3033   if (n_var == 0)
3034     {
3035       /* Load from constant pool.  */
3036       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
3037       return;
3038     }
3039
3040   if (n_var == 2)
3041     {
3042       /* The vector is initialized only with non-constants.  */
3043       new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
3044                                 XVECEXP (vals, 0, 1));
3045
3046       emit_move_insn (target, new_rtx);
3047       return;
3048     }
3049   
3050   /* One field is non-constant and the other one is a constant.  Load the
3051      constant from the constant pool and use ps_merge instruction to
3052      construct the whole vector.  */
3053   op1 = XVECEXP (vals, 0, 0);
3054   op2 = XVECEXP (vals, 0, 1);
3055
3056   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
3057
3058   tmp = gen_reg_rtx (GET_MODE (constant_op));
3059   emit_move_insn (tmp, constant_op);
3060
3061   if (CONSTANT_P (op1))
3062     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
3063   else
3064     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
3065
3066   emit_move_insn (target, new_rtx);
3067 }
3068
3069 void
3070 paired_expand_vector_move (rtx operands[])
3071 {
3072   rtx op0 = operands[0], op1 = operands[1];
3073
3074   emit_move_insn (op0, op1);
3075 }
3076
3077 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
3078    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
3079    operands for the relation operation COND.  This is a recursive
3080    function.  */
3081
3082 static void
3083 paired_emit_vector_compare (enum rtx_code rcode,
3084                             rtx dest, rtx op0, rtx op1,
3085                             rtx cc_op0, rtx cc_op1)
3086 {
3087   rtx tmp = gen_reg_rtx (V2SFmode);
3088   rtx tmp1, max, min, equal_zero;
3089
3090   gcc_assert (TARGET_PAIRED_FLOAT);
3091   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
3092
3093   switch (rcode)
3094     {
3095     case LT:
3096     case LTU:
3097       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
3098       return;
3099     case GE:
3100     case GEU:
3101       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
3102       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
3103       return;
3104     case LE:
3105     case LEU:
3106       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
3107       return;
3108     case GT:
3109       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
3110       return;
3111     case EQ:
3112       tmp1 = gen_reg_rtx (V2SFmode);
3113       max = gen_reg_rtx (V2SFmode);
3114       min = gen_reg_rtx (V2SFmode);
3115       equal_zero = gen_reg_rtx (V2SFmode);
3116
3117       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
3118       emit_insn (gen_selv2sf4
3119                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
3120       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
3121       emit_insn (gen_selv2sf4
3122                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
3123       emit_insn (gen_subv2sf3 (tmp1, min, max));
3124       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
3125       return;
3126     case NE:
3127       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
3128       return;
3129     case UNLE:
3130       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
3131       return;
3132     case UNLT:
3133       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
3134       return;
3135     case UNGE:
3136       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
3137       return;
3138     case UNGT:
3139       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
3140       return;
3141     default:
3142       gcc_unreachable ();
3143     }
3144
3145   return;
3146 }
3147
3148 /* Emit vector conditional expression.
3149    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
3150    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
3151
3152 int
3153 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
3154                               rtx cond, rtx cc_op0, rtx cc_op1)
3155 {
3156   enum rtx_code rcode = GET_CODE (cond);
3157
3158   if (!TARGET_PAIRED_FLOAT)
3159     return 0;
3160
3161   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
3162
3163   return 1;
3164 }
3165
3166 /* Initialize vector TARGET to VALS.  */
3167
3168 void
3169 rs6000_expand_vector_init (rtx target, rtx vals)
3170 {
3171   enum machine_mode mode = GET_MODE (target);
3172   enum machine_mode inner_mode = GET_MODE_INNER (mode);
3173   int n_elts = GET_MODE_NUNITS (mode);
3174   int n_var = 0, one_var = -1;
3175   bool all_same = true, all_const_zero = true;
3176   rtx x, mem;
3177   int i;
3178
3179   for (i = 0; i < n_elts; ++i)
3180     {
3181       x = XVECEXP (vals, 0, i);
3182       if (!CONSTANT_P (x))
3183         ++n_var, one_var = i;
3184       else if (x != CONST0_RTX (inner_mode))
3185         all_const_zero = false;
3186
3187       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
3188         all_same = false;
3189     }
3190
3191   if (n_var == 0)
3192     {
3193       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
3194       if (mode != V4SFmode && all_const_zero)
3195         {
3196           /* Zero register.  */
3197           emit_insn (gen_rtx_SET (VOIDmode, target,
3198                                   gen_rtx_XOR (mode, target, target)));
3199           return;
3200         }
3201       else if (mode != V4SFmode && easy_vector_constant (const_vec, mode))
3202         {
3203           /* Splat immediate.  */
3204           emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
3205           return;
3206         }
3207       else if (all_same)
3208         ;       /* Splat vector element.  */
3209       else
3210         {
3211           /* Load from constant pool.  */
3212           emit_move_insn (target, const_vec);
3213           return;
3214         }
3215     }
3216
3217   /* Store value to stack temp.  Load vector element.  Splat.  */
3218   if (all_same)
3219     {
3220       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
3221       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
3222                       XVECEXP (vals, 0, 0));
3223       x = gen_rtx_UNSPEC (VOIDmode,
3224                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
3225       emit_insn (gen_rtx_PARALLEL (VOIDmode,
3226                                    gen_rtvec (2,
3227                                               gen_rtx_SET (VOIDmode,
3228                                                            target, mem),
3229                                               x)));
3230       x = gen_rtx_VEC_SELECT (inner_mode, target,
3231                               gen_rtx_PARALLEL (VOIDmode,
3232                                                 gen_rtvec (1, const0_rtx)));
3233       emit_insn (gen_rtx_SET (VOIDmode, target,
3234                               gen_rtx_VEC_DUPLICATE (mode, x)));
3235       return;
3236     }
3237
3238   /* One field is non-constant.  Load constant then overwrite
3239      varying field.  */
3240   if (n_var == 1)
3241     {
3242       rtx copy = copy_rtx (vals);
3243
3244       /* Load constant part of vector, substitute neighboring value for
3245          varying element.  */
3246       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
3247       rs6000_expand_vector_init (target, copy);
3248
3249       /* Insert variable.  */
3250       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
3251       return;
3252     }
3253
3254   /* Construct the vector in memory one field at a time
3255      and load the whole vector.  */
3256   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
3257   for (i = 0; i < n_elts; i++)
3258     emit_move_insn (adjust_address_nv (mem, inner_mode,
3259                                     i * GET_MODE_SIZE (inner_mode)),
3260                     XVECEXP (vals, 0, i));
3261   emit_move_insn (target, mem);
3262 }
3263
3264 /* Set field ELT of TARGET to VAL.  */
3265
3266 void
3267 rs6000_expand_vector_set (rtx target, rtx val, int elt)
3268 {
3269   enum machine_mode mode = GET_MODE (target);
3270   enum machine_mode inner_mode = GET_MODE_INNER (mode);
3271   rtx reg = gen_reg_rtx (mode);
3272   rtx mask, mem, x;
3273   int width = GET_MODE_SIZE (inner_mode);
3274   int i;
3275
3276   /* Load single variable value.  */
3277   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
3278   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
3279   x = gen_rtx_UNSPEC (VOIDmode,
3280                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
3281   emit_insn (gen_rtx_PARALLEL (VOIDmode,
3282                                gen_rtvec (2,
3283                                           gen_rtx_SET (VOIDmode,
3284                                                        reg, mem),
3285                                           x)));
3286
3287   /* Linear sequence.  */
3288   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
3289   for (i = 0; i < 16; ++i)
3290     XVECEXP (mask, 0, i) = GEN_INT (i);
3291
3292   /* Set permute mask to insert element into target.  */
3293   for (i = 0; i < width; ++i)
3294     XVECEXP (mask, 0, elt*width + i)
3295       = GEN_INT (i + 0x10);
3296   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
3297   x = gen_rtx_UNSPEC (mode,
3298                       gen_rtvec (3, target, reg,
3299                                  force_reg (V16QImode, x)),
3300                       UNSPEC_VPERM);
3301   emit_insn (gen_rtx_SET (VOIDmode, target, x));
3302 }
3303
3304 /* Extract field ELT from VEC into TARGET.  */
3305
3306 void
3307 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
3308 {
3309   enum machine_mode mode = GET_MODE (vec);
3310   enum machine_mode inner_mode = GET_MODE_INNER (mode);
3311   rtx mem, x;
3312
3313   /* Allocate mode-sized buffer.  */
3314   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
3315
3316   /* Add offset to field within buffer matching vector element.  */
3317   mem = adjust_address_nv (mem, mode, elt * GET_MODE_SIZE (inner_mode));
3318
3319   /* Store single field into mode-sized buffer.  */
3320   x = gen_rtx_UNSPEC (VOIDmode,
3321                       gen_rtvec (1, const0_rtx), UNSPEC_STVE);
3322   emit_insn (gen_rtx_PARALLEL (VOIDmode,
3323                                gen_rtvec (2,
3324                                           gen_rtx_SET (VOIDmode,
3325                                                        mem, vec),
3326                                           x)));
3327   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
3328 }
3329
3330 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
3331    implement ANDing by the mask IN.  */
3332 void
3333 build_mask64_2_operands (rtx in, rtx *out)
3334 {
3335 #if HOST_BITS_PER_WIDE_INT >= 64
3336   unsigned HOST_WIDE_INT c, lsb, m1, m2;
3337   int shift;
3338
3339   gcc_assert (GET_CODE (in) == CONST_INT);
3340
3341   c = INTVAL (in);
3342   if (c & 1)
3343     {
3344       /* Assume c initially something like 0x00fff000000fffff.  The idea
3345          is to rotate the word so that the middle ^^^^^^ group of zeros
3346          is at the MS end and can be cleared with an rldicl mask.  We then
3347          rotate back and clear off the MS    ^^ group of zeros with a
3348          second rldicl.  */
3349       c = ~c;                   /*   c == 0xff000ffffff00000 */
3350       lsb = c & -c;             /* lsb == 0x0000000000100000 */
3351       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
3352       c = ~c;                   /*   c == 0x00fff000000fffff */
3353       c &= -lsb;                /*   c == 0x00fff00000000000 */
3354       lsb = c & -c;             /* lsb == 0x0000100000000000 */
3355       c = ~c;                   /*   c == 0xff000fffffffffff */
3356       c &= -lsb;                /*   c == 0xff00000000000000 */
3357       shift = 0;
3358       while ((lsb >>= 1) != 0)
3359         shift++;                /* shift == 44 on exit from loop */
3360       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
3361       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
3362       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
3363     }
3364   else
3365     {
3366       /* Assume c initially something like 0xff000f0000000000.  The idea
3367          is to rotate the word so that the     ^^^  middle group of zeros
3368          is at the LS end and can be cleared with an rldicr mask.  We then
3369          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
3370          a second rldicr.  */
3371       lsb = c & -c;             /* lsb == 0x0000010000000000 */
3372       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
3373       c = ~c;                   /*   c == 0x00fff0ffffffffff */
3374       c &= -lsb;                /*   c == 0x00fff00000000000 */
3375       lsb = c & -c;             /* lsb == 0x0000100000000000 */
3376       c = ~c;                   /*   c == 0xff000fffffffffff */
3377       c &= -lsb;                /*   c == 0xff00000000000000 */
3378       shift = 0;
3379       while ((lsb >>= 1) != 0)
3380         shift++;                /* shift == 44 on exit from loop */
3381       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
3382       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
3383       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
3384     }
3385
3386   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
3387      masks will be all 1's.  We are guaranteed more than one transition.  */
3388   out[0] = GEN_INT (64 - shift);
3389   out[1] = GEN_INT (m1);
3390   out[2] = GEN_INT (shift);
3391   out[3] = GEN_INT (m2);
3392 #else
3393   (void)in;
3394   (void)out;
3395   gcc_unreachable ();
3396 #endif
3397 }
3398
3399 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
3400
3401 bool
3402 invalid_e500_subreg (rtx op, enum machine_mode mode)
3403 {
3404   if (TARGET_E500_DOUBLE)
3405     {
3406       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
3407          subreg:TI and reg:TF.  Decimal float modes are like integer
3408          modes (only low part of each register used) for this
3409          purpose.  */
3410       if (GET_CODE (op) == SUBREG
3411           && (mode == SImode || mode == DImode || mode == TImode
3412               || mode == DDmode || mode == TDmode)
3413           && REG_P (SUBREG_REG (op))
3414           && (GET_MODE (SUBREG_REG (op)) == DFmode
3415               || GET_MODE (SUBREG_REG (op)) == TFmode))
3416         return true;
3417
3418       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
3419          reg:TI.  */
3420       if (GET_CODE (op) == SUBREG
3421           && (mode == DFmode || mode == TFmode)
3422           && REG_P (SUBREG_REG (op))
3423           && (GET_MODE (SUBREG_REG (op)) == DImode
3424               || GET_MODE (SUBREG_REG (op)) == TImode
3425               || GET_MODE (SUBREG_REG (op)) == DDmode
3426               || GET_MODE (SUBREG_REG (op)) == TDmode))
3427         return true;
3428     }
3429
3430   if (TARGET_SPE
3431       && GET_CODE (op) == SUBREG
3432       && mode == SImode
3433       && REG_P (SUBREG_REG (op))
3434       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
3435     return true;
3436
3437   return false;
3438 }
3439
3440 /* AIX increases natural record alignment to doubleword if the first
3441    field is an FP double while the FP fields remain word aligned.  */
3442
3443 unsigned int
3444 rs6000_special_round_type_align (tree type, unsigned int computed,
3445                                  unsigned int specified)
3446 {
3447   unsigned int align = MAX (computed, specified);
3448   tree field = TYPE_FIELDS (type);
3449
3450   /* Skip all non field decls */
3451   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
3452     field = TREE_CHAIN (field);
3453
3454   if (field != NULL && field != type)
3455     {
3456       type = TREE_TYPE (field);
3457       while (TREE_CODE (type) == ARRAY_TYPE)
3458         type = TREE_TYPE (type);
3459
3460       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
3461         align = MAX (align, 64);
3462     }
3463
3464   return align;
3465 }
3466
3467 /* Darwin increases record alignment to the natural alignment of
3468    the first field.  */
3469
3470 unsigned int
3471 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
3472                                         unsigned int specified)
3473 {
3474   unsigned int align = MAX (computed, specified);
3475
3476   if (TYPE_PACKED (type))
3477     return align;
3478
3479   /* Find the first field, looking down into aggregates.  */
3480   do {
3481     tree field = TYPE_FIELDS (type);
3482     /* Skip all non field decls */
3483     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
3484       field = TREE_CHAIN (field);
3485     if (! field)
3486       break;
3487     type = TREE_TYPE (field);
3488     while (TREE_CODE (type) == ARRAY_TYPE)
3489       type = TREE_TYPE (type);
3490   } while (AGGREGATE_TYPE_P (type));
3491
3492   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
3493     align = MAX (align, TYPE_ALIGN (type));
3494
3495   return align;
3496 }
3497
3498 /* Return 1 for an operand in small memory on V.4/eabi.  */
3499
3500 int
3501 small_data_operand (rtx op ATTRIBUTE_UNUSED,
3502                     enum machine_mode mode ATTRIBUTE_UNUSED)
3503 {
3504 #if TARGET_ELF
3505   rtx sym_ref;
3506
3507   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
3508     return 0;
3509
3510   if (DEFAULT_ABI != ABI_V4)
3511     return 0;
3512
3513   /* Vector and float memory instructions have a limited offset on the
3514      SPE, so using a vector or float variable directly as an operand is
3515      not useful.  */
3516   if (TARGET_SPE
3517       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
3518     return 0;
3519
3520   if (GET_CODE (op) == SYMBOL_REF)
3521     sym_ref = op;
3522
3523   else if (GET_CODE (op) != CONST
3524            || GET_CODE (XEXP (op, 0)) != PLUS
3525            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
3526            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
3527     return 0;
3528
3529   else
3530     {
3531       rtx sum = XEXP (op, 0);
3532       HOST_WIDE_INT summand;
3533
3534       /* We have to be careful here, because it is the referenced address
3535          that must be 32k from _SDA_BASE_, not just the symbol.  */
3536       summand = INTVAL (XEXP (sum, 1));
3537       if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
3538         return 0;
3539
3540       sym_ref = XEXP (sum, 0);
3541     }
3542
3543   return SYMBOL_REF_SMALL_P (sym_ref);
3544 #else
3545   return 0;
3546 #endif
3547 }
3548
3549 /* Return true if either operand is a general purpose register.  */
3550
3551 bool
3552 gpr_or_gpr_p (rtx op0, rtx op1)
3553 {
3554   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
3555           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
3556 }
3557
3558 \f
3559 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address.  */
3560
3561 static bool
3562 constant_pool_expr_p (rtx op)
3563 {
3564   rtx base, offset;
3565
3566   split_const (op, &base, &offset);
3567   return (GET_CODE (base) == SYMBOL_REF
3568           && CONSTANT_POOL_ADDRESS_P (base)
3569           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
3570 }
3571
3572 bool
3573 toc_relative_expr_p (rtx op)
3574 {
3575   rtx base, offset;
3576
3577   if (GET_CODE (op) != CONST)
3578     return false;
3579
3580   split_const (op, &base, &offset);
3581   return (GET_CODE (base) == UNSPEC
3582           && XINT (base, 1) == UNSPEC_TOCREL);
3583 }
3584
3585 bool
3586 legitimate_constant_pool_address_p (rtx x)
3587 {
3588   return (TARGET_TOC
3589           && GET_CODE (x) == PLUS
3590           && GET_CODE (XEXP (x, 0)) == REG
3591           && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
3592           && toc_relative_expr_p (XEXP (x, 1)));
3593 }
3594
3595 static bool
3596 legitimate_small_data_p (enum machine_mode mode, rtx x)
3597 {
3598   return (DEFAULT_ABI == ABI_V4
3599           && !flag_pic && !TARGET_TOC
3600           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
3601           && small_data_operand (x, mode));
3602 }
3603
3604 /* SPE offset addressing is limited to 5-bits worth of double words.  */
3605 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
3606
3607 bool
3608 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
3609 {
3610   unsigned HOST_WIDE_INT offset, extra;
3611
3612   if (GET_CODE (x) != PLUS)
3613     return false;
3614   if (GET_CODE (XEXP (x, 0)) != REG)
3615     return false;
3616   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
3617     return false;
3618   if (legitimate_constant_pool_address_p (x))
3619     return true;
3620   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3621     return false;
3622
3623   offset = INTVAL (XEXP (x, 1));
3624   extra = 0;
3625   switch (mode)
3626     {
3627     case V16QImode:
3628     case V8HImode:
3629     case V4SFmode:
3630     case V4SImode:
3631       /* AltiVec vector modes.  Only reg+reg addressing is valid and
3632          constant offset zero should not occur due to canonicalization.  */
3633       return false;
3634
3635     case V4HImode:
3636     case V2SImode:
3637     case V1DImode:
3638     case V2SFmode:
3639        /* Paired vector modes.  Only reg+reg addressing is valid and
3640           constant offset zero should not occur due to canonicalization.  */
3641       if (TARGET_PAIRED_FLOAT)
3642         return false;
3643       /* SPE vector modes.  */
3644       return SPE_CONST_OFFSET_OK (offset);
3645
3646     case DFmode:
3647       if (TARGET_E500_DOUBLE)
3648         return SPE_CONST_OFFSET_OK (offset);
3649
3650     case DDmode:
3651     case DImode:
3652       /* On e500v2, we may have:
3653
3654            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
3655
3656          Which gets addressed with evldd instructions.  */
3657       if (TARGET_E500_DOUBLE)
3658         return SPE_CONST_OFFSET_OK (offset);
3659
3660       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
3661         extra = 4;
3662       else if (offset & 3)
3663         return false;
3664       break;
3665
3666     case TFmode:
3667       if (TARGET_E500_DOUBLE)
3668         return (SPE_CONST_OFFSET_OK (offset)
3669                 && SPE_CONST_OFFSET_OK (offset + 8));
3670
3671     case TDmode:
3672     case TImode:
3673       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
3674         extra = 12;
3675       else if (offset & 3)
3676         return false;
3677       else
3678         extra = 8;
3679       break;
3680
3681     default:
3682       break;
3683     }
3684
3685   offset += 0x8000;
3686   return (offset < 0x10000) && (offset + extra < 0x10000);
3687 }
3688
3689 bool
3690 legitimate_indexed_address_p (rtx x, int strict)
3691 {
3692   rtx op0, op1;
3693
3694   if (GET_CODE (x) != PLUS)
3695     return false;
3696
3697   op0 = XEXP (x, 0);
3698   op1 = XEXP (x, 1);
3699
3700   /* Recognize the rtl generated by reload which we know will later be
3701      replaced with proper base and index regs.  */
3702   if (!strict
3703       && reload_in_progress
3704       && (REG_P (op0) || GET_CODE (op0) == PLUS)
3705       && REG_P (op1))
3706     return true;
3707
3708   return (REG_P (op0) && REG_P (op1)
3709           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
3710                && INT_REG_OK_FOR_INDEX_P (op1, strict))
3711               || (INT_REG_OK_FOR_BASE_P (op1, strict)
3712                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
3713 }
3714
3715 bool
3716 avoiding_indexed_address_p (enum machine_mode mode)
3717 {
3718   /* Avoid indexed addressing for modes that have non-indexed
3719      load/store instruction forms.  */
3720   return TARGET_AVOID_XFORM && !ALTIVEC_VECTOR_MODE (mode);
3721 }
3722
3723 inline bool
3724 legitimate_indirect_address_p (rtx x, int strict)
3725 {
3726   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
3727 }
3728
3729 bool
3730 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
3731 {
3732   if (!TARGET_MACHO || !flag_pic
3733       || mode != SImode || GET_CODE (x) != MEM)
3734     return false;
3735   x = XEXP (x, 0);
3736
3737   if (GET_CODE (x) != LO_SUM)
3738     return false;
3739   if (GET_CODE (XEXP (x, 0)) != REG)
3740     return false;
3741   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
3742     return false;
3743   x = XEXP (x, 1);
3744
3745   return CONSTANT_P (x);
3746 }
3747
3748 static bool
3749 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
3750 {
3751   if (GET_CODE (x) != LO_SUM)
3752     return false;
3753   if (GET_CODE (XEXP (x, 0)) != REG)
3754     return false;
3755   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
3756     return false;
3757   /* Restrict addressing for DI because of our SUBREG hackery.  */
3758   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
3759                              || mode == DDmode || mode == TDmode
3760                              || mode == DImode))
3761     return false;
3762   x = XEXP (x, 1);
3763
3764   if (TARGET_ELF || TARGET_MACHO)
3765     {
3766       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
3767         return false;
3768       if (TARGET_TOC)
3769         return false;
3770       if (GET_MODE_NUNITS (mode) != 1)
3771         return false;
3772       if (GET_MODE_BITSIZE (mode) > 64
3773           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
3774               && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
3775                    && (mode == DFmode || mode == DDmode))))
3776         return false;
3777
3778       return CONSTANT_P (x);
3779     }
3780
3781   return false;
3782 }
3783
3784
3785 /* Try machine-dependent ways of modifying an illegitimate address
3786    to be legitimate.  If we find one, return the new, valid address.
3787    This is used from only one place: `memory_address' in explow.c.
3788
3789    OLDX is the address as it was before break_out_memory_refs was
3790    called.  In some cases it is useful to look at this to decide what
3791    needs to be done.
3792
3793    MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
3794
3795    It is always safe for this function to do nothing.  It exists to
3796    recognize opportunities to optimize the output.
3797
3798    On RS/6000, first check for the sum of a register with a constant
3799    integer that is out of range.  If so, generate code to add the
3800    constant with the low-order 16 bits masked to the register and force
3801    this result into another register (this can be done with `cau').
3802    Then generate an address of REG+(CONST&0xffff), allowing for the
3803    possibility of bit 16 being a one.
3804
3805    Then check for the sum of a register and something not constant, try to
3806    load the other things into a register and return the sum.  */
3807
3808 rtx
3809 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3810                            enum machine_mode mode)
3811 {
3812   if (GET_CODE (x) == SYMBOL_REF)
3813     {
3814       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
3815       if (model != 0)
3816         return rs6000_legitimize_tls_address (x, model);
3817     }
3818
3819   if (GET_CODE (x) == PLUS
3820       && GET_CODE (XEXP (x, 0)) == REG
3821       && GET_CODE (XEXP (x, 1)) == CONST_INT
3822       && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000
3823       && !((TARGET_POWERPC64
3824             && (mode == DImode || mode == TImode)
3825             && (INTVAL (XEXP (x, 1)) & 3) != 0)
3826            || SPE_VECTOR_MODE (mode)
3827            || ALTIVEC_VECTOR_MODE (mode)
3828            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
3829                                       || mode == DImode || mode == DDmode
3830                                       || mode == TDmode))))
3831     {
3832       HOST_WIDE_INT high_int, low_int;
3833       rtx sum;
3834       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
3835       high_int = INTVAL (XEXP (x, 1)) - low_int;
3836       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
3837                                          GEN_INT (high_int)), 0);
3838       return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
3839     }
3840   else if (GET_CODE (x) == PLUS
3841            && GET_CODE (XEXP (x, 0)) == REG
3842            && GET_CODE (XEXP (x, 1)) != CONST_INT
3843            && GET_MODE_NUNITS (mode) == 1
3844            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
3845                || TARGET_POWERPC64
3846                || ((mode != DImode && mode != DFmode && mode != DDmode)
3847                    || (TARGET_E500_DOUBLE && mode != DDmode)))
3848            && (TARGET_POWERPC64 || mode != DImode)
3849            && !avoiding_indexed_address_p (mode)
3850            && mode != TImode
3851            && mode != TFmode
3852            && mode != TDmode)
3853     {
3854       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
3855                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
3856     }
3857   else if (ALTIVEC_VECTOR_MODE (mode))
3858     {
3859       rtx reg;
3860
3861       /* Make sure both operands are registers.  */
3862       if (GET_CODE (x) == PLUS)
3863         return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
3864                              force_reg (Pmode, XEXP (x, 1)));
3865
3866       reg = force_reg (Pmode, x);
3867       return reg;
3868     }
3869   else if (SPE_VECTOR_MODE (mode)
3870            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
3871                                       || mode == DDmode || mode == TDmode
3872                                       || mode == DImode)))
3873     {
3874       if (mode == DImode)
3875         return x;
3876       /* We accept [reg + reg] and [reg + OFFSET].  */
3877
3878       if (GET_CODE (x) == PLUS)
3879        {
3880          rtx op1 = XEXP (x, 0);
3881          rtx op2 = XEXP (x, 1);
3882          rtx y;
3883
3884          op1 = force_reg (Pmode, op1);
3885
3886          if (GET_CODE (op2) != REG
3887              && (GET_CODE (op2) != CONST_INT
3888                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
3889                  || (GET_MODE_SIZE (mode) > 8
3890                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
3891            op2 = force_reg (Pmode, op2);
3892
3893          /* We can't always do [reg + reg] for these, because [reg +
3894             reg + offset] is not a legitimate addressing mode.  */
3895          y = gen_rtx_PLUS (Pmode, op1, op2);
3896
3897          if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
3898            return force_reg (Pmode, y);
3899          else
3900            return y;
3901        }
3902
3903       return force_reg (Pmode, x);
3904     }
3905   else if (TARGET_ELF
3906            && TARGET_32BIT
3907            && TARGET_NO_TOC
3908            && ! flag_pic
3909            && GET_CODE (x) != CONST_INT
3910            && GET_CODE (x) != CONST_DOUBLE
3911            && CONSTANT_P (x)
3912            && GET_MODE_NUNITS (mode) == 1
3913            && (GET_MODE_BITSIZE (mode) <= 32
3914                || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
3915                    && (mode == DFmode || mode == DDmode))))
3916     {
3917       rtx reg = gen_reg_rtx (Pmode);
3918       emit_insn (gen_elf_high (reg, x));
3919       return gen_rtx_LO_SUM (Pmode, reg, x);
3920     }
3921   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
3922            && ! flag_pic
3923 #if TARGET_MACHO
3924            && ! MACHO_DYNAMIC_NO_PIC_P
3925 #endif
3926            && GET_CODE (x) != CONST_INT
3927            && GET_CODE (x) != CONST_DOUBLE
3928            && CONSTANT_P (x)
3929            && GET_MODE_NUNITS (mode) == 1
3930            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
3931                || (mode != DFmode && mode != DDmode))
3932            && mode != DImode
3933            && mode != TImode)
3934     {
3935       rtx reg = gen_reg_rtx (Pmode);
3936       emit_insn (gen_macho_high (reg, x));
3937       return gen_rtx_LO_SUM (Pmode, reg, x);
3938     }
3939   else if (TARGET_TOC
3940            && GET_CODE (x) == SYMBOL_REF
3941            && constant_pool_expr_p (x)
3942            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
3943     {
3944       return create_TOC_reference (x);
3945     }
3946   else
3947     return x;
3948 }
3949
3950 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
3951    We need to emit DTP-relative relocations.  */
3952
3953 static void
3954 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
3955 {
3956   switch (size)
3957     {
3958     case 4:
3959       fputs ("\t.long\t", file);
3960       break;
3961     case 8:
3962       fputs (DOUBLE_INT_ASM_OP, file);
3963       break;
3964     default:
3965       gcc_unreachable ();
3966     }
3967   output_addr_const (file, x);
3968   fputs ("@dtprel+0x8000", file);
3969 }
3970
3971 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
3972
3973 static GTY(()) rtx rs6000_tls_symbol;
3974 static rtx
3975 rs6000_tls_get_addr (void)
3976 {
3977   if (!rs6000_tls_symbol)
3978     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
3979
3980   return rs6000_tls_symbol;
3981 }
3982
3983 /* Construct the SYMBOL_REF for TLS GOT references.  */
3984
3985 static GTY(()) rtx rs6000_got_symbol;
3986 static rtx
3987 rs6000_got_sym (void)
3988 {
3989   if (!rs6000_got_symbol)
3990     {
3991       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3992       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
3993       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
3994     }
3995
3996   return rs6000_got_symbol;
3997 }
3998
3999 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
4000    this (thread-local) address.  */
4001
4002 static rtx
4003 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
4004 {
4005   rtx dest, insn;
4006
4007   dest = gen_reg_rtx (Pmode);
4008   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
4009     {
4010       rtx tlsreg;
4011
4012       if (TARGET_64BIT)
4013         {
4014           tlsreg = gen_rtx_REG (Pmode, 13);
4015           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
4016         }
4017       else
4018         {
4019           tlsreg = gen_rtx_REG (Pmode, 2);
4020           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
4021         }
4022       emit_insn (insn);
4023     }
4024   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
4025     {
4026       rtx tlsreg, tmp;
4027
4028       tmp = gen_reg_rtx (Pmode);
4029       if (TARGET_64BIT)
4030         {
4031           tlsreg = gen_rtx_REG (Pmode, 13);
4032           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
4033         }
4034       else
4035         {
4036           tlsreg = gen_rtx_REG (Pmode, 2);
4037           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
4038         }
4039       emit_insn (insn);
4040       if (TARGET_64BIT)
4041         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
4042       else
4043         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
4044       emit_insn (insn);
4045     }
4046   else
4047     {
4048       rtx r3, got, tga, tmp1, tmp2, eqv;
4049
4050       /* We currently use relocations like @got@tlsgd for tls, which
4051          means the linker will handle allocation of tls entries, placing
4052          them in the .got section.  So use a pointer to the .got section,
4053          not one to secondary TOC sections used by 64-bit -mminimal-toc,
4054          or to secondary GOT sections used by 32-bit -fPIC.  */
4055       if (TARGET_64BIT)
4056         got = gen_rtx_REG (Pmode, 2);
4057       else
4058         {
4059           if (flag_pic == 1)
4060             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
4061           else
4062             {
4063               rtx gsym = rs6000_got_sym ();
4064               got = gen_reg_rtx (Pmode);
4065               if (flag_pic == 0)
4066                 rs6000_emit_move (got, gsym, Pmode);
4067               else
4068                 {
4069                   rtx tmp3, mem;
4070                   rtx first, last;
4071
4072                   tmp1 = gen_reg_rtx (Pmode);
4073                   tmp2 = gen_reg_rtx (Pmode);
4074                   tmp3 = gen_reg_rtx (Pmode);
4075                   mem = gen_const_mem (Pmode, tmp1);
4076
4077                   first = emit_insn (gen_load_toc_v4_PIC_1b (gsym));
4078                   emit_move_insn (tmp1,
4079                                   gen_rtx_REG (Pmode, LR_REGNO));
4080                   emit_move_insn (tmp2, mem);
4081                   emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
4082                   last = emit_move_insn (got, tmp3);
4083                   set_unique_reg_note (last, REG_EQUAL, gsym);
4084                 }
4085             }
4086         }
4087
4088       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
4089         {
4090           r3 = gen_rtx_REG (Pmode, 3);
4091           tga = rs6000_tls_get_addr ();
4092
4093           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
4094             insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
4095           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
4096             insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
4097           else if (DEFAULT_ABI == ABI_V4)
4098             insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
4099           else
4100             gcc_unreachable ();
4101
4102           start_sequence ();
4103           insn = emit_call_insn (insn);
4104           RTL_CONST_CALL_P (insn) = 1;
4105           use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
4106           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
4107             use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
4108           insn = get_insns ();
4109           end_sequence ();
4110           emit_libcall_block (insn, dest, r3, addr);
4111         }
4112       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
4113         {
4114           r3 = gen_rtx_REG (Pmode, 3);
4115           tga = rs6000_tls_get_addr ();
4116
4117           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
4118             insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
4119           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
4120             insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
4121           else if (DEFAULT_ABI == ABI_V4)
4122             insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
4123           else
4124             gcc_unreachable ();
4125
4126           start_sequence ();
4127           insn = emit_call_insn (insn);
4128           RTL_CONST_CALL_P (insn) = 1;
4129           use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
4130           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
4131             use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
4132           insn = get_insns ();
4133           end_sequence ();
4134           tmp1 = gen_reg_rtx (Pmode);
4135           eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
4136                                 UNSPEC_TLSLD);
4137           emit_libcall_block (insn, tmp1, r3, eqv);
4138           if (rs6000_tls_size == 16)
4139             {
4140               if (TARGET_64BIT)
4141                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
4142               else
4143                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
4144             }
4145           else if (rs6000_tls_size == 32)
4146             {
4147               tmp2 = gen_reg_rtx (Pmode);
4148               if (TARGET_64BIT)
4149                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
4150               else
4151                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
4152               emit_insn (insn);
4153               if (TARGET_64BIT)
4154                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
4155               else
4156                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
4157             }
4158           else
4159             {
4160               tmp2 = gen_reg_rtx (Pmode);
4161               if (TARGET_64BIT)
4162                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
4163               else
4164                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
4165               emit_insn (insn);
4166               insn = gen_rtx_SET (Pmode, dest,
4167                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
4168             }
4169           emit_insn (insn);
4170         }
4171       else
4172         {
4173           /* IE, or 64-bit offset LE.  */
4174           tmp2 = gen_reg_rtx (Pmode);
4175           if (TARGET_64BIT)
4176             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
4177           else
4178             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
4179           emit_insn (insn);
4180           if (TARGET_64BIT)
4181             insn = gen_tls_tls_64 (dest, tmp2, addr);
4182           else
4183             insn = gen_tls_tls_32 (dest, tmp2, addr);
4184           emit_insn (insn);
4185         }
4186     }
4187
4188   return dest;
4189 }
4190
4191 /* Return 1 if X contains a thread-local symbol.  */
4192
4193 bool
4194 rs6000_tls_referenced_p (rtx x)
4195 {
4196   if (! TARGET_HAVE_TLS)
4197     return false;
4198
4199   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
4200 }
4201
4202 /* Return 1 if *X is a thread-local symbol.  This is the same as
4203    rs6000_tls_symbol_ref except for the type of the unused argument.  */
4204
4205 static int
4206 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
4207 {
4208   return RS6000_SYMBOL_REF_TLS_P (*x);
4209 }
4210
4211 /* The convention appears to be to define this wherever it is used.
4212    With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
4213    is now used here.  */
4214 #ifndef REG_MODE_OK_FOR_BASE_P
4215 #define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
4216 #endif
4217
4218 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
4219    replace the input X, or the original X if no replacement is called for.
4220    The output parameter *WIN is 1 if the calling macro should goto WIN,
4221    0 if it should not.
4222
4223    For RS/6000, we wish to handle large displacements off a base
4224    register by splitting the addend across an addiu/addis and the mem insn.
4225    This cuts number of extra insns needed from 3 to 1.
4226
4227    On Darwin, we use this to generate code for floating point constants.
4228    A movsf_low is generated so we wind up with 2 instructions rather than 3.
4229    The Darwin code is inside #if TARGET_MACHO because only then are the
4230    machopic_* functions defined.  */
4231 rtx
4232 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
4233                                   int opnum, int type,
4234                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
4235 {
4236   /* We must recognize output that we have already generated ourselves.  */
4237   if (GET_CODE (x) == PLUS
4238       && GET_CODE (XEXP (x, 0)) == PLUS
4239       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
4240       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4241       && GET_CODE (XEXP (x, 1)) == CONST_INT)
4242     {
4243       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4244                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4245                    opnum, (enum reload_type)type);
4246       *win = 1;
4247       return x;
4248     }
4249
4250 #if TARGET_MACHO
4251   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
4252       && GET_CODE (x) == LO_SUM
4253       && GET_CODE (XEXP (x, 0)) == PLUS
4254       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
4255       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
4256       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
4257       && machopic_operand_p (XEXP (x, 1)))
4258     {
4259       /* Result of previous invocation of this function on Darwin
4260          floating point constant.  */
4261       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4262                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
4263                    opnum, (enum reload_type)type);
4264       *win = 1;
4265       return x;
4266     }
4267 #endif
4268
4269   /* Force ld/std non-word aligned offset into base register by wrapping
4270      in offset 0.  */
4271   if (GET_CODE (x) == PLUS
4272       && GET_CODE (XEXP (x, 0)) == REG
4273       && REGNO (XEXP (x, 0)) < 32
4274       && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
4275       && GET_CODE (XEXP (x, 1)) == CONST_INT
4276       && (INTVAL (XEXP (x, 1)) & 3) != 0
4277       && !ALTIVEC_VECTOR_MODE (mode)
4278       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
4279       && TARGET_POWERPC64)
4280     {
4281       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
4282       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4283                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4284                    opnum, (enum reload_type) type);
4285       *win = 1;
4286       return x;
4287     }
4288
4289   if (GET_CODE (x) == PLUS
4290       && GET_CODE (XEXP (x, 0)) == REG
4291       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
4292       && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
4293       && GET_CODE (XEXP (x, 1)) == CONST_INT
4294       && !SPE_VECTOR_MODE (mode)
4295       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
4296                                   || mode == DDmode || mode == TDmode
4297                                   || mode == DImode))
4298       && !ALTIVEC_VECTOR_MODE (mode))
4299     {
4300       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
4301       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
4302       HOST_WIDE_INT high
4303         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
4304
4305       /* Check for 32-bit overflow.  */
4306       if (high + low != val)
4307         {
4308           *win = 0;
4309           return x;
4310         }
4311
4312       /* Reload the high part into a base reg; leave the low part
4313          in the mem directly.  */
4314
4315       x = gen_rtx_PLUS (GET_MODE (x),
4316                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
4317                                       GEN_INT (high)),
4318                         GEN_INT (low));
4319
4320       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4321                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4322                    opnum, (enum reload_type)type);
4323       *win = 1;
4324       return x;
4325     }
4326
4327   if (GET_CODE (x) == SYMBOL_REF
4328       && !ALTIVEC_VECTOR_MODE (mode)
4329       && !SPE_VECTOR_MODE (mode)
4330 #if TARGET_MACHO
4331       && DEFAULT_ABI == ABI_DARWIN
4332       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
4333 #else
4334       && DEFAULT_ABI == ABI_V4
4335       && !flag_pic
4336 #endif
4337       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
4338          The same goes for DImode without 64-bit gprs and DFmode and DDmode
4339          without fprs.  */
4340       && mode != TFmode
4341       && mode != TDmode
4342       && (mode != DImode || TARGET_POWERPC64)
4343       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
4344           || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
4345     {
4346 #if TARGET_MACHO
4347       if (flag_pic)
4348         {
4349           rtx offset = machopic_gen_offset (x);
4350           x = gen_rtx_LO_SUM (GET_MODE (x),
4351                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
4352                   gen_rtx_HIGH (Pmode, offset)), offset);
4353         }
4354       else
4355 #endif
4356         x = gen_rtx_LO_SUM (GET_MODE (x),
4357               gen_rtx_HIGH (Pmode, x), x);
4358
4359       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4360                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
4361                    opnum, (enum reload_type)type);
4362       *win = 1;
4363       return x;
4364     }
4365
4366   /* Reload an offset address wrapped by an AND that represents the
4367      masking of the lower bits.  Strip the outer AND and let reload
4368      convert the offset address into an indirect address.  */
4369   if (TARGET_ALTIVEC
4370       && ALTIVEC_VECTOR_MODE (mode)
4371       && GET_CODE (x) == AND
4372       && GET_CODE (XEXP (x, 0)) == PLUS
4373       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
4374       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4375       && GET_CODE (XEXP (x, 1)) == CONST_INT
4376       && INTVAL (XEXP (x, 1)) == -16)
4377     {
4378       x = XEXP (x, 0);
4379       *win = 1;
4380       return x;
4381     }
4382
4383   if (TARGET_TOC
4384       && GET_CODE (x) == SYMBOL_REF
4385       && constant_pool_expr_p (x)
4386       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
4387     {
4388       x = create_TOC_reference (x);
4389       *win = 1;
4390       return x;
4391     }
4392   *win = 0;
4393   return x;
4394 }
4395
4396 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
4397    that is a valid memory address for an instruction.
4398    The MODE argument is the machine mode for the MEM expression
4399    that wants to use this address.
4400
4401    On the RS/6000, there are four valid address: a SYMBOL_REF that
4402    refers to a constant pool entry of an address (or the sum of it
4403    plus a constant), a short (16-bit signed) constant plus a register,
4404    the sum of two registers, or a register indirect, possibly with an
4405    auto-increment.  For DFmode, DDmode and DImode with a constant plus
4406    register, we must ensure that both words are addressable or PowerPC64
4407    with offset word aligned.
4408
4409    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
4410    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
4411    because adjacent memory cells are accessed by adding word-sized offsets
4412    during assembly output.  */
4413 int
4414 rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
4415 {
4416   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
4417   if (TARGET_ALTIVEC
4418       && ALTIVEC_VECTOR_MODE (mode)
4419       && GET_CODE (x) == AND
4420       && GET_CODE (XEXP (x, 1)) == CONST_INT
4421       && INTVAL (XEXP (x, 1)) == -16)
4422     x = XEXP (x, 0);
4423
4424   if (RS6000_SYMBOL_REF_TLS_P (x))
4425     return 0;
4426   if (legitimate_indirect_address_p (x, reg_ok_strict))
4427     return 1;
4428   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
4429       && !ALTIVEC_VECTOR_MODE (mode)
4430       && !SPE_VECTOR_MODE (mode)
4431       && mode != TFmode
4432       && mode != TDmode
4433       /* Restrict addressing for DI because of our SUBREG hackery.  */
4434       && !(TARGET_E500_DOUBLE
4435            && (mode == DFmode || mode == DDmode || mode == DImode))
4436       && TARGET_UPDATE
4437       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
4438     return 1;
4439   if (legitimate_small_data_p (mode, x))
4440     return 1;
4441   if (legitimate_constant_pool_address_p (x))
4442     return 1;
4443   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
4444   if (! reg_ok_strict
4445       && GET_CODE (x) == PLUS
4446       && GET_CODE (XEXP (x, 0)) == REG
4447       && (XEXP (x, 0) == virtual_stack_vars_rtx
4448           || XEXP (x, 0) == arg_pointer_rtx)
4449       && GET_CODE (XEXP (x, 1)) == CONST_INT)
4450     return 1;
4451   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
4452     return 1;
4453   if (mode != TImode
4454       && mode != TFmode
4455       && mode != TDmode
4456       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
4457           || TARGET_POWERPC64
4458           || (mode != DFmode && mode != DDmode)
4459           || (TARGET_E500_DOUBLE && mode != DDmode))
4460       && (TARGET_POWERPC64 || mode != DImode)
4461       && !avoiding_indexed_address_p (mode)
4462       && legitimate_indexed_address_p (x, reg_ok_strict))
4463     return 1;
4464   if (GET_CODE (x) == PRE_MODIFY
4465       && mode != TImode
4466       && mode != TFmode
4467       && mode != TDmode
4468       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
4469           || TARGET_POWERPC64
4470           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
4471       && (TARGET_POWERPC64 || mode != DImode)
4472       && !ALTIVEC_VECTOR_MODE (mode)
4473       && !SPE_VECTOR_MODE (mode)
4474       /* Restrict addressing for DI because of our SUBREG hackery.  */
4475       && !(TARGET_E500_DOUBLE
4476            && (mode == DFmode || mode == DDmode || mode == DImode))
4477       && TARGET_UPDATE
4478       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
4479       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
4480           || (!avoiding_indexed_address_p (mode)
4481               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
4482       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4483     return 1;
4484   if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
4485     return 1;
4486   return 0;
4487 }
4488
4489 /* Go to LABEL if ADDR (a legitimate address expression)
4490    has an effect that depends on the machine mode it is used for.
4491
4492    On the RS/6000 this is true of all integral offsets (since AltiVec
4493    modes don't allow them) or is a pre-increment or decrement.
4494
4495    ??? Except that due to conceptual problems in offsettable_address_p
4496    we can't really report the problems of integral offsets.  So leave
4497    this assuming that the adjustable offset must be valid for the
4498    sub-words of a TFmode operand, which is what we had before.  */
4499
4500 bool
4501 rs6000_mode_dependent_address (rtx addr)
4502 {
4503   switch (GET_CODE (addr))
4504     {
4505     case PLUS:
4506       if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
4507         {
4508           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
4509           return val + 12 + 0x8000 >= 0x10000;
4510         }
4511       break;
4512
4513     case LO_SUM:
4514       return true;
4515
4516     /* Auto-increment cases are now treated generically in recog.c.  */
4517     case PRE_MODIFY:
4518       return TARGET_UPDATE;
4519
4520     default:
4521       break;
4522     }
4523
4524   return false;
4525 }
4526
4527 /* Implement FIND_BASE_TERM.  */
4528
4529 rtx
4530 rs6000_find_base_term (rtx op)
4531 {
4532   rtx base, offset;
4533
4534   split_const (op, &base, &offset);
4535   if (GET_CODE (base) == UNSPEC)
4536     switch (XINT (base, 1))
4537       {
4538       case UNSPEC_TOCREL:
4539       case UNSPEC_MACHOPIC_OFFSET:
4540         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
4541            for aliasing purposes.  */
4542         return XVECEXP (base, 0, 0);
4543       }
4544
4545   return op;
4546 }
4547
4548 /* More elaborate version of recog's offsettable_memref_p predicate
4549    that works around the ??? note of rs6000_mode_dependent_address.
4550    In particular it accepts
4551
4552      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
4553
4554    in 32-bit mode, that the recog predicate rejects.  */
4555
4556 bool
4557 rs6000_offsettable_memref_p (rtx op)
4558 {
4559   if (!MEM_P (op))
4560     return false;
4561
4562   /* First mimic offsettable_memref_p.  */
4563   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
4564     return true;
4565
4566   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
4567      the latter predicate knows nothing about the mode of the memory
4568      reference and, therefore, assumes that it is the largest supported
4569      mode (TFmode).  As a consequence, legitimate offsettable memory
4570      references are rejected.  rs6000_legitimate_offset_address_p contains
4571      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
4572   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
4573 }
4574
4575 /* Return number of consecutive hard regs needed starting at reg REGNO
4576    to hold something of mode MODE.
4577    This is ordinarily the length in words of a value of mode MODE
4578    but can be less for certain modes in special long registers.
4579
4580    For the SPE, GPRs are 64 bits but only 32 bits are visible in
4581    scalar instructions.  The upper 32 bits are only available to the
4582    SIMD instructions.
4583
4584    POWER and PowerPC GPRs hold 32 bits worth;
4585    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
4586
4587 int
4588 rs6000_hard_regno_nregs (int regno, enum machine_mode mode)
4589 {
4590   if (FP_REGNO_P (regno))
4591     return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
4592
4593   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
4594     return (GET_MODE_SIZE (mode) + UNITS_PER_SPE_WORD - 1) / UNITS_PER_SPE_WORD;
4595
4596   if (ALTIVEC_REGNO_P (regno))
4597     return
4598       (GET_MODE_SIZE (mode) + UNITS_PER_ALTIVEC_WORD - 1) / UNITS_PER_ALTIVEC_WORD;
4599
4600   /* The value returned for SCmode in the E500 double case is 2 for
4601      ABI compatibility; storing an SCmode value in a single register
4602      would require function_arg and rs6000_spe_function_arg to handle
4603      SCmode so as to pass the value correctly in a pair of
4604      registers.  */
4605   if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
4606       && !DECIMAL_FLOAT_MODE_P (mode))
4607     return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
4608
4609   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4610 }
4611
4612 /* Change register usage conditional on target flags.  */
4613 void
4614 rs6000_conditional_register_usage (void)
4615 {
4616   int i;
4617
4618   /* Set MQ register fixed (already call_used) if not POWER
4619      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
4620      be allocated.  */
4621   if (! TARGET_POWER)
4622     fixed_regs[64] = 1;
4623
4624   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
4625   if (TARGET_64BIT)
4626     fixed_regs[13] = call_used_regs[13]
4627       = call_really_used_regs[13] = 1;
4628
4629   /* Conditionally disable FPRs.  */
4630   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
4631     for (i = 32; i < 64; i++)
4632       fixed_regs[i] = call_used_regs[i]
4633         = call_really_used_regs[i] = 1;
4634
4635   /* The TOC register is not killed across calls in a way that is
4636      visible to the compiler.  */
4637   if (DEFAULT_ABI == ABI_AIX)
4638     call_really_used_regs[2] = 0;
4639
4640   if (DEFAULT_ABI == ABI_V4
4641       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
4642       && flag_pic == 2)
4643     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4644
4645   if (DEFAULT_ABI == ABI_V4
4646       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
4647       && flag_pic == 1)
4648     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4649       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4650       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4651
4652   if (DEFAULT_ABI == ABI_DARWIN
4653       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
4654       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4655       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4656       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4657
4658   if (TARGET_TOC && TARGET_MINIMAL_TOC)
4659     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
4660       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
4661
4662   if (TARGET_SPE)
4663     {
4664       global_regs[SPEFSCR_REGNO] = 1;
4665       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
4666          registers in prologues and epilogues.  We no longer use r14
4667          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
4668          pool for link-compatibility with older versions of GCC.  Once
4669          "old" code has died out, we can return r14 to the allocation
4670          pool.  */
4671       fixed_regs[14]
4672         = call_used_regs[14]
4673         = call_really_used_regs[14] = 1;
4674     }
4675
4676   if (!TARGET_ALTIVEC)
4677     {
4678       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
4679         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
4680       call_really_used_regs[VRSAVE_REGNO] = 1;
4681     }
4682
4683   if (TARGET_ALTIVEC)
4684     global_regs[VSCR_REGNO] = 1;
4685
4686   if (TARGET_ALTIVEC_ABI)
4687     {
4688       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
4689         call_used_regs[i] = call_really_used_regs[i] = 1;
4690
4691       /* AIX reserves VR20:31 in non-extended ABI mode.  */
4692       if (TARGET_XCOFF)
4693         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
4694           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
4695     }
4696 }
4697 \f
4698 /* Try to output insns to set TARGET equal to the constant C if it can
4699    be done in less than N insns.  Do all computations in MODE.
4700    Returns the place where the output has been placed if it can be
4701    done and the insns have been emitted.  If it would take more than N
4702    insns, zero is returned and no insns and emitted.  */
4703
4704 rtx
4705 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
4706                        rtx source, int n ATTRIBUTE_UNUSED)
4707 {
4708   rtx result, insn, set;
4709   HOST_WIDE_INT c0, c1;
4710
4711   switch (mode)
4712     {
4713       case  QImode:
4714     case HImode:
4715       if (dest == NULL)
4716         dest = gen_reg_rtx (mode);
4717       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
4718       return dest;
4719
4720     case SImode:
4721       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
4722
4723       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
4724                               GEN_INT (INTVAL (source)
4725                                        & (~ (HOST_WIDE_INT) 0xffff))));
4726       emit_insn (gen_rtx_SET (VOIDmode, dest,
4727                               gen_rtx_IOR (SImode, copy_rtx (result),
4728                                            GEN_INT (INTVAL (source) & 0xffff))));
4729       result = dest;
4730       break;
4731
4732     case DImode:
4733       switch (GET_CODE (source))
4734         {
4735         case CONST_INT:
4736           c0 = INTVAL (source);
4737           c1 = -(c0 < 0);
4738           break;
4739
4740         case CONST_DOUBLE:
4741 #if HOST_BITS_PER_WIDE_INT >= 64
4742           c0 = CONST_DOUBLE_LOW (source);
4743           c1 = -(c0 < 0);
4744 #else
4745           c0 = CONST_DOUBLE_LOW (source);
4746           c1 = CONST_DOUBLE_HIGH (source);
4747 #endif
4748           break;
4749
4750         default:
4751           gcc_unreachable ();
4752         }
4753
4754       result = rs6000_emit_set_long_const (dest, c0, c1);
4755       break;
4756
4757     default:
4758       gcc_unreachable ();
4759     }
4760
4761   insn = get_last_insn ();
4762   set = single_set (insn);
4763   if (! CONSTANT_P (SET_SRC (set)))
4764     set_unique_reg_note (insn, REG_EQUAL, source);
4765
4766   return result;
4767 }
4768
4769 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
4770    fall back to a straight forward decomposition.  We do this to avoid
4771    exponential run times encountered when looking for longer sequences
4772    with rs6000_emit_set_const.  */
4773 static rtx
4774 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
4775 {
4776   if (!TARGET_POWERPC64)
4777     {
4778       rtx operand1, operand2;
4779
4780       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
4781                                         DImode);
4782       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
4783                                         DImode);
4784       emit_move_insn (operand1, GEN_INT (c1));
4785       emit_move_insn (operand2, GEN_INT (c2));
4786     }
4787   else
4788     {
4789       HOST_WIDE_INT ud1, ud2, ud3, ud4;
4790
4791       ud1 = c1 & 0xffff;
4792       ud2 = (c1 & 0xffff0000) >> 16;
4793 #if HOST_BITS_PER_WIDE_INT >= 64
4794       c2 = c1 >> 32;
4795 #endif
4796       ud3 = c2 & 0xffff;
4797       ud4 = (c2 & 0xffff0000) >> 16;
4798
4799       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
4800           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
4801         {
4802           if (ud1 & 0x8000)
4803             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
4804           else
4805             emit_move_insn (dest, GEN_INT (ud1));
4806         }
4807
4808       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
4809                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
4810         {
4811           if (ud2 & 0x8000)
4812             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
4813                                            - 0x80000000));
4814           else
4815             emit_move_insn (dest, GEN_INT (ud2 << 16));
4816           if (ud1 != 0)
4817             emit_move_insn (copy_rtx (dest),
4818                             gen_rtx_IOR (DImode, copy_rtx (dest),
4819                                          GEN_INT (ud1)));
4820         }
4821       else if ((ud4 == 0xffff && (ud3 & 0x8000))
4822                || (ud4 == 0 && ! (ud3 & 0x8000)))
4823         {
4824           if (ud3 & 0x8000)
4825             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
4826                                            - 0x80000000));
4827           else
4828             emit_move_insn (dest, GEN_INT (ud3 << 16));
4829
4830           if (ud2 != 0)
4831             emit_move_insn (copy_rtx (dest),
4832                             gen_rtx_IOR (DImode, copy_rtx (dest),
4833                                          GEN_INT (ud2)));
4834           emit_move_insn (copy_rtx (dest),
4835                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
4836                                           GEN_INT (16)));
4837           if (ud1 != 0)
4838             emit_move_insn (copy_rtx (dest),
4839                             gen_rtx_IOR (DImode, copy_rtx (dest),
4840                                          GEN_INT (ud1)));
4841         }
4842       else
4843         {
4844           if (ud4 & 0x8000)
4845             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
4846                                            - 0x80000000));
4847           else
4848             emit_move_insn (dest, GEN_INT (ud4 << 16));
4849
4850           if (ud3 != 0)
4851             emit_move_insn (copy_rtx (dest),
4852                             gen_rtx_IOR (DImode, copy_rtx (dest),
4853                                          GEN_INT (ud3)));
4854
4855           emit_move_insn (copy_rtx (dest),
4856                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
4857                                           GEN_INT (32)));
4858           if (ud2 != 0)
4859             emit_move_insn (copy_rtx (dest),
4860                             gen_rtx_IOR (DImode, copy_rtx (dest),
4861                                          GEN_INT (ud2 << 16)));
4862           if (ud1 != 0)
4863             emit_move_insn (copy_rtx (dest),
4864                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
4865         }
4866     }
4867   return dest;
4868 }
4869
4870 /* Helper for the following.  Get rid of [r+r] memory refs
4871    in cases where it won't work (TImode, TFmode, TDmode).  */
4872
4873 static void
4874 rs6000_eliminate_indexed_memrefs (rtx operands[2])
4875 {
4876   if (GET_CODE (operands[0]) == MEM
4877       && GET_CODE (XEXP (operands[0], 0)) != REG
4878       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0))
4879       && ! reload_in_progress)
4880     operands[0]
4881       = replace_equiv_address (operands[0],
4882                                copy_addr_to_reg (XEXP (operands[0], 0)));
4883
4884   if (GET_CODE (operands[1]) == MEM
4885       && GET_CODE (XEXP (operands[1], 0)) != REG
4886       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0))
4887       && ! reload_in_progress)
4888     operands[1]
4889       = replace_equiv_address (operands[1],
4890                                copy_addr_to_reg (XEXP (operands[1], 0)));
4891 }
4892
4893 /* Emit a move from SOURCE to DEST in mode MODE.  */
4894 void
4895 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
4896 {
4897   rtx operands[2];
4898   operands[0] = dest;
4899   operands[1] = source;
4900
4901   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
4902   if (GET_CODE (operands[1]) == CONST_DOUBLE
4903       && ! FLOAT_MODE_P (mode)
4904       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
4905     {
4906       /* FIXME.  This should never happen.  */
4907       /* Since it seems that it does, do the safe thing and convert
4908          to a CONST_INT.  */
4909       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
4910     }
4911   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
4912               || FLOAT_MODE_P (mode)
4913               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
4914                    || CONST_DOUBLE_LOW (operands[1]) < 0)
4915                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
4916                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
4917
4918   /* Check if GCC is setting up a block move that will end up using FP
4919      registers as temporaries.  We must make sure this is acceptable.  */
4920   if (GET_CODE (operands[0]) == MEM
4921       && GET_CODE (operands[1]) == MEM
4922       && mode == DImode
4923       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
4924           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
4925       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
4926                                             ? 32 : MEM_ALIGN (operands[0])))
4927             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
4928                                                ? 32
4929                                                : MEM_ALIGN (operands[1]))))
4930       && ! MEM_VOLATILE_P (operands [0])
4931       && ! MEM_VOLATILE_P (operands [1]))
4932     {
4933       emit_move_insn (adjust_address (operands[0], SImode, 0),
4934                       adjust_address (operands[1], SImode, 0));
4935       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
4936                       adjust_address (copy_rtx (operands[1]), SImode, 4));
4937       return;
4938     }
4939
4940   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
4941       && !gpc_reg_operand (operands[1], mode))
4942     operands[1] = force_reg (mode, operands[1]);
4943
4944   if (mode == SFmode && ! TARGET_POWERPC
4945       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
4946       && GET_CODE (operands[0]) == MEM)
4947     {
4948       int regnum;
4949
4950       if (reload_in_progress || reload_completed)
4951         regnum = true_regnum (operands[1]);
4952       else if (GET_CODE (operands[1]) == REG)
4953         regnum = REGNO (operands[1]);
4954       else
4955         regnum = -1;
4956
4957       /* If operands[1] is a register, on POWER it may have
4958          double-precision data in it, so truncate it to single
4959          precision.  */
4960       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
4961         {
4962           rtx newreg;
4963           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
4964                     : gen_reg_rtx (mode));
4965           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
4966           operands[1] = newreg;
4967         }
4968     }
4969
4970   /* Recognize the case where operand[1] is a reference to thread-local
4971      data and load its address to a register.  */
4972   if (rs6000_tls_referenced_p (operands[1]))
4973     {
4974       enum tls_model model;
4975       rtx tmp = operands[1];
4976       rtx addend = NULL;
4977
4978       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
4979         {
4980           addend = XEXP (XEXP (tmp, 0), 1);
4981           tmp = XEXP (XEXP (tmp, 0), 0);
4982         }
4983
4984       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
4985       model = SYMBOL_REF_TLS_MODEL (tmp);
4986       gcc_assert (model != 0);
4987
4988       tmp = rs6000_legitimize_tls_address (tmp, model);
4989       if (addend)
4990         {
4991           tmp = gen_rtx_PLUS (mode, tmp, addend);
4992           tmp = force_operand (tmp, operands[0]);
4993         }
4994       operands[1] = tmp;
4995     }
4996
4997   /* Handle the case where reload calls us with an invalid address.  */
4998   if (reload_in_progress && mode == Pmode
4999       && (! general_operand (operands[1], mode)
5000           || ! nonimmediate_operand (operands[0], mode)))
5001     goto emit_set;
5002
5003   /* 128-bit constant floating-point values on Darwin should really be
5004      loaded as two parts.  */
5005   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
5006       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
5007     {
5008       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
5009          know how to get a DFmode SUBREG of a TFmode.  */
5010       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
5011       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
5012                         simplify_gen_subreg (imode, operands[1], mode, 0),
5013                         imode);
5014       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
5015                                              GET_MODE_SIZE (imode)),
5016                         simplify_gen_subreg (imode, operands[1], mode,
5017                                              GET_MODE_SIZE (imode)),
5018                         imode);
5019       return;
5020     }
5021
5022   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
5023     cfun->machine->sdmode_stack_slot =
5024       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
5025
5026   if (reload_in_progress
5027       && mode == SDmode
5028       && MEM_P (operands[0])
5029       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
5030       && REG_P (operands[1]))
5031     {
5032       if (FP_REGNO_P (REGNO (operands[1])))
5033         {
5034           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
5035           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
5036           emit_insn (gen_movsd_store (mem, operands[1]));
5037         }
5038       else if (INT_REGNO_P (REGNO (operands[1])))
5039         {
5040           rtx mem = adjust_address_nv (operands[0], mode, 4);
5041           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
5042           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
5043         }
5044       else
5045         gcc_unreachable();
5046       return;
5047     }
5048   if (reload_in_progress
5049       && mode == SDmode
5050       && REG_P (operands[0])
5051       && MEM_P (operands[1])
5052       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
5053     {
5054       if (FP_REGNO_P (REGNO (operands[0])))
5055         {
5056           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
5057           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
5058           emit_insn (gen_movsd_load (operands[0], mem));
5059         }
5060       else if (INT_REGNO_P (REGNO (operands[0])))
5061         {
5062           rtx mem = adjust_address_nv (operands[1], mode, 4);
5063           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
5064           emit_insn (gen_movsd_hardfloat (operands[0], mem));
5065         }
5066       else
5067         gcc_unreachable();
5068       return;
5069     }
5070
5071   /* FIXME:  In the long term, this switch statement should go away
5072      and be replaced by a sequence of tests based on things like
5073      mode == Pmode.  */
5074   switch (mode)
5075     {
5076     case HImode:
5077     case QImode:
5078       if (CONSTANT_P (operands[1])
5079           && GET_CODE (operands[1]) != CONST_INT)
5080         operands[1] = force_const_mem (mode, operands[1]);
5081       break;
5082
5083     case TFmode:
5084     case TDmode:
5085       rs6000_eliminate_indexed_memrefs (operands);
5086       /* fall through */
5087
5088     case DFmode:
5089     case DDmode:
5090     case SFmode:
5091     case SDmode:
5092       if (CONSTANT_P (operands[1])
5093           && ! easy_fp_constant (operands[1], mode))
5094         operands[1] = force_const_mem (mode, operands[1]);
5095       break;
5096
5097     case V16QImode:
5098     case V8HImode:
5099     case V4SFmode:
5100     case V4SImode:
5101     case V4HImode:
5102     case V2SFmode:
5103     case V2SImode:
5104     case V1DImode:
5105       if (CONSTANT_P (operands[1])
5106           && !easy_vector_constant (operands[1], mode))
5107         operands[1] = force_const_mem (mode, operands[1]);
5108       break;
5109
5110     case SImode:
5111     case DImode:
5112       /* Use default pattern for address of ELF small data */
5113       if (TARGET_ELF
5114           && mode == Pmode
5115           && DEFAULT_ABI == ABI_V4
5116           && (GET_CODE (operands[1]) == SYMBOL_REF
5117               || GET_CODE (operands[1]) == CONST)
5118           && small_data_operand (operands[1], mode))
5119         {
5120           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
5121           return;
5122         }
5123
5124       if (DEFAULT_ABI == ABI_V4
5125           && mode == Pmode && mode == SImode
5126           && flag_pic == 1 && got_operand (operands[1], mode))
5127         {
5128           emit_insn (gen_movsi_got (operands[0], operands[1]));
5129           return;
5130         }
5131
5132       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
5133           && TARGET_NO_TOC
5134           && ! flag_pic
5135           && mode == Pmode
5136           && CONSTANT_P (operands[1])
5137           && GET_CODE (operands[1]) != HIGH
5138           && GET_CODE (operands[1]) != CONST_INT)
5139         {
5140           rtx target = (!can_create_pseudo_p ()
5141                         ? operands[0]
5142                         : gen_reg_rtx (mode));
5143
5144           /* If this is a function address on -mcall-aixdesc,
5145              convert it to the address of the descriptor.  */
5146           if (DEFAULT_ABI == ABI_AIX
5147               && GET_CODE (operands[1]) == SYMBOL_REF
5148               && XSTR (operands[1], 0)[0] == '.')
5149             {
5150               const char *name = XSTR (operands[1], 0);
5151               rtx new_ref;
5152               while (*name == '.')
5153                 name++;
5154               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
5155               CONSTANT_POOL_ADDRESS_P (new_ref)
5156                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
5157               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
5158               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
5159               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
5160               operands[1] = new_ref;
5161             }
5162
5163           if (DEFAULT_ABI == ABI_DARWIN)
5164             {
5165 #if TARGET_MACHO
5166               if (MACHO_DYNAMIC_NO_PIC_P)
5167                 {
5168                   /* Take care of any required data indirection.  */
5169                   operands[1] = rs6000_machopic_legitimize_pic_address (
5170                                   operands[1], mode, operands[0]);
5171                   if (operands[0] != operands[1])
5172                     emit_insn (gen_rtx_SET (VOIDmode,
5173                                             operands[0], operands[1]));
5174                   return;
5175                 }
5176 #endif
5177               emit_insn (gen_macho_high (target, operands[1]));
5178               emit_insn (gen_macho_low (operands[0], target, operands[1]));
5179               return;
5180             }
5181
5182           emit_insn (gen_elf_high (target, operands[1]));
5183           emit_insn (gen_elf_low (operands[0], target, operands[1]));
5184           return;
5185         }
5186
5187       /* If this is a SYMBOL_REF that refers to a constant pool entry,
5188          and we have put it in the TOC, we just need to make a TOC-relative
5189          reference to it.  */
5190       if (TARGET_TOC
5191           && GET_CODE (operands[1]) == SYMBOL_REF
5192           && constant_pool_expr_p (operands[1])
5193           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
5194                                               get_pool_mode (operands[1])))
5195         {
5196           operands[1] = create_TOC_reference (operands[1]);
5197         }
5198       else if (mode == Pmode
5199                && CONSTANT_P (operands[1])
5200                && ((GET_CODE (operands[1]) != CONST_INT
5201                     && ! easy_fp_constant (operands[1], mode))
5202                    || (GET_CODE (operands[1]) == CONST_INT
5203                        && num_insns_constant (operands[1], mode) > 2)
5204                    || (GET_CODE (operands[0]) == REG
5205                        && FP_REGNO_P (REGNO (operands[0]))))
5206                && GET_CODE (operands[1]) != HIGH
5207                && ! legitimate_constant_pool_address_p (operands[1])
5208                && ! toc_relative_expr_p (operands[1]))
5209         {
5210           /* Emit a USE operation so that the constant isn't deleted if
5211              expensive optimizations are turned on because nobody
5212              references it.  This should only be done for operands that
5213              contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
5214              This should not be done for operands that contain LABEL_REFs.
5215              For now, we just handle the obvious case.  */
5216           if (GET_CODE (operands[1]) != LABEL_REF)
5217             emit_use (operands[1]);
5218
5219 #if TARGET_MACHO
5220           /* Darwin uses a special PIC legitimizer.  */
5221           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
5222             {
5223               operands[1] =
5224                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
5225                                                         operands[0]);
5226               if (operands[0] != operands[1])
5227                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
5228               return;
5229             }
5230 #endif
5231
5232           /* If we are to limit the number of things we put in the TOC and
5233              this is a symbol plus a constant we can add in one insn,
5234              just put the symbol in the TOC and add the constant.  Don't do
5235              this if reload is in progress.  */
5236           if (GET_CODE (operands[1]) == CONST
5237               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
5238               && GET_CODE (XEXP (operands[1], 0)) == PLUS
5239               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
5240               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
5241                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
5242               && ! side_effects_p (operands[0]))
5243             {
5244               rtx sym =
5245                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
5246               rtx other = XEXP (XEXP (operands[1], 0), 1);
5247
5248               sym = force_reg (mode, sym);
5249               if (mode == SImode)
5250                 emit_insn (gen_addsi3 (operands[0], sym, other));
5251               else
5252                 emit_insn (gen_adddi3 (operands[0], sym, other));
5253               return;
5254             }
5255
5256           operands[1] = force_const_mem (mode, operands[1]);
5257
5258           if (TARGET_TOC
5259               && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
5260               && constant_pool_expr_p (XEXP (operands[1], 0))
5261               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
5262                         get_pool_constant (XEXP (operands[1], 0)),
5263                         get_pool_mode (XEXP (operands[1], 0))))
5264             {
5265               operands[1]
5266                 = gen_const_mem (mode,
5267                                  create_TOC_reference (XEXP (operands[1], 0)));
5268               set_mem_alias_set (operands[1], get_TOC_alias_set ());
5269             }
5270         }
5271       break;
5272
5273     case TImode:
5274       rs6000_eliminate_indexed_memrefs (operands);
5275
5276       if (TARGET_POWER)
5277         {
5278           emit_insn (gen_rtx_PARALLEL (VOIDmode,
5279                        gen_rtvec (2,
5280                                   gen_rtx_SET (VOIDmode,
5281                                                operands[0], operands[1]),
5282                                   gen_rtx_CLOBBER (VOIDmode,
5283                                                    gen_rtx_SCRATCH (SImode)))));
5284           return;
5285         }
5286       break;
5287
5288     default:
5289       gcc_unreachable ();
5290     }
5291
5292   /* Above, we may have called force_const_mem which may have returned
5293      an invalid address.  If we can, fix this up; otherwise, reload will
5294      have to deal with it.  */
5295   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
5296     operands[1] = validize_mem (operands[1]);
5297
5298  emit_set:
5299   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
5300 }
5301 \f
5302 /* Nonzero if we can use a floating-point register to pass this arg.  */
5303 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
5304   (SCALAR_FLOAT_MODE_P (MODE)                   \
5305    && (CUM)->fregno <= FP_ARG_MAX_REG           \
5306    && TARGET_HARD_FLOAT && TARGET_FPRS)
5307
5308 /* Nonzero if we can use an AltiVec register to pass this arg.  */
5309 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)      \
5310   (ALTIVEC_VECTOR_MODE (MODE)                           \
5311    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG              \
5312    && TARGET_ALTIVEC_ABI                                \
5313    && (NAMED))
5314
5315 /* Return a nonzero value to say to return the function value in
5316    memory, just as large structures are always returned.  TYPE will be
5317    the data type of the value, and FNTYPE will be the type of the
5318    function doing the returning, or @code{NULL} for libcalls.
5319
5320    The AIX ABI for the RS/6000 specifies that all structures are
5321    returned in memory.  The Darwin ABI does the same.  The SVR4 ABI
5322    specifies that structures <= 8 bytes are returned in r3/r4, but a
5323    draft put them in memory, and GCC used to implement the draft
5324    instead of the final standard.  Therefore, aix_struct_return
5325    controls this instead of DEFAULT_ABI; V.4 targets needing backward
5326    compatibility can change DRAFT_V4_STRUCT_RET to override the
5327    default, and -m switches get the final word.  See
5328    rs6000_override_options for more details.
5329
5330    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
5331    long double support is enabled.  These values are returned in memory.
5332
5333    int_size_in_bytes returns -1 for variable size objects, which go in
5334    memory always.  The cast to unsigned makes -1 > 8.  */
5335
5336 static bool
5337 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
5338 {
5339   /* In the darwin64 abi, try to use registers for larger structs
5340      if possible.  */
5341   if (rs6000_darwin64_abi
5342       && TREE_CODE (type) == RECORD_TYPE
5343       && int_size_in_bytes (type) > 0)
5344     {
5345       CUMULATIVE_ARGS valcum;
5346       rtx valret;
5347
5348       valcum.words = 0;
5349       valcum.fregno = FP_ARG_MIN_REG;
5350       valcum.vregno = ALTIVEC_ARG_MIN_REG;
5351       /* Do a trial code generation as if this were going to be passed
5352          as an argument; if any part goes in memory, we return NULL.  */
5353       valret = rs6000_darwin64_record_arg (&valcum, type, 1, true);
5354       if (valret)
5355         return false;
5356       /* Otherwise fall through to more conventional ABI rules.  */
5357     }
5358
5359   if (AGGREGATE_TYPE_P (type)
5360       && (aix_struct_return
5361           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
5362     return true;
5363
5364   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
5365      modes only exist for GCC vector types if -maltivec.  */
5366   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
5367       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
5368     return false;
5369
5370   /* Return synthetic vectors in memory.  */
5371   if (TREE_CODE (type) == VECTOR_TYPE
5372       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
5373     {
5374       static bool warned_for_return_big_vectors = false;
5375       if (!warned_for_return_big_vectors)
5376         {
5377           warning (0, "GCC vector returned by reference: "
5378                    "non-standard ABI extension with no compatibility guarantee");
5379           warned_for_return_big_vectors = true;
5380         }
5381       return true;
5382     }
5383
5384   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
5385     return true;
5386
5387   return false;
5388 }
5389
5390 /* Initialize a variable CUM of type CUMULATIVE_ARGS
5391    for a call to a function whose data type is FNTYPE.
5392    For a library call, FNTYPE is 0.
5393
5394    For incoming args we set the number of arguments in the prototype large
5395    so we never return a PARALLEL.  */
5396
5397 void
5398 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
5399                       rtx libname ATTRIBUTE_UNUSED, int incoming,
5400                       int libcall, int n_named_args)
5401 {
5402   static CUMULATIVE_ARGS zero_cumulative;
5403
5404   *cum = zero_cumulative;
5405   cum->words = 0;
5406   cum->fregno = FP_ARG_MIN_REG;
5407   cum->vregno = ALTIVEC_ARG_MIN_REG;
5408   cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
5409   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
5410                       ? CALL_LIBCALL : CALL_NORMAL);
5411   cum->sysv_gregno = GP_ARG_MIN_REG;
5412   cum->stdarg = fntype
5413     && (TYPE_ARG_TYPES (fntype) != 0
5414         && (TREE_VALUE (tree_last  (TYPE_ARG_TYPES (fntype)))
5415             != void_type_node));
5416
5417   cum->nargs_prototype = 0;
5418   if (incoming || cum->prototype)
5419     cum->nargs_prototype = n_named_args;
5420
5421   /* Check for a longcall attribute.  */
5422   if ((!fntype && rs6000_default_long_calls)
5423       || (fntype
5424           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
5425           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
5426     cum->call_cookie |= CALL_LONG;
5427
5428   if (TARGET_DEBUG_ARG)
5429     {
5430       fprintf (stderr, "\ninit_cumulative_args:");
5431       if (fntype)
5432         {
5433           tree ret_type = TREE_TYPE (fntype);
5434           fprintf (stderr, " ret code = %s,",
5435                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
5436         }
5437
5438       if (cum->call_cookie & CALL_LONG)
5439         fprintf (stderr, " longcall,");
5440
5441       fprintf (stderr, " proto = %d, nargs = %d\n",
5442                cum->prototype, cum->nargs_prototype);
5443     }
5444
5445   if (fntype
5446       && !TARGET_ALTIVEC
5447       && TARGET_ALTIVEC_ABI
5448       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
5449     {
5450       error ("cannot return value in vector register because"
5451              " altivec instructions are disabled, use -maltivec"
5452              " to enable them");
5453     }
5454 }
5455 \f
5456 /* Return true if TYPE must be passed on the stack and not in registers.  */
5457
5458 static bool
5459 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
5460 {
5461   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
5462     return must_pass_in_stack_var_size (mode, type);
5463   else
5464     return must_pass_in_stack_var_size_or_pad (mode, type);
5465 }
5466
5467 /* If defined, a C expression which determines whether, and in which
5468    direction, to pad out an argument with extra space.  The value
5469    should be of type `enum direction': either `upward' to pad above
5470    the argument, `downward' to pad below, or `none' to inhibit
5471    padding.
5472
5473    For the AIX ABI structs are always stored left shifted in their
5474    argument slot.  */
5475
5476 enum direction
5477 function_arg_padding (enum machine_mode mode, const_tree type)
5478 {
5479 #ifndef AGGREGATE_PADDING_FIXED
5480 #define AGGREGATE_PADDING_FIXED 0
5481 #endif
5482 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
5483 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
5484 #endif
5485
5486   if (!AGGREGATE_PADDING_FIXED)
5487     {
5488       /* GCC used to pass structures of the same size as integer types as
5489          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
5490          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
5491          passed padded downward, except that -mstrict-align further
5492          muddied the water in that multi-component structures of 2 and 4
5493          bytes in size were passed padded upward.
5494
5495          The following arranges for best compatibility with previous
5496          versions of gcc, but removes the -mstrict-align dependency.  */
5497       if (BYTES_BIG_ENDIAN)
5498         {
5499           HOST_WIDE_INT size = 0;
5500
5501           if (mode == BLKmode)
5502             {
5503               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
5504                 size = int_size_in_bytes (type);
5505             }
5506           else
5507             size = GET_MODE_SIZE (mode);
5508
5509           if (size == 1 || size == 2 || size == 4)
5510             return downward;
5511         }
5512       return upward;
5513     }
5514
5515   if (AGGREGATES_PAD_UPWARD_ALWAYS)
5516     {
5517       if (type != 0 && AGGREGATE_TYPE_P (type))
5518         return upward;
5519     }
5520
5521   /* Fall back to the default.  */
5522   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
5523 }
5524
5525 /* If defined, a C expression that gives the alignment boundary, in bits,
5526    of an argument with the specified mode and type.  If it is not defined,
5527    PARM_BOUNDARY is used for all arguments.
5528
5529    V.4 wants long longs and doubles to be double word aligned.  Just
5530    testing the mode size is a boneheaded way to do this as it means
5531    that other types such as complex int are also double word aligned.
5532    However, we're stuck with this because changing the ABI might break
5533    existing library interfaces.
5534
5535    Doubleword align SPE vectors.
5536    Quadword align Altivec vectors.
5537    Quadword align large synthetic vector types.   */
5538
5539 int
5540 function_arg_boundary (enum machine_mode mode, tree type)
5541 {
5542   if (DEFAULT_ABI == ABI_V4
5543       && (GET_MODE_SIZE (mode) == 8
5544           || (TARGET_HARD_FLOAT
5545               && TARGET_FPRS
5546               && (mode == TFmode || mode == TDmode))))
5547     return 64;
5548   else if (SPE_VECTOR_MODE (mode)
5549            || (type && TREE_CODE (type) == VECTOR_TYPE
5550                && int_size_in_bytes (type) >= 8
5551                && int_size_in_bytes (type) < 16))
5552     return 64;
5553   else if (ALTIVEC_VECTOR_MODE (mode)
5554            || (type && TREE_CODE (type) == VECTOR_TYPE
5555                && int_size_in_bytes (type) >= 16))
5556     return 128;
5557   else if (rs6000_darwin64_abi && mode == BLKmode
5558            && type && TYPE_ALIGN (type) > 64)
5559     return 128;
5560   else
5561     return PARM_BOUNDARY;
5562 }
5563
5564 /* For a function parm of MODE and TYPE, return the starting word in
5565    the parameter area.  NWORDS of the parameter area are already used.  */
5566
5567 static unsigned int
5568 rs6000_parm_start (enum machine_mode mode, tree type, unsigned int nwords)
5569 {
5570   unsigned int align;
5571   unsigned int parm_offset;
5572
5573   align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
5574   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
5575   return nwords + (-(parm_offset + nwords) & align);
5576 }
5577
5578 /* Compute the size (in words) of a function argument.  */
5579
5580 static unsigned long
5581 rs6000_arg_size (enum machine_mode mode, tree type)
5582 {
5583   unsigned long size;
5584
5585   if (mode != BLKmode)
5586     size = GET_MODE_SIZE (mode);
5587   else
5588     size = int_size_in_bytes (type);
5589
5590   if (TARGET_32BIT)
5591     return (size + 3) >> 2;
5592   else
5593     return (size + 7) >> 3;
5594 }
5595 \f
5596 /* Use this to flush pending int fields.  */
5597
5598 static void
5599 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
5600                                           HOST_WIDE_INT bitpos)
5601 {
5602   unsigned int startbit, endbit;
5603   int intregs, intoffset;
5604   enum machine_mode mode;
5605
5606   if (cum->intoffset == -1)
5607     return;
5608
5609   intoffset = cum->intoffset;
5610   cum->intoffset = -1;
5611
5612   if (intoffset % BITS_PER_WORD != 0)
5613     {
5614       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
5615                             MODE_INT, 0);
5616       if (mode == BLKmode)
5617         {
5618           /* We couldn't find an appropriate mode, which happens,
5619              e.g., in packed structs when there are 3 bytes to load.
5620              Back intoffset back to the beginning of the word in this
5621              case.  */
5622           intoffset = intoffset & -BITS_PER_WORD;
5623         }
5624     }
5625
5626   startbit = intoffset & -BITS_PER_WORD;
5627   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5628   intregs = (endbit - startbit) / BITS_PER_WORD;
5629   cum->words += intregs;
5630 }
5631
5632 /* The darwin64 ABI calls for us to recurse down through structs,
5633    looking for elements passed in registers.  Unfortunately, we have
5634    to track int register count here also because of misalignments
5635    in powerpc alignment mode.  */
5636
5637 static void
5638 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
5639                                             tree type,
5640                                             HOST_WIDE_INT startbitpos)
5641 {
5642   tree f;
5643
5644   for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
5645     if (TREE_CODE (f) == FIELD_DECL)
5646       {
5647         HOST_WIDE_INT bitpos = startbitpos;
5648         tree ftype = TREE_TYPE (f);
5649         enum machine_mode mode;
5650         if (ftype == error_mark_node)
5651           continue;
5652         mode = TYPE_MODE (ftype);
5653
5654         if (DECL_SIZE (f) != 0
5655             && host_integerp (bit_position (f), 1))
5656           bitpos += int_bit_position (f);
5657
5658         /* ??? FIXME: else assume zero offset.  */
5659
5660         if (TREE_CODE (ftype) == RECORD_TYPE)
5661           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
5662         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
5663           {
5664             rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
5665             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
5666             cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
5667           }
5668         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
5669           {
5670             rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
5671             cum->vregno++;
5672             cum->words += 2;
5673           }
5674         else if (cum->intoffset == -1)
5675           cum->intoffset = bitpos;
5676       }
5677 }
5678
5679 /* Update the data in CUM to advance over an argument
5680    of mode MODE and data type TYPE.
5681    (TYPE is null for libcalls where that information may not be available.)
5682
5683    Note that for args passed by reference, function_arg will be called
5684    with MODE and TYPE set to that of the pointer to the arg, not the arg
5685    itself.  */
5686
5687 void
5688 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5689                       tree type, int named, int depth)
5690 {
5691   int size;
5692
5693   /* Only tick off an argument if we're not recursing.  */
5694   if (depth == 0)
5695     cum->nargs_prototype--;
5696
5697   if (TARGET_ALTIVEC_ABI
5698       && (ALTIVEC_VECTOR_MODE (mode)
5699           || (type && TREE_CODE (type) == VECTOR_TYPE
5700               && int_size_in_bytes (type) == 16)))
5701     {
5702       bool stack = false;
5703
5704       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
5705         {
5706           cum->vregno++;
5707           if (!TARGET_ALTIVEC)
5708             error ("cannot pass argument in vector register because"
5709                    " altivec instructions are disabled, use -maltivec"
5710                    " to enable them");
5711
5712           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
5713              even if it is going to be passed in a vector register.
5714              Darwin does the same for variable-argument functions.  */
5715           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5716               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
5717             stack = true;
5718         }
5719       else
5720         stack = true;
5721
5722       if (stack)
5723         {
5724           int align;
5725
5726           /* Vector parameters must be 16-byte aligned.  This places
5727              them at 2 mod 4 in terms of words in 32-bit mode, since
5728              the parameter save area starts at offset 24 from the
5729              stack.  In 64-bit mode, they just have to start on an
5730              even word, since the parameter save area is 16-byte
5731              aligned.  Space for GPRs is reserved even if the argument
5732              will be passed in memory.  */
5733           if (TARGET_32BIT)
5734             align = (2 - cum->words) & 3;
5735           else
5736             align = cum->words & 1;
5737           cum->words += align + rs6000_arg_size (mode, type);
5738
5739           if (TARGET_DEBUG_ARG)
5740             {
5741               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
5742                        cum->words, align);
5743               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
5744                        cum->nargs_prototype, cum->prototype,
5745                        GET_MODE_NAME (mode));
5746             }
5747         }
5748     }
5749   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
5750            && !cum->stdarg
5751            && cum->sysv_gregno <= GP_ARG_MAX_REG)
5752     cum->sysv_gregno++;
5753
5754   else if (rs6000_darwin64_abi
5755            && mode == BLKmode
5756            && TREE_CODE (type) == RECORD_TYPE
5757            && (size = int_size_in_bytes (type)) > 0)
5758     {
5759       /* Variable sized types have size == -1 and are
5760          treated as if consisting entirely of ints.
5761          Pad to 16 byte boundary if needed.  */
5762       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
5763           && (cum->words % 2) != 0)
5764         cum->words++;
5765       /* For varargs, we can just go up by the size of the struct. */
5766       if (!named)
5767         cum->words += (size + 7) / 8;
5768       else
5769         {
5770           /* It is tempting to say int register count just goes up by
5771              sizeof(type)/8, but this is wrong in a case such as
5772              { int; double; int; } [powerpc alignment].  We have to
5773              grovel through the fields for these too.  */
5774           cum->intoffset = 0;
5775           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
5776           rs6000_darwin64_record_arg_advance_flush (cum,
5777                                                     size * BITS_PER_UNIT);
5778         }
5779     }
5780   else if (DEFAULT_ABI == ABI_V4)
5781     {
5782       if (TARGET_HARD_FLOAT && TARGET_FPRS
5783           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
5784               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
5785               || (mode == TFmode && !TARGET_IEEEQUAD)
5786               || mode == SDmode || mode == DDmode || mode == TDmode))
5787         {
5788           /* _Decimal128 must use an even/odd register pair.  This assumes
5789              that the register number is odd when fregno is odd.  */
5790           if (mode == TDmode && (cum->fregno % 2) == 1)
5791             cum->fregno++;
5792
5793           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
5794               <= FP_ARG_V4_MAX_REG)
5795             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
5796           else
5797             {
5798               cum->fregno = FP_ARG_V4_MAX_REG + 1;
5799               if (mode == DFmode || mode == TFmode
5800                   || mode == DDmode || mode == TDmode)
5801                 cum->words += cum->words & 1;
5802               cum->words += rs6000_arg_size (mode, type);
5803             }
5804         }
5805       else
5806         {
5807           int n_words = rs6000_arg_size (mode, type);
5808           int gregno = cum->sysv_gregno;
5809
5810           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
5811              (r7,r8) or (r9,r10).  As does any other 2 word item such
5812              as complex int due to a historical mistake.  */
5813           if (n_words == 2)
5814             gregno += (1 - gregno) & 1;
5815
5816           /* Multi-reg args are not split between registers and stack.  */
5817           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
5818             {
5819               /* Long long and SPE vectors are aligned on the stack.
5820                  So are other 2 word items such as complex int due to
5821                  a historical mistake.  */
5822               if (n_words == 2)
5823                 cum->words += cum->words & 1;
5824               cum->words += n_words;
5825             }
5826
5827           /* Note: continuing to accumulate gregno past when we've started
5828              spilling to the stack indicates the fact that we've started
5829              spilling to the stack to expand_builtin_saveregs.  */
5830           cum->sysv_gregno = gregno + n_words;
5831         }
5832
5833       if (TARGET_DEBUG_ARG)
5834         {
5835           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
5836                    cum->words, cum->fregno);
5837           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
5838                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
5839           fprintf (stderr, "mode = %4s, named = %d\n",
5840                    GET_MODE_NAME (mode), named);
5841         }
5842     }
5843   else
5844     {
5845       int n_words = rs6000_arg_size (mode, type);
5846       int start_words = cum->words;
5847       int align_words = rs6000_parm_start (mode, type, start_words);
5848
5849       cum->words = align_words + n_words;
5850
5851       if (SCALAR_FLOAT_MODE_P (mode)
5852           && TARGET_HARD_FLOAT && TARGET_FPRS)
5853         {
5854           /* _Decimal128 must be passed in an even/odd float register pair.
5855              This assumes that the register number is odd when fregno is
5856              odd.  */
5857           if (mode == TDmode && (cum->fregno % 2) == 1)
5858             cum->fregno++;
5859           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
5860         }
5861
5862       if (TARGET_DEBUG_ARG)
5863         {
5864           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
5865                    cum->words, cum->fregno);
5866           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
5867                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
5868           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
5869                    named, align_words - start_words, depth);
5870         }
5871     }
5872 }
5873
5874 static rtx
5875 spe_build_register_parallel (enum machine_mode mode, int gregno)
5876 {
5877   rtx r1, r3, r5, r7;
5878
5879   switch (mode)
5880     {
5881     case DFmode:
5882       r1 = gen_rtx_REG (DImode, gregno);
5883       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
5884       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
5885
5886     case DCmode:
5887     case TFmode:
5888       r1 = gen_rtx_REG (DImode, gregno);
5889       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
5890       r3 = gen_rtx_REG (DImode, gregno + 2);
5891       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
5892       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
5893
5894     case TCmode:
5895       r1 = gen_rtx_REG (DImode, gregno);
5896       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
5897       r3 = gen_rtx_REG (DImode, gregno + 2);
5898       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
5899       r5 = gen_rtx_REG (DImode, gregno + 4);
5900       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
5901       r7 = gen_rtx_REG (DImode, gregno + 6);
5902       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
5903       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
5904
5905     default:
5906       gcc_unreachable ();
5907     }
5908 }
5909
5910 /* Determine where to put a SIMD argument on the SPE.  */
5911 static rtx
5912 rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5913                          tree type)
5914 {
5915   int gregno = cum->sysv_gregno;
5916
5917   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
5918      are passed and returned in a pair of GPRs for ABI compatibility.  */
5919   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5920                              || mode == DCmode || mode == TCmode))
5921     {
5922       int n_words = rs6000_arg_size (mode, type);
5923
5924       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
5925       if (mode == DFmode)
5926         gregno += (1 - gregno) & 1;
5927
5928       /* Multi-reg args are not split between registers and stack.  */
5929       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
5930         return NULL_RTX;
5931
5932       return spe_build_register_parallel (mode, gregno);
5933     }
5934   if (cum->stdarg)
5935     {
5936       int n_words = rs6000_arg_size (mode, type);
5937
5938       /* SPE vectors are put in odd registers.  */
5939       if (n_words == 2 && (gregno & 1) == 0)
5940         gregno += 1;
5941
5942       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
5943         {
5944           rtx r1, r2;
5945           enum machine_mode m = SImode;
5946
5947           r1 = gen_rtx_REG (m, gregno);
5948           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
5949           r2 = gen_rtx_REG (m, gregno + 1);
5950           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
5951           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
5952         }
5953       else
5954         return NULL_RTX;
5955     }
5956   else
5957     {
5958       if (gregno <= GP_ARG_MAX_REG)
5959         return gen_rtx_REG (mode, gregno);
5960       else
5961         return NULL_RTX;
5962     }
5963 }
5964
5965 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
5966    structure between cum->intoffset and bitpos to integer registers.  */
5967
5968 static void
5969 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
5970                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
5971 {
5972   enum machine_mode mode;
5973   unsigned int regno;
5974   unsigned int startbit, endbit;
5975   int this_regno, intregs, intoffset;
5976   rtx reg;
5977
5978   if (cum->intoffset == -1)
5979     return;
5980
5981   intoffset = cum->intoffset;
5982   cum->intoffset = -1;
5983
5984   /* If this is the trailing part of a word, try to only load that
5985      much into the register.  Otherwise load the whole register.  Note
5986      that in the latter case we may pick up unwanted bits.  It's not a
5987      problem at the moment but may wish to revisit.  */
5988
5989   if (intoffset % BITS_PER_WORD != 0)
5990     {
5991       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
5992                           MODE_INT, 0);
5993       if (mode == BLKmode)
5994         {
5995           /* We couldn't find an appropriate mode, which happens,
5996              e.g., in packed structs when there are 3 bytes to load.
5997              Back intoffset back to the beginning of the word in this
5998              case.  */
5999          intoffset = intoffset & -BITS_PER_WORD;
6000          mode = word_mode;
6001         }
6002     }
6003   else
6004     mode = word_mode;
6005
6006   startbit = intoffset & -BITS_PER_WORD;
6007   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6008   intregs = (endbit - startbit) / BITS_PER_WORD;
6009   this_regno = cum->words + intoffset / BITS_PER_WORD;
6010
6011   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
6012     cum->use_stack = 1;
6013
6014   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
6015   if (intregs <= 0)
6016     return;
6017
6018   intoffset /= BITS_PER_UNIT;
6019   do
6020     {
6021       regno = GP_ARG_MIN_REG + this_regno;
6022       reg = gen_rtx_REG (mode, regno);
6023       rvec[(*k)++] =
6024         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
6025
6026       this_regno += 1;
6027       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
6028       mode = word_mode;
6029       intregs -= 1;
6030     }
6031   while (intregs > 0);
6032 }
6033
6034 /* Recursive workhorse for the following.  */
6035
6036 static void
6037 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
6038                                     HOST_WIDE_INT startbitpos, rtx rvec[],
6039                                     int *k)
6040 {
6041   tree f;
6042
6043   for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
6044     if (TREE_CODE (f) == FIELD_DECL)
6045       {
6046         HOST_WIDE_INT bitpos = startbitpos;
6047         tree ftype = TREE_TYPE (f);
6048         enum machine_mode mode;
6049         if (ftype == error_mark_node)
6050           continue;
6051         mode = TYPE_MODE (ftype);
6052
6053         if (DECL_SIZE (f) != 0
6054             && host_integerp (bit_position (f), 1))
6055           bitpos += int_bit_position (f);
6056
6057         /* ??? FIXME: else assume zero offset.  */
6058
6059         if (TREE_CODE (ftype) == RECORD_TYPE)
6060           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
6061         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
6062           {
6063 #if 0
6064             switch (mode)
6065               {
6066               case SCmode: mode = SFmode; break;
6067               case DCmode: mode = DFmode; break;
6068               case TCmode: mode = TFmode; break;
6069               default: break;
6070               }
6071 #endif
6072             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
6073             rvec[(*k)++]
6074               = gen_rtx_EXPR_LIST (VOIDmode,
6075                                    gen_rtx_REG (mode, cum->fregno++),
6076                                    GEN_INT (bitpos / BITS_PER_UNIT));
6077             if (mode == TFmode || mode == TDmode)
6078               cum->fregno++;
6079           }
6080         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
6081           {
6082             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
6083             rvec[(*k)++]
6084               = gen_rtx_EXPR_LIST (VOIDmode,
6085                                    gen_rtx_REG (mode, cum->vregno++),
6086                                    GEN_INT (bitpos / BITS_PER_UNIT));
6087           }
6088         else if (cum->intoffset == -1)
6089           cum->intoffset = bitpos;
6090       }
6091 }
6092
6093 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
6094    the register(s) to be used for each field and subfield of a struct
6095    being passed by value, along with the offset of where the
6096    register's value may be found in the block.  FP fields go in FP
6097    register, vector fields go in vector registers, and everything
6098    else goes in int registers, packed as in memory.
6099
6100    This code is also used for function return values.  RETVAL indicates
6101    whether this is the case.
6102
6103    Much of this is taken from the SPARC V9 port, which has a similar
6104    calling convention.  */
6105
6106 static rtx
6107 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
6108                             int named, bool retval)
6109 {
6110   rtx rvec[FIRST_PSEUDO_REGISTER];
6111   int k = 1, kbase = 1;
6112   HOST_WIDE_INT typesize = int_size_in_bytes (type);
6113   /* This is a copy; modifications are not visible to our caller.  */
6114   CUMULATIVE_ARGS copy_cum = *orig_cum;
6115   CUMULATIVE_ARGS *cum = &copy_cum;
6116
6117   /* Pad to 16 byte boundary if needed.  */
6118   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
6119       && (cum->words % 2) != 0)
6120     cum->words++;
6121
6122   cum->intoffset = 0;
6123   cum->use_stack = 0;
6124   cum->named = named;
6125
6126   /* Put entries into rvec[] for individual FP and vector fields, and
6127      for the chunks of memory that go in int regs.  Note we start at
6128      element 1; 0 is reserved for an indication of using memory, and
6129      may or may not be filled in below. */
6130   rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
6131   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
6132
6133   /* If any part of the struct went on the stack put all of it there.
6134      This hack is because the generic code for
6135      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
6136      parts of the struct are not at the beginning.  */
6137   if (cum->use_stack)
6138     {
6139       if (retval)
6140         return NULL_RTX;    /* doesn't go in registers at all */
6141       kbase = 0;
6142       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6143     }
6144   if (k > 1 || cum->use_stack)
6145     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
6146   else
6147     return NULL_RTX;
6148 }
6149
6150 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
6151
6152 static rtx
6153 rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
6154 {
6155   int n_units;
6156   int i, k;
6157   rtx rvec[GP_ARG_NUM_REG + 1];
6158
6159   if (align_words >= GP_ARG_NUM_REG)
6160     return NULL_RTX;
6161
6162   n_units = rs6000_arg_size (mode, type);
6163
6164   /* Optimize the simple case where the arg fits in one gpr, except in
6165      the case of BLKmode due to assign_parms assuming that registers are
6166      BITS_PER_WORD wide.  */
6167   if (n_units == 0
6168       || (n_units == 1 && mode != BLKmode))
6169     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6170
6171   k = 0;
6172   if (align_words + n_units > GP_ARG_NUM_REG)
6173     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
6174        using a magic NULL_RTX component.
6175        This is not strictly correct.  Only some of the arg belongs in
6176        memory, not all of it.  However, the normal scheme using
6177        function_arg_partial_nregs can result in unusual subregs, eg.
6178        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
6179        store the whole arg to memory is often more efficient than code
6180        to store pieces, and we know that space is available in the right
6181        place for the whole arg.  */
6182     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6183
6184   i = 0;
6185   do
6186     {
6187       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
6188       rtx off = GEN_INT (i++ * 4);
6189       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
6190     }
6191   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
6192
6193   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
6194 }
6195
6196 /* Determine where to put an argument to a function.
6197    Value is zero to push the argument on the stack,
6198    or a hard register in which to store the argument.
6199
6200    MODE is the argument's machine mode.
6201    TYPE is the data type of the argument (as a tree).
6202     This is null for libcalls where that information may
6203     not be available.
6204    CUM is a variable of type CUMULATIVE_ARGS which gives info about
6205     the preceding args and about the function being called.  It is
6206     not modified in this routine.
6207    NAMED is nonzero if this argument is a named parameter
6208     (otherwise it is an extra parameter matching an ellipsis).
6209
6210    On RS/6000 the first eight words of non-FP are normally in registers
6211    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
6212    Under V.4, the first 8 FP args are in registers.
6213
6214    If this is floating-point and no prototype is specified, we use
6215    both an FP and integer register (or possibly FP reg and stack).  Library
6216    functions (when CALL_LIBCALL is set) always have the proper types for args,
6217    so we can pass the FP value just in one register.  emit_library_function
6218    doesn't support PARALLEL anyway.
6219
6220    Note that for args passed by reference, function_arg will be called
6221    with MODE and TYPE set to that of the pointer to the arg, not the arg
6222    itself.  */
6223
6224 rtx
6225 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6226               tree type, int named)
6227 {
6228   enum rs6000_abi abi = DEFAULT_ABI;
6229
6230   /* Return a marker to indicate whether CR1 needs to set or clear the
6231      bit that V.4 uses to say fp args were passed in registers.
6232      Assume that we don't need the marker for software floating point,
6233      or compiler generated library calls.  */
6234   if (mode == VOIDmode)
6235     {
6236       if (abi == ABI_V4
6237           && (cum->call_cookie & CALL_LIBCALL) == 0
6238           && (cum->stdarg
6239               || (cum->nargs_prototype < 0
6240                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
6241         {
6242           /* For the SPE, we need to crxor CR6 always.  */
6243           if (TARGET_SPE_ABI)
6244             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
6245           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
6246             return GEN_INT (cum->call_cookie
6247                             | ((cum->fregno == FP_ARG_MIN_REG)
6248                                ? CALL_V4_SET_FP_ARGS
6249                                : CALL_V4_CLEAR_FP_ARGS));
6250         }
6251
6252       return GEN_INT (cum->call_cookie);
6253     }
6254
6255   if (rs6000_darwin64_abi && mode == BLKmode
6256       && TREE_CODE (type) == RECORD_TYPE)
6257     {
6258       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
6259       if (rslt != NULL_RTX)
6260         return rslt;
6261       /* Else fall through to usual handling.  */
6262     }
6263
6264   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
6265     if (TARGET_64BIT && ! cum->prototype)
6266       {
6267         /* Vector parameters get passed in vector register
6268            and also in GPRs or memory, in absence of prototype.  */
6269         int align_words;
6270         rtx slot;
6271         align_words = (cum->words + 1) & ~1;
6272
6273         if (align_words >= GP_ARG_NUM_REG)
6274           {
6275             slot = NULL_RTX;
6276           }
6277         else
6278           {
6279             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6280           }
6281         return gen_rtx_PARALLEL (mode,
6282                  gen_rtvec (2,
6283                             gen_rtx_EXPR_LIST (VOIDmode,
6284                                                slot, const0_rtx),
6285                             gen_rtx_EXPR_LIST (VOIDmode,
6286                                                gen_rtx_REG (mode, cum->vregno),
6287                                                const0_rtx)));
6288       }
6289     else
6290       return gen_rtx_REG (mode, cum->vregno);
6291   else if (TARGET_ALTIVEC_ABI
6292            && (ALTIVEC_VECTOR_MODE (mode)
6293                || (type && TREE_CODE (type) == VECTOR_TYPE
6294                    && int_size_in_bytes (type) == 16)))
6295     {
6296       if (named || abi == ABI_V4)
6297         return NULL_RTX;
6298       else
6299         {
6300           /* Vector parameters to varargs functions under AIX or Darwin
6301              get passed in memory and possibly also in GPRs.  */
6302           int align, align_words, n_words;
6303           enum machine_mode part_mode;
6304
6305           /* Vector parameters must be 16-byte aligned.  This places them at
6306              2 mod 4 in terms of words in 32-bit mode, since the parameter
6307              save area starts at offset 24 from the stack.  In 64-bit mode,
6308              they just have to start on an even word, since the parameter
6309              save area is 16-byte aligned.  */
6310           if (TARGET_32BIT)
6311             align = (2 - cum->words) & 3;
6312           else
6313             align = cum->words & 1;
6314           align_words = cum->words + align;
6315
6316           /* Out of registers?  Memory, then.  */
6317           if (align_words >= GP_ARG_NUM_REG)
6318             return NULL_RTX;
6319
6320           if (TARGET_32BIT && TARGET_POWERPC64)
6321             return rs6000_mixed_function_arg (mode, type, align_words);
6322
6323           /* The vector value goes in GPRs.  Only the part of the
6324              value in GPRs is reported here.  */
6325           part_mode = mode;
6326           n_words = rs6000_arg_size (mode, type);
6327           if (align_words + n_words > GP_ARG_NUM_REG)
6328             /* Fortunately, there are only two possibilities, the value
6329                is either wholly in GPRs or half in GPRs and half not.  */
6330             part_mode = DImode;
6331
6332           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
6333         }
6334     }
6335   else if (TARGET_SPE_ABI && TARGET_SPE
6336            && (SPE_VECTOR_MODE (mode)
6337                || (TARGET_E500_DOUBLE && (mode == DFmode
6338                                           || mode == DCmode
6339                                           || mode == TFmode
6340                                           || mode == TCmode))))
6341     return rs6000_spe_function_arg (cum, mode, type);
6342
6343   else if (abi == ABI_V4)
6344     {
6345       if (TARGET_HARD_FLOAT && TARGET_FPRS
6346           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
6347               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
6348               || (mode == TFmode && !TARGET_IEEEQUAD)
6349               || mode == SDmode || mode == DDmode || mode == TDmode))
6350         {
6351           /* _Decimal128 must use an even/odd register pair.  This assumes
6352              that the register number is odd when fregno is odd.  */
6353           if (mode == TDmode && (cum->fregno % 2) == 1)
6354             cum->fregno++;
6355
6356           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
6357               <= FP_ARG_V4_MAX_REG)
6358             return gen_rtx_REG (mode, cum->fregno);
6359           else
6360             return NULL_RTX;
6361         }
6362       else
6363         {
6364           int n_words = rs6000_arg_size (mode, type);
6365           int gregno = cum->sysv_gregno;
6366
6367           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
6368              (r7,r8) or (r9,r10).  As does any other 2 word item such
6369              as complex int due to a historical mistake.  */
6370           if (n_words == 2)
6371             gregno += (1 - gregno) & 1;
6372
6373           /* Multi-reg args are not split between registers and stack.  */
6374           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
6375             return NULL_RTX;
6376
6377           if (TARGET_32BIT && TARGET_POWERPC64)
6378             return rs6000_mixed_function_arg (mode, type,
6379                                               gregno - GP_ARG_MIN_REG);
6380           return gen_rtx_REG (mode, gregno);
6381         }
6382     }
6383   else
6384     {
6385       int align_words = rs6000_parm_start (mode, type, cum->words);
6386
6387       /* _Decimal128 must be passed in an even/odd float register pair.
6388          This assumes that the register number is odd when fregno is odd.  */
6389       if (mode == TDmode && (cum->fregno % 2) == 1)
6390         cum->fregno++;
6391
6392       if (USE_FP_FOR_ARG_P (cum, mode, type))
6393         {
6394           rtx rvec[GP_ARG_NUM_REG + 1];
6395           rtx r;
6396           int k;
6397           bool needs_psave;
6398           enum machine_mode fmode = mode;
6399           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
6400
6401           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
6402             {
6403               /* Currently, we only ever need one reg here because complex
6404                  doubles are split.  */
6405               gcc_assert (cum->fregno == FP_ARG_MAX_REG
6406                           && (fmode == TFmode || fmode == TDmode));
6407
6408               /* Long double or _Decimal128 split over regs and memory.  */
6409               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
6410             }
6411
6412           /* Do we also need to pass this arg in the parameter save
6413              area?  */
6414           needs_psave = (type
6415                          && (cum->nargs_prototype <= 0
6416                              || (DEFAULT_ABI == ABI_AIX
6417                                  && TARGET_XL_COMPAT
6418                                  && align_words >= GP_ARG_NUM_REG)));
6419
6420           if (!needs_psave && mode == fmode)
6421             return gen_rtx_REG (fmode, cum->fregno);
6422
6423           k = 0;
6424           if (needs_psave)
6425             {
6426               /* Describe the part that goes in gprs or the stack.
6427                  This piece must come first, before the fprs.  */
6428               if (align_words < GP_ARG_NUM_REG)
6429                 {
6430                   unsigned long n_words = rs6000_arg_size (mode, type);
6431
6432                   if (align_words + n_words > GP_ARG_NUM_REG
6433                       || (TARGET_32BIT && TARGET_POWERPC64))
6434                     {
6435                       /* If this is partially on the stack, then we only
6436                          include the portion actually in registers here.  */
6437                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
6438                       rtx off;
6439                       int i = 0;
6440                       if (align_words + n_words > GP_ARG_NUM_REG)
6441                         /* Not all of the arg fits in gprs.  Say that it
6442                            goes in memory too, using a magic NULL_RTX
6443                            component.  Also see comment in
6444                            rs6000_mixed_function_arg for why the normal
6445                            function_arg_partial_nregs scheme doesn't work
6446                            in this case. */
6447                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
6448                                                        const0_rtx);
6449                       do
6450                         {
6451                           r = gen_rtx_REG (rmode,
6452                                            GP_ARG_MIN_REG + align_words);
6453                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
6454                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
6455                         }
6456                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
6457                     }
6458                   else
6459                     {
6460                       /* The whole arg fits in gprs.  */
6461                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6462                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
6463                     }
6464                 }
6465               else
6466                 /* It's entirely in memory.  */
6467                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6468             }
6469
6470           /* Describe where this piece goes in the fprs.  */
6471           r = gen_rtx_REG (fmode, cum->fregno);
6472           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
6473
6474           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
6475         }
6476       else if (align_words < GP_ARG_NUM_REG)
6477         {
6478           if (TARGET_32BIT && TARGET_POWERPC64)
6479             return rs6000_mixed_function_arg (mode, type, align_words);
6480
6481           if (mode == BLKmode)
6482             mode = Pmode;
6483
6484           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
6485         }
6486       else
6487         return NULL_RTX;
6488     }
6489 }
6490 \f
6491 /* For an arg passed partly in registers and partly in memory, this is
6492    the number of bytes passed in registers.  For args passed entirely in
6493    registers or entirely in memory, zero.  When an arg is described by a
6494    PARALLEL, perhaps using more than one register type, this function
6495    returns the number of bytes used by the first element of the PARALLEL.  */
6496
6497 static int
6498 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6499                           tree type, bool named)
6500 {
6501   int ret = 0;
6502   int align_words;
6503
6504   if (DEFAULT_ABI == ABI_V4)
6505     return 0;
6506
6507   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
6508       && cum->nargs_prototype >= 0)
6509     return 0;
6510
6511   /* In this complicated case we just disable the partial_nregs code.  */
6512   if (rs6000_darwin64_abi && mode == BLKmode
6513       && TREE_CODE (type) == RECORD_TYPE
6514       && int_size_in_bytes (type) > 0)
6515     return 0;
6516
6517   align_words = rs6000_parm_start (mode, type, cum->words);
6518
6519   if (USE_FP_FOR_ARG_P (cum, mode, type))
6520     {
6521       /* If we are passing this arg in the fixed parameter save area
6522          (gprs or memory) as well as fprs, then this function should
6523          return the number of partial bytes passed in the parameter
6524          save area rather than partial bytes passed in fprs.  */
6525       if (type
6526           && (cum->nargs_prototype <= 0
6527               || (DEFAULT_ABI == ABI_AIX
6528                   && TARGET_XL_COMPAT
6529                   && align_words >= GP_ARG_NUM_REG)))
6530         return 0;
6531       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
6532                > FP_ARG_MAX_REG + 1)
6533         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
6534       else if (cum->nargs_prototype >= 0)
6535         return 0;
6536     }
6537
6538   if (align_words < GP_ARG_NUM_REG
6539       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
6540     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
6541
6542   if (ret != 0 && TARGET_DEBUG_ARG)
6543     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
6544
6545   return ret;
6546 }
6547 \f
6548 /* A C expression that indicates when an argument must be passed by
6549    reference.  If nonzero for an argument, a copy of that argument is
6550    made in memory and a pointer to the argument is passed instead of
6551    the argument itself.  The pointer is passed in whatever way is
6552    appropriate for passing a pointer to that type.
6553
6554    Under V.4, aggregates and long double are passed by reference.
6555
6556    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
6557    reference unless the AltiVec vector extension ABI is in force.
6558
6559    As an extension to all ABIs, variable sized types are passed by
6560    reference.  */
6561
6562 static bool
6563 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
6564                           enum machine_mode mode, const_tree type,
6565                           bool named ATTRIBUTE_UNUSED)
6566 {
6567   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
6568     {
6569       if (TARGET_DEBUG_ARG)
6570         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
6571       return 1;
6572     }
6573
6574   if (!type)
6575     return 0;
6576
6577   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
6578     {
6579       if (TARGET_DEBUG_ARG)
6580         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
6581       return 1;
6582     }
6583
6584   if (int_size_in_bytes (type) < 0)
6585     {
6586       if (TARGET_DEBUG_ARG)
6587         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
6588       return 1;
6589     }
6590
6591   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
6592      modes only exist for GCC vector types if -maltivec.  */
6593   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
6594     {
6595       if (TARGET_DEBUG_ARG)
6596         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
6597       return 1;
6598     }
6599
6600   /* Pass synthetic vectors in memory.  */
6601   if (TREE_CODE (type) == VECTOR_TYPE
6602       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
6603     {
6604       static bool warned_for_pass_big_vectors = false;
6605       if (TARGET_DEBUG_ARG)
6606         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
6607       if (!warned_for_pass_big_vectors)
6608         {
6609           warning (0, "GCC vector passed by reference: "
6610                    "non-standard ABI extension with no compatibility guarantee");
6611           warned_for_pass_big_vectors = true;
6612         }
6613       return 1;
6614     }
6615
6616   return 0;
6617 }
6618
6619 static void
6620 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
6621 {
6622   int i;
6623   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
6624
6625   if (nregs == 0)
6626     return;
6627
6628   for (i = 0; i < nregs; i++)
6629     {
6630       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
6631       if (reload_completed)
6632         {
6633           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
6634             tem = NULL_RTX;
6635           else
6636             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
6637                                        i * GET_MODE_SIZE (reg_mode));
6638         }
6639       else
6640         tem = replace_equiv_address (tem, XEXP (tem, 0));
6641
6642       gcc_assert (tem);
6643
6644       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
6645     }
6646 }
6647 \f
6648 /* Perform any needed actions needed for a function that is receiving a
6649    variable number of arguments.
6650
6651    CUM is as above.
6652
6653    MODE and TYPE are the mode and type of the current parameter.
6654
6655    PRETEND_SIZE is a variable that should be set to the amount of stack
6656    that must be pushed by the prolog to pretend that our caller pushed
6657    it.
6658
6659    Normally, this macro will push all remaining incoming registers on the
6660    stack and set PRETEND_SIZE to the length of the registers pushed.  */
6661
6662 static void
6663 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6664                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
6665                         int no_rtl)
6666 {
6667   CUMULATIVE_ARGS next_cum;
6668   int reg_size = TARGET_32BIT ? 4 : 8;
6669   rtx save_area = NULL_RTX, mem;
6670   int first_reg_offset;
6671   alias_set_type set;
6672
6673   /* Skip the last named argument.  */
6674   next_cum = *cum;
6675   function_arg_advance (&next_cum, mode, type, 1, 0);
6676
6677   if (DEFAULT_ABI == ABI_V4)
6678     {
6679       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
6680
6681       if (! no_rtl)
6682         {
6683           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
6684           HOST_WIDE_INT offset = 0;
6685
6686           /* Try to optimize the size of the varargs save area.
6687              The ABI requires that ap.reg_save_area is doubleword
6688              aligned, but we don't need to allocate space for all
6689              the bytes, only those to which we actually will save
6690              anything.  */
6691           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
6692             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
6693           if (TARGET_HARD_FLOAT && TARGET_FPRS
6694               && next_cum.fregno <= FP_ARG_V4_MAX_REG
6695               && cfun->va_list_fpr_size)
6696             {
6697               if (gpr_reg_num)
6698                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
6699                            * UNITS_PER_FP_WORD;
6700               if (cfun->va_list_fpr_size
6701                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
6702                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
6703               else
6704                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
6705                             * UNITS_PER_FP_WORD;
6706             }
6707           if (gpr_reg_num)
6708             {
6709               offset = -((first_reg_offset * reg_size) & ~7);
6710               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
6711                 {
6712                   gpr_reg_num = cfun->va_list_gpr_size;
6713                   if (reg_size == 4 && (first_reg_offset & 1))
6714                     gpr_reg_num++;
6715                 }
6716               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
6717             }
6718           else if (fpr_size)
6719             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
6720                        * UNITS_PER_FP_WORD
6721                      - (int) (GP_ARG_NUM_REG * reg_size);
6722
6723           if (gpr_size + fpr_size)
6724             {
6725               rtx reg_save_area
6726                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
6727               gcc_assert (GET_CODE (reg_save_area) == MEM);
6728               reg_save_area = XEXP (reg_save_area, 0);
6729               if (GET_CODE (reg_save_area) == PLUS)
6730                 {
6731                   gcc_assert (XEXP (reg_save_area, 0)
6732                               == virtual_stack_vars_rtx);
6733                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
6734                   offset += INTVAL (XEXP (reg_save_area, 1));
6735                 }
6736               else
6737                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
6738             }
6739
6740           cfun->machine->varargs_save_offset = offset;
6741           save_area = plus_constant (virtual_stack_vars_rtx, offset);
6742         }
6743     }
6744   else
6745     {
6746       first_reg_offset = next_cum.words;
6747       save_area = virtual_incoming_args_rtx;
6748
6749       if (targetm.calls.must_pass_in_stack (mode, type))
6750         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
6751     }
6752
6753   set = get_varargs_alias_set ();
6754   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
6755       && cfun->va_list_gpr_size)
6756     {
6757       int nregs = GP_ARG_NUM_REG - first_reg_offset;
6758
6759       if (va_list_gpr_counter_field)
6760         {
6761           /* V4 va_list_gpr_size counts number of registers needed.  */
6762           if (nregs > cfun->va_list_gpr_size)
6763             nregs = cfun->va_list_gpr_size;
6764         }
6765       else
6766         {
6767           /* char * va_list instead counts number of bytes needed.  */
6768           if (nregs > cfun->va_list_gpr_size / reg_size)
6769             nregs = cfun->va_list_gpr_size / reg_size;
6770         }
6771
6772       mem = gen_rtx_MEM (BLKmode,
6773                          plus_constant (save_area,
6774                                         first_reg_offset * reg_size));
6775       MEM_NOTRAP_P (mem) = 1;
6776       set_mem_alias_set (mem, set);
6777       set_mem_align (mem, BITS_PER_WORD);
6778
6779       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
6780                                   nregs);
6781     }
6782
6783   /* Save FP registers if needed.  */
6784   if (DEFAULT_ABI == ABI_V4
6785       && TARGET_HARD_FLOAT && TARGET_FPRS
6786       && ! no_rtl
6787       && next_cum.fregno <= FP_ARG_V4_MAX_REG
6788       && cfun->va_list_fpr_size)
6789     {
6790       int fregno = next_cum.fregno, nregs;
6791       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
6792       rtx lab = gen_label_rtx ();
6793       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
6794                                                * UNITS_PER_FP_WORD);
6795
6796       emit_jump_insn
6797         (gen_rtx_SET (VOIDmode,
6798                       pc_rtx,
6799                       gen_rtx_IF_THEN_ELSE (VOIDmode,
6800                                             gen_rtx_NE (VOIDmode, cr1,
6801                                                         const0_rtx),
6802                                             gen_rtx_LABEL_REF (VOIDmode, lab),
6803                                             pc_rtx)));
6804
6805       for (nregs = 0;
6806            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
6807            fregno++, off += UNITS_PER_FP_WORD, nregs++)
6808         {
6809           mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
6810                               ? DFmode : SFmode, 
6811                              plus_constant (save_area, off));
6812           MEM_NOTRAP_P (mem) = 1;
6813           set_mem_alias_set (mem, set);
6814           set_mem_align (mem, GET_MODE_ALIGNMENT (
6815                          (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
6816                           ? DFmode : SFmode));
6817           emit_move_insn (mem, gen_rtx_REG (
6818                           (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
6819                            ? DFmode : SFmode, fregno));
6820         }
6821
6822       emit_label (lab);
6823     }
6824 }
6825
6826 /* Create the va_list data type.  */
6827
6828 static tree
6829 rs6000_build_builtin_va_list (void)
6830 {
6831   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
6832
6833   /* For AIX, prefer 'char *' because that's what the system
6834      header files like.  */
6835   if (DEFAULT_ABI != ABI_V4)
6836     return build_pointer_type (char_type_node);
6837
6838   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6839   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
6840
6841   f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
6842                       unsigned_char_type_node);
6843   f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
6844                       unsigned_char_type_node);
6845   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
6846      every user file.  */
6847   f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
6848                       short_unsigned_type_node);
6849   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
6850                       ptr_type_node);
6851   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
6852                       ptr_type_node);
6853
6854   va_list_gpr_counter_field = f_gpr;
6855   va_list_fpr_counter_field = f_fpr;
6856
6857   DECL_FIELD_CONTEXT (f_gpr) = record;
6858   DECL_FIELD_CONTEXT (f_fpr) = record;
6859   DECL_FIELD_CONTEXT (f_res) = record;
6860   DECL_FIELD_CONTEXT (f_ovf) = record;
6861   DECL_FIELD_CONTEXT (f_sav) = record;
6862
6863   TREE_CHAIN (record) = type_decl;
6864   TYPE_NAME (record) = type_decl;
6865   TYPE_FIELDS (record) = f_gpr;
6866   TREE_CHAIN (f_gpr) = f_fpr;
6867   TREE_CHAIN (f_fpr) = f_res;
6868   TREE_CHAIN (f_res) = f_ovf;
6869   TREE_CHAIN (f_ovf) = f_sav;
6870
6871   layout_type (record);
6872
6873   /* The correct type is an array type of one element.  */
6874   return build_array_type (record, build_index_type (size_zero_node));
6875 }
6876
6877 /* Implement va_start.  */
6878
6879 static void
6880 rs6000_va_start (tree valist, rtx nextarg)
6881 {
6882   HOST_WIDE_INT words, n_gpr, n_fpr;
6883   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
6884   tree gpr, fpr, ovf, sav, t;
6885
6886   /* Only SVR4 needs something special.  */
6887   if (DEFAULT_ABI != ABI_V4)
6888     {
6889       std_expand_builtin_va_start (valist, nextarg);
6890       return;
6891     }
6892
6893   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
6894   f_fpr = TREE_CHAIN (f_gpr);
6895   f_res = TREE_CHAIN (f_fpr);
6896   f_ovf = TREE_CHAIN (f_res);
6897   f_sav = TREE_CHAIN (f_ovf);
6898
6899   valist = build_va_arg_indirect_ref (valist);
6900   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6901   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
6902                 f_fpr, NULL_TREE);
6903   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
6904                 f_ovf, NULL_TREE);
6905   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
6906                 f_sav, NULL_TREE);
6907
6908   /* Count number of gp and fp argument registers used.  */
6909   words = crtl->args.info.words;
6910   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
6911                GP_ARG_NUM_REG);
6912   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
6913                FP_ARG_NUM_REG);
6914
6915   if (TARGET_DEBUG_ARG)
6916     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
6917              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
6918              words, n_gpr, n_fpr);
6919
6920   if (cfun->va_list_gpr_size)
6921     {
6922       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
6923                   build_int_cst (NULL_TREE, n_gpr));
6924       TREE_SIDE_EFFECTS (t) = 1;
6925       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6926     }
6927
6928   if (cfun->va_list_fpr_size)
6929     {
6930       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
6931                   build_int_cst (NULL_TREE, n_fpr));
6932       TREE_SIDE_EFFECTS (t) = 1;
6933       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6934     }
6935
6936   /* Find the overflow area.  */
6937   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
6938   if (words != 0)
6939     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
6940                 size_int (words * UNITS_PER_WORD));
6941   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
6942   TREE_SIDE_EFFECTS (t) = 1;
6943   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6944
6945   /* If there were no va_arg invocations, don't set up the register
6946      save area.  */
6947   if (!cfun->va_list_gpr_size
6948       && !cfun->va_list_fpr_size
6949       && n_gpr < GP_ARG_NUM_REG
6950       && n_fpr < FP_ARG_V4_MAX_REG)
6951     return;
6952
6953   /* Find the register save area.  */
6954   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
6955   if (cfun->machine->varargs_save_offset)
6956     t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
6957                 size_int (cfun->machine->varargs_save_offset));
6958   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
6959   TREE_SIDE_EFFECTS (t) = 1;
6960   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6961 }
6962
6963 /* Implement va_arg.  */
6964
6965 tree
6966 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6967                         gimple_seq *post_p)
6968 {
6969   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
6970   tree gpr, fpr, ovf, sav, reg, t, u;
6971   int size, rsize, n_reg, sav_ofs, sav_scale;
6972   tree lab_false, lab_over, addr;
6973   int align;
6974   tree ptrtype = build_pointer_type (type);
6975   int regalign = 0;
6976   gimple stmt;
6977
6978   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
6979     {
6980       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
6981       return build_va_arg_indirect_ref (t);
6982     }
6983
6984   if (DEFAULT_ABI != ABI_V4)
6985     {
6986       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
6987         {
6988           tree elem_type = TREE_TYPE (type);
6989           enum machine_mode elem_mode = TYPE_MODE (elem_type);
6990           int elem_size = GET_MODE_SIZE (elem_mode);
6991
6992           if (elem_size < UNITS_PER_WORD)
6993             {
6994               tree real_part, imag_part;
6995               gimple_seq post = NULL;
6996
6997               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
6998                                                   &post);
6999               /* Copy the value into a temporary, lest the formal temporary
7000                  be reused out from under us.  */
7001               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
7002               gimple_seq_add_seq (pre_p, post);
7003
7004               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
7005                                                   post_p);
7006
7007               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
7008             }
7009         }
7010
7011       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
7012     }
7013
7014   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
7015   f_fpr = TREE_CHAIN (f_gpr);
7016   f_res = TREE_CHAIN (f_fpr);
7017   f_ovf = TREE_CHAIN (f_res);
7018   f_sav = TREE_CHAIN (f_ovf);
7019
7020   valist = build_va_arg_indirect_ref (valist);
7021   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
7022   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
7023                 f_fpr, NULL_TREE);
7024   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
7025                 f_ovf, NULL_TREE);
7026   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
7027                 f_sav, NULL_TREE);
7028
7029   size = int_size_in_bytes (type);
7030   rsize = (size + 3) / 4;
7031   align = 1;
7032
7033   if (TARGET_HARD_FLOAT && TARGET_FPRS
7034       && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
7035           || (TARGET_DOUBLE_FLOAT 
7036               && (TYPE_MODE (type) == DFmode 
7037                   || TYPE_MODE (type) == TFmode
7038                   || TYPE_MODE (type) == SDmode
7039                   || TYPE_MODE (type) == DDmode
7040                   || TYPE_MODE (type) == TDmode))))
7041     {
7042       /* FP args go in FP registers, if present.  */
7043       reg = fpr;
7044       n_reg = (size + 7) / 8;
7045       sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
7046       sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
7047       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
7048         align = 8;
7049     }
7050   else
7051     {
7052       /* Otherwise into GP registers.  */
7053       reg = gpr;
7054       n_reg = rsize;
7055       sav_ofs = 0;
7056       sav_scale = 4;
7057       if (n_reg == 2)
7058         align = 8;
7059     }
7060
7061   /* Pull the value out of the saved registers....  */
7062
7063   lab_over = NULL;
7064   addr = create_tmp_var (ptr_type_node, "addr");
7065   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
7066
7067   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
7068   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7069     align = 16;
7070   else
7071     {
7072       lab_false = create_artificial_label ();
7073       lab_over = create_artificial_label ();
7074
7075       /* Long long and SPE vectors are aligned in the registers.
7076          As are any other 2 gpr item such as complex int due to a
7077          historical mistake.  */
7078       u = reg;
7079       if (n_reg == 2 && reg == gpr)
7080         {
7081           regalign = 1;
7082           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
7083                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
7084           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
7085                       unshare_expr (reg), u);
7086         }
7087       /* _Decimal128 is passed in even/odd fpr pairs; the stored
7088          reg number is 0 for f1, so we want to make it odd.  */
7089       else if (reg == fpr && TYPE_MODE (type) == TDmode)
7090         {
7091           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
7092                       build_int_cst (TREE_TYPE (reg), 1));
7093           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
7094         }
7095
7096       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
7097       t = build2 (GE_EXPR, boolean_type_node, u, t);
7098       u = build1 (GOTO_EXPR, void_type_node, lab_false);
7099       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
7100       gimplify_and_add (t, pre_p);
7101
7102       t = sav;
7103       if (sav_ofs)
7104         t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
7105
7106       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
7107                   build_int_cst (TREE_TYPE (reg), n_reg));
7108       u = fold_convert (sizetype, u);
7109       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
7110       t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
7111
7112       /* _Decimal32 varargs are located in the second word of the 64-bit
7113          FP register for 32-bit binaries.  */
7114       if (!TARGET_POWERPC64
7115           && TARGET_HARD_FLOAT && TARGET_FPRS
7116           && TYPE_MODE (type) == SDmode)
7117         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
7118
7119       gimplify_assign (addr, t, pre_p);
7120
7121       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
7122
7123       stmt = gimple_build_label (lab_false);
7124       gimple_seq_add_stmt (pre_p, stmt);
7125
7126       if ((n_reg == 2 && !regalign) || n_reg > 2)
7127         {
7128           /* Ensure that we don't find any more args in regs.
7129              Alignment has taken care of for special cases.  */
7130           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
7131         }
7132     }
7133
7134   /* ... otherwise out of the overflow area.  */
7135
7136   /* Care for on-stack alignment if needed.  */
7137   t = ovf;
7138   if (align != 1)
7139     {
7140       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
7141       t = fold_convert (sizetype, t);
7142       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
7143                   size_int (-align));
7144       t = fold_convert (TREE_TYPE (ovf), t);
7145     }
7146   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
7147
7148   gimplify_assign (unshare_expr (addr), t, pre_p);
7149
7150   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
7151   gimplify_assign (unshare_expr (ovf), t, pre_p);
7152
7153   if (lab_over)
7154     {
7155       stmt = gimple_build_label (lab_over);
7156       gimple_seq_add_stmt (pre_p, stmt);
7157     }
7158
7159   if (STRICT_ALIGNMENT
7160       && (TYPE_ALIGN (type)
7161           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
7162     {
7163       /* The value (of type complex double, for example) may not be
7164          aligned in memory in the saved registers, so copy via a
7165          temporary.  (This is the same code as used for SPARC.)  */
7166       tree tmp = create_tmp_var (type, "va_arg_tmp");
7167       tree dest_addr = build_fold_addr_expr (tmp);
7168
7169       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
7170                                    3, dest_addr, addr, size_int (rsize * 4));
7171
7172       gimplify_and_add (copy, pre_p);
7173       addr = dest_addr;
7174     }
7175
7176   addr = fold_convert (ptrtype, addr);
7177   return build_va_arg_indirect_ref (addr);
7178 }
7179
7180 /* Builtins.  */
7181
7182 static void
7183 def_builtin (int mask, const char *name, tree type, int code)
7184 {
7185   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
7186     {
7187       if (rs6000_builtin_decls[code])
7188         abort ();
7189
7190       rs6000_builtin_decls[code] =
7191         add_builtin_function (name, type, code, BUILT_IN_MD,
7192                               NULL, NULL_TREE);
7193     }
7194 }
7195
7196 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
7197
7198 static const struct builtin_description bdesc_3arg[] =
7199 {
7200   { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
7201   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
7202   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
7203   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
7204   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
7205   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
7206   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
7207   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
7208   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
7209   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
7210   { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
7211   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
7212   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
7213   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
7214   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
7215   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
7216   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
7217   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
7218   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
7219   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
7220   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
7221   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
7222   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
7223
7224   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
7225   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
7226   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
7227   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
7228   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
7229   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
7230   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
7231   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
7232   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
7233   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
7234   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
7235   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
7236   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
7237   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
7238   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
7239
7240   { 0, CODE_FOR_paired_msub, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
7241   { 0, CODE_FOR_paired_madd, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
7242   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
7243   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
7244   { 0, CODE_FOR_paired_nmsub, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
7245   { 0, CODE_FOR_paired_nmadd, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
7246   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
7247   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
7248   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
7249 };
7250
7251 /* DST operations: void foo (void *, const int, const char).  */
7252
7253 static const struct builtin_description bdesc_dst[] =
7254 {
7255   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
7256   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
7257   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
7258   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
7259
7260   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
7261   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
7262   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
7263   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
7264 };
7265
7266 /* Simple binary operations: VECc = foo (VECa, VECb).  */
7267
7268 static struct builtin_description bdesc_2arg[] =
7269 {
7270   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
7271   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
7272   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
7273   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
7274   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
7275   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
7276   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
7277   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
7278   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
7279   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
7280   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
7281   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
7282   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
7283   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
7284   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
7285   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
7286   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
7287   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
7288   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
7289   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
7290   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
7291   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
7292   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
7293   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
7294   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
7295   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
7296   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
7297   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
7298   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
7299   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
7300   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
7301   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
7302   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
7303   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
7304   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
7305   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
7306   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
7307   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
7308   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
7309   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
7310   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
7311   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
7312   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
7313   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
7314   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
7315   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
7316   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
7317   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
7318   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
7319   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
7320   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
7321   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
7322   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
7323   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
7324   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
7325   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
7326   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
7327   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
7328   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
7329   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
7330   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
7331   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
7332   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
7333   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
7334   { MASK_ALTIVEC, CODE_FOR_altivec_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
7335   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
7336   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
7337   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
7338   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
7339   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
7340   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
7341   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
7342   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
7343   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
7344   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
7345   { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
7346   { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
7347   { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
7348   { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
7349   { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
7350   { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
7351   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
7352   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
7353   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
7354   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
7355   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
7356   { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
7357   { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
7358   { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
7359   { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
7360   { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
7361   { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
7362   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
7363   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
7364   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
7365   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
7366   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
7367   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
7368   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
7369   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
7370   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
7371   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
7372   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
7373   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
7374   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
7375   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
7376   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
7377   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
7378   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
7379   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
7380   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
7381
7382   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
7383   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
7384   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
7385   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
7386   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
7387   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
7388   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
7389   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
7390   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
7391   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
7392   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
7393   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
7394   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
7395   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
7396   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
7397   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
7398   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
7399   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
7400   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
7401   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
7402   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
7403   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
7404   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
7405   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
7406   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
7407   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
7408   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
7409   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
7410   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
7411   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
7412   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
7413   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
7414   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
7415   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
7416   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
7417   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
7418   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
7419   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
7420   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
7421   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
7422   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
7423   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
7424   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
7425   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
7426   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
7427   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
7428   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
7429   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
7430   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
7431   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
7432   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
7433   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
7434   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
7435   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
7436   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
7437   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
7438   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
7439   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
7440   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
7441   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
7442   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
7443   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
7444   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
7445   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
7446   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
7447   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
7448   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
7449   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
7450   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
7451   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
7452   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
7453   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
7454   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
7455   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
7456   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
7457   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
7458   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
7459   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
7460   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
7461   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
7462   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
7463   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
7464   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
7465   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
7466   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
7467   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
7468   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
7469   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
7470   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
7471   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
7472   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
7473   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
7474   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
7475   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
7476   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
7477   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
7478   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
7479   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
7480   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
7481   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
7482   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
7483   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
7484   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
7485   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
7486   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
7487   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
7488   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
7489   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
7490   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
7491   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
7492   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
7493   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
7494   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
7495   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
7496   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
7497   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
7498   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
7499   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
7500   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
7501   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
7502   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
7503   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
7504   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
7505   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
7506   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
7507   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
7508   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
7509
7510   { 0, CODE_FOR_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
7511   { 0, CODE_FOR_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
7512   { 0, CODE_FOR_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
7513   { 0, CODE_FOR_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
7514   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
7515   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
7516   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
7517   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
7518   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
7519   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
7520
7521   /* Place holder, leave as first spe builtin.  */
7522   { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
7523   { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
7524   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
7525   { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
7526   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
7527   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
7528   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
7529   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
7530   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
7531   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
7532   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
7533   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
7534   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
7535   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
7536   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
7537   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
7538   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
7539   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
7540   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
7541   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
7542   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
7543   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
7544   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
7545   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
7546   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
7547   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
7548   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
7549   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
7550   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
7551   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
7552   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
7553   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
7554   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
7555   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
7556   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
7557   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
7558   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
7559   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
7560   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
7561   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
7562   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
7563   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
7564   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
7565   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
7566   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
7567   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
7568   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
7569   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
7570   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
7571   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
7572   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
7573   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
7574   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
7575   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
7576   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
7577   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
7578   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
7579   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
7580   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
7581   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
7582   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
7583   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
7584   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
7585   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
7586   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
7587   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
7588   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
7589   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
7590   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
7591   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
7592   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
7593   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
7594   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
7595   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
7596   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
7597   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
7598   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
7599   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
7600   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
7601   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
7602   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
7603   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
7604   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
7605   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
7606   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
7607   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
7608   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
7609   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
7610   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
7611   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
7612   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
7613   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
7614   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
7615   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
7616   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
7617   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
7618   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
7619   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
7620   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
7621   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
7622   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
7623   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
7624   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
7625   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
7626   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
7627   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
7628   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
7629   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
7630   { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
7631
7632   /* SPE binary operations expecting a 5-bit unsigned literal.  */
7633   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
7634
7635   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
7636   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
7637   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
7638   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
7639   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
7640   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
7641   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
7642   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
7643   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
7644   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
7645   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
7646   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
7647   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
7648   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
7649   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
7650   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
7651   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
7652   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
7653   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
7654   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
7655   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
7656   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
7657   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
7658   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
7659   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
7660   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
7661
7662   /* Place-holder.  Leave as last binary SPE builtin.  */
7663   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
7664 };
7665
7666 /* AltiVec predicates.  */
7667
7668 struct builtin_description_predicates
7669 {
7670   const unsigned int mask;
7671   const enum insn_code icode;
7672   const char *opcode;
7673   const char *const name;
7674   const enum rs6000_builtins code;
7675 };
7676
7677 static const struct builtin_description_predicates bdesc_altivec_preds[] =
7678 {
7679   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
7680   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
7681   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
7682   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
7683   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
7684   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
7685   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
7686   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
7687   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
7688   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
7689   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
7690   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
7691   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
7692
7693   { MASK_ALTIVEC, CODE_FOR_nothing, NULL, "__builtin_vec_vcmpeq_p", ALTIVEC_BUILTIN_VCMPEQ_P },
7694   { MASK_ALTIVEC, CODE_FOR_nothing, NULL, "__builtin_vec_vcmpgt_p", ALTIVEC_BUILTIN_VCMPGT_P },
7695   { MASK_ALTIVEC, CODE_FOR_nothing, NULL, "__builtin_vec_vcmpge_p", ALTIVEC_BUILTIN_VCMPGE_P }
7696 };
7697
7698 /* SPE predicates.  */
7699 static struct builtin_description bdesc_spe_predicates[] =
7700 {
7701   /* Place-holder.  Leave as first.  */
7702   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
7703   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
7704   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
7705   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
7706   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
7707   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
7708   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
7709   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
7710   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
7711   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
7712   /* Place-holder.  Leave as last.  */
7713   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
7714 };
7715
7716 /* SPE evsel predicates.  */
7717 static struct builtin_description bdesc_spe_evsel[] =
7718 {
7719   /* Place-holder.  Leave as first.  */
7720   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
7721   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
7722   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
7723   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
7724   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
7725   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
7726   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
7727   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
7728   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
7729   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
7730   /* Place-holder.  Leave as last.  */
7731   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
7732 };
7733
7734 /* PAIRED predicates.  */
7735 static const struct builtin_description bdesc_paired_preds[] =
7736 {
7737   /* Place-holder.  Leave as first.  */
7738   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
7739   /* Place-holder.  Leave as last.  */
7740   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
7741 };
7742
7743 /* ABS* operations.  */
7744
7745 static const struct builtin_description bdesc_abs[] =
7746 {
7747   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
7748   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
7749   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
7750   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
7751   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
7752   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
7753   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
7754 };
7755
7756 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
7757    foo (VECa).  */
7758
7759 static struct builtin_description bdesc_1arg[] =
7760 {
7761   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
7762   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
7763   { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
7764   { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
7765   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
7766   { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
7767   { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
7768   { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
7769   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
7770   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
7771   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
7772   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
7773   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
7774   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
7775   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
7776   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
7777   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
7778
7779   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
7780   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
7781   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
7782   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
7783   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
7784   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
7785   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
7786   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
7787   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
7788   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
7789   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
7790   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
7791   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
7792   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
7793   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
7794   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
7795   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
7796   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
7797   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
7798
7799   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
7800      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
7801   { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
7802   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
7803   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
7804   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
7805   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
7806   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
7807   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
7808   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
7809   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
7810   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
7811   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
7812   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
7813   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
7814   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
7815   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
7816   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
7817   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
7818   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
7819   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
7820   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
7821   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
7822   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
7823   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
7824   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
7825   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
7826   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
7827   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
7828   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
7829
7830   /* Place-holder.  Leave as last unary SPE builtin.  */
7831   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
7832
7833   { 0, CODE_FOR_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
7834   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
7835   { 0, CODE_FOR_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
7836   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
7837   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
7838 };
7839
7840 static rtx
7841 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
7842 {
7843   rtx pat;
7844   tree arg0 = CALL_EXPR_ARG (exp, 0);
7845   rtx op0 = expand_normal (arg0);
7846   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7847   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7848
7849   if (icode == CODE_FOR_nothing)
7850     /* Builtin not supported on this processor.  */
7851     return 0;
7852
7853   /* If we got invalid arguments bail out before generating bad rtl.  */
7854   if (arg0 == error_mark_node)
7855     return const0_rtx;
7856
7857   if (icode == CODE_FOR_altivec_vspltisb
7858       || icode == CODE_FOR_altivec_vspltish
7859       || icode == CODE_FOR_altivec_vspltisw
7860       || icode == CODE_FOR_spe_evsplatfi
7861       || icode == CODE_FOR_spe_evsplati)
7862     {
7863       /* Only allow 5-bit *signed* literals.  */
7864       if (GET_CODE (op0) != CONST_INT
7865           || INTVAL (op0) > 15
7866           || INTVAL (op0) < -16)
7867         {
7868           error ("argument 1 must be a 5-bit signed literal");
7869           return const0_rtx;
7870         }
7871     }
7872
7873   if (target == 0
7874       || GET_MODE (target) != tmode
7875       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7876     target = gen_reg_rtx (tmode);
7877
7878   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7879     op0 = copy_to_mode_reg (mode0, op0);
7880
7881   pat = GEN_FCN (icode) (target, op0);
7882   if (! pat)
7883     return 0;
7884   emit_insn (pat);
7885
7886   return target;
7887 }
7888
7889 static rtx
7890 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
7891 {
7892   rtx pat, scratch1, scratch2;
7893   tree arg0 = CALL_EXPR_ARG (exp, 0);
7894   rtx op0 = expand_normal (arg0);
7895   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7896   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7897
7898   /* If we have invalid arguments, bail out before generating bad rtl.  */
7899   if (arg0 == error_mark_node)
7900     return const0_rtx;
7901
7902   if (target == 0
7903       || GET_MODE (target) != tmode
7904       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7905     target = gen_reg_rtx (tmode);
7906
7907   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7908     op0 = copy_to_mode_reg (mode0, op0);
7909
7910   scratch1 = gen_reg_rtx (mode0);
7911   scratch2 = gen_reg_rtx (mode0);
7912
7913   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
7914   if (! pat)
7915     return 0;
7916   emit_insn (pat);
7917
7918   return target;
7919 }
7920
7921 static rtx
7922 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
7923 {
7924   rtx pat;
7925   tree arg0 = CALL_EXPR_ARG (exp, 0);
7926   tree arg1 = CALL_EXPR_ARG (exp, 1);
7927   rtx op0 = expand_normal (arg0);
7928   rtx op1 = expand_normal (arg1);
7929   enum machine_mode tmode = insn_data[icode].operand[0].mode;
7930   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7931   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7932
7933   if (icode == CODE_FOR_nothing)
7934     /* Builtin not supported on this processor.  */
7935     return 0;
7936
7937   /* If we got invalid arguments bail out before generating bad rtl.  */
7938   if (arg0 == error_mark_node || arg1 == error_mark_node)
7939     return const0_rtx;
7940
7941   if (icode == CODE_FOR_altivec_vcfux
7942       || icode == CODE_FOR_altivec_vcfsx
7943       || icode == CODE_FOR_altivec_vctsxs
7944       || icode == CODE_FOR_altivec_vctuxs
7945       || icode == CODE_FOR_altivec_vspltb
7946       || icode == CODE_FOR_altivec_vsplth
7947       || icode == CODE_FOR_altivec_vspltw
7948       || icode == CODE_FOR_spe_evaddiw
7949       || icode == CODE_FOR_spe_evldd
7950       || icode == CODE_FOR_spe_evldh
7951       || icode == CODE_FOR_spe_evldw
7952       || icode == CODE_FOR_spe_evlhhesplat
7953       || icode == CODE_FOR_spe_evlhhossplat
7954       || icode == CODE_FOR_spe_evlhhousplat
7955       || icode == CODE_FOR_spe_evlwhe
7956       || icode == CODE_FOR_spe_evlwhos
7957       || icode == CODE_FOR_spe_evlwhou
7958       || icode == CODE_FOR_spe_evlwhsplat
7959       || icode == CODE_FOR_spe_evlwwsplat
7960       || icode == CODE_FOR_spe_evrlwi
7961       || icode == CODE_FOR_spe_evslwi
7962       || icode == CODE_FOR_spe_evsrwis
7963       || icode == CODE_FOR_spe_evsubifw
7964       || icode == CODE_FOR_spe_evsrwiu)
7965     {
7966       /* Only allow 5-bit unsigned literals.  */
7967       STRIP_NOPS (arg1);
7968       if (TREE_CODE (arg1) != INTEGER_CST
7969           || TREE_INT_CST_LOW (arg1) & ~0x1f)
7970         {
7971           error ("argument 2 must be a 5-bit unsigned literal");
7972           return const0_rtx;
7973         }
7974     }
7975
7976   if (target == 0
7977       || GET_MODE (target) != tmode
7978       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7979     target = gen_reg_rtx (tmode);
7980
7981   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7982     op0 = copy_to_mode_reg (mode0, op0);
7983   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7984     op1 = copy_to_mode_reg (mode1, op1);
7985
7986   pat = GEN_FCN (icode) (target, op0, op1);
7987   if (! pat)
7988     return 0;
7989   emit_insn (pat);
7990
7991   return target;
7992 }
7993
7994 static rtx
7995 altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode,
7996                                   tree exp, rtx target)
7997 {
7998   rtx pat, scratch;
7999   tree cr6_form = CALL_EXPR_ARG (exp, 0);
8000   tree arg0 = CALL_EXPR_ARG (exp, 1);
8001   tree arg1 = CALL_EXPR_ARG (exp, 2);
8002   rtx op0 = expand_normal (arg0);
8003   rtx op1 = expand_normal (arg1);
8004   enum machine_mode tmode = SImode;
8005   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
8006   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
8007   int cr6_form_int;
8008
8009   if (TREE_CODE (cr6_form) != INTEGER_CST)
8010     {
8011       error ("argument 1 of __builtin_altivec_predicate must be a constant");
8012       return const0_rtx;
8013     }
8014   else
8015     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
8016
8017   gcc_assert (mode0 == mode1);
8018
8019   /* If we have invalid arguments, bail out before generating bad rtl.  */
8020   if (arg0 == error_mark_node || arg1 == error_mark_node)
8021     return const0_rtx;
8022
8023   if (target == 0
8024       || GET_MODE (target) != tmode
8025       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8026     target = gen_reg_rtx (tmode);
8027
8028   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8029     op0 = copy_to_mode_reg (mode0, op0);
8030   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
8031     op1 = copy_to_mode_reg (mode1, op1);
8032
8033   scratch = gen_reg_rtx (mode0);
8034
8035   pat = GEN_FCN (icode) (scratch, op0, op1,
8036                          gen_rtx_SYMBOL_REF (Pmode, opcode));
8037   if (! pat)
8038     return 0;
8039   emit_insn (pat);
8040
8041   /* The vec_any* and vec_all* predicates use the same opcodes for two
8042      different operations, but the bits in CR6 will be different
8043      depending on what information we want.  So we have to play tricks
8044      with CR6 to get the right bits out.
8045
8046      If you think this is disgusting, look at the specs for the
8047      AltiVec predicates.  */
8048
8049   switch (cr6_form_int)
8050     {
8051     case 0:
8052       emit_insn (gen_cr6_test_for_zero (target));
8053       break;
8054     case 1:
8055       emit_insn (gen_cr6_test_for_zero_reverse (target));
8056       break;
8057     case 2:
8058       emit_insn (gen_cr6_test_for_lt (target));
8059       break;
8060     case 3:
8061       emit_insn (gen_cr6_test_for_lt_reverse (target));
8062       break;
8063     default:
8064       error ("argument 1 of __builtin_altivec_predicate is out of range");
8065       break;
8066     }
8067
8068   return target;
8069 }
8070
8071 static rtx
8072 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
8073 {
8074   rtx pat, addr;
8075   tree arg0 = CALL_EXPR_ARG (exp, 0);
8076   tree arg1 = CALL_EXPR_ARG (exp, 1);
8077   enum machine_mode tmode = insn_data[icode].operand[0].mode;
8078   enum machine_mode mode0 = Pmode;
8079   enum machine_mode mode1 = Pmode;
8080   rtx op0 = expand_normal (arg0);
8081   rtx op1 = expand_normal (arg1);
8082
8083   if (icode == CODE_FOR_nothing)
8084     /* Builtin not supported on this processor.  */
8085     return 0;
8086
8087   /* If we got invalid arguments bail out before generating bad rtl.  */
8088   if (arg0 == error_mark_node || arg1 == error_mark_node)
8089     return const0_rtx;
8090
8091   if (target == 0
8092       || GET_MODE (target) != tmode
8093       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8094     target = gen_reg_rtx (tmode);
8095
8096   op1 = copy_to_mode_reg (mode1, op1);
8097
8098   if (op0 == const0_rtx)
8099     {
8100       addr = gen_rtx_MEM (tmode, op1);
8101     }
8102   else
8103     {
8104       op0 = copy_to_mode_reg (mode0, op0);
8105       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
8106     }
8107
8108   pat = GEN_FCN (icode) (target, addr);
8109
8110   if (! pat)
8111     return 0;
8112   emit_insn (pat);
8113
8114   return target;
8115 }
8116
8117 static rtx
8118 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
8119 {
8120   rtx pat, addr;
8121   tree arg0 = CALL_EXPR_ARG (exp, 0);
8122   tree arg1 = CALL_EXPR_ARG (exp, 1);
8123   enum machine_mode tmode = insn_data[icode].operand[0].mode;
8124   enum machine_mode mode0 = Pmode;
8125   enum machine_mode mode1 = Pmode;
8126   rtx op0 = expand_normal (arg0);
8127   rtx op1 = expand_normal (arg1);
8128
8129   if (icode == CODE_FOR_nothing)
8130     /* Builtin not supported on this processor.  */
8131     return 0;
8132
8133   /* If we got invalid arguments bail out before generating bad rtl.  */
8134   if (arg0 == error_mark_node || arg1 == error_mark_node)
8135     return const0_rtx;
8136
8137   if (target == 0
8138       || GET_MODE (target) != tmode
8139       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8140     target = gen_reg_rtx (tmode);
8141
8142   op1 = copy_to_mode_reg (mode1, op1);
8143
8144   if (op0 == const0_rtx)
8145     {
8146       addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
8147     }
8148   else
8149     {
8150       op0 = copy_to_mode_reg (mode0, op0);
8151       addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
8152     }
8153
8154   pat = GEN_FCN (icode) (target, addr);
8155
8156   if (! pat)
8157     return 0;
8158   emit_insn (pat);
8159
8160   return target;
8161 }
8162
8163 static rtx
8164 spe_expand_stv_builtin (enum insn_code icode, tree exp)
8165 {
8166   tree arg0 = CALL_EXPR_ARG (exp, 0);
8167   tree arg1 = CALL_EXPR_ARG (exp, 1);
8168   tree arg2 = CALL_EXPR_ARG (exp, 2);
8169   rtx op0 = expand_normal (arg0);
8170   rtx op1 = expand_normal (arg1);
8171   rtx op2 = expand_normal (arg2);
8172   rtx pat;
8173   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
8174   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
8175   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
8176
8177   /* Invalid arguments.  Bail before doing anything stoopid!  */
8178   if (arg0 == error_mark_node
8179       || arg1 == error_mark_node
8180       || arg2 == error_mark_node)
8181     return const0_rtx;
8182
8183   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
8184     op0 = copy_to_mode_reg (mode2, op0);
8185   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
8186     op1 = copy_to_mode_reg (mode0, op1);
8187   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
8188     op2 = copy_to_mode_reg (mode1, op2);
8189
8190   pat = GEN_FCN (icode) (op1, op2, op0);
8191   if (pat)
8192     emit_insn (pat);
8193   return NULL_RTX;
8194 }
8195
8196 static rtx
8197 paired_expand_stv_builtin (enum insn_code icode, tree exp)
8198 {
8199   tree arg0 = CALL_EXPR_ARG (exp, 0);
8200   tree arg1 = CALL_EXPR_ARG (exp, 1);
8201   tree arg2 = CALL_EXPR_ARG (exp, 2);
8202   rtx op0 = expand_normal (arg0);
8203   rtx op1 = expand_normal (arg1);
8204   rtx op2 = expand_normal (arg2);
8205   rtx pat, addr;
8206   enum machine_mode tmode = insn_data[icode].operand[0].mode;
8207   enum machine_mode mode1 = Pmode;
8208   enum machine_mode mode2 = Pmode;
8209
8210   /* Invalid arguments.  Bail before doing anything stoopid!  */
8211   if (arg0 == error_mark_node
8212       || arg1 == error_mark_node
8213       || arg2 == error_mark_node)
8214     return const0_rtx;
8215
8216   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
8217     op0 = copy_to_mode_reg (tmode, op0);
8218
8219   op2 = copy_to_mode_reg (mode2, op2);
8220
8221   if (op1 == const0_rtx)
8222     {
8223       addr = gen_rtx_MEM (tmode, op2);
8224     }
8225   else
8226     {
8227       op1 = copy_to_mode_reg (mode1, op1);
8228       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
8229     }
8230
8231   pat = GEN_FCN (icode) (addr, op0);
8232   if (pat)
8233     emit_insn (pat);
8234   return NULL_RTX;
8235 }
8236
8237 static rtx
8238 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
8239 {
8240   tree arg0 = CALL_EXPR_ARG (exp, 0);
8241   tree arg1 = CALL_EXPR_ARG (exp, 1);
8242   tree arg2 = CALL_EXPR_ARG (exp, 2);
8243   rtx op0 = expand_normal (arg0);
8244   rtx op1 = expand_normal (arg1);
8245   rtx op2 = expand_normal (arg2);
8246   rtx pat, addr;
8247   enum machine_mode tmode = insn_data[icode].operand[0].mode;
8248   enum machine_mode mode1 = Pmode;
8249   enum machine_mode mode2 = Pmode;
8250
8251   /* Invalid arguments.  Bail before doing anything stoopid!  */
8252   if (arg0 == error_mark_node
8253       || arg1 == error_mark_node
8254       || arg2 == error_mark_node)
8255     return const0_rtx;
8256
8257   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
8258     op0 = copy_to_mode_reg (tmode, op0);
8259
8260   op2 = copy_to_mode_reg (mode2, op2);
8261
8262   if (op1 == const0_rtx)
8263     {
8264       addr = gen_rtx_MEM (tmode, op2);
8265     }
8266   else
8267     {
8268       op1 = copy_to_mode_reg (mode1, op1);
8269       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
8270     }
8271
8272   pat = GEN_FCN (icode) (addr, op0);
8273   if (pat)
8274     emit_insn (pat);
8275   return NULL_RTX;
8276 }
8277
8278 static rtx
8279 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
8280 {
8281   rtx pat;
8282   tree arg0 = CALL_EXPR_ARG (exp, 0);
8283   tree arg1 = CALL_EXPR_ARG (exp, 1);
8284   tree arg2 = CALL_EXPR_ARG (exp, 2);
8285   rtx op0 = expand_normal (arg0);
8286   rtx op1 = expand_normal (arg1);
8287   rtx op2 = expand_normal (arg2);
8288   enum machine_mode tmode = insn_data[icode].operand[0].mode;
8289   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
8290   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
8291   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
8292
8293   if (icode == CODE_FOR_nothing)
8294     /* Builtin not supported on this processor.  */
8295     return 0;
8296
8297   /* If we got invalid arguments bail out before generating bad rtl.  */
8298   if (arg0 == error_mark_node
8299       || arg1 == error_mark_node
8300       || arg2 == error_mark_node)
8301     return const0_rtx;
8302
8303   if (icode == CODE_FOR_altivec_vsldoi_v4sf
8304       || icode == CODE_FOR_altivec_vsldoi_v4si
8305       || icode == CODE_FOR_altivec_vsldoi_v8hi
8306       || icode == CODE_FOR_altivec_vsldoi_v16qi)
8307     {
8308       /* Only allow 4-bit unsigned literals.  */
8309       STRIP_NOPS (arg2);
8310       if (TREE_CODE (arg2) != INTEGER_CST
8311           || TREE_INT_CST_LOW (arg2) & ~0xf)
8312         {
8313           error ("argument 3 must be a 4-bit unsigned literal");
8314           return const0_rtx;
8315         }
8316     }
8317
8318   if (target == 0
8319       || GET_MODE (target) != tmode
8320       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8321     target = gen_reg_rtx (tmode);
8322
8323   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8324     op0 = copy_to_mode_reg (mode0, op0);
8325   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
8326     op1 = copy_to_mode_reg (mode1, op1);
8327   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
8328     op2 = copy_to_mode_reg (mode2, op2);
8329
8330   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
8331     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
8332   else 
8333     pat = GEN_FCN (icode) (target, op0, op1, op2);
8334   if (! pat)
8335     return 0;
8336   emit_insn (pat);
8337
8338   return target;
8339 }
8340
8341 /* Expand the lvx builtins.  */
8342 static rtx
8343 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
8344 {
8345   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8346   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8347   tree arg0;
8348   enum machine_mode tmode, mode0;
8349   rtx pat, op0;
8350   enum insn_code icode;
8351
8352   switch (fcode)
8353     {
8354     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
8355       icode = CODE_FOR_altivec_lvx_v16qi;
8356       break;
8357     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
8358       icode = CODE_FOR_altivec_lvx_v8hi;
8359       break;
8360     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
8361       icode = CODE_FOR_altivec_lvx_v4si;
8362       break;
8363     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
8364       icode = CODE_FOR_altivec_lvx_v4sf;
8365       break;
8366     default:
8367       *expandedp = false;
8368       return NULL_RTX;
8369     }
8370
8371   *expandedp = true;
8372
8373   arg0 = CALL_EXPR_ARG (exp, 0);
8374   op0 = expand_normal (arg0);
8375   tmode = insn_data[icode].operand[0].mode;
8376   mode0 = insn_data[icode].operand[1].mode;
8377
8378   if (target == 0
8379       || GET_MODE (target) != tmode
8380       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8381     target = gen_reg_rtx (tmode);
8382
8383   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
8384     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
8385
8386   pat = GEN_FCN (icode) (target, op0);
8387   if (! pat)
8388     return 0;
8389   emit_insn (pat);
8390   return target;
8391 }
8392
8393 /* Expand the stvx builtins.  */
8394 static rtx
8395 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
8396                            bool *expandedp)
8397 {
8398   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8399   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8400   tree arg0, arg1;
8401   enum machine_mode mode0, mode1;
8402   rtx pat, op0, op1;
8403   enum insn_code icode;
8404
8405   switch (fcode)
8406     {
8407     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
8408       icode = CODE_FOR_altivec_stvx_v16qi;
8409       break;
8410     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
8411       icode = CODE_FOR_altivec_stvx_v8hi;
8412       break;
8413     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
8414       icode = CODE_FOR_altivec_stvx_v4si;
8415       break;
8416     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
8417       icode = CODE_FOR_altivec_stvx_v4sf;
8418       break;
8419     default:
8420       *expandedp = false;
8421       return NULL_RTX;
8422     }
8423
8424   arg0 = CALL_EXPR_ARG (exp, 0);
8425   arg1 = CALL_EXPR_ARG (exp, 1);
8426   op0 = expand_normal (arg0);
8427   op1 = expand_normal (arg1);
8428   mode0 = insn_data[icode].operand[0].mode;
8429   mode1 = insn_data[icode].operand[1].mode;
8430
8431   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8432     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
8433   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
8434     op1 = copy_to_mode_reg (mode1, op1);
8435
8436   pat = GEN_FCN (icode) (op0, op1);
8437   if (pat)
8438     emit_insn (pat);
8439
8440   *expandedp = true;
8441   return NULL_RTX;
8442 }
8443
8444 /* Expand the dst builtins.  */
8445 static rtx
8446 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
8447                             bool *expandedp)
8448 {
8449   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8450   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8451   tree arg0, arg1, arg2;
8452   enum machine_mode mode0, mode1, mode2;
8453   rtx pat, op0, op1, op2;
8454   const struct builtin_description *d;
8455   size_t i;
8456
8457   *expandedp = false;
8458
8459   /* Handle DST variants.  */
8460   d = bdesc_dst;
8461   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
8462     if (d->code == fcode)
8463       {
8464         arg0 = CALL_EXPR_ARG (exp, 0);
8465         arg1 = CALL_EXPR_ARG (exp, 1);
8466         arg2 = CALL_EXPR_ARG (exp, 2);
8467         op0 = expand_normal (arg0);
8468         op1 = expand_normal (arg1);
8469         op2 = expand_normal (arg2);
8470         mode0 = insn_data[d->icode].operand[0].mode;
8471         mode1 = insn_data[d->icode].operand[1].mode;
8472         mode2 = insn_data[d->icode].operand[2].mode;
8473
8474         /* Invalid arguments, bail out before generating bad rtl.  */
8475         if (arg0 == error_mark_node
8476             || arg1 == error_mark_node
8477             || arg2 == error_mark_node)
8478           return const0_rtx;
8479
8480         *expandedp = true;
8481         STRIP_NOPS (arg2);
8482         if (TREE_CODE (arg2) != INTEGER_CST
8483             || TREE_INT_CST_LOW (arg2) & ~0x3)
8484           {
8485             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
8486             return const0_rtx;
8487           }
8488
8489         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
8490           op0 = copy_to_mode_reg (Pmode, op0);
8491         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
8492           op1 = copy_to_mode_reg (mode1, op1);
8493
8494         pat = GEN_FCN (d->icode) (op0, op1, op2);
8495         if (pat != 0)
8496           emit_insn (pat);
8497
8498         return NULL_RTX;
8499       }
8500
8501   return NULL_RTX;
8502 }
8503
8504 /* Expand vec_init builtin.  */
8505 static rtx
8506 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
8507 {
8508   enum machine_mode tmode = TYPE_MODE (type);
8509   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
8510   int i, n_elt = GET_MODE_NUNITS (tmode);
8511   rtvec v = rtvec_alloc (n_elt);
8512
8513   gcc_assert (VECTOR_MODE_P (tmode));
8514   gcc_assert (n_elt == call_expr_nargs (exp));
8515
8516   for (i = 0; i < n_elt; ++i)
8517     {
8518       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
8519       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
8520     }
8521
8522   if (!target || !register_operand (target, tmode))
8523     target = gen_reg_rtx (tmode);
8524
8525   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
8526   return target;
8527 }
8528
8529 /* Return the integer constant in ARG.  Constrain it to be in the range
8530    of the subparts of VEC_TYPE; issue an error if not.  */
8531
8532 static int
8533 get_element_number (tree vec_type, tree arg)
8534 {
8535   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
8536
8537   if (!host_integerp (arg, 1)
8538       || (elt = tree_low_cst (arg, 1), elt > max))
8539     {
8540       error ("selector must be an integer constant in the range 0..%wi", max);
8541       return 0;
8542     }
8543
8544   return elt;
8545 }
8546
8547 /* Expand vec_set builtin.  */
8548 static rtx
8549 altivec_expand_vec_set_builtin (tree exp)
8550 {
8551   enum machine_mode tmode, mode1;
8552   tree arg0, arg1, arg2;
8553   int elt;
8554   rtx op0, op1;
8555
8556   arg0 = CALL_EXPR_ARG (exp, 0);
8557   arg1 = CALL_EXPR_ARG (exp, 1);
8558   arg2 = CALL_EXPR_ARG (exp, 2);
8559
8560   tmode = TYPE_MODE (TREE_TYPE (arg0));
8561   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
8562   gcc_assert (VECTOR_MODE_P (tmode));
8563
8564   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
8565   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
8566   elt = get_element_number (TREE_TYPE (arg0), arg2);
8567
8568   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
8569     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
8570
8571   op0 = force_reg (tmode, op0);
8572   op1 = force_reg (mode1, op1);
8573
8574   rs6000_expand_vector_set (op0, op1, elt);
8575
8576   return op0;
8577 }
8578
8579 /* Expand vec_ext builtin.  */
8580 static rtx
8581 altivec_expand_vec_ext_builtin (tree exp, rtx target)
8582 {
8583   enum machine_mode tmode, mode0;
8584   tree arg0, arg1;
8585   int elt;
8586   rtx op0;
8587
8588   arg0 = CALL_EXPR_ARG (exp, 0);
8589   arg1 = CALL_EXPR_ARG (exp, 1);
8590
8591   op0 = expand_normal (arg0);
8592   elt = get_element_number (TREE_TYPE (arg0), arg1);
8593
8594   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
8595   mode0 = TYPE_MODE (TREE_TYPE (arg0));
8596   gcc_assert (VECTOR_MODE_P (mode0));
8597
8598   op0 = force_reg (mode0, op0);
8599
8600   if (optimize || !target || !register_operand (target, tmode))
8601     target = gen_reg_rtx (tmode);
8602
8603   rs6000_expand_vector_extract (target, op0, elt);
8604
8605   return target;
8606 }
8607
8608 /* Expand the builtin in EXP and store the result in TARGET.  Store
8609    true in *EXPANDEDP if we found a builtin to expand.  */
8610 static rtx
8611 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
8612 {
8613   const struct builtin_description *d;
8614   const struct builtin_description_predicates *dp;
8615   size_t i;
8616   enum insn_code icode;
8617   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8618   tree arg0;
8619   rtx op0, pat;
8620   enum machine_mode tmode, mode0;
8621   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8622
8623   if (fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8624       && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
8625     {
8626       *expandedp = true;
8627       error ("unresolved overload for Altivec builtin %qF", fndecl);
8628       return const0_rtx;
8629     }
8630
8631   target = altivec_expand_ld_builtin (exp, target, expandedp);
8632   if (*expandedp)
8633     return target;
8634
8635   target = altivec_expand_st_builtin (exp, target, expandedp);
8636   if (*expandedp)
8637     return target;
8638
8639   target = altivec_expand_dst_builtin (exp, target, expandedp);
8640   if (*expandedp)
8641     return target;
8642
8643   *expandedp = true;
8644
8645   switch (fcode)
8646     {
8647     case ALTIVEC_BUILTIN_STVX:
8648       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, exp);
8649     case ALTIVEC_BUILTIN_STVEBX:
8650       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
8651     case ALTIVEC_BUILTIN_STVEHX:
8652       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
8653     case ALTIVEC_BUILTIN_STVEWX:
8654       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
8655     case ALTIVEC_BUILTIN_STVXL:
8656       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
8657
8658     case ALTIVEC_BUILTIN_STVLX:
8659       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
8660     case ALTIVEC_BUILTIN_STVLXL:
8661       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
8662     case ALTIVEC_BUILTIN_STVRX:
8663       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
8664     case ALTIVEC_BUILTIN_STVRXL:
8665       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
8666
8667     case ALTIVEC_BUILTIN_MFVSCR:
8668       icode = CODE_FOR_altivec_mfvscr;
8669       tmode = insn_data[icode].operand[0].mode;
8670
8671       if (target == 0
8672           || GET_MODE (target) != tmode
8673           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8674         target = gen_reg_rtx (tmode);
8675
8676       pat = GEN_FCN (icode) (target);
8677       if (! pat)
8678         return 0;
8679       emit_insn (pat);
8680       return target;
8681
8682     case ALTIVEC_BUILTIN_MTVSCR:
8683       icode = CODE_FOR_altivec_mtvscr;
8684       arg0 = CALL_EXPR_ARG (exp, 0);
8685       op0 = expand_normal (arg0);
8686       mode0 = insn_data[icode].operand[0].mode;
8687
8688       /* If we got invalid arguments bail out before generating bad rtl.  */
8689       if (arg0 == error_mark_node)
8690         return const0_rtx;
8691
8692       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8693         op0 = copy_to_mode_reg (mode0, op0);
8694
8695       pat = GEN_FCN (icode) (op0);
8696       if (pat)
8697         emit_insn (pat);
8698       return NULL_RTX;
8699
8700     case ALTIVEC_BUILTIN_DSSALL:
8701       emit_insn (gen_altivec_dssall ());
8702       return NULL_RTX;
8703
8704     case ALTIVEC_BUILTIN_DSS:
8705       icode = CODE_FOR_altivec_dss;
8706       arg0 = CALL_EXPR_ARG (exp, 0);
8707       STRIP_NOPS (arg0);
8708       op0 = expand_normal (arg0);
8709       mode0 = insn_data[icode].operand[0].mode;
8710
8711       /* If we got invalid arguments bail out before generating bad rtl.  */
8712       if (arg0 == error_mark_node)
8713         return const0_rtx;
8714
8715       if (TREE_CODE (arg0) != INTEGER_CST
8716           || TREE_INT_CST_LOW (arg0) & ~0x3)
8717         {
8718           error ("argument to dss must be a 2-bit unsigned literal");
8719           return const0_rtx;
8720         }
8721
8722       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8723         op0 = copy_to_mode_reg (mode0, op0);
8724
8725       emit_insn (gen_altivec_dss (op0));
8726       return NULL_RTX;
8727
8728     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
8729     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
8730     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
8731     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
8732       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
8733
8734     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
8735     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
8736     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
8737     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
8738       return altivec_expand_vec_set_builtin (exp);
8739
8740     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
8741     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
8742     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
8743     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
8744       return altivec_expand_vec_ext_builtin (exp, target);
8745
8746     default:
8747       break;
8748       /* Fall through.  */
8749     }
8750
8751   /* Expand abs* operations.  */
8752   d = bdesc_abs;
8753   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
8754     if (d->code == fcode)
8755       return altivec_expand_abs_builtin (d->icode, exp, target);
8756
8757   /* Expand the AltiVec predicates.  */
8758   dp = bdesc_altivec_preds;
8759   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
8760     if (dp->code == fcode)
8761       return altivec_expand_predicate_builtin (dp->icode, dp->opcode,
8762                                                exp, target);
8763
8764   /* LV* are funky.  We initialized them differently.  */
8765   switch (fcode)
8766     {
8767     case ALTIVEC_BUILTIN_LVSL:
8768       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
8769                                         exp, target, false);
8770     case ALTIVEC_BUILTIN_LVSR:
8771       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
8772                                         exp, target, false);
8773     case ALTIVEC_BUILTIN_LVEBX:
8774       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
8775                                         exp, target, false);
8776     case ALTIVEC_BUILTIN_LVEHX:
8777       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
8778                                         exp, target, false);
8779     case ALTIVEC_BUILTIN_LVEWX:
8780       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
8781                                         exp, target, false);
8782     case ALTIVEC_BUILTIN_LVXL:
8783       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
8784                                         exp, target, false);
8785     case ALTIVEC_BUILTIN_LVX:
8786       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
8787                                         exp, target, false);
8788     case ALTIVEC_BUILTIN_LVLX:
8789       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
8790                                         exp, target, true);
8791     case ALTIVEC_BUILTIN_LVLXL:
8792       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
8793                                         exp, target, true);
8794     case ALTIVEC_BUILTIN_LVRX:
8795       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
8796                                         exp, target, true);
8797     case ALTIVEC_BUILTIN_LVRXL:
8798       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
8799                                         exp, target, true);
8800     default:
8801       break;
8802       /* Fall through.  */
8803     }
8804
8805   *expandedp = false;
8806   return NULL_RTX;
8807 }
8808
8809 /* Expand the builtin in EXP and store the result in TARGET.  Store
8810    true in *EXPANDEDP if we found a builtin to expand.  */
8811 static rtx
8812 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
8813 {
8814   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8815   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8816   const struct builtin_description *d;
8817   size_t i;
8818
8819   *expandedp = true;
8820
8821   switch (fcode)
8822     {
8823     case PAIRED_BUILTIN_STX:
8824       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
8825     case PAIRED_BUILTIN_LX:
8826       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
8827     default:
8828       break;
8829       /* Fall through.  */
8830     }
8831
8832   /* Expand the paired predicates.  */
8833   d = bdesc_paired_preds;
8834   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
8835     if (d->code == fcode)
8836       return paired_expand_predicate_builtin (d->icode, exp, target);
8837
8838   *expandedp = false;
8839   return NULL_RTX;
8840 }
8841
8842 /* Binops that need to be initialized manually, but can be expanded
8843    automagically by rs6000_expand_binop_builtin.  */
8844 static struct builtin_description bdesc_2arg_spe[] =
8845 {
8846   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
8847   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
8848   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
8849   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
8850   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
8851   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
8852   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
8853   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
8854   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
8855   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
8856   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
8857   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
8858   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
8859   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
8860   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
8861   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
8862   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
8863   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
8864   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
8865   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
8866   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
8867   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
8868 };
8869
8870 /* Expand the builtin in EXP and store the result in TARGET.  Store
8871    true in *EXPANDEDP if we found a builtin to expand.
8872
8873    This expands the SPE builtins that are not simple unary and binary
8874    operations.  */
8875 static rtx
8876 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
8877 {
8878   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8879   tree arg1, arg0;
8880   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8881   enum insn_code icode;
8882   enum machine_mode tmode, mode0;
8883   rtx pat, op0;
8884   struct builtin_description *d;
8885   size_t i;
8886
8887   *expandedp = true;
8888
8889   /* Syntax check for a 5-bit unsigned immediate.  */
8890   switch (fcode)
8891     {
8892     case SPE_BUILTIN_EVSTDD:
8893     case SPE_BUILTIN_EVSTDH:
8894     case SPE_BUILTIN_EVSTDW:
8895     case SPE_BUILTIN_EVSTWHE:
8896     case SPE_BUILTIN_EVSTWHO:
8897     case SPE_BUILTIN_EVSTWWE:
8898     case SPE_BUILTIN_EVSTWWO:
8899       arg1 = CALL_EXPR_ARG (exp, 2);
8900       if (TREE_CODE (arg1) != INTEGER_CST
8901           || TREE_INT_CST_LOW (arg1) & ~0x1f)
8902         {
8903           error ("argument 2 must be a 5-bit unsigned literal");
8904           return const0_rtx;
8905         }
8906       break;
8907     default:
8908       break;
8909     }
8910
8911   /* The evsplat*i instructions are not quite generic.  */
8912   switch (fcode)
8913     {
8914     case SPE_BUILTIN_EVSPLATFI:
8915       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
8916                                          exp, target);
8917     case SPE_BUILTIN_EVSPLATI:
8918       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
8919                                          exp, target);
8920     default:
8921       break;
8922     }
8923
8924   d = (struct builtin_description *) bdesc_2arg_spe;
8925   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
8926     if (d->code == fcode)
8927       return rs6000_expand_binop_builtin (d->icode, exp, target);
8928
8929   d = (struct builtin_description *) bdesc_spe_predicates;
8930   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
8931     if (d->code == fcode)
8932       return spe_expand_predicate_builtin (d->icode, exp, target);
8933
8934   d = (struct builtin_description *) bdesc_spe_evsel;
8935   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
8936     if (d->code == fcode)
8937       return spe_expand_evsel_builtin (d->icode, exp, target);
8938
8939   switch (fcode)
8940     {
8941     case SPE_BUILTIN_EVSTDDX:
8942       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
8943     case SPE_BUILTIN_EVSTDHX:
8944       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
8945     case SPE_BUILTIN_EVSTDWX:
8946       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
8947     case SPE_BUILTIN_EVSTWHEX:
8948       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
8949     case SPE_BUILTIN_EVSTWHOX:
8950       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
8951     case SPE_BUILTIN_EVSTWWEX:
8952       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
8953     case SPE_BUILTIN_EVSTWWOX:
8954       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
8955     case SPE_BUILTIN_EVSTDD:
8956       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
8957     case SPE_BUILTIN_EVSTDH:
8958       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
8959     case SPE_BUILTIN_EVSTDW:
8960       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
8961     case SPE_BUILTIN_EVSTWHE:
8962       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
8963     case SPE_BUILTIN_EVSTWHO:
8964       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
8965     case SPE_BUILTIN_EVSTWWE:
8966       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
8967     case SPE_BUILTIN_EVSTWWO:
8968       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
8969     case SPE_BUILTIN_MFSPEFSCR:
8970       icode = CODE_FOR_spe_mfspefscr;
8971       tmode = insn_data[icode].operand[0].mode;
8972
8973       if (target == 0
8974           || GET_MODE (target) != tmode
8975           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
8976         target = gen_reg_rtx (tmode);
8977
8978       pat = GEN_FCN (icode) (target);
8979       if (! pat)
8980         return 0;
8981       emit_insn (pat);
8982       return target;
8983     case SPE_BUILTIN_MTSPEFSCR:
8984       icode = CODE_FOR_spe_mtspefscr;
8985       arg0 = CALL_EXPR_ARG (exp, 0);
8986       op0 = expand_normal (arg0);
8987       mode0 = insn_data[icode].operand[0].mode;
8988
8989       if (arg0 == error_mark_node)
8990         return const0_rtx;
8991
8992       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
8993         op0 = copy_to_mode_reg (mode0, op0);
8994
8995       pat = GEN_FCN (icode) (op0);
8996       if (pat)
8997         emit_insn (pat);
8998       return NULL_RTX;
8999     default:
9000       break;
9001     }
9002
9003   *expandedp = false;
9004   return NULL_RTX;
9005 }
9006
9007 static rtx
9008 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
9009 {
9010   rtx pat, scratch, tmp;
9011   tree form = CALL_EXPR_ARG (exp, 0);
9012   tree arg0 = CALL_EXPR_ARG (exp, 1);
9013   tree arg1 = CALL_EXPR_ARG (exp, 2);
9014   rtx op0 = expand_normal (arg0);
9015   rtx op1 = expand_normal (arg1);
9016   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
9017   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
9018   int form_int;
9019   enum rtx_code code;
9020
9021   if (TREE_CODE (form) != INTEGER_CST)
9022     {
9023       error ("argument 1 of __builtin_paired_predicate must be a constant");
9024       return const0_rtx;
9025     }
9026   else
9027     form_int = TREE_INT_CST_LOW (form);
9028
9029   gcc_assert (mode0 == mode1);
9030
9031   if (arg0 == error_mark_node || arg1 == error_mark_node)
9032     return const0_rtx;
9033
9034   if (target == 0
9035       || GET_MODE (target) != SImode
9036       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
9037     target = gen_reg_rtx (SImode);
9038   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
9039     op0 = copy_to_mode_reg (mode0, op0);
9040   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
9041     op1 = copy_to_mode_reg (mode1, op1);
9042
9043   scratch = gen_reg_rtx (CCFPmode);
9044
9045   pat = GEN_FCN (icode) (scratch, op0, op1);
9046   if (!pat)
9047     return const0_rtx;
9048
9049   emit_insn (pat);
9050
9051   switch (form_int)
9052     {
9053       /* LT bit.  */
9054     case 0:
9055       code = LT;
9056       break;
9057       /* GT bit.  */
9058     case 1:
9059       code = GT;
9060       break;
9061       /* EQ bit.  */
9062     case 2:
9063       code = EQ;
9064       break;
9065       /* UN bit.  */
9066     case 3:
9067       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
9068       return target;
9069     default:
9070       error ("argument 1 of __builtin_paired_predicate is out of range");
9071       return const0_rtx;
9072     }
9073
9074   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
9075   emit_move_insn (target, tmp);
9076   return target;
9077 }
9078
9079 static rtx
9080 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
9081 {
9082   rtx pat, scratch, tmp;
9083   tree form = CALL_EXPR_ARG (exp, 0);
9084   tree arg0 = CALL_EXPR_ARG (exp, 1);
9085   tree arg1 = CALL_EXPR_ARG (exp, 2);
9086   rtx op0 = expand_normal (arg0);
9087   rtx op1 = expand_normal (arg1);
9088   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
9089   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
9090   int form_int;
9091   enum rtx_code code;
9092
9093   if (TREE_CODE (form) != INTEGER_CST)
9094     {
9095       error ("argument 1 of __builtin_spe_predicate must be a constant");
9096       return const0_rtx;
9097     }
9098   else
9099     form_int = TREE_INT_CST_LOW (form);
9100
9101   gcc_assert (mode0 == mode1);
9102
9103   if (arg0 == error_mark_node || arg1 == error_mark_node)
9104     return const0_rtx;
9105
9106   if (target == 0
9107       || GET_MODE (target) != SImode
9108       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
9109     target = gen_reg_rtx (SImode);
9110
9111   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
9112     op0 = copy_to_mode_reg (mode0, op0);
9113   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
9114     op1 = copy_to_mode_reg (mode1, op1);
9115
9116   scratch = gen_reg_rtx (CCmode);
9117
9118   pat = GEN_FCN (icode) (scratch, op0, op1);
9119   if (! pat)
9120     return const0_rtx;
9121   emit_insn (pat);
9122
9123   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
9124      _lower_.  We use one compare, but look in different bits of the
9125      CR for each variant.
9126
9127      There are 2 elements in each SPE simd type (upper/lower).  The CR
9128      bits are set as follows:
9129
9130      BIT0  | BIT 1  | BIT 2   | BIT 3
9131      U     |   L    | (U | L) | (U & L)
9132
9133      So, for an "all" relationship, BIT 3 would be set.
9134      For an "any" relationship, BIT 2 would be set.  Etc.
9135
9136      Following traditional nomenclature, these bits map to:
9137
9138      BIT0  | BIT 1  | BIT 2   | BIT 3
9139      LT    | GT     | EQ      | OV
9140
9141      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
9142   */
9143
9144   switch (form_int)
9145     {
9146       /* All variant.  OV bit.  */
9147     case 0:
9148       /* We need to get to the OV bit, which is the ORDERED bit.  We
9149          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
9150          that's ugly and will make validate_condition_mode die.
9151          So let's just use another pattern.  */
9152       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
9153       return target;
9154       /* Any variant.  EQ bit.  */
9155     case 1:
9156       code = EQ;
9157       break;
9158       /* Upper variant.  LT bit.  */
9159     case 2:
9160       code = LT;
9161       break;
9162       /* Lower variant.  GT bit.  */
9163     case 3:
9164       code = GT;
9165       break;
9166     default:
9167       error ("argument 1 of __builtin_spe_predicate is out of range");
9168       return const0_rtx;
9169     }
9170
9171   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
9172   emit_move_insn (target, tmp);
9173
9174   return target;
9175 }
9176
9177 /* The evsel builtins look like this:
9178
9179      e = __builtin_spe_evsel_OP (a, b, c, d);
9180
9181    and work like this:
9182
9183      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
9184      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
9185 */
9186
9187 static rtx
9188 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
9189 {
9190   rtx pat, scratch;
9191   tree arg0 = CALL_EXPR_ARG (exp, 0);
9192   tree arg1 = CALL_EXPR_ARG (exp, 1);
9193   tree arg2 = CALL_EXPR_ARG (exp, 2);
9194   tree arg3 = CALL_EXPR_ARG (exp, 3);
9195   rtx op0 = expand_normal (arg0);
9196   rtx op1 = expand_normal (arg1);
9197   rtx op2 = expand_normal (arg2);
9198   rtx op3 = expand_normal (arg3);
9199   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
9200   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
9201
9202   gcc_assert (mode0 == mode1);
9203
9204   if (arg0 == error_mark_node || arg1 == error_mark_node
9205       || arg2 == error_mark_node || arg3 == error_mark_node)
9206     return const0_rtx;
9207
9208   if (target == 0
9209       || GET_MODE (target) != mode0
9210       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
9211     target = gen_reg_rtx (mode0);
9212
9213   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
9214     op0 = copy_to_mode_reg (mode0, op0);
9215   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
9216     op1 = copy_to_mode_reg (mode0, op1);
9217   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
9218     op2 = copy_to_mode_reg (mode0, op2);
9219   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
9220     op3 = copy_to_mode_reg (mode0, op3);
9221
9222   /* Generate the compare.  */
9223   scratch = gen_reg_rtx (CCmode);
9224   pat = GEN_FCN (icode) (scratch, op0, op1);
9225   if (! pat)
9226     return const0_rtx;
9227   emit_insn (pat);
9228
9229   if (mode0 == V2SImode)
9230     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
9231   else
9232     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
9233
9234   return target;
9235 }
9236
9237 /* Expand an expression EXP that calls a built-in function,
9238    with result going to TARGET if that's convenient
9239    (and in mode MODE if that's convenient).
9240    SUBTARGET may be used as the target for computing one of EXP's operands.
9241    IGNORE is nonzero if the value is to be ignored.  */
9242
9243 static rtx
9244 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
9245                        enum machine_mode mode ATTRIBUTE_UNUSED,
9246                        int ignore ATTRIBUTE_UNUSED)
9247 {
9248   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
9249   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
9250   const struct builtin_description *d;
9251   size_t i;
9252   rtx ret;
9253   bool success;
9254
9255   if (fcode == RS6000_BUILTIN_RECIP)
9256       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);    
9257
9258   if (fcode == RS6000_BUILTIN_RECIPF)
9259       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);    
9260
9261   if (fcode == RS6000_BUILTIN_RSQRTF)
9262       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);    
9263
9264   if (fcode == ALTIVEC_BUILTIN_MASK_FOR_LOAD
9265       || fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
9266     {
9267       int icode = (int) CODE_FOR_altivec_lvsr;
9268       enum machine_mode tmode = insn_data[icode].operand[0].mode;
9269       enum machine_mode mode = insn_data[icode].operand[1].mode;
9270       tree arg;
9271       rtx op, addr, pat;
9272
9273       gcc_assert (TARGET_ALTIVEC);
9274
9275       arg = CALL_EXPR_ARG (exp, 0);
9276       gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE);
9277       op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
9278       addr = memory_address (mode, op);
9279       if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
9280         op = addr;
9281       else
9282         {
9283           /* For the load case need to negate the address.  */
9284           op = gen_reg_rtx (GET_MODE (addr));
9285           emit_insn (gen_rtx_SET (VOIDmode, op,
9286                          gen_rtx_NEG (GET_MODE (addr), addr)));
9287         }
9288       op = gen_rtx_MEM (mode, op);
9289
9290       if (target == 0
9291           || GET_MODE (target) != tmode
9292           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
9293         target = gen_reg_rtx (tmode);
9294
9295       /*pat = gen_altivec_lvsr (target, op);*/
9296       pat = GEN_FCN (icode) (target, op);
9297       if (!pat)
9298         return 0;
9299       emit_insn (pat);
9300
9301       return target;
9302     }
9303
9304   /* FIXME: There's got to be a nicer way to handle this case than
9305      constructing a new CALL_EXPR.  */
9306   if (fcode == ALTIVEC_BUILTIN_VCFUX
9307       || fcode == ALTIVEC_BUILTIN_VCFSX
9308       || fcode == ALTIVEC_BUILTIN_VCTUXS
9309       || fcode == ALTIVEC_BUILTIN_VCTSXS)
9310     {
9311       if (call_expr_nargs (exp) == 1)
9312         exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
9313                                2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
9314     }
9315
9316   if (TARGET_ALTIVEC)
9317     {
9318       ret = altivec_expand_builtin (exp, target, &success);
9319
9320       if (success)
9321         return ret;
9322     }
9323   if (TARGET_SPE)
9324     {
9325       ret = spe_expand_builtin (exp, target, &success);
9326
9327       if (success)
9328         return ret;
9329     }
9330   if (TARGET_PAIRED_FLOAT)
9331     {
9332       ret = paired_expand_builtin (exp, target, &success);
9333
9334       if (success)
9335         return ret;
9336     }  
9337
9338   gcc_assert (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT);
9339
9340   /* Handle simple unary operations.  */
9341   d = (struct builtin_description *) bdesc_1arg;
9342   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
9343     if (d->code == fcode)
9344       return rs6000_expand_unop_builtin (d->icode, exp, target);
9345
9346   /* Handle simple binary operations.  */
9347   d = (struct builtin_description *) bdesc_2arg;
9348   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
9349     if (d->code == fcode)
9350       return rs6000_expand_binop_builtin (d->icode, exp, target);
9351
9352   /* Handle simple ternary operations.  */
9353   d = bdesc_3arg;
9354   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
9355     if (d->code == fcode)
9356       return rs6000_expand_ternop_builtin (d->icode, exp, target);
9357
9358   gcc_unreachable ();
9359 }
9360
9361 static void
9362 rs6000_init_builtins (void)
9363 {
9364   tree tdecl;
9365   
9366   V2SI_type_node = build_vector_type (intSI_type_node, 2);
9367   V2SF_type_node = build_vector_type (float_type_node, 2);
9368   V4HI_type_node = build_vector_type (intHI_type_node, 4);
9369   V4SI_type_node = build_vector_type (intSI_type_node, 4);
9370   V4SF_type_node = build_vector_type (float_type_node, 4);
9371   V8HI_type_node = build_vector_type (intHI_type_node, 8);
9372   V16QI_type_node = build_vector_type (intQI_type_node, 16);
9373
9374   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
9375   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
9376   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
9377
9378   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
9379   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
9380   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
9381   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
9382
9383   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
9384      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
9385      'vector unsigned short'.  */
9386
9387   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
9388   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
9389   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
9390   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
9391
9392   long_integer_type_internal_node = long_integer_type_node;
9393   long_unsigned_type_internal_node = long_unsigned_type_node;
9394   intQI_type_internal_node = intQI_type_node;
9395   uintQI_type_internal_node = unsigned_intQI_type_node;
9396   intHI_type_internal_node = intHI_type_node;
9397   uintHI_type_internal_node = unsigned_intHI_type_node;
9398   intSI_type_internal_node = intSI_type_node;
9399   uintSI_type_internal_node = unsigned_intSI_type_node;
9400   float_type_internal_node = float_type_node;
9401   void_type_internal_node = void_type_node;
9402
9403   tdecl = build_decl (TYPE_DECL, get_identifier ("__bool char"),
9404                       bool_char_type_node);
9405   TYPE_NAME (bool_char_type_node) = tdecl;
9406   (*lang_hooks.decls.pushdecl) (tdecl);
9407   tdecl = build_decl (TYPE_DECL, get_identifier ("__bool short"),
9408                       bool_short_type_node);
9409   TYPE_NAME (bool_short_type_node) = tdecl;
9410   (*lang_hooks.decls.pushdecl) (tdecl);
9411   tdecl = build_decl (TYPE_DECL, get_identifier ("__bool int"),
9412                       bool_int_type_node);
9413   TYPE_NAME (bool_int_type_node) = tdecl;
9414   (*lang_hooks.decls.pushdecl) (tdecl);
9415   tdecl = build_decl (TYPE_DECL, get_identifier ("__pixel"),
9416                       pixel_type_node);
9417   TYPE_NAME (pixel_type_node) = tdecl;
9418   (*lang_hooks.decls.pushdecl) (tdecl);
9419
9420   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
9421   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
9422   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
9423   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
9424
9425   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector unsigned char"),
9426                       unsigned_V16QI_type_node);
9427   TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
9428   (*lang_hooks.decls.pushdecl) (tdecl);
9429   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector signed char"),
9430                       V16QI_type_node);
9431   TYPE_NAME (V16QI_type_node) = tdecl;
9432   (*lang_hooks.decls.pushdecl) (tdecl);
9433   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __bool char"),
9434                       bool_V16QI_type_node);
9435   TYPE_NAME ( bool_V16QI_type_node) = tdecl;
9436   (*lang_hooks.decls.pushdecl) (tdecl);
9437
9438   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector unsigned short"),
9439                       unsigned_V8HI_type_node);
9440   TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
9441   (*lang_hooks.decls.pushdecl) (tdecl);
9442   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector signed short"),
9443                       V8HI_type_node);
9444   TYPE_NAME (V8HI_type_node) = tdecl;
9445   (*lang_hooks.decls.pushdecl) (tdecl);
9446   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __bool short"),
9447                       bool_V8HI_type_node);
9448   TYPE_NAME (bool_V8HI_type_node) = tdecl;
9449   (*lang_hooks.decls.pushdecl) (tdecl);
9450
9451   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector unsigned int"),
9452                       unsigned_V4SI_type_node);
9453   TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
9454   (*lang_hooks.decls.pushdecl) (tdecl);
9455   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector signed int"),
9456                       V4SI_type_node);
9457   TYPE_NAME (V4SI_type_node) = tdecl;
9458   (*lang_hooks.decls.pushdecl) (tdecl);
9459   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __bool int"),
9460                       bool_V4SI_type_node);
9461   TYPE_NAME (bool_V4SI_type_node) = tdecl;
9462   (*lang_hooks.decls.pushdecl) (tdecl);
9463
9464   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector float"),
9465                       V4SF_type_node);
9466   TYPE_NAME (V4SF_type_node) = tdecl;
9467   (*lang_hooks.decls.pushdecl) (tdecl);
9468   tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __pixel"),
9469                       pixel_V8HI_type_node);
9470   TYPE_NAME (pixel_V8HI_type_node) = tdecl;
9471   (*lang_hooks.decls.pushdecl) (tdecl);
9472
9473   if (TARGET_PAIRED_FLOAT)
9474     paired_init_builtins ();
9475   if (TARGET_SPE)
9476     spe_init_builtins ();
9477   if (TARGET_ALTIVEC)
9478     altivec_init_builtins ();
9479   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT)
9480     rs6000_common_init_builtins ();
9481   if (TARGET_PPC_GFXOPT)
9482     {
9483       tree ftype = build_function_type_list (float_type_node,
9484                                              float_type_node,
9485                                              float_type_node,
9486                                              NULL_TREE);
9487       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
9488                    RS6000_BUILTIN_RECIPF);
9489
9490       ftype = build_function_type_list (float_type_node,
9491                                         float_type_node,
9492                                         NULL_TREE);
9493       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
9494                    RS6000_BUILTIN_RSQRTF);
9495     }
9496   if (TARGET_POPCNTB)
9497     {
9498       tree ftype = build_function_type_list (double_type_node,
9499                                              double_type_node,
9500                                              double_type_node,
9501                                              NULL_TREE);
9502       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
9503                    RS6000_BUILTIN_RECIP);
9504
9505     }
9506
9507 #if TARGET_XCOFF
9508   /* AIX libm provides clog as __clog.  */
9509   if (built_in_decls [BUILT_IN_CLOG])
9510     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
9511 #endif
9512
9513 #ifdef SUBTARGET_INIT_BUILTINS
9514   SUBTARGET_INIT_BUILTINS;
9515 #endif
9516 }
9517
9518 /* Search through a set of builtins and enable the mask bits.
9519    DESC is an array of builtins.
9520    SIZE is the total number of builtins.
9521    START is the builtin enum at which to start.
9522    END is the builtin enum at which to end.  */
9523 static void
9524 enable_mask_for_builtins (struct builtin_description *desc, int size,
9525                           enum rs6000_builtins start,
9526                           enum rs6000_builtins end)
9527 {
9528   int i;
9529
9530   for (i = 0; i < size; ++i)
9531     if (desc[i].code == start)
9532       break;
9533
9534   if (i == size)
9535     return;
9536
9537   for (; i < size; ++i)
9538     {
9539       /* Flip all the bits on.  */
9540       desc[i].mask = target_flags;
9541       if (desc[i].code == end)
9542         break;
9543     }
9544 }
9545
9546 static void
9547 spe_init_builtins (void)
9548 {
9549   tree endlink = void_list_node;
9550   tree puint_type_node = build_pointer_type (unsigned_type_node);
9551   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
9552   struct builtin_description *d;
9553   size_t i;
9554
9555   tree v2si_ftype_4_v2si
9556     = build_function_type
9557     (opaque_V2SI_type_node,
9558      tree_cons (NULL_TREE, opaque_V2SI_type_node,
9559                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
9560                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9561                                       tree_cons (NULL_TREE, opaque_V2SI_type_node,
9562                                                  endlink)))));
9563
9564   tree v2sf_ftype_4_v2sf
9565     = build_function_type
9566     (opaque_V2SF_type_node,
9567      tree_cons (NULL_TREE, opaque_V2SF_type_node,
9568                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
9569                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
9570                                       tree_cons (NULL_TREE, opaque_V2SF_type_node,
9571                                                  endlink)))));
9572
9573   tree int_ftype_int_v2si_v2si
9574     = build_function_type
9575     (integer_type_node,
9576      tree_cons (NULL_TREE, integer_type_node,
9577                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
9578                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9579                                       endlink))));
9580
9581   tree int_ftype_int_v2sf_v2sf
9582     = build_function_type
9583     (integer_type_node,
9584      tree_cons (NULL_TREE, integer_type_node,
9585                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
9586                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
9587                                       endlink))));
9588
9589   tree void_ftype_v2si_puint_int
9590     = build_function_type (void_type_node,
9591                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9592                                       tree_cons (NULL_TREE, puint_type_node,
9593                                                  tree_cons (NULL_TREE,
9594                                                             integer_type_node,
9595                                                             endlink))));
9596
9597   tree void_ftype_v2si_puint_char
9598     = build_function_type (void_type_node,
9599                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9600                                       tree_cons (NULL_TREE, puint_type_node,
9601                                                  tree_cons (NULL_TREE,
9602                                                             char_type_node,
9603                                                             endlink))));
9604
9605   tree void_ftype_v2si_pv2si_int
9606     = build_function_type (void_type_node,
9607                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9608                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
9609                                                  tree_cons (NULL_TREE,
9610                                                             integer_type_node,
9611                                                             endlink))));
9612
9613   tree void_ftype_v2si_pv2si_char
9614     = build_function_type (void_type_node,
9615                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
9616                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
9617                                                  tree_cons (NULL_TREE,
9618                                                             char_type_node,
9619                                                             endlink))));
9620
9621   tree void_ftype_int
9622     = build_function_type (void_type_node,
9623                            tree_cons (NULL_TREE, integer_type_node, endlink));
9624
9625   tree int_ftype_void
9626     = build_function_type (integer_type_node, endlink);
9627
9628   tree v2si_ftype_pv2si_int
9629     = build_function_type (opaque_V2SI_type_node,
9630                            tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
9631                                       tree_cons (NULL_TREE, integer_type_node,
9632                                                  endlink)));
9633
9634   tree v2si_ftype_puint_int
9635     = build_function_type (opaque_V2SI_type_node,
9636                            tree_cons (NULL_TREE, puint_type_node,
9637                                       tree_cons (NULL_TREE, integer_type_node,
9638                                                  endlink)));
9639
9640   tree v2si_ftype_pushort_int
9641     = build_function_type (opaque_V2SI_type_node,
9642                            tree_cons (NULL_TREE, pushort_type_node,
9643                                       tree_cons (NULL_TREE, integer_type_node,
9644                                                  endlink)));
9645
9646   tree v2si_ftype_signed_char
9647     = build_function_type (opaque_V2SI_type_node,
9648                            tree_cons (NULL_TREE, signed_char_type_node,
9649                                       endlink));
9650
9651   /* The initialization of the simple binary and unary builtins is
9652      done in rs6000_common_init_builtins, but we have to enable the
9653      mask bits here manually because we have run out of `target_flags'
9654      bits.  We really need to redesign this mask business.  */
9655
9656   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
9657                             ARRAY_SIZE (bdesc_2arg),
9658                             SPE_BUILTIN_EVADDW,
9659                             SPE_BUILTIN_EVXOR);
9660   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
9661                             ARRAY_SIZE (bdesc_1arg),
9662                             SPE_BUILTIN_EVABS,
9663                             SPE_BUILTIN_EVSUBFUSIAAW);
9664   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
9665                             ARRAY_SIZE (bdesc_spe_predicates),
9666                             SPE_BUILTIN_EVCMPEQ,
9667                             SPE_BUILTIN_EVFSTSTLT);
9668   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
9669                             ARRAY_SIZE (bdesc_spe_evsel),
9670                             SPE_BUILTIN_EVSEL_CMPGTS,
9671                             SPE_BUILTIN_EVSEL_FSTSTEQ);
9672
9673   (*lang_hooks.decls.pushdecl)
9674     (build_decl (TYPE_DECL, get_identifier ("__ev64_opaque__"),
9675                  opaque_V2SI_type_node));
9676
9677   /* Initialize irregular SPE builtins.  */
9678
9679   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
9680   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
9681   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
9682   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
9683   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
9684   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
9685   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
9686   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
9687   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
9688   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
9689   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
9690   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
9691   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
9692   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
9693   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
9694   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
9695   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
9696   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
9697
9698   /* Loads.  */
9699   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
9700   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
9701   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
9702   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
9703   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
9704   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
9705   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
9706   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
9707   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
9708   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
9709   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
9710   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
9711   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
9712   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
9713   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
9714   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
9715   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
9716   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
9717   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
9718   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
9719   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
9720   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
9721
9722   /* Predicates.  */
9723   d = (struct builtin_description *) bdesc_spe_predicates;
9724   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
9725     {
9726       tree type;
9727
9728       switch (insn_data[d->icode].operand[1].mode)
9729         {
9730         case V2SImode:
9731           type = int_ftype_int_v2si_v2si;
9732           break;
9733         case V2SFmode:
9734           type = int_ftype_int_v2sf_v2sf;
9735           break;
9736         default:
9737           gcc_unreachable ();
9738         }
9739
9740       def_builtin (d->mask, d->name, type, d->code);
9741     }
9742
9743   /* Evsel predicates.  */
9744   d = (struct builtin_description *) bdesc_spe_evsel;
9745   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
9746     {
9747       tree type;
9748
9749       switch (insn_data[d->icode].operand[1].mode)
9750         {
9751         case V2SImode:
9752           type = v2si_ftype_4_v2si;
9753           break;
9754         case V2SFmode:
9755           type = v2sf_ftype_4_v2sf;
9756           break;
9757         default:
9758           gcc_unreachable ();
9759         }
9760
9761       def_builtin (d->mask, d->name, type, d->code);
9762     }
9763 }
9764
9765 static void
9766 paired_init_builtins (void)
9767 {
9768   const struct builtin_description *d;
9769   size_t i;
9770   tree endlink = void_list_node;
9771
9772    tree int_ftype_int_v2sf_v2sf
9773     = build_function_type
9774     (integer_type_node,
9775      tree_cons (NULL_TREE, integer_type_node,
9776                 tree_cons (NULL_TREE, V2SF_type_node,
9777                            tree_cons (NULL_TREE, V2SF_type_node,
9778                                       endlink))));
9779   tree pcfloat_type_node =
9780     build_pointer_type (build_qualified_type
9781                         (float_type_node, TYPE_QUAL_CONST));
9782
9783   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
9784                                                            long_integer_type_node,
9785                                                            pcfloat_type_node,
9786                                                            NULL_TREE);
9787   tree void_ftype_v2sf_long_pcfloat =
9788     build_function_type_list (void_type_node,
9789                               V2SF_type_node,
9790                               long_integer_type_node,
9791                               pcfloat_type_node,
9792                               NULL_TREE);
9793
9794
9795   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
9796                PAIRED_BUILTIN_LX);
9797
9798
9799   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
9800                PAIRED_BUILTIN_STX);
9801
9802   /* Predicates.  */
9803   d = bdesc_paired_preds;
9804   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
9805     {
9806       tree type;
9807
9808       switch (insn_data[d->icode].operand[1].mode)
9809         {
9810         case V2SFmode:
9811           type = int_ftype_int_v2sf_v2sf;
9812           break;
9813         default:
9814           gcc_unreachable ();
9815         }
9816
9817       def_builtin (d->mask, d->name, type, d->code);
9818     }
9819 }
9820
9821 static void
9822 altivec_init_builtins (void)
9823 {
9824   const struct builtin_description *d;
9825   const struct builtin_description_predicates *dp;
9826   size_t i;
9827   tree ftype;
9828
9829   tree pfloat_type_node = build_pointer_type (float_type_node);
9830   tree pint_type_node = build_pointer_type (integer_type_node);
9831   tree pshort_type_node = build_pointer_type (short_integer_type_node);
9832   tree pchar_type_node = build_pointer_type (char_type_node);
9833
9834   tree pvoid_type_node = build_pointer_type (void_type_node);
9835
9836   tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
9837   tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
9838   tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
9839   tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
9840
9841   tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
9842
9843   tree int_ftype_opaque
9844     = build_function_type_list (integer_type_node,
9845                                 opaque_V4SI_type_node, NULL_TREE);
9846   tree opaque_ftype_opaque
9847     = build_function_type (integer_type_node,
9848                                 NULL_TREE);
9849   tree opaque_ftype_opaque_int
9850     = build_function_type_list (opaque_V4SI_type_node,
9851                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
9852   tree opaque_ftype_opaque_opaque_int
9853     = build_function_type_list (opaque_V4SI_type_node,
9854                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
9855                                 integer_type_node, NULL_TREE);
9856   tree int_ftype_int_opaque_opaque
9857     = build_function_type_list (integer_type_node,
9858                                 integer_type_node, opaque_V4SI_type_node,
9859                                 opaque_V4SI_type_node, NULL_TREE);
9860   tree int_ftype_int_v4si_v4si
9861     = build_function_type_list (integer_type_node,
9862                                 integer_type_node, V4SI_type_node,
9863                                 V4SI_type_node, NULL_TREE);
9864   tree v4sf_ftype_pcfloat
9865     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
9866   tree void_ftype_pfloat_v4sf
9867     = build_function_type_list (void_type_node,
9868                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
9869   tree v4si_ftype_pcint
9870     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
9871   tree void_ftype_pint_v4si
9872     = build_function_type_list (void_type_node,
9873                                 pint_type_node, V4SI_type_node, NULL_TREE);
9874   tree v8hi_ftype_pcshort
9875     = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
9876   tree void_ftype_pshort_v8hi
9877     = build_function_type_list (void_type_node,
9878                                 pshort_type_node, V8HI_type_node, NULL_TREE);
9879   tree v16qi_ftype_pcchar
9880     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
9881   tree void_ftype_pchar_v16qi
9882     = build_function_type_list (void_type_node,
9883                                 pchar_type_node, V16QI_type_node, NULL_TREE);
9884   tree void_ftype_v4si
9885     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
9886   tree v8hi_ftype_void
9887     = build_function_type (V8HI_type_node, void_list_node);
9888   tree void_ftype_void
9889     = build_function_type (void_type_node, void_list_node);
9890   tree void_ftype_int
9891     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
9892
9893   tree opaque_ftype_long_pcvoid
9894     = build_function_type_list (opaque_V4SI_type_node,
9895                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9896   tree v16qi_ftype_long_pcvoid
9897     = build_function_type_list (V16QI_type_node,
9898                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9899   tree v8hi_ftype_long_pcvoid
9900     = build_function_type_list (V8HI_type_node,
9901                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9902   tree v4si_ftype_long_pcvoid
9903     = build_function_type_list (V4SI_type_node,
9904                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
9905
9906   tree void_ftype_opaque_long_pvoid
9907     = build_function_type_list (void_type_node,
9908                                 opaque_V4SI_type_node, long_integer_type_node,
9909                                 pvoid_type_node, NULL_TREE);
9910   tree void_ftype_v4si_long_pvoid
9911     = build_function_type_list (void_type_node,
9912                                 V4SI_type_node, long_integer_type_node,
9913                                 pvoid_type_node, NULL_TREE);
9914   tree void_ftype_v16qi_long_pvoid
9915     = build_function_type_list (void_type_node,
9916                                 V16QI_type_node, long_integer_type_node,
9917                                 pvoid_type_node, NULL_TREE);
9918   tree void_ftype_v8hi_long_pvoid
9919     = build_function_type_list (void_type_node,
9920                                 V8HI_type_node, long_integer_type_node,
9921                                 pvoid_type_node, NULL_TREE);
9922   tree int_ftype_int_v8hi_v8hi
9923     = build_function_type_list (integer_type_node,
9924                                 integer_type_node, V8HI_type_node,
9925                                 V8HI_type_node, NULL_TREE);
9926   tree int_ftype_int_v16qi_v16qi
9927     = build_function_type_list (integer_type_node,
9928                                 integer_type_node, V16QI_type_node,
9929                                 V16QI_type_node, NULL_TREE);
9930   tree int_ftype_int_v4sf_v4sf
9931     = build_function_type_list (integer_type_node,
9932                                 integer_type_node, V4SF_type_node,
9933                                 V4SF_type_node, NULL_TREE);
9934   tree v4si_ftype_v4si
9935     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
9936   tree v8hi_ftype_v8hi
9937     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
9938   tree v16qi_ftype_v16qi
9939     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
9940   tree v4sf_ftype_v4sf
9941     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
9942   tree void_ftype_pcvoid_int_int
9943     = build_function_type_list (void_type_node,
9944                                 pcvoid_type_node, integer_type_node,
9945                                 integer_type_node, NULL_TREE);
9946
9947   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
9948                ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
9949   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
9950                ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
9951   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
9952                ALTIVEC_BUILTIN_LD_INTERNAL_4si);
9953   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
9954                ALTIVEC_BUILTIN_ST_INTERNAL_4si);
9955   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
9956                ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
9957   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
9958                ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
9959   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
9960                ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
9961   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
9962                ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
9963   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
9964   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
9965   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
9966   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
9967   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
9968   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
9969   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
9970   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
9971   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
9972   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
9973   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
9974   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
9975   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
9976   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
9977   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
9978   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
9979   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
9980   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
9981   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
9982   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
9983   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
9984   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
9985   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
9986   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
9987   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
9988   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
9989   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
9990   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
9991   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
9992   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
9993
9994   if (rs6000_cpu == PROCESSOR_CELL)
9995     {
9996       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
9997       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
9998       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
9999       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
10000
10001       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
10002       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
10003       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
10004       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
10005
10006       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
10007       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
10008       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
10009       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
10010
10011       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
10012       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
10013       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
10014       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
10015     }
10016   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
10017   def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
10018   def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
10019
10020   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
10021   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
10022   def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
10023   def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
10024   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
10025   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
10026   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
10027   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
10028   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
10029   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
10030   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
10031   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
10032
10033   /* Add the DST variants.  */
10034   d = bdesc_dst;
10035   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
10036     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
10037
10038   /* Initialize the predicates.  */
10039   dp = bdesc_altivec_preds;
10040   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
10041     {
10042       enum machine_mode mode1;
10043       tree type;
10044       bool is_overloaded = dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10045                            && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10046
10047       if (is_overloaded)
10048         mode1 = VOIDmode;
10049       else
10050         mode1 = insn_data[dp->icode].operand[1].mode;
10051
10052       switch (mode1)
10053         {
10054         case VOIDmode:
10055           type = int_ftype_int_opaque_opaque;
10056           break;
10057         case V4SImode:
10058           type = int_ftype_int_v4si_v4si;
10059           break;
10060         case V8HImode:
10061           type = int_ftype_int_v8hi_v8hi;
10062           break;
10063         case V16QImode:
10064           type = int_ftype_int_v16qi_v16qi;
10065           break;
10066         case V4SFmode:
10067           type = int_ftype_int_v4sf_v4sf;
10068           break;
10069         default:
10070           gcc_unreachable ();
10071         }
10072
10073       def_builtin (dp->mask, dp->name, type, dp->code);
10074     }
10075
10076   /* Initialize the abs* operators.  */
10077   d = bdesc_abs;
10078   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
10079     {
10080       enum machine_mode mode0;
10081       tree type;
10082
10083       mode0 = insn_data[d->icode].operand[0].mode;
10084
10085       switch (mode0)
10086         {
10087         case V4SImode:
10088           type = v4si_ftype_v4si;
10089           break;
10090         case V8HImode:
10091           type = v8hi_ftype_v8hi;
10092           break;
10093         case V16QImode:
10094           type = v16qi_ftype_v16qi;
10095           break;
10096         case V4SFmode:
10097           type = v4sf_ftype_v4sf;
10098           break;
10099         default:
10100           gcc_unreachable ();
10101         }
10102
10103       def_builtin (d->mask, d->name, type, d->code);
10104     }
10105
10106   if (TARGET_ALTIVEC)
10107     {
10108       tree decl;
10109
10110       /* Initialize target builtin that implements
10111          targetm.vectorize.builtin_mask_for_load.  */
10112
10113       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
10114                                    v16qi_ftype_long_pcvoid,
10115                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
10116                                    BUILT_IN_MD, NULL, NULL_TREE);
10117       TREE_READONLY (decl) = 1;
10118       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
10119       altivec_builtin_mask_for_load = decl;
10120     }
10121
10122   /* Access to the vec_init patterns.  */
10123   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
10124                                     integer_type_node, integer_type_node,
10125                                     integer_type_node, NULL_TREE);
10126   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
10127                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
10128
10129   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
10130                                     short_integer_type_node,
10131                                     short_integer_type_node,
10132                                     short_integer_type_node,
10133                                     short_integer_type_node,
10134                                     short_integer_type_node,
10135                                     short_integer_type_node,
10136                                     short_integer_type_node, NULL_TREE);
10137   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
10138                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
10139
10140   ftype = build_function_type_list (V16QI_type_node, char_type_node,
10141                                     char_type_node, char_type_node,
10142                                     char_type_node, char_type_node,
10143                                     char_type_node, char_type_node,
10144                                     char_type_node, char_type_node,
10145                                     char_type_node, char_type_node,
10146                                     char_type_node, char_type_node,
10147                                     char_type_node, char_type_node,
10148                                     char_type_node, NULL_TREE);
10149   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
10150                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
10151
10152   ftype = build_function_type_list (V4SF_type_node, float_type_node,
10153                                     float_type_node, float_type_node,
10154                                     float_type_node, NULL_TREE);
10155   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
10156                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
10157
10158   /* Access to the vec_set patterns.  */
10159   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
10160                                     intSI_type_node,
10161                                     integer_type_node, NULL_TREE);
10162   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
10163                ALTIVEC_BUILTIN_VEC_SET_V4SI);
10164
10165   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
10166                                     intHI_type_node,
10167                                     integer_type_node, NULL_TREE);
10168   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
10169                ALTIVEC_BUILTIN_VEC_SET_V8HI);
10170
10171   ftype = build_function_type_list (V8HI_type_node, V16QI_type_node,
10172                                     intQI_type_node,
10173                                     integer_type_node, NULL_TREE);
10174   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
10175                ALTIVEC_BUILTIN_VEC_SET_V16QI);
10176
10177   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
10178                                     float_type_node,
10179                                     integer_type_node, NULL_TREE);
10180   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4sf", ftype,
10181                ALTIVEC_BUILTIN_VEC_SET_V4SF);
10182
10183   /* Access to the vec_extract patterns.  */
10184   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
10185                                     integer_type_node, NULL_TREE);
10186   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
10187                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
10188
10189   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
10190                                     integer_type_node, NULL_TREE);
10191   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
10192                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
10193
10194   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
10195                                     integer_type_node, NULL_TREE);
10196   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
10197                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
10198
10199   ftype = build_function_type_list (float_type_node, V4SF_type_node,
10200                                     integer_type_node, NULL_TREE);
10201   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4sf", ftype,
10202                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
10203 }
10204
10205 static void
10206 rs6000_common_init_builtins (void)
10207 {
10208   const struct builtin_description *d;
10209   size_t i;
10210
10211   tree v2sf_ftype_v2sf_v2sf_v2sf
10212     = build_function_type_list (V2SF_type_node,
10213                                 V2SF_type_node, V2SF_type_node,
10214                                 V2SF_type_node, NULL_TREE);
10215
10216   tree v4sf_ftype_v4sf_v4sf_v16qi
10217     = build_function_type_list (V4SF_type_node,
10218                                 V4SF_type_node, V4SF_type_node,
10219                                 V16QI_type_node, NULL_TREE);
10220   tree v4si_ftype_v4si_v4si_v16qi
10221     = build_function_type_list (V4SI_type_node,
10222                                 V4SI_type_node, V4SI_type_node,
10223                                 V16QI_type_node, NULL_TREE);
10224   tree v8hi_ftype_v8hi_v8hi_v16qi
10225     = build_function_type_list (V8HI_type_node,
10226                                 V8HI_type_node, V8HI_type_node,
10227                                 V16QI_type_node, NULL_TREE);
10228   tree v16qi_ftype_v16qi_v16qi_v16qi
10229     = build_function_type_list (V16QI_type_node,
10230                                 V16QI_type_node, V16QI_type_node,
10231                                 V16QI_type_node, NULL_TREE);
10232   tree v4si_ftype_int
10233     = build_function_type_list (V4SI_type_node, integer_type_node, NULL_TREE);
10234   tree v8hi_ftype_int
10235     = build_function_type_list (V8HI_type_node, integer_type_node, NULL_TREE);
10236   tree v16qi_ftype_int
10237     = build_function_type_list (V16QI_type_node, integer_type_node, NULL_TREE);
10238   tree v8hi_ftype_v16qi
10239     = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
10240   tree v4sf_ftype_v4sf
10241     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
10242
10243   tree v2si_ftype_v2si_v2si
10244     = build_function_type_list (opaque_V2SI_type_node,
10245                                 opaque_V2SI_type_node,
10246                                 opaque_V2SI_type_node, NULL_TREE);
10247
10248   tree v2sf_ftype_v2sf_v2sf_spe
10249     = build_function_type_list (opaque_V2SF_type_node,
10250                                 opaque_V2SF_type_node,
10251                                 opaque_V2SF_type_node, NULL_TREE);
10252
10253   tree v2sf_ftype_v2sf_v2sf
10254     = build_function_type_list (V2SF_type_node,
10255                                 V2SF_type_node,
10256                                 V2SF_type_node, NULL_TREE);
10257
10258
10259   tree v2si_ftype_int_int
10260     = build_function_type_list (opaque_V2SI_type_node,
10261                                 integer_type_node, integer_type_node,
10262                                 NULL_TREE);
10263
10264   tree opaque_ftype_opaque
10265     = build_function_type_list (opaque_V4SI_type_node,
10266                                 opaque_V4SI_type_node, NULL_TREE);
10267
10268   tree v2si_ftype_v2si
10269     = build_function_type_list (opaque_V2SI_type_node,
10270                                 opaque_V2SI_type_node, NULL_TREE);
10271
10272   tree v2sf_ftype_v2sf_spe
10273     = build_function_type_list (opaque_V2SF_type_node,
10274                                 opaque_V2SF_type_node, NULL_TREE);
10275
10276   tree v2sf_ftype_v2sf
10277     = build_function_type_list (V2SF_type_node,
10278                                 V2SF_type_node, NULL_TREE);
10279
10280   tree v2sf_ftype_v2si
10281     = build_function_type_list (opaque_V2SF_type_node,
10282                                 opaque_V2SI_type_node, NULL_TREE);
10283
10284   tree v2si_ftype_v2sf
10285     = build_function_type_list (opaque_V2SI_type_node,
10286                                 opaque_V2SF_type_node, NULL_TREE);
10287
10288   tree v2si_ftype_v2si_char
10289     = build_function_type_list (opaque_V2SI_type_node,
10290                                 opaque_V2SI_type_node,
10291                                 char_type_node, NULL_TREE);
10292
10293   tree v2si_ftype_int_char
10294     = build_function_type_list (opaque_V2SI_type_node,
10295                                 integer_type_node, char_type_node, NULL_TREE);
10296
10297   tree v2si_ftype_char
10298     = build_function_type_list (opaque_V2SI_type_node,
10299                                 char_type_node, NULL_TREE);
10300
10301   tree int_ftype_int_int
10302     = build_function_type_list (integer_type_node,
10303                                 integer_type_node, integer_type_node,
10304                                 NULL_TREE);
10305
10306   tree opaque_ftype_opaque_opaque
10307     = build_function_type_list (opaque_V4SI_type_node,
10308                                 opaque_V4SI_type_node, opaque_V4SI_type_node, NULL_TREE);
10309   tree v4si_ftype_v4si_v4si
10310     = build_function_type_list (V4SI_type_node,
10311                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
10312   tree v4sf_ftype_v4si_int
10313     = build_function_type_list (V4SF_type_node,
10314                                 V4SI_type_node, integer_type_node, NULL_TREE);
10315   tree v4si_ftype_v4sf_int
10316     = build_function_type_list (V4SI_type_node,
10317                                 V4SF_type_node, integer_type_node, NULL_TREE);
10318   tree v4si_ftype_v4si_int
10319     = build_function_type_list (V4SI_type_node,
10320                                 V4SI_type_node, integer_type_node, NULL_TREE);
10321   tree v8hi_ftype_v8hi_int
10322     = build_function_type_list (V8HI_type_node,
10323                                 V8HI_type_node, integer_type_node, NULL_TREE);
10324   tree v16qi_ftype_v16qi_int
10325     = build_function_type_list (V16QI_type_node,
10326                                 V16QI_type_node, integer_type_node, NULL_TREE);
10327   tree v16qi_ftype_v16qi_v16qi_int
10328     = build_function_type_list (V16QI_type_node,
10329                                 V16QI_type_node, V16QI_type_node,
10330                                 integer_type_node, NULL_TREE);
10331   tree v8hi_ftype_v8hi_v8hi_int
10332     = build_function_type_list (V8HI_type_node,
10333                                 V8HI_type_node, V8HI_type_node,
10334                                 integer_type_node, NULL_TREE);
10335   tree v4si_ftype_v4si_v4si_int
10336     = build_function_type_list (V4SI_type_node,
10337                                 V4SI_type_node, V4SI_type_node,
10338                                 integer_type_node, NULL_TREE);
10339   tree v4sf_ftype_v4sf_v4sf_int
10340     = build_function_type_list (V4SF_type_node,
10341                                 V4SF_type_node, V4SF_type_node,
10342                                 integer_type_node, NULL_TREE);
10343   tree v4sf_ftype_v4sf_v4sf
10344     = build_function_type_list (V4SF_type_node,
10345                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
10346   tree opaque_ftype_opaque_opaque_opaque
10347     = build_function_type_list (opaque_V4SI_type_node,
10348                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
10349                                 opaque_V4SI_type_node, NULL_TREE);
10350   tree v4sf_ftype_v4sf_v4sf_v4si
10351     = build_function_type_list (V4SF_type_node,
10352                                 V4SF_type_node, V4SF_type_node,
10353                                 V4SI_type_node, NULL_TREE);
10354   tree v4sf_ftype_v4sf_v4sf_v4sf
10355     = build_function_type_list (V4SF_type_node,
10356                                 V4SF_type_node, V4SF_type_node,
10357                                 V4SF_type_node, NULL_TREE);
10358   tree v4si_ftype_v4si_v4si_v4si
10359     = build_function_type_list (V4SI_type_node,
10360                                 V4SI_type_node, V4SI_type_node,
10361                                 V4SI_type_node, NULL_TREE);
10362   tree v8hi_ftype_v8hi_v8hi
10363     = build_function_type_list (V8HI_type_node,
10364                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10365   tree v8hi_ftype_v8hi_v8hi_v8hi
10366     = build_function_type_list (V8HI_type_node,
10367                                 V8HI_type_node, V8HI_type_node,
10368                                 V8HI_type_node, NULL_TREE);
10369   tree v4si_ftype_v8hi_v8hi_v4si
10370     = build_function_type_list (V4SI_type_node,
10371                                 V8HI_type_node, V8HI_type_node,
10372                                 V4SI_type_node, NULL_TREE);
10373   tree v4si_ftype_v16qi_v16qi_v4si
10374     = build_function_type_list (V4SI_type_node,
10375                                 V16QI_type_node, V16QI_type_node,
10376                                 V4SI_type_node, NULL_TREE);
10377   tree v16qi_ftype_v16qi_v16qi
10378     = build_function_type_list (V16QI_type_node,
10379                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10380   tree v4si_ftype_v4sf_v4sf
10381     = build_function_type_list (V4SI_type_node,
10382                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
10383   tree v8hi_ftype_v16qi_v16qi
10384     = build_function_type_list (V8HI_type_node,
10385                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10386   tree v4si_ftype_v8hi_v8hi
10387     = build_function_type_list (V4SI_type_node,
10388                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10389   tree v8hi_ftype_v4si_v4si
10390     = build_function_type_list (V8HI_type_node,
10391                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
10392   tree v16qi_ftype_v8hi_v8hi
10393     = build_function_type_list (V16QI_type_node,
10394                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10395   tree v4si_ftype_v16qi_v4si
10396     = build_function_type_list (V4SI_type_node,
10397                                 V16QI_type_node, V4SI_type_node, NULL_TREE);
10398   tree v4si_ftype_v16qi_v16qi
10399     = build_function_type_list (V4SI_type_node,
10400                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10401   tree v4si_ftype_v8hi_v4si
10402     = build_function_type_list (V4SI_type_node,
10403                                 V8HI_type_node, V4SI_type_node, NULL_TREE);
10404   tree v4si_ftype_v8hi
10405     = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
10406   tree int_ftype_v4si_v4si
10407     = build_function_type_list (integer_type_node,
10408                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
10409   tree int_ftype_v4sf_v4sf
10410     = build_function_type_list (integer_type_node,
10411                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
10412   tree int_ftype_v16qi_v16qi
10413     = build_function_type_list (integer_type_node,
10414                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
10415   tree int_ftype_v8hi_v8hi
10416     = build_function_type_list (integer_type_node,
10417                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
10418
10419   /* Add the simple ternary operators.  */
10420   d = bdesc_3arg;
10421   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
10422     {
10423       enum machine_mode mode0, mode1, mode2, mode3;
10424       tree type;
10425       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10426                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10427
10428       if (is_overloaded)
10429         {
10430           mode0 = VOIDmode;
10431           mode1 = VOIDmode;
10432           mode2 = VOIDmode;
10433           mode3 = VOIDmode;
10434         }
10435       else
10436         {
10437           if (d->name == 0 || d->icode == CODE_FOR_nothing)
10438             continue;
10439
10440           mode0 = insn_data[d->icode].operand[0].mode;
10441           mode1 = insn_data[d->icode].operand[1].mode;
10442           mode2 = insn_data[d->icode].operand[2].mode;
10443           mode3 = insn_data[d->icode].operand[3].mode;
10444         }
10445
10446       /* When all four are of the same mode.  */
10447       if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
10448         {
10449           switch (mode0)
10450             {
10451             case VOIDmode:
10452               type = opaque_ftype_opaque_opaque_opaque;
10453               break;
10454             case V4SImode:
10455               type = v4si_ftype_v4si_v4si_v4si;
10456               break;
10457             case V4SFmode:
10458               type = v4sf_ftype_v4sf_v4sf_v4sf;
10459               break;
10460             case V8HImode:
10461               type = v8hi_ftype_v8hi_v8hi_v8hi;
10462               break;
10463             case V16QImode:
10464               type = v16qi_ftype_v16qi_v16qi_v16qi;
10465               break;
10466             case V2SFmode:
10467                 type = v2sf_ftype_v2sf_v2sf_v2sf;
10468               break;
10469             default:
10470               gcc_unreachable ();
10471             }
10472         }
10473       else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
10474         {
10475           switch (mode0)
10476             {
10477             case V4SImode:
10478               type = v4si_ftype_v4si_v4si_v16qi;
10479               break;
10480             case V4SFmode:
10481               type = v4sf_ftype_v4sf_v4sf_v16qi;
10482               break;
10483             case V8HImode:
10484               type = v8hi_ftype_v8hi_v8hi_v16qi;
10485               break;
10486             case V16QImode:
10487               type = v16qi_ftype_v16qi_v16qi_v16qi;
10488               break;
10489             default:
10490               gcc_unreachable ();
10491             }
10492         }
10493       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
10494                && mode3 == V4SImode)
10495         type = v4si_ftype_v16qi_v16qi_v4si;
10496       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
10497                && mode3 == V4SImode)
10498         type = v4si_ftype_v8hi_v8hi_v4si;
10499       else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
10500                && mode3 == V4SImode)
10501         type = v4sf_ftype_v4sf_v4sf_v4si;
10502
10503       /* vchar, vchar, vchar, 4-bit literal.  */
10504       else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
10505                && mode3 == QImode)
10506         type = v16qi_ftype_v16qi_v16qi_int;
10507
10508       /* vshort, vshort, vshort, 4-bit literal.  */
10509       else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
10510                && mode3 == QImode)
10511         type = v8hi_ftype_v8hi_v8hi_int;
10512
10513       /* vint, vint, vint, 4-bit literal.  */
10514       else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
10515                && mode3 == QImode)
10516         type = v4si_ftype_v4si_v4si_int;
10517
10518       /* vfloat, vfloat, vfloat, 4-bit literal.  */
10519       else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
10520                && mode3 == QImode)
10521         type = v4sf_ftype_v4sf_v4sf_int;
10522
10523       else
10524         gcc_unreachable ();
10525
10526       def_builtin (d->mask, d->name, type, d->code);
10527     }
10528
10529   /* Add the simple binary operators.  */
10530   d = (struct builtin_description *) bdesc_2arg;
10531   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
10532     {
10533       enum machine_mode mode0, mode1, mode2;
10534       tree type;
10535       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10536                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10537
10538       if (is_overloaded)
10539         {
10540           mode0 = VOIDmode;
10541           mode1 = VOIDmode;
10542           mode2 = VOIDmode;
10543         }
10544       else
10545         {
10546           if (d->name == 0 || d->icode == CODE_FOR_nothing)
10547             continue;
10548
10549           mode0 = insn_data[d->icode].operand[0].mode;
10550           mode1 = insn_data[d->icode].operand[1].mode;
10551           mode2 = insn_data[d->icode].operand[2].mode;
10552         }
10553
10554       /* When all three operands are of the same mode.  */
10555       if (mode0 == mode1 && mode1 == mode2)
10556         {
10557           switch (mode0)
10558             {
10559             case VOIDmode:
10560               type = opaque_ftype_opaque_opaque;
10561               break;
10562             case V4SFmode:
10563               type = v4sf_ftype_v4sf_v4sf;
10564               break;
10565             case V4SImode:
10566               type = v4si_ftype_v4si_v4si;
10567               break;
10568             case V16QImode:
10569               type = v16qi_ftype_v16qi_v16qi;
10570               break;
10571             case V8HImode:
10572               type = v8hi_ftype_v8hi_v8hi;
10573               break;
10574             case V2SImode:
10575               type = v2si_ftype_v2si_v2si;
10576               break;
10577             case V2SFmode:
10578               if (TARGET_PAIRED_FLOAT)
10579                 type = v2sf_ftype_v2sf_v2sf;
10580               else
10581                 type = v2sf_ftype_v2sf_v2sf_spe;
10582               break;
10583             case SImode:
10584               type = int_ftype_int_int;
10585               break;
10586             default:
10587               gcc_unreachable ();
10588             }
10589         }
10590
10591       /* A few other combos we really don't want to do manually.  */
10592
10593       /* vint, vfloat, vfloat.  */
10594       else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
10595         type = v4si_ftype_v4sf_v4sf;
10596
10597       /* vshort, vchar, vchar.  */
10598       else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
10599         type = v8hi_ftype_v16qi_v16qi;
10600
10601       /* vint, vshort, vshort.  */
10602       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
10603         type = v4si_ftype_v8hi_v8hi;
10604
10605       /* vshort, vint, vint.  */
10606       else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
10607         type = v8hi_ftype_v4si_v4si;
10608
10609       /* vchar, vshort, vshort.  */
10610       else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
10611         type = v16qi_ftype_v8hi_v8hi;
10612
10613       /* vint, vchar, vint.  */
10614       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
10615         type = v4si_ftype_v16qi_v4si;
10616
10617       /* vint, vchar, vchar.  */
10618       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
10619         type = v4si_ftype_v16qi_v16qi;
10620
10621       /* vint, vshort, vint.  */
10622       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
10623         type = v4si_ftype_v8hi_v4si;
10624
10625       /* vint, vint, 5-bit literal.  */
10626       else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
10627         type = v4si_ftype_v4si_int;
10628
10629       /* vshort, vshort, 5-bit literal.  */
10630       else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
10631         type = v8hi_ftype_v8hi_int;
10632
10633       /* vchar, vchar, 5-bit literal.  */
10634       else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
10635         type = v16qi_ftype_v16qi_int;
10636
10637       /* vfloat, vint, 5-bit literal.  */
10638       else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
10639         type = v4sf_ftype_v4si_int;
10640
10641       /* vint, vfloat, 5-bit literal.  */
10642       else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
10643         type = v4si_ftype_v4sf_int;
10644
10645       else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
10646         type = v2si_ftype_int_int;
10647
10648       else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
10649         type = v2si_ftype_v2si_char;
10650
10651       else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
10652         type = v2si_ftype_int_char;
10653
10654       else
10655         {
10656           /* int, x, x.  */
10657           gcc_assert (mode0 == SImode);
10658           switch (mode1)
10659             {
10660             case V4SImode:
10661               type = int_ftype_v4si_v4si;
10662               break;
10663             case V4SFmode:
10664               type = int_ftype_v4sf_v4sf;
10665               break;
10666             case V16QImode:
10667               type = int_ftype_v16qi_v16qi;
10668               break;
10669             case V8HImode:
10670               type = int_ftype_v8hi_v8hi;
10671               break;
10672             default:
10673               gcc_unreachable ();
10674             }
10675         }
10676
10677       def_builtin (d->mask, d->name, type, d->code);
10678     }
10679
10680   /* Add the simple unary operators.  */
10681   d = (struct builtin_description *) bdesc_1arg;
10682   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
10683     {
10684       enum machine_mode mode0, mode1;
10685       tree type;
10686       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
10687                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
10688
10689       if (is_overloaded)
10690         {
10691           mode0 = VOIDmode;
10692           mode1 = VOIDmode;
10693         }
10694       else
10695         {
10696           if (d->name == 0 || d->icode == CODE_FOR_nothing)
10697             continue;
10698
10699           mode0 = insn_data[d->icode].operand[0].mode;
10700           mode1 = insn_data[d->icode].operand[1].mode;
10701         }
10702
10703       if (mode0 == V4SImode && mode1 == QImode)
10704         type = v4si_ftype_int;
10705       else if (mode0 == V8HImode && mode1 == QImode)
10706         type = v8hi_ftype_int;
10707       else if (mode0 == V16QImode && mode1 == QImode)
10708         type = v16qi_ftype_int;
10709       else if (mode0 == VOIDmode && mode1 == VOIDmode)
10710         type = opaque_ftype_opaque;
10711       else if (mode0 == V4SFmode && mode1 == V4SFmode)
10712         type = v4sf_ftype_v4sf;
10713       else if (mode0 == V8HImode && mode1 == V16QImode)
10714         type = v8hi_ftype_v16qi;
10715       else if (mode0 == V4SImode && mode1 == V8HImode)
10716         type = v4si_ftype_v8hi;
10717       else if (mode0 == V2SImode && mode1 == V2SImode)
10718         type = v2si_ftype_v2si;
10719       else if (mode0 == V2SFmode && mode1 == V2SFmode)
10720         {
10721           if (TARGET_PAIRED_FLOAT)
10722             type = v2sf_ftype_v2sf;
10723           else
10724             type = v2sf_ftype_v2sf_spe;
10725         }
10726       else if (mode0 == V2SFmode && mode1 == V2SImode)
10727         type = v2sf_ftype_v2si;
10728       else if (mode0 == V2SImode && mode1 == V2SFmode)
10729         type = v2si_ftype_v2sf;
10730       else if (mode0 == V2SImode && mode1 == QImode)
10731         type = v2si_ftype_char;
10732       else
10733         gcc_unreachable ();
10734
10735       def_builtin (d->mask, d->name, type, d->code);
10736     }
10737 }
10738
10739 static void
10740 rs6000_init_libfuncs (void)
10741 {
10742   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
10743       && !TARGET_POWER2 && !TARGET_POWERPC)
10744     {
10745       /* AIX library routines for float->int conversion.  */
10746       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
10747       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
10748       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
10749       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
10750     }
10751
10752   if (!TARGET_IEEEQUAD)
10753       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
10754     if (!TARGET_XL_COMPAT)
10755       {
10756         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
10757         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
10758         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
10759         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
10760
10761         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
10762           {
10763             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
10764             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
10765             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
10766             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
10767             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
10768             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
10769             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
10770
10771             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
10772             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
10773             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
10774             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
10775             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
10776             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
10777             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
10778             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
10779           }
10780
10781         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
10782           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
10783       }
10784     else
10785       {
10786         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
10787         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
10788         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
10789         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
10790       }
10791   else
10792     {
10793       /* 32-bit SVR4 quad floating point routines.  */
10794
10795       set_optab_libfunc (add_optab, TFmode, "_q_add");
10796       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
10797       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
10798       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
10799       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
10800       if (TARGET_PPC_GPOPT || TARGET_POWER2)
10801         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
10802
10803       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
10804       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
10805       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
10806       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
10807       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
10808       set_optab_libfunc (le_optab, TFmode, "_q_fle");
10809
10810       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
10811       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
10812       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
10813       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
10814       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
10815       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
10816       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
10817       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
10818     }
10819 }
10820
10821 \f
10822 /* Expand a block clear operation, and return 1 if successful.  Return 0
10823    if we should let the compiler generate normal code.
10824
10825    operands[0] is the destination
10826    operands[1] is the length
10827    operands[3] is the alignment */
10828
10829 int
10830 expand_block_clear (rtx operands[])
10831 {
10832   rtx orig_dest = operands[0];
10833   rtx bytes_rtx = operands[1];
10834   rtx align_rtx = operands[3];
10835   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
10836   HOST_WIDE_INT align;
10837   HOST_WIDE_INT bytes;
10838   int offset;
10839   int clear_bytes;
10840   int clear_step;
10841
10842   /* If this is not a fixed size move, just call memcpy */
10843   if (! constp)
10844     return 0;
10845
10846   /* This must be a fixed size alignment  */
10847   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
10848   align = INTVAL (align_rtx) * BITS_PER_UNIT;
10849
10850   /* Anything to clear? */
10851   bytes = INTVAL (bytes_rtx);
10852   if (bytes <= 0)
10853     return 1;
10854
10855   /* Use the builtin memset after a point, to avoid huge code bloat.
10856      When optimize_size, avoid any significant code bloat; calling
10857      memset is about 4 instructions, so allow for one instruction to
10858      load zero and three to do clearing.  */
10859   if (TARGET_ALTIVEC && align >= 128)
10860     clear_step = 16;
10861   else if (TARGET_POWERPC64 && align >= 32)
10862     clear_step = 8;
10863   else if (TARGET_SPE && align >= 64)
10864     clear_step = 8;
10865   else
10866     clear_step = 4;
10867
10868   if (optimize_size && bytes > 3 * clear_step)
10869     return 0;
10870   if (! optimize_size && bytes > 8 * clear_step)
10871     return 0;
10872
10873   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
10874     {
10875       enum machine_mode mode = BLKmode;
10876       rtx dest;
10877
10878       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
10879         {
10880           clear_bytes = 16;
10881           mode = V4SImode;
10882         }
10883       else if (bytes >= 8 && TARGET_SPE && align >= 64)
10884         {
10885           clear_bytes = 8;
10886           mode = V2SImode;
10887         }
10888       else if (bytes >= 8 && TARGET_POWERPC64
10889                /* 64-bit loads and stores require word-aligned
10890                   displacements.  */
10891                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
10892         {
10893           clear_bytes = 8;
10894           mode = DImode;
10895         }
10896       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
10897         {                       /* move 4 bytes */
10898           clear_bytes = 4;
10899           mode = SImode;
10900         }
10901       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
10902         {                       /* move 2 bytes */
10903           clear_bytes = 2;
10904           mode = HImode;
10905         }
10906       else /* move 1 byte at a time */
10907         {
10908           clear_bytes = 1;
10909           mode = QImode;
10910         }
10911
10912       dest = adjust_address (orig_dest, mode, offset);
10913
10914       emit_move_insn (dest, CONST0_RTX (mode));
10915     }
10916
10917   return 1;
10918 }
10919
10920 \f
10921 /* Expand a block move operation, and return 1 if successful.  Return 0
10922    if we should let the compiler generate normal code.
10923
10924    operands[0] is the destination
10925    operands[1] is the source
10926    operands[2] is the length
10927    operands[3] is the alignment */
10928
10929 #define MAX_MOVE_REG 4
10930
10931 int
10932 expand_block_move (rtx operands[])
10933 {
10934   rtx orig_dest = operands[0];
10935   rtx orig_src  = operands[1];
10936   rtx bytes_rtx = operands[2];
10937   rtx align_rtx = operands[3];
10938   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
10939   int align;
10940   int bytes;
10941   int offset;
10942   int move_bytes;
10943   rtx stores[MAX_MOVE_REG];
10944   int num_reg = 0;
10945
10946   /* If this is not a fixed size move, just call memcpy */
10947   if (! constp)
10948     return 0;
10949
10950   /* This must be a fixed size alignment */
10951   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
10952   align = INTVAL (align_rtx) * BITS_PER_UNIT;
10953
10954   /* Anything to move? */
10955   bytes = INTVAL (bytes_rtx);
10956   if (bytes <= 0)
10957     return 1;
10958
10959   /* store_one_arg depends on expand_block_move to handle at least the size of
10960      reg_parm_stack_space.  */
10961   if (bytes > (TARGET_POWERPC64 ? 64 : 32))
10962     return 0;
10963
10964   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
10965     {
10966       union {
10967         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
10968         rtx (*mov) (rtx, rtx);
10969       } gen_func;
10970       enum machine_mode mode = BLKmode;
10971       rtx src, dest;
10972
10973       /* Altivec first, since it will be faster than a string move
10974          when it applies, and usually not significantly larger.  */
10975       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
10976         {
10977           move_bytes = 16;
10978           mode = V4SImode;
10979           gen_func.mov = gen_movv4si;
10980         }
10981       else if (TARGET_SPE && bytes >= 8 && align >= 64)
10982         {
10983           move_bytes = 8;
10984           mode = V2SImode;
10985           gen_func.mov = gen_movv2si;
10986         }
10987       else if (TARGET_STRING
10988           && bytes > 24         /* move up to 32 bytes at a time */
10989           && ! fixed_regs[5]
10990           && ! fixed_regs[6]
10991           && ! fixed_regs[7]
10992           && ! fixed_regs[8]
10993           && ! fixed_regs[9]
10994           && ! fixed_regs[10]
10995           && ! fixed_regs[11]
10996           && ! fixed_regs[12])
10997         {
10998           move_bytes = (bytes > 32) ? 32 : bytes;
10999           gen_func.movmemsi = gen_movmemsi_8reg;
11000         }
11001       else if (TARGET_STRING
11002                && bytes > 16    /* move up to 24 bytes at a time */
11003                && ! fixed_regs[5]
11004                && ! fixed_regs[6]
11005                && ! fixed_regs[7]
11006                && ! fixed_regs[8]
11007                && ! fixed_regs[9]
11008                && ! fixed_regs[10])
11009         {
11010           move_bytes = (bytes > 24) ? 24 : bytes;
11011           gen_func.movmemsi = gen_movmemsi_6reg;
11012         }
11013       else if (TARGET_STRING
11014                && bytes > 8     /* move up to 16 bytes at a time */
11015                && ! fixed_regs[5]
11016                && ! fixed_regs[6]
11017                && ! fixed_regs[7]
11018                && ! fixed_regs[8])
11019         {
11020           move_bytes = (bytes > 16) ? 16 : bytes;
11021           gen_func.movmemsi = gen_movmemsi_4reg;
11022         }
11023       else if (bytes >= 8 && TARGET_POWERPC64
11024                /* 64-bit loads and stores require word-aligned
11025                   displacements.  */
11026                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
11027         {
11028           move_bytes = 8;
11029           mode = DImode;
11030           gen_func.mov = gen_movdi;
11031         }
11032       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
11033         {                       /* move up to 8 bytes at a time */
11034           move_bytes = (bytes > 8) ? 8 : bytes;
11035           gen_func.movmemsi = gen_movmemsi_2reg;
11036         }
11037       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
11038         {                       /* move 4 bytes */
11039           move_bytes = 4;
11040           mode = SImode;
11041           gen_func.mov = gen_movsi;
11042         }
11043       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
11044         {                       /* move 2 bytes */
11045           move_bytes = 2;
11046           mode = HImode;
11047           gen_func.mov = gen_movhi;
11048         }
11049       else if (TARGET_STRING && bytes > 1)
11050         {                       /* move up to 4 bytes at a time */
11051           move_bytes = (bytes > 4) ? 4 : bytes;
11052           gen_func.movmemsi = gen_movmemsi_1reg;
11053         }
11054       else /* move 1 byte at a time */
11055         {
11056           move_bytes = 1;
11057           mode = QImode;
11058           gen_func.mov = gen_movqi;
11059         }
11060
11061       src = adjust_address (orig_src, mode, offset);
11062       dest = adjust_address (orig_dest, mode, offset);
11063
11064       if (mode != BLKmode)
11065         {
11066           rtx tmp_reg = gen_reg_rtx (mode);
11067
11068           emit_insn ((*gen_func.mov) (tmp_reg, src));
11069           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
11070         }
11071
11072       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
11073         {
11074           int i;
11075           for (i = 0; i < num_reg; i++)
11076             emit_insn (stores[i]);
11077           num_reg = 0;
11078         }
11079
11080       if (mode == BLKmode)
11081         {
11082           /* Move the address into scratch registers.  The movmemsi
11083              patterns require zero offset.  */
11084           if (!REG_P (XEXP (src, 0)))
11085             {
11086               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
11087               src = replace_equiv_address (src, src_reg);
11088             }
11089           set_mem_size (src, GEN_INT (move_bytes));
11090
11091           if (!REG_P (XEXP (dest, 0)))
11092             {
11093               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
11094               dest = replace_equiv_address (dest, dest_reg);
11095             }
11096           set_mem_size (dest, GEN_INT (move_bytes));
11097
11098           emit_insn ((*gen_func.movmemsi) (dest, src,
11099                                            GEN_INT (move_bytes & 31),
11100                                            align_rtx));
11101         }
11102     }
11103
11104   return 1;
11105 }
11106
11107 \f
11108 /* Return a string to perform a load_multiple operation.
11109    operands[0] is the vector.
11110    operands[1] is the source address.
11111    operands[2] is the first destination register.  */
11112
11113 const char *
11114 rs6000_output_load_multiple (rtx operands[3])
11115 {
11116   /* We have to handle the case where the pseudo used to contain the address
11117      is assigned to one of the output registers.  */
11118   int i, j;
11119   int words = XVECLEN (operands[0], 0);
11120   rtx xop[10];
11121
11122   if (XVECLEN (operands[0], 0) == 1)
11123     return "{l|lwz} %2,0(%1)";
11124
11125   for (i = 0; i < words; i++)
11126     if (refers_to_regno_p (REGNO (operands[2]) + i,
11127                            REGNO (operands[2]) + i + 1, operands[1], 0))
11128       {
11129         if (i == words-1)
11130           {
11131             xop[0] = GEN_INT (4 * (words-1));
11132             xop[1] = operands[1];
11133             xop[2] = operands[2];
11134             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
11135             return "";
11136           }
11137         else if (i == 0)
11138           {
11139             xop[0] = GEN_INT (4 * (words-1));
11140             xop[1] = operands[1];
11141             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
11142             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);
11143             return "";
11144           }
11145         else
11146           {
11147             for (j = 0; j < words; j++)
11148               if (j != i)
11149                 {
11150                   xop[0] = GEN_INT (j * 4);
11151                   xop[1] = operands[1];
11152                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
11153                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
11154                 }
11155             xop[0] = GEN_INT (i * 4);
11156             xop[1] = operands[1];
11157             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
11158             return "";
11159           }
11160       }
11161
11162   return "{lsi|lswi} %2,%1,%N0";
11163 }
11164
11165 \f
11166 /* A validation routine: say whether CODE, a condition code, and MODE
11167    match.  The other alternatives either don't make sense or should
11168    never be generated.  */
11169
11170 void
11171 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
11172 {
11173   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
11174                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
11175               && GET_MODE_CLASS (mode) == MODE_CC);
11176
11177   /* These don't make sense.  */
11178   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
11179               || mode != CCUNSmode);
11180
11181   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
11182               || mode == CCUNSmode);
11183
11184   gcc_assert (mode == CCFPmode
11185               || (code != ORDERED && code != UNORDERED
11186                   && code != UNEQ && code != LTGT
11187                   && code != UNGT && code != UNLT
11188                   && code != UNGE && code != UNLE));
11189
11190   /* These should never be generated except for
11191      flag_finite_math_only.  */
11192   gcc_assert (mode != CCFPmode
11193               || flag_finite_math_only
11194               || (code != LE && code != GE
11195                   && code != UNEQ && code != LTGT
11196                   && code != UNGT && code != UNLT));
11197
11198   /* These are invalid; the information is not there.  */
11199   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
11200 }
11201
11202 \f
11203 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
11204    mask required to convert the result of a rotate insn into a shift
11205    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
11206
11207 int
11208 includes_lshift_p (rtx shiftop, rtx andop)
11209 {
11210   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
11211
11212   shift_mask <<= INTVAL (shiftop);
11213
11214   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
11215 }
11216
11217 /* Similar, but for right shift.  */
11218
11219 int
11220 includes_rshift_p (rtx shiftop, rtx andop)
11221 {
11222   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
11223
11224   shift_mask >>= INTVAL (shiftop);
11225
11226   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
11227 }
11228
11229 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
11230    to perform a left shift.  It must have exactly SHIFTOP least
11231    significant 0's, then one or more 1's, then zero or more 0's.  */
11232
11233 int
11234 includes_rldic_lshift_p (rtx shiftop, rtx andop)
11235 {
11236   if (GET_CODE (andop) == CONST_INT)
11237     {
11238       HOST_WIDE_INT c, lsb, shift_mask;
11239
11240       c = INTVAL (andop);
11241       if (c == 0 || c == ~0)
11242         return 0;
11243
11244       shift_mask = ~0;
11245       shift_mask <<= INTVAL (shiftop);
11246
11247       /* Find the least significant one bit.  */
11248       lsb = c & -c;
11249
11250       /* It must coincide with the LSB of the shift mask.  */
11251       if (-lsb != shift_mask)
11252         return 0;
11253
11254       /* Invert to look for the next transition (if any).  */
11255       c = ~c;
11256
11257       /* Remove the low group of ones (originally low group of zeros).  */
11258       c &= -lsb;
11259
11260       /* Again find the lsb, and check we have all 1's above.  */
11261       lsb = c & -c;
11262       return c == -lsb;
11263     }
11264   else if (GET_CODE (andop) == CONST_DOUBLE
11265            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
11266     {
11267       HOST_WIDE_INT low, high, lsb;
11268       HOST_WIDE_INT shift_mask_low, shift_mask_high;
11269
11270       low = CONST_DOUBLE_LOW (andop);
11271       if (HOST_BITS_PER_WIDE_INT < 64)
11272         high = CONST_DOUBLE_HIGH (andop);
11273
11274       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
11275           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
11276         return 0;
11277
11278       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
11279         {
11280           shift_mask_high = ~0;
11281           if (INTVAL (shiftop) > 32)
11282             shift_mask_high <<= INTVAL (shiftop) - 32;
11283
11284           lsb = high & -high;
11285
11286           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
11287             return 0;
11288
11289           high = ~high;
11290           high &= -lsb;
11291
11292           lsb = high & -high;
11293           return high == -lsb;
11294         }
11295
11296       shift_mask_low = ~0;
11297       shift_mask_low <<= INTVAL (shiftop);
11298
11299       lsb = low & -low;
11300
11301       if (-lsb != shift_mask_low)
11302         return 0;
11303
11304       if (HOST_BITS_PER_WIDE_INT < 64)
11305         high = ~high;
11306       low = ~low;
11307       low &= -lsb;
11308
11309       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
11310         {
11311           lsb = high & -high;
11312           return high == -lsb;
11313         }
11314
11315       lsb = low & -low;
11316       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
11317     }
11318   else
11319     return 0;
11320 }
11321
11322 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
11323    to perform a left shift.  It must have SHIFTOP or more least
11324    significant 0's, with the remainder of the word 1's.  */
11325
11326 int
11327 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
11328 {
11329   if (GET_CODE (andop) == CONST_INT)
11330     {
11331       HOST_WIDE_INT c, lsb, shift_mask;
11332
11333       shift_mask = ~0;
11334       shift_mask <<= INTVAL (shiftop);
11335       c = INTVAL (andop);
11336
11337       /* Find the least significant one bit.  */
11338       lsb = c & -c;
11339
11340       /* It must be covered by the shift mask.
11341          This test also rejects c == 0.  */
11342       if ((lsb & shift_mask) == 0)
11343         return 0;
11344
11345       /* Check we have all 1's above the transition, and reject all 1's.  */
11346       return c == -lsb && lsb != 1;
11347     }
11348   else if (GET_CODE (andop) == CONST_DOUBLE
11349            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
11350     {
11351       HOST_WIDE_INT low, lsb, shift_mask_low;
11352
11353       low = CONST_DOUBLE_LOW (andop);
11354
11355       if (HOST_BITS_PER_WIDE_INT < 64)
11356         {
11357           HOST_WIDE_INT high, shift_mask_high;
11358
11359           high = CONST_DOUBLE_HIGH (andop);
11360
11361           if (low == 0)
11362             {
11363               shift_mask_high = ~0;
11364               if (INTVAL (shiftop) > 32)
11365                 shift_mask_high <<= INTVAL (shiftop) - 32;
11366
11367               lsb = high & -high;
11368
11369               if ((lsb & shift_mask_high) == 0)
11370                 return 0;
11371
11372               return high == -lsb;
11373             }
11374           if (high != ~0)
11375             return 0;
11376         }
11377
11378       shift_mask_low = ~0;
11379       shift_mask_low <<= INTVAL (shiftop);
11380
11381       lsb = low & -low;
11382
11383       if ((lsb & shift_mask_low) == 0)
11384         return 0;
11385
11386       return low == -lsb && lsb != 1;
11387     }
11388   else
11389     return 0;
11390 }
11391
11392 /* Return 1 if operands will generate a valid arguments to rlwimi
11393 instruction for insert with right shift in 64-bit mode.  The mask may
11394 not start on the first bit or stop on the last bit because wrap-around
11395 effects of instruction do not correspond to semantics of RTL insn.  */
11396
11397 int
11398 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
11399 {
11400   if (INTVAL (startop) > 32
11401       && INTVAL (startop) < 64
11402       && INTVAL (sizeop) > 1
11403       && INTVAL (sizeop) + INTVAL (startop) < 64
11404       && INTVAL (shiftop) > 0
11405       && INTVAL (sizeop) + INTVAL (shiftop) < 32
11406       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
11407     return 1;
11408
11409   return 0;
11410 }
11411
11412 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
11413    for lfq and stfq insns iff the registers are hard registers.   */
11414
11415 int
11416 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
11417 {
11418   /* We might have been passed a SUBREG.  */
11419   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
11420     return 0;
11421
11422   /* We might have been passed non floating point registers.  */
11423   if (!FP_REGNO_P (REGNO (reg1))
11424       || !FP_REGNO_P (REGNO (reg2)))
11425     return 0;
11426
11427   return (REGNO (reg1) == REGNO (reg2) - 1);
11428 }
11429
11430 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
11431    addr1 and addr2 must be in consecutive memory locations
11432    (addr2 == addr1 + 8).  */
11433
11434 int
11435 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
11436 {
11437   rtx addr1, addr2;
11438   unsigned int reg1, reg2;
11439   int offset1, offset2;
11440
11441   /* The mems cannot be volatile.  */
11442   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
11443     return 0;
11444
11445   addr1 = XEXP (mem1, 0);
11446   addr2 = XEXP (mem2, 0);
11447
11448   /* Extract an offset (if used) from the first addr.  */
11449   if (GET_CODE (addr1) == PLUS)
11450     {
11451       /* If not a REG, return zero.  */
11452       if (GET_CODE (XEXP (addr1, 0)) != REG)
11453         return 0;
11454       else
11455         {
11456           reg1 = REGNO (XEXP (addr1, 0));
11457           /* The offset must be constant!  */
11458           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
11459             return 0;
11460           offset1 = INTVAL (XEXP (addr1, 1));
11461         }
11462     }
11463   else if (GET_CODE (addr1) != REG)
11464     return 0;
11465   else
11466     {
11467       reg1 = REGNO (addr1);
11468       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
11469       offset1 = 0;
11470     }
11471
11472   /* And now for the second addr.  */
11473   if (GET_CODE (addr2) == PLUS)
11474     {
11475       /* If not a REG, return zero.  */
11476       if (GET_CODE (XEXP (addr2, 0)) != REG)
11477         return 0;
11478       else
11479         {
11480           reg2 = REGNO (XEXP (addr2, 0));
11481           /* The offset must be constant. */
11482           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
11483             return 0;
11484           offset2 = INTVAL (XEXP (addr2, 1));
11485         }
11486     }
11487   else if (GET_CODE (addr2) != REG)
11488     return 0;
11489   else
11490     {
11491       reg2 = REGNO (addr2);
11492       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
11493       offset2 = 0;
11494     }
11495
11496   /* Both of these must have the same base register.  */
11497   if (reg1 != reg2)
11498     return 0;
11499
11500   /* The offset for the second addr must be 8 more than the first addr.  */
11501   if (offset2 != offset1 + 8)
11502     return 0;
11503
11504   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
11505      instructions.  */
11506   return 1;
11507 }
11508 \f
11509
11510 rtx
11511 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
11512 {
11513   static bool eliminated = false;
11514   if (mode != SDmode)
11515     return assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
11516   else
11517     {
11518       rtx mem = cfun->machine->sdmode_stack_slot;
11519       gcc_assert (mem != NULL_RTX);
11520
11521       if (!eliminated)
11522         {
11523           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
11524           cfun->machine->sdmode_stack_slot = mem;
11525           eliminated = true;
11526         }
11527       return mem;
11528     }
11529 }
11530
11531 static tree
11532 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
11533 {
11534   /* Don't walk into types.  */
11535   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
11536     {
11537       *walk_subtrees = 0;
11538       return NULL_TREE;
11539     }
11540
11541   switch (TREE_CODE (*tp))
11542     {
11543     case VAR_DECL:
11544     case PARM_DECL:
11545     case FIELD_DECL:
11546     case RESULT_DECL:
11547     case SSA_NAME:
11548     case REAL_CST:
11549     case INDIRECT_REF:
11550     case ALIGN_INDIRECT_REF:
11551     case MISALIGNED_INDIRECT_REF:
11552     case VIEW_CONVERT_EXPR:
11553       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
11554         return *tp;
11555       break;
11556     default:
11557       break;
11558     }
11559
11560   return NULL_TREE;
11561 }
11562
11563
11564 /* Allocate a 64-bit stack slot to be used for copying SDmode
11565    values through if this function has any SDmode references.  */
11566
11567 static void
11568 rs6000_alloc_sdmode_stack_slot (void)
11569 {
11570   tree t;
11571   basic_block bb;
11572   gimple_stmt_iterator gsi;
11573
11574   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
11575
11576   FOR_EACH_BB (bb)
11577     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
11578       {
11579         tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
11580         if (ret)
11581           {
11582             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
11583             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
11584                                                                   SDmode, 0);
11585             return;
11586           }
11587       }
11588
11589   /* Check for any SDmode parameters of the function.  */
11590   for (t = DECL_ARGUMENTS (cfun->decl); t; t = TREE_CHAIN (t))
11591     {
11592       if (TREE_TYPE (t) == error_mark_node)
11593         continue;
11594
11595       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
11596           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
11597         {
11598           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
11599           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
11600                                                                 SDmode, 0);
11601           return;
11602         }
11603     }
11604 }
11605
11606 static void
11607 rs6000_instantiate_decls (void)
11608 {
11609   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
11610     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
11611 }
11612
11613 /* Return the register class of a scratch register needed to copy IN into
11614    or out of a register in RCLASS in MODE.  If it can be done directly,
11615    NO_REGS is returned.  */
11616
11617 enum reg_class
11618 rs6000_secondary_reload_class (enum reg_class rclass,
11619                                enum machine_mode mode ATTRIBUTE_UNUSED,
11620                                rtx in)
11621 {
11622   int regno;
11623
11624   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
11625 #if TARGET_MACHO
11626                      && MACHOPIC_INDIRECT
11627 #endif
11628                      ))
11629     {
11630       /* We cannot copy a symbolic operand directly into anything
11631          other than BASE_REGS for TARGET_ELF.  So indicate that a
11632          register from BASE_REGS is needed as an intermediate
11633          register.
11634
11635          On Darwin, pic addresses require a load from memory, which
11636          needs a base register.  */
11637       if (rclass != BASE_REGS
11638           && (GET_CODE (in) == SYMBOL_REF
11639               || GET_CODE (in) == HIGH
11640               || GET_CODE (in) == LABEL_REF
11641               || GET_CODE (in) == CONST))
11642         return BASE_REGS;
11643     }
11644
11645   if (GET_CODE (in) == REG)
11646     {
11647       regno = REGNO (in);
11648       if (regno >= FIRST_PSEUDO_REGISTER)
11649         {
11650           regno = true_regnum (in);
11651           if (regno >= FIRST_PSEUDO_REGISTER)
11652             regno = -1;
11653         }
11654     }
11655   else if (GET_CODE (in) == SUBREG)
11656     {
11657       regno = true_regnum (in);
11658       if (regno >= FIRST_PSEUDO_REGISTER)
11659         regno = -1;
11660     }
11661   else
11662     regno = -1;
11663
11664   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
11665      into anything.  */
11666   if (rclass == GENERAL_REGS || rclass == BASE_REGS
11667       || (regno >= 0 && INT_REGNO_P (regno)))
11668     return NO_REGS;
11669
11670   /* Constants, memory, and FP registers can go into FP registers.  */
11671   if ((regno == -1 || FP_REGNO_P (regno))
11672       && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
11673     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
11674
11675   /* Memory, and AltiVec registers can go into AltiVec registers.  */
11676   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
11677       && rclass == ALTIVEC_REGS)
11678     return NO_REGS;
11679
11680   /* We can copy among the CR registers.  */
11681   if ((rclass == CR_REGS || rclass == CR0_REGS)
11682       && regno >= 0 && CR_REGNO_P (regno))
11683     return NO_REGS;
11684
11685   /* Otherwise, we need GENERAL_REGS.  */
11686   return GENERAL_REGS;
11687 }
11688 \f
11689 /* Given a comparison operation, return the bit number in CCR to test.  We
11690    know this is a valid comparison.
11691
11692    SCC_P is 1 if this is for an scc.  That means that %D will have been
11693    used instead of %C, so the bits will be in different places.
11694
11695    Return -1 if OP isn't a valid comparison for some reason.  */
11696
11697 int
11698 ccr_bit (rtx op, int scc_p)
11699 {
11700   enum rtx_code code = GET_CODE (op);
11701   enum machine_mode cc_mode;
11702   int cc_regnum;
11703   int base_bit;
11704   rtx reg;
11705
11706   if (!COMPARISON_P (op))
11707     return -1;
11708
11709   reg = XEXP (op, 0);
11710
11711   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
11712
11713   cc_mode = GET_MODE (reg);
11714   cc_regnum = REGNO (reg);
11715   base_bit = 4 * (cc_regnum - CR0_REGNO);
11716
11717   validate_condition_mode (code, cc_mode);
11718
11719   /* When generating a sCOND operation, only positive conditions are
11720      allowed.  */
11721   gcc_assert (!scc_p
11722               || code == EQ || code == GT || code == LT || code == UNORDERED
11723               || code == GTU || code == LTU);
11724
11725   switch (code)
11726     {
11727     case NE:
11728       return scc_p ? base_bit + 3 : base_bit + 2;
11729     case EQ:
11730       return base_bit + 2;
11731     case GT:  case GTU:  case UNLE:
11732       return base_bit + 1;
11733     case LT:  case LTU:  case UNGE:
11734       return base_bit;
11735     case ORDERED:  case UNORDERED:
11736       return base_bit + 3;
11737
11738     case GE:  case GEU:
11739       /* If scc, we will have done a cror to put the bit in the
11740          unordered position.  So test that bit.  For integer, this is ! LT
11741          unless this is an scc insn.  */
11742       return scc_p ? base_bit + 3 : base_bit;
11743
11744     case LE:  case LEU:
11745       return scc_p ? base_bit + 3 : base_bit + 1;
11746
11747     default:
11748       gcc_unreachable ();
11749     }
11750 }
11751 \f
11752 /* Return the GOT register.  */
11753
11754 rtx
11755 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
11756 {
11757   /* The second flow pass currently (June 1999) can't update
11758      regs_ever_live without disturbing other parts of the compiler, so
11759      update it here to make the prolog/epilogue code happy.  */
11760   if (!can_create_pseudo_p ()
11761       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
11762     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
11763
11764   crtl->uses_pic_offset_table = 1;
11765
11766   return pic_offset_table_rtx;
11767 }
11768 \f
11769 /* Function to init struct machine_function.
11770    This will be called, via a pointer variable,
11771    from push_function_context.  */
11772
11773 static struct machine_function *
11774 rs6000_init_machine_status (void)
11775 {
11776   return GGC_CNEW (machine_function);
11777 }
11778 \f
11779 /* These macros test for integers and extract the low-order bits.  */
11780 #define INT_P(X)  \
11781 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
11782  && GET_MODE (X) == VOIDmode)
11783
11784 #define INT_LOWPART(X) \
11785   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
11786
11787 int
11788 extract_MB (rtx op)
11789 {
11790   int i;
11791   unsigned long val = INT_LOWPART (op);
11792
11793   /* If the high bit is zero, the value is the first 1 bit we find
11794      from the left.  */
11795   if ((val & 0x80000000) == 0)
11796     {
11797       gcc_assert (val & 0xffffffff);
11798
11799       i = 1;
11800       while (((val <<= 1) & 0x80000000) == 0)
11801         ++i;
11802       return i;
11803     }
11804
11805   /* If the high bit is set and the low bit is not, or the mask is all
11806      1's, the value is zero.  */
11807   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
11808     return 0;
11809
11810   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
11811      from the right.  */
11812   i = 31;
11813   while (((val >>= 1) & 1) != 0)
11814     --i;
11815
11816   return i;
11817 }
11818
11819 int
11820 extract_ME (rtx op)
11821 {
11822   int i;
11823   unsigned long val = INT_LOWPART (op);
11824
11825   /* If the low bit is zero, the value is the first 1 bit we find from
11826      the right.  */
11827   if ((val & 1) == 0)
11828     {
11829       gcc_assert (val & 0xffffffff);
11830
11831       i = 30;
11832       while (((val >>= 1) & 1) == 0)
11833         --i;
11834
11835       return i;
11836     }
11837
11838   /* If the low bit is set and the high bit is not, or the mask is all
11839      1's, the value is 31.  */
11840   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
11841     return 31;
11842
11843   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
11844      from the left.  */
11845   i = 0;
11846   while (((val <<= 1) & 0x80000000) != 0)
11847     ++i;
11848
11849   return i;
11850 }
11851
11852 /* Locate some local-dynamic symbol still in use by this function
11853    so that we can print its name in some tls_ld pattern.  */
11854
11855 static const char *
11856 rs6000_get_some_local_dynamic_name (void)
11857 {
11858   rtx insn;
11859
11860   if (cfun->machine->some_ld_name)
11861     return cfun->machine->some_ld_name;
11862
11863   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
11864     if (INSN_P (insn)
11865         && for_each_rtx (&PATTERN (insn),
11866                          rs6000_get_some_local_dynamic_name_1, 0))
11867       return cfun->machine->some_ld_name;
11868
11869   gcc_unreachable ();
11870 }
11871
11872 /* Helper function for rs6000_get_some_local_dynamic_name.  */
11873
11874 static int
11875 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
11876 {
11877   rtx x = *px;
11878
11879   if (GET_CODE (x) == SYMBOL_REF)
11880     {
11881       const char *str = XSTR (x, 0);
11882       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
11883         {
11884           cfun->machine->some_ld_name = str;
11885           return 1;
11886         }
11887     }
11888
11889   return 0;
11890 }
11891
11892 /* Write out a function code label.  */
11893
11894 void
11895 rs6000_output_function_entry (FILE *file, const char *fname)
11896 {
11897   if (fname[0] != '.')
11898     {
11899       switch (DEFAULT_ABI)
11900         {
11901         default:
11902           gcc_unreachable ();
11903
11904         case ABI_AIX:
11905           if (DOT_SYMBOLS)
11906             putc ('.', file);
11907           else
11908             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
11909           break;
11910
11911         case ABI_V4:
11912         case ABI_DARWIN:
11913           break;
11914         }
11915     }
11916   if (TARGET_AIX)
11917     RS6000_OUTPUT_BASENAME (file, fname);
11918   else
11919     assemble_name (file, fname);
11920 }
11921
11922 /* Print an operand.  Recognize special options, documented below.  */
11923
11924 #if TARGET_ELF
11925 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
11926 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
11927 #else
11928 #define SMALL_DATA_RELOC "sda21"
11929 #define SMALL_DATA_REG 0
11930 #endif
11931
11932 void
11933 print_operand (FILE *file, rtx x, int code)
11934 {
11935   int i;
11936   HOST_WIDE_INT val;
11937   unsigned HOST_WIDE_INT uval;
11938
11939   switch (code)
11940     {
11941     case '.':
11942       /* Write out an instruction after the call which may be replaced
11943          with glue code by the loader.  This depends on the AIX version.  */
11944       asm_fprintf (file, RS6000_CALL_GLUE);
11945       return;
11946
11947       /* %a is output_address.  */
11948
11949     case 'A':
11950       /* If X is a constant integer whose low-order 5 bits are zero,
11951          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
11952          in the AIX assembler where "sri" with a zero shift count
11953          writes a trash instruction.  */
11954       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
11955         putc ('l', file);
11956       else
11957         putc ('r', file);
11958       return;
11959
11960     case 'b':
11961       /* If constant, low-order 16 bits of constant, unsigned.
11962          Otherwise, write normally.  */
11963       if (INT_P (x))
11964         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
11965       else
11966         print_operand (file, x, 0);
11967       return;
11968
11969     case 'B':
11970       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
11971          for 64-bit mask direction.  */
11972       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
11973       return;
11974
11975       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
11976          output_operand.  */
11977
11978     case 'c':
11979       /* X is a CR register.  Print the number of the GT bit of the CR.  */
11980       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
11981         output_operand_lossage ("invalid %%E value");
11982       else
11983         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
11984       return;
11985
11986     case 'D':
11987       /* Like 'J' but get to the GT bit only.  */
11988       gcc_assert (GET_CODE (x) == REG);
11989
11990       /* Bit 1 is GT bit.  */
11991       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
11992
11993       /* Add one for shift count in rlinm for scc.  */
11994       fprintf (file, "%d", i + 1);
11995       return;
11996
11997     case 'E':
11998       /* X is a CR register.  Print the number of the EQ bit of the CR */
11999       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
12000         output_operand_lossage ("invalid %%E value");
12001       else
12002         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
12003       return;
12004
12005     case 'f':
12006       /* X is a CR register.  Print the shift count needed to move it
12007          to the high-order four bits.  */
12008       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
12009         output_operand_lossage ("invalid %%f value");
12010       else
12011         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
12012       return;
12013
12014     case 'F':
12015       /* Similar, but print the count for the rotate in the opposite
12016          direction.  */
12017       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
12018         output_operand_lossage ("invalid %%F value");
12019       else
12020         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
12021       return;
12022
12023     case 'G':
12024       /* X is a constant integer.  If it is negative, print "m",
12025          otherwise print "z".  This is to make an aze or ame insn.  */
12026       if (GET_CODE (x) != CONST_INT)
12027         output_operand_lossage ("invalid %%G value");
12028       else if (INTVAL (x) >= 0)
12029         putc ('z', file);
12030       else
12031         putc ('m', file);
12032       return;
12033
12034     case 'h':
12035       /* If constant, output low-order five bits.  Otherwise, write
12036          normally.  */
12037       if (INT_P (x))
12038         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
12039       else
12040         print_operand (file, x, 0);
12041       return;
12042
12043     case 'H':
12044       /* If constant, output low-order six bits.  Otherwise, write
12045          normally.  */
12046       if (INT_P (x))
12047         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
12048       else
12049         print_operand (file, x, 0);
12050       return;
12051
12052     case 'I':
12053       /* Print `i' if this is a constant, else nothing.  */
12054       if (INT_P (x))
12055         putc ('i', file);
12056       return;
12057
12058     case 'j':
12059       /* Write the bit number in CCR for jump.  */
12060       i = ccr_bit (x, 0);
12061       if (i == -1)
12062         output_operand_lossage ("invalid %%j code");
12063       else
12064         fprintf (file, "%d", i);
12065       return;
12066
12067     case 'J':
12068       /* Similar, but add one for shift count in rlinm for scc and pass
12069          scc flag to `ccr_bit'.  */
12070       i = ccr_bit (x, 1);
12071       if (i == -1)
12072         output_operand_lossage ("invalid %%J code");
12073       else
12074         /* If we want bit 31, write a shift count of zero, not 32.  */
12075         fprintf (file, "%d", i == 31 ? 0 : i + 1);
12076       return;
12077
12078     case 'k':
12079       /* X must be a constant.  Write the 1's complement of the
12080          constant.  */
12081       if (! INT_P (x))
12082         output_operand_lossage ("invalid %%k value");
12083       else
12084         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
12085       return;
12086
12087     case 'K':
12088       /* X must be a symbolic constant on ELF.  Write an
12089          expression suitable for an 'addi' that adds in the low 16
12090          bits of the MEM.  */
12091       if (GET_CODE (x) != CONST)
12092         {
12093           print_operand_address (file, x);
12094           fputs ("@l", file);
12095         }
12096       else
12097         {
12098           if (GET_CODE (XEXP (x, 0)) != PLUS
12099               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
12100                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
12101               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
12102             output_operand_lossage ("invalid %%K value");
12103           print_operand_address (file, XEXP (XEXP (x, 0), 0));
12104           fputs ("@l", file);
12105           /* For GNU as, there must be a non-alphanumeric character
12106              between 'l' and the number.  The '-' is added by
12107              print_operand() already.  */
12108           if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
12109             fputs ("+", file);
12110           print_operand (file, XEXP (XEXP (x, 0), 1), 0);
12111         }
12112       return;
12113
12114       /* %l is output_asm_label.  */
12115
12116     case 'L':
12117       /* Write second word of DImode or DFmode reference.  Works on register
12118          or non-indexed memory only.  */
12119       if (GET_CODE (x) == REG)
12120         fputs (reg_names[REGNO (x) + 1], file);
12121       else if (GET_CODE (x) == MEM)
12122         {
12123           /* Handle possible auto-increment.  Since it is pre-increment and
12124              we have already done it, we can just use an offset of word.  */
12125           if (GET_CODE (XEXP (x, 0)) == PRE_INC
12126               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
12127             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
12128                                            UNITS_PER_WORD));
12129           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12130             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
12131                                            UNITS_PER_WORD));
12132           else
12133             output_address (XEXP (adjust_address_nv (x, SImode,
12134                                                      UNITS_PER_WORD),
12135                                   0));
12136
12137           if (small_data_operand (x, GET_MODE (x)))
12138             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12139                      reg_names[SMALL_DATA_REG]);
12140         }
12141       return;
12142
12143     case 'm':
12144       /* MB value for a mask operand.  */
12145       if (! mask_operand (x, SImode))
12146         output_operand_lossage ("invalid %%m value");
12147
12148       fprintf (file, "%d", extract_MB (x));
12149       return;
12150
12151     case 'M':
12152       /* ME value for a mask operand.  */
12153       if (! mask_operand (x, SImode))
12154         output_operand_lossage ("invalid %%M value");
12155
12156       fprintf (file, "%d", extract_ME (x));
12157       return;
12158
12159       /* %n outputs the negative of its operand.  */
12160
12161     case 'N':
12162       /* Write the number of elements in the vector times 4.  */
12163       if (GET_CODE (x) != PARALLEL)
12164         output_operand_lossage ("invalid %%N value");
12165       else
12166         fprintf (file, "%d", XVECLEN (x, 0) * 4);
12167       return;
12168
12169     case 'O':
12170       /* Similar, but subtract 1 first.  */
12171       if (GET_CODE (x) != PARALLEL)
12172         output_operand_lossage ("invalid %%O value");
12173       else
12174         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
12175       return;
12176
12177     case 'p':
12178       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
12179       if (! INT_P (x)
12180           || INT_LOWPART (x) < 0
12181           || (i = exact_log2 (INT_LOWPART (x))) < 0)
12182         output_operand_lossage ("invalid %%p value");
12183       else
12184         fprintf (file, "%d", i);
12185       return;
12186
12187     case 'P':
12188       /* The operand must be an indirect memory reference.  The result
12189          is the register name.  */
12190       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
12191           || REGNO (XEXP (x, 0)) >= 32)
12192         output_operand_lossage ("invalid %%P value");
12193       else
12194         fputs (reg_names[REGNO (XEXP (x, 0))], file);
12195       return;
12196
12197     case 'q':
12198       /* This outputs the logical code corresponding to a boolean
12199          expression.  The expression may have one or both operands
12200          negated (if one, only the first one).  For condition register
12201          logical operations, it will also treat the negated
12202          CR codes as NOTs, but not handle NOTs of them.  */
12203       {
12204         const char *const *t = 0;
12205         const char *s;
12206         enum rtx_code code = GET_CODE (x);
12207         static const char * const tbl[3][3] = {
12208           { "and", "andc", "nor" },
12209           { "or", "orc", "nand" },
12210           { "xor", "eqv", "xor" } };
12211
12212         if (code == AND)
12213           t = tbl[0];
12214         else if (code == IOR)
12215           t = tbl[1];
12216         else if (code == XOR)
12217           t = tbl[2];
12218         else
12219           output_operand_lossage ("invalid %%q value");
12220
12221         if (GET_CODE (XEXP (x, 0)) != NOT)
12222           s = t[0];
12223         else
12224           {
12225             if (GET_CODE (XEXP (x, 1)) == NOT)
12226               s = t[2];
12227             else
12228               s = t[1];
12229           }
12230
12231         fputs (s, file);
12232       }
12233       return;
12234
12235     case 'Q':
12236       if (TARGET_MFCRF)
12237         fputc (',', file);
12238         /* FALLTHRU */
12239       else
12240         return;
12241
12242     case 'R':
12243       /* X is a CR register.  Print the mask for `mtcrf'.  */
12244       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
12245         output_operand_lossage ("invalid %%R value");
12246       else
12247         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
12248       return;
12249
12250     case 's':
12251       /* Low 5 bits of 32 - value */
12252       if (! INT_P (x))
12253         output_operand_lossage ("invalid %%s value");
12254       else
12255         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
12256       return;
12257
12258     case 'S':
12259       /* PowerPC64 mask position.  All 0's is excluded.
12260          CONST_INT 32-bit mask is considered sign-extended so any
12261          transition must occur within the CONST_INT, not on the boundary.  */
12262       if (! mask64_operand (x, DImode))
12263         output_operand_lossage ("invalid %%S value");
12264
12265       uval = INT_LOWPART (x);
12266
12267       if (uval & 1)     /* Clear Left */
12268         {
12269 #if HOST_BITS_PER_WIDE_INT > 64
12270           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
12271 #endif
12272           i = 64;
12273         }
12274       else              /* Clear Right */
12275         {
12276           uval = ~uval;
12277 #if HOST_BITS_PER_WIDE_INT > 64
12278           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
12279 #endif
12280           i = 63;
12281         }
12282       while (uval != 0)
12283         --i, uval >>= 1;
12284       gcc_assert (i >= 0);
12285       fprintf (file, "%d", i);
12286       return;
12287
12288     case 't':
12289       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
12290       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
12291
12292       /* Bit 3 is OV bit.  */
12293       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
12294
12295       /* If we want bit 31, write a shift count of zero, not 32.  */
12296       fprintf (file, "%d", i == 31 ? 0 : i + 1);
12297       return;
12298
12299     case 'T':
12300       /* Print the symbolic name of a branch target register.  */
12301       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
12302                                   && REGNO (x) != CTR_REGNO))
12303         output_operand_lossage ("invalid %%T value");
12304       else if (REGNO (x) == LR_REGNO)
12305         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
12306       else
12307         fputs ("ctr", file);
12308       return;
12309
12310     case 'u':
12311       /* High-order 16 bits of constant for use in unsigned operand.  */
12312       if (! INT_P (x))
12313         output_operand_lossage ("invalid %%u value");
12314       else
12315         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
12316                  (INT_LOWPART (x) >> 16) & 0xffff);
12317       return;
12318
12319     case 'v':
12320       /* High-order 16 bits of constant for use in signed operand.  */
12321       if (! INT_P (x))
12322         output_operand_lossage ("invalid %%v value");
12323       else
12324         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
12325                  (INT_LOWPART (x) >> 16) & 0xffff);
12326       return;
12327
12328     case 'U':
12329       /* Print `u' if this has an auto-increment or auto-decrement.  */
12330       if (GET_CODE (x) == MEM
12331           && (GET_CODE (XEXP (x, 0)) == PRE_INC
12332               || GET_CODE (XEXP (x, 0)) == PRE_DEC
12333               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
12334         putc ('u', file);
12335       return;
12336
12337     case 'V':
12338       /* Print the trap code for this operand.  */
12339       switch (GET_CODE (x))
12340         {
12341         case EQ:
12342           fputs ("eq", file);   /* 4 */
12343           break;
12344         case NE:
12345           fputs ("ne", file);   /* 24 */
12346           break;
12347         case LT:
12348           fputs ("lt", file);   /* 16 */
12349           break;
12350         case LE:
12351           fputs ("le", file);   /* 20 */
12352           break;
12353         case GT:
12354           fputs ("gt", file);   /* 8 */
12355           break;
12356         case GE:
12357           fputs ("ge", file);   /* 12 */
12358           break;
12359         case LTU:
12360           fputs ("llt", file);  /* 2 */
12361           break;
12362         case LEU:
12363           fputs ("lle", file);  /* 6 */
12364           break;
12365         case GTU:
12366           fputs ("lgt", file);  /* 1 */
12367           break;
12368         case GEU:
12369           fputs ("lge", file);  /* 5 */
12370           break;
12371         default:
12372           gcc_unreachable ();
12373         }
12374       break;
12375
12376     case 'w':
12377       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
12378          normally.  */
12379       if (INT_P (x))
12380         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
12381                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
12382       else
12383         print_operand (file, x, 0);
12384       return;
12385
12386     case 'W':
12387       /* MB value for a PowerPC64 rldic operand.  */
12388       val = (GET_CODE (x) == CONST_INT
12389              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
12390
12391       if (val < 0)
12392         i = -1;
12393       else
12394         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
12395           if ((val <<= 1) < 0)
12396             break;
12397
12398 #if HOST_BITS_PER_WIDE_INT == 32
12399       if (GET_CODE (x) == CONST_INT && i >= 0)
12400         i += 32;  /* zero-extend high-part was all 0's */
12401       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
12402         {
12403           val = CONST_DOUBLE_LOW (x);
12404
12405           gcc_assert (val);
12406           if (val < 0)
12407             --i;
12408           else
12409             for ( ; i < 64; i++)
12410               if ((val <<= 1) < 0)
12411                 break;
12412         }
12413 #endif
12414
12415       fprintf (file, "%d", i + 1);
12416       return;
12417
12418     case 'X':
12419       if (GET_CODE (x) == MEM
12420           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
12421               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
12422                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
12423         putc ('x', file);
12424       return;
12425
12426     case 'Y':
12427       /* Like 'L', for third word of TImode  */
12428       if (GET_CODE (x) == REG)
12429         fputs (reg_names[REGNO (x) + 2], file);
12430       else if (GET_CODE (x) == MEM)
12431         {
12432           if (GET_CODE (XEXP (x, 0)) == PRE_INC
12433               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
12434             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
12435           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12436             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
12437           else
12438             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
12439           if (small_data_operand (x, GET_MODE (x)))
12440             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12441                      reg_names[SMALL_DATA_REG]);
12442         }
12443       return;
12444
12445     case 'z':
12446       /* X is a SYMBOL_REF.  Write out the name preceded by a
12447          period and without any trailing data in brackets.  Used for function
12448          names.  If we are configured for System V (or the embedded ABI) on
12449          the PowerPC, do not emit the period, since those systems do not use
12450          TOCs and the like.  */
12451       gcc_assert (GET_CODE (x) == SYMBOL_REF);
12452
12453       /* Mark the decl as referenced so that cgraph will output the
12454          function.  */
12455       if (SYMBOL_REF_DECL (x))
12456         mark_decl_referenced (SYMBOL_REF_DECL (x));
12457
12458       /* For macho, check to see if we need a stub.  */
12459       if (TARGET_MACHO)
12460         {
12461           const char *name = XSTR (x, 0);
12462 #if TARGET_MACHO
12463           if (MACHOPIC_INDIRECT
12464               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
12465             name = machopic_indirection_name (x, /*stub_p=*/true);
12466 #endif
12467           assemble_name (file, name);
12468         }
12469       else if (!DOT_SYMBOLS)
12470         assemble_name (file, XSTR (x, 0));
12471       else
12472         rs6000_output_function_entry (file, XSTR (x, 0));
12473       return;
12474
12475     case 'Z':
12476       /* Like 'L', for last word of TImode.  */
12477       if (GET_CODE (x) == REG)
12478         fputs (reg_names[REGNO (x) + 3], file);
12479       else if (GET_CODE (x) == MEM)
12480         {
12481           if (GET_CODE (XEXP (x, 0)) == PRE_INC
12482               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
12483             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
12484           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12485             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
12486           else
12487             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
12488           if (small_data_operand (x, GET_MODE (x)))
12489             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12490                      reg_names[SMALL_DATA_REG]);
12491         }
12492       return;
12493
12494       /* Print AltiVec or SPE memory operand.  */
12495     case 'y':
12496       {
12497         rtx tmp;
12498
12499         gcc_assert (GET_CODE (x) == MEM);
12500
12501         tmp = XEXP (x, 0);
12502
12503         /* Ugly hack because %y is overloaded.  */
12504         if ((TARGET_SPE || TARGET_E500_DOUBLE)
12505             && (GET_MODE_SIZE (GET_MODE (x)) == 8
12506                 || GET_MODE (x) == TFmode
12507                 || GET_MODE (x) == TImode))
12508           {
12509             /* Handle [reg].  */
12510             if (GET_CODE (tmp) == REG)
12511               {
12512                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
12513                 break;
12514               }
12515             /* Handle [reg+UIMM].  */
12516             else if (GET_CODE (tmp) == PLUS &&
12517                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
12518               {
12519                 int x;
12520
12521                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
12522
12523                 x = INTVAL (XEXP (tmp, 1));
12524                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
12525                 break;
12526               }
12527
12528             /* Fall through.  Must be [reg+reg].  */
12529           }
12530         if (TARGET_ALTIVEC
12531             && GET_CODE (tmp) == AND
12532             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
12533             && INTVAL (XEXP (tmp, 1)) == -16)
12534           tmp = XEXP (tmp, 0);
12535         if (GET_CODE (tmp) == REG)
12536           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
12537         else
12538           {
12539             if (!GET_CODE (tmp) == PLUS
12540                 || !REG_P (XEXP (tmp, 0))
12541                 || !REG_P (XEXP (tmp, 1)))
12542               {
12543                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
12544                 break;
12545               }
12546
12547             if (REGNO (XEXP (tmp, 0)) == 0)
12548               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
12549                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
12550             else
12551               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
12552                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
12553           }
12554         break;
12555       }
12556
12557     case 0:
12558       if (GET_CODE (x) == REG)
12559         fprintf (file, "%s", reg_names[REGNO (x)]);
12560       else if (GET_CODE (x) == MEM)
12561         {
12562           /* We need to handle PRE_INC and PRE_DEC here, since we need to
12563              know the width from the mode.  */
12564           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
12565             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
12566                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
12567           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
12568             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
12569                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
12570           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
12571             output_address (XEXP (XEXP (x, 0), 1));
12572           else
12573             output_address (XEXP (x, 0));
12574         }
12575       else
12576         output_addr_const (file, x);
12577       return;
12578
12579     case '&':
12580       assemble_name (file, rs6000_get_some_local_dynamic_name ());
12581       return;
12582
12583     default:
12584       output_operand_lossage ("invalid %%xn code");
12585     }
12586 }
12587 \f
12588 /* Print the address of an operand.  */
12589
12590 void
12591 print_operand_address (FILE *file, rtx x)
12592 {
12593   if (GET_CODE (x) == REG)
12594     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
12595   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
12596            || GET_CODE (x) == LABEL_REF)
12597     {
12598       output_addr_const (file, x);
12599       if (small_data_operand (x, GET_MODE (x)))
12600         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
12601                  reg_names[SMALL_DATA_REG]);
12602       else
12603         gcc_assert (!TARGET_TOC);
12604     }
12605   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
12606     {
12607       gcc_assert (REG_P (XEXP (x, 0)));
12608       if (REGNO (XEXP (x, 0)) == 0)
12609         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
12610                  reg_names[ REGNO (XEXP (x, 0)) ]);
12611       else
12612         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
12613                  reg_names[ REGNO (XEXP (x, 1)) ]);
12614     }
12615   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
12616     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
12617              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
12618 #if TARGET_ELF
12619   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
12620            && CONSTANT_P (XEXP (x, 1)))
12621     {
12622       output_addr_const (file, XEXP (x, 1));
12623       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
12624     }
12625 #endif
12626 #if TARGET_MACHO
12627   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
12628            && CONSTANT_P (XEXP (x, 1)))
12629     {
12630       fprintf (file, "lo16(");
12631       output_addr_const (file, XEXP (x, 1));
12632       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
12633     }
12634 #endif
12635   else if (legitimate_constant_pool_address_p (x))
12636     {
12637       output_addr_const (file, XEXP (x, 1));
12638       fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
12639     }
12640   else
12641     gcc_unreachable ();
12642 }
12643 \f
12644 /* Implement OUTPUT_ADDR_CONST_EXTRA for address X.  */
12645
12646 bool
12647 rs6000_output_addr_const_extra (FILE *file, rtx x)
12648 {
12649   if (GET_CODE (x) == UNSPEC)
12650     switch (XINT (x, 1))
12651       {
12652       case UNSPEC_TOCREL:
12653         x = XVECEXP (x, 0, 0);
12654         gcc_assert (GET_CODE (x) == SYMBOL_REF);
12655         output_addr_const (file, x);
12656         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
12657           {
12658             putc ('-', file);
12659             assemble_name (file, toc_label_name);
12660           }
12661         else if (TARGET_ELF)
12662           fputs ("@toc", file);
12663         return true;
12664
12665 #if TARGET_MACHO
12666       case UNSPEC_MACHOPIC_OFFSET:
12667         output_addr_const (file, XVECEXP (x, 0, 0));
12668         putc ('-', file);
12669         machopic_output_function_base_name (file);
12670         return true;
12671 #endif
12672       }
12673   return false;
12674 }
12675 \f
12676 /* Target hook for assembling integer objects.  The PowerPC version has
12677    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
12678    is defined.  It also needs to handle DI-mode objects on 64-bit
12679    targets.  */
12680
12681 static bool
12682 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
12683 {
12684 #ifdef RELOCATABLE_NEEDS_FIXUP
12685   /* Special handling for SI values.  */
12686   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
12687     {
12688       static int recurse = 0;
12689
12690       /* For -mrelocatable, we mark all addresses that need to be fixed up
12691          in the .fixup section.  */
12692       if (TARGET_RELOCATABLE
12693           && in_section != toc_section
12694           && in_section != text_section
12695           && !unlikely_text_section_p (in_section)
12696           && !recurse
12697           && GET_CODE (x) != CONST_INT
12698           && GET_CODE (x) != CONST_DOUBLE
12699           && CONSTANT_P (x))
12700         {
12701           char buf[256];
12702
12703           recurse = 1;
12704           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
12705           fixuplabelno++;
12706           ASM_OUTPUT_LABEL (asm_out_file, buf);
12707           fprintf (asm_out_file, "\t.long\t(");
12708           output_addr_const (asm_out_file, x);
12709           fprintf (asm_out_file, ")@fixup\n");
12710           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
12711           ASM_OUTPUT_ALIGN (asm_out_file, 2);
12712           fprintf (asm_out_file, "\t.long\t");
12713           assemble_name (asm_out_file, buf);
12714           fprintf (asm_out_file, "\n\t.previous\n");
12715           recurse = 0;
12716           return true;
12717         }
12718       /* Remove initial .'s to turn a -mcall-aixdesc function
12719          address into the address of the descriptor, not the function
12720          itself.  */
12721       else if (GET_CODE (x) == SYMBOL_REF
12722                && XSTR (x, 0)[0] == '.'
12723                && DEFAULT_ABI == ABI_AIX)
12724         {
12725           const char *name = XSTR (x, 0);
12726           while (*name == '.')
12727             name++;
12728
12729           fprintf (asm_out_file, "\t.long\t%s\n", name);
12730           return true;
12731         }
12732     }
12733 #endif /* RELOCATABLE_NEEDS_FIXUP */
12734   return default_assemble_integer (x, size, aligned_p);
12735 }
12736
12737 #ifdef HAVE_GAS_HIDDEN
12738 /* Emit an assembler directive to set symbol visibility for DECL to
12739    VISIBILITY_TYPE.  */
12740
12741 static void
12742 rs6000_assemble_visibility (tree decl, int vis)
12743 {
12744   /* Functions need to have their entry point symbol visibility set as
12745      well as their descriptor symbol visibility.  */
12746   if (DEFAULT_ABI == ABI_AIX
12747       && DOT_SYMBOLS
12748       && TREE_CODE (decl) == FUNCTION_DECL)
12749     {
12750       static const char * const visibility_types[] = {
12751         NULL, "internal", "hidden", "protected"
12752       };
12753
12754       const char *name, *type;
12755
12756       name = ((* targetm.strip_name_encoding)
12757               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
12758       type = visibility_types[vis];
12759
12760       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
12761       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
12762     }
12763   else
12764     default_assemble_visibility (decl, vis);
12765 }
12766 #endif
12767 \f
12768 enum rtx_code
12769 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
12770 {
12771   /* Reversal of FP compares takes care -- an ordered compare
12772      becomes an unordered compare and vice versa.  */
12773   if (mode == CCFPmode
12774       && (!flag_finite_math_only
12775           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
12776           || code == UNEQ || code == LTGT))
12777     return reverse_condition_maybe_unordered (code);
12778   else
12779     return reverse_condition (code);
12780 }
12781
12782 /* Generate a compare for CODE.  Return a brand-new rtx that
12783    represents the result of the compare.  */
12784
12785 static rtx
12786 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
12787 {
12788   enum machine_mode comp_mode;
12789   rtx compare_result;
12790   enum rtx_code code = GET_CODE (cmp);
12791   rtx op0 = XEXP (cmp, 0);
12792   rtx op1 = XEXP (cmp, 1);
12793
12794   if (FLOAT_MODE_P (mode))
12795     comp_mode = CCFPmode;
12796   else if (code == GTU || code == LTU
12797            || code == GEU || code == LEU)
12798     comp_mode = CCUNSmode;
12799   else if ((code == EQ || code == NE)
12800            && GET_CODE (op0) == SUBREG
12801            && GET_CODE (op1) == SUBREG
12802            && SUBREG_PROMOTED_UNSIGNED_P (op0)
12803            && SUBREG_PROMOTED_UNSIGNED_P (op1))
12804     /* These are unsigned values, perhaps there will be a later
12805        ordering compare that can be shared with this one.
12806        Unfortunately we cannot detect the signedness of the operands
12807        for non-subregs.  */
12808     comp_mode = CCUNSmode;
12809   else
12810     comp_mode = CCmode;
12811
12812   /* First, the compare.  */
12813   compare_result = gen_reg_rtx (comp_mode);
12814
12815   /* E500 FP compare instructions on the GPRs.  Yuck!  */
12816   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
12817       && FLOAT_MODE_P (mode))
12818     {
12819       rtx cmp, or_result, compare_result2;
12820       enum machine_mode op_mode = GET_MODE (op0);
12821
12822       if (op_mode == VOIDmode)
12823         op_mode = GET_MODE (op1);
12824
12825       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
12826          This explains the following mess.  */
12827
12828       switch (code)
12829         {
12830         case EQ: case UNEQ: case NE: case LTGT:
12831           switch (op_mode)
12832             {
12833             case SFmode:
12834               cmp = (flag_finite_math_only && !flag_trapping_math)
12835                 ? gen_tstsfeq_gpr (compare_result, op0, op1)
12836                 : gen_cmpsfeq_gpr (compare_result, op0, op1);
12837               break;
12838
12839             case DFmode:
12840               cmp = (flag_finite_math_only && !flag_trapping_math)
12841                 ? gen_tstdfeq_gpr (compare_result, op0, op1)
12842                 : gen_cmpdfeq_gpr (compare_result, op0, op1);
12843               break;
12844
12845             case TFmode:
12846               cmp = (flag_finite_math_only && !flag_trapping_math)
12847                 ? gen_tsttfeq_gpr (compare_result, op0, op1)
12848                 : gen_cmptfeq_gpr (compare_result, op0, op1);
12849               break;
12850
12851             default:
12852               gcc_unreachable ();
12853             }
12854           break;
12855
12856         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
12857           switch (op_mode)
12858             {
12859             case SFmode:
12860               cmp = (flag_finite_math_only && !flag_trapping_math)
12861                 ? gen_tstsfgt_gpr (compare_result, op0, op1)
12862                 : gen_cmpsfgt_gpr (compare_result, op0, op1);
12863               break;
12864
12865             case DFmode:
12866               cmp = (flag_finite_math_only && !flag_trapping_math)
12867                 ? gen_tstdfgt_gpr (compare_result, op0, op1)
12868                 : gen_cmpdfgt_gpr (compare_result, op0, op1);
12869               break;
12870
12871             case TFmode:
12872               cmp = (flag_finite_math_only && !flag_trapping_math)
12873                 ? gen_tsttfgt_gpr (compare_result, op0, op1)
12874                 : gen_cmptfgt_gpr (compare_result, op0, op1);
12875               break;
12876
12877             default:
12878               gcc_unreachable ();
12879             }
12880           break;
12881
12882         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
12883           switch (op_mode)
12884             {
12885             case SFmode:
12886               cmp = (flag_finite_math_only && !flag_trapping_math)
12887                 ? gen_tstsflt_gpr (compare_result, op0, op1)
12888                 : gen_cmpsflt_gpr (compare_result, op0, op1);
12889               break;
12890
12891             case DFmode:
12892               cmp = (flag_finite_math_only && !flag_trapping_math)
12893                 ? gen_tstdflt_gpr (compare_result, op0, op1)
12894                 : gen_cmpdflt_gpr (compare_result, op0, op1);
12895               break;
12896
12897             case TFmode:
12898               cmp = (flag_finite_math_only && !flag_trapping_math)
12899                 ? gen_tsttflt_gpr (compare_result, op0, op1)
12900                 : gen_cmptflt_gpr (compare_result, op0, op1);
12901               break;
12902
12903             default:
12904               gcc_unreachable ();
12905             }
12906           break;
12907         default:
12908           gcc_unreachable ();
12909         }
12910
12911       /* Synthesize LE and GE from LT/GT || EQ.  */
12912       if (code == LE || code == GE || code == LEU || code == GEU)
12913         {
12914           emit_insn (cmp);
12915
12916           switch (code)
12917             {
12918             case LE: code = LT; break;
12919             case GE: code = GT; break;
12920             case LEU: code = LT; break;
12921             case GEU: code = GT; break;
12922             default: gcc_unreachable ();
12923             }
12924
12925           compare_result2 = gen_reg_rtx (CCFPmode);
12926
12927           /* Do the EQ.  */
12928           switch (op_mode)
12929             {
12930             case SFmode:
12931               cmp = (flag_finite_math_only && !flag_trapping_math)
12932                 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
12933                 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
12934               break;
12935
12936             case DFmode:
12937               cmp = (flag_finite_math_only && !flag_trapping_math)
12938                 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
12939                 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
12940               break;
12941
12942             case TFmode:
12943               cmp = (flag_finite_math_only && !flag_trapping_math)
12944                 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
12945                 : gen_cmptfeq_gpr (compare_result2, op0, op1);
12946               break;
12947
12948             default:
12949               gcc_unreachable ();
12950             }
12951           emit_insn (cmp);
12952
12953           /* OR them together.  */
12954           or_result = gen_reg_rtx (CCFPmode);
12955           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
12956                                            compare_result2);
12957           compare_result = or_result;
12958           code = EQ;
12959         }
12960       else
12961         {
12962           if (code == NE || code == LTGT)
12963             code = NE;
12964           else
12965             code = EQ;
12966         }
12967
12968       emit_insn (cmp);
12969     }
12970   else
12971     {
12972       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
12973          CLOBBERs to match cmptf_internal2 pattern.  */
12974       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
12975           && GET_MODE (op0) == TFmode
12976           && !TARGET_IEEEQUAD
12977           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
12978         emit_insn (gen_rtx_PARALLEL (VOIDmode,
12979           gen_rtvec (9,
12980                      gen_rtx_SET (VOIDmode,
12981                                   compare_result,
12982                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
12983                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12984                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12985                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12986                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12987                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12988                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12989                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
12990                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)))));
12991       else if (GET_CODE (op1) == UNSPEC
12992                && XINT (op1, 1) == UNSPEC_SP_TEST)
12993         {
12994           rtx op1b = XVECEXP (op1, 0, 0);
12995           comp_mode = CCEQmode;
12996           compare_result = gen_reg_rtx (CCEQmode);
12997           if (TARGET_64BIT)
12998             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
12999           else
13000             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
13001         }
13002       else
13003         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
13004                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
13005     }
13006
13007   /* Some kinds of FP comparisons need an OR operation;
13008      under flag_finite_math_only we don't bother.  */
13009   if (FLOAT_MODE_P (mode)
13010       && !flag_finite_math_only
13011       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
13012       && (code == LE || code == GE
13013           || code == UNEQ || code == LTGT
13014           || code == UNGT || code == UNLT))
13015     {
13016       enum rtx_code or1, or2;
13017       rtx or1_rtx, or2_rtx, compare2_rtx;
13018       rtx or_result = gen_reg_rtx (CCEQmode);
13019
13020       switch (code)
13021         {
13022         case LE: or1 = LT;  or2 = EQ;  break;
13023         case GE: or1 = GT;  or2 = EQ;  break;
13024         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
13025         case LTGT: or1 = LT;  or2 = GT;  break;
13026         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
13027         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
13028         default:  gcc_unreachable ();
13029         }
13030       validate_condition_mode (or1, comp_mode);
13031       validate_condition_mode (or2, comp_mode);
13032       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
13033       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
13034       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
13035                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
13036                                       const_true_rtx);
13037       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
13038
13039       compare_result = or_result;
13040       code = EQ;
13041     }
13042
13043   validate_condition_mode (code, GET_MODE (compare_result));
13044
13045   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
13046 }
13047
13048
13049 /* Emit the RTL for an sCOND pattern.  */
13050
13051 void
13052 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
13053 {
13054   rtx condition_rtx;
13055   enum machine_mode op_mode;
13056   enum rtx_code cond_code;
13057   rtx result = operands[0];
13058
13059   condition_rtx = rs6000_generate_compare (operands[1], mode);
13060   cond_code = GET_CODE (condition_rtx);
13061
13062   if (FLOAT_MODE_P (mode)
13063       && !TARGET_FPRS && TARGET_HARD_FLOAT)
13064     {
13065       rtx t;
13066
13067       PUT_MODE (condition_rtx, SImode);
13068       t = XEXP (condition_rtx, 0);
13069
13070       gcc_assert (cond_code == NE || cond_code == EQ);
13071
13072       if (cond_code == NE)
13073         emit_insn (gen_e500_flip_gt_bit (t, t));
13074
13075       emit_insn (gen_move_from_CR_gt_bit (result, t));
13076       return;
13077     }
13078
13079   if (cond_code == NE
13080       || cond_code == GE || cond_code == LE
13081       || cond_code == GEU || cond_code == LEU
13082       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
13083     {
13084       rtx not_result = gen_reg_rtx (CCEQmode);
13085       rtx not_op, rev_cond_rtx;
13086       enum machine_mode cc_mode;
13087
13088       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
13089
13090       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
13091                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
13092       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
13093       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
13094       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
13095     }
13096
13097   op_mode = GET_MODE (XEXP (operands[1], 0));
13098   if (op_mode == VOIDmode)
13099     op_mode = GET_MODE (XEXP (operands[1], 1));
13100
13101   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
13102     {
13103       PUT_MODE (condition_rtx, DImode);
13104       convert_move (result, condition_rtx, 0);
13105     }
13106   else
13107     {
13108       PUT_MODE (condition_rtx, SImode);
13109       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
13110     }
13111 }
13112
13113 /* Emit a branch of kind CODE to location LOC.  */
13114
13115 void
13116 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
13117 {
13118   rtx condition_rtx, loc_ref;
13119
13120   condition_rtx = rs6000_generate_compare (operands[0], mode);
13121   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
13122   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
13123                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
13124                                                      loc_ref, pc_rtx)));
13125 }
13126
13127 /* Return the string to output a conditional branch to LABEL, which is
13128    the operand number of the label, or -1 if the branch is really a
13129    conditional return.
13130
13131    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
13132    condition code register and its mode specifies what kind of
13133    comparison we made.
13134
13135    REVERSED is nonzero if we should reverse the sense of the comparison.
13136
13137    INSN is the insn.  */
13138
13139 char *
13140 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
13141 {
13142   static char string[64];
13143   enum rtx_code code = GET_CODE (op);
13144   rtx cc_reg = XEXP (op, 0);
13145   enum machine_mode mode = GET_MODE (cc_reg);
13146   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
13147   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
13148   int really_reversed = reversed ^ need_longbranch;
13149   char *s = string;
13150   const char *ccode;
13151   const char *pred;
13152   rtx note;
13153
13154   validate_condition_mode (code, mode);
13155
13156   /* Work out which way this really branches.  We could use
13157      reverse_condition_maybe_unordered here always but this
13158      makes the resulting assembler clearer.  */
13159   if (really_reversed)
13160     {
13161       /* Reversal of FP compares takes care -- an ordered compare
13162          becomes an unordered compare and vice versa.  */
13163       if (mode == CCFPmode)
13164         code = reverse_condition_maybe_unordered (code);
13165       else
13166         code = reverse_condition (code);
13167     }
13168
13169   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
13170     {
13171       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
13172          to the GT bit.  */
13173       switch (code)
13174         {
13175         case EQ:
13176           /* Opposite of GT.  */
13177           code = GT;
13178           break;
13179
13180         case NE:
13181           code = UNLE;
13182           break;
13183
13184         default:
13185           gcc_unreachable ();
13186         }
13187     }
13188
13189   switch (code)
13190     {
13191       /* Not all of these are actually distinct opcodes, but
13192          we distinguish them for clarity of the resulting assembler.  */
13193     case NE: case LTGT:
13194       ccode = "ne"; break;
13195     case EQ: case UNEQ:
13196       ccode = "eq"; break;
13197     case GE: case GEU:
13198       ccode = "ge"; break;
13199     case GT: case GTU: case UNGT:
13200       ccode = "gt"; break;
13201     case LE: case LEU:
13202       ccode = "le"; break;
13203     case LT: case LTU: case UNLT:
13204       ccode = "lt"; break;
13205     case UNORDERED: ccode = "un"; break;
13206     case ORDERED: ccode = "nu"; break;
13207     case UNGE: ccode = "nl"; break;
13208     case UNLE: ccode = "ng"; break;
13209     default:
13210       gcc_unreachable ();
13211     }
13212
13213   /* Maybe we have a guess as to how likely the branch is.
13214      The old mnemonics don't have a way to specify this information.  */
13215   pred = "";
13216   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
13217   if (note != NULL_RTX)
13218     {
13219       /* PROB is the difference from 50%.  */
13220       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
13221
13222       /* Only hint for highly probable/improbable branches on newer
13223          cpus as static prediction overrides processor dynamic
13224          prediction.  For older cpus we may as well always hint, but
13225          assume not taken for branches that are very close to 50% as a
13226          mispredicted taken branch is more expensive than a
13227          mispredicted not-taken branch.  */
13228       if (rs6000_always_hint
13229           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
13230               && br_prob_note_reliable_p (note)))
13231         {
13232           if (abs (prob) > REG_BR_PROB_BASE / 20
13233               && ((prob > 0) ^ need_longbranch))
13234             pred = "+";
13235           else
13236             pred = "-";
13237         }
13238     }
13239
13240   if (label == NULL)
13241     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
13242   else
13243     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
13244
13245   /* We need to escape any '%' characters in the reg_names string.
13246      Assume they'd only be the first character....  */
13247   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
13248     *s++ = '%';
13249   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
13250
13251   if (label != NULL)
13252     {
13253       /* If the branch distance was too far, we may have to use an
13254          unconditional branch to go the distance.  */
13255       if (need_longbranch)
13256         s += sprintf (s, ",$+8\n\tb %s", label);
13257       else
13258         s += sprintf (s, ",%s", label);
13259     }
13260
13261   return string;
13262 }
13263
13264 /* Return the string to flip the GT bit on a CR.  */
13265 char *
13266 output_e500_flip_gt_bit (rtx dst, rtx src)
13267 {
13268   static char string[64];
13269   int a, b;
13270
13271   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
13272               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
13273
13274   /* GT bit.  */
13275   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
13276   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
13277
13278   sprintf (string, "crnot %d,%d", a, b);
13279   return string;
13280 }
13281
13282 /* Return insn index for the vector compare instruction for given CODE,
13283    and DEST_MODE, OP_MODE. Return INSN_NOT_AVAILABLE if valid insn is
13284    not available.  */
13285
13286 static int
13287 get_vec_cmp_insn (enum rtx_code code,
13288                   enum machine_mode dest_mode,
13289                   enum machine_mode op_mode)
13290 {
13291   if (!TARGET_ALTIVEC)
13292     return INSN_NOT_AVAILABLE;
13293
13294   switch (code)
13295     {
13296     case EQ:
13297       if (dest_mode == V16QImode && op_mode == V16QImode)
13298         return UNSPEC_VCMPEQUB;
13299       if (dest_mode == V8HImode && op_mode == V8HImode)
13300         return UNSPEC_VCMPEQUH;
13301       if (dest_mode == V4SImode && op_mode == V4SImode)
13302         return UNSPEC_VCMPEQUW;
13303       if (dest_mode == V4SImode && op_mode == V4SFmode)
13304         return UNSPEC_VCMPEQFP;
13305       break;
13306     case GE:
13307       if (dest_mode == V4SImode && op_mode == V4SFmode)
13308         return UNSPEC_VCMPGEFP;
13309     case GT:
13310       if (dest_mode == V16QImode && op_mode == V16QImode)
13311         return UNSPEC_VCMPGTSB;
13312       if (dest_mode == V8HImode && op_mode == V8HImode)
13313         return UNSPEC_VCMPGTSH;
13314       if (dest_mode == V4SImode && op_mode == V4SImode)
13315         return UNSPEC_VCMPGTSW;
13316       if (dest_mode == V4SImode && op_mode == V4SFmode)
13317         return UNSPEC_VCMPGTFP;
13318       break;
13319     case GTU:
13320       if (dest_mode == V16QImode && op_mode == V16QImode)
13321         return UNSPEC_VCMPGTUB;
13322       if (dest_mode == V8HImode && op_mode == V8HImode)
13323         return UNSPEC_VCMPGTUH;
13324       if (dest_mode == V4SImode && op_mode == V4SImode)
13325         return UNSPEC_VCMPGTUW;
13326       break;
13327     default:
13328       break;
13329     }
13330   return INSN_NOT_AVAILABLE;
13331 }
13332
13333 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
13334    DMODE is expected destination mode. This is a recursive function.  */
13335
13336 static rtx
13337 rs6000_emit_vector_compare (enum rtx_code rcode,
13338                             rtx op0, rtx op1,
13339                             enum machine_mode dmode)
13340 {
13341   int vec_cmp_insn;
13342   rtx mask;
13343   enum machine_mode dest_mode;
13344   enum machine_mode op_mode = GET_MODE (op1);
13345
13346   gcc_assert (TARGET_ALTIVEC);
13347   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
13348
13349   /* Floating point vector compare instructions uses destination V4SImode.
13350      Move destination to appropriate mode later.  */
13351   if (dmode == V4SFmode)
13352     dest_mode = V4SImode;
13353   else
13354     dest_mode = dmode;
13355
13356   mask = gen_reg_rtx (dest_mode);
13357   vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
13358
13359   if (vec_cmp_insn == INSN_NOT_AVAILABLE)
13360     {
13361       bool swap_operands = false;
13362       bool try_again = false;
13363       switch (rcode)
13364         {
13365         case LT:
13366           rcode = GT;
13367           swap_operands = true;
13368           try_again = true;
13369           break;
13370         case LTU:
13371           rcode = GTU;
13372           swap_operands = true;
13373           try_again = true;
13374           break;
13375         case NE:
13376         case UNLE:
13377         case UNLT:
13378         case UNGE:
13379         case UNGT:
13380           /* Invert condition and try again.
13381              e.g., A != B becomes ~(A==B).  */
13382           {
13383             enum rtx_code rev_code;
13384             enum insn_code nor_code;
13385             rtx eq_rtx;
13386
13387             rev_code = reverse_condition_maybe_unordered (rcode);
13388             eq_rtx = rs6000_emit_vector_compare (rev_code, op0, op1,
13389                                                  dest_mode);
13390
13391             nor_code = optab_handler (one_cmpl_optab, (int)dest_mode)->insn_code;
13392             gcc_assert (nor_code != CODE_FOR_nothing);
13393             emit_insn (GEN_FCN (nor_code) (mask, eq_rtx));
13394
13395             if (dmode != dest_mode)
13396               {
13397                 rtx temp = gen_reg_rtx (dest_mode);
13398                 convert_move (temp, mask, 0);
13399                 return temp;
13400               }
13401             return mask;
13402           }
13403           break;
13404         case GE:
13405         case GEU:
13406         case LE:
13407         case LEU:
13408           /* Try GT/GTU/LT/LTU OR EQ */
13409           {
13410             rtx c_rtx, eq_rtx;
13411             enum insn_code ior_code;
13412             enum rtx_code new_code;
13413
13414             switch (rcode)
13415               {
13416               case  GE:
13417                 new_code = GT;
13418                 break;
13419
13420               case GEU:
13421                 new_code = GTU;
13422                 break;
13423
13424               case LE:
13425                 new_code = LT;
13426                 break;
13427
13428               case LEU:
13429                 new_code = LTU;
13430                 break;
13431
13432               default:
13433                 gcc_unreachable ();
13434               }
13435
13436             c_rtx = rs6000_emit_vector_compare (new_code,
13437                                                 op0, op1, dest_mode);
13438             eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
13439                                                  dest_mode);
13440
13441             ior_code = optab_handler (ior_optab, (int)dest_mode)->insn_code;
13442             gcc_assert (ior_code != CODE_FOR_nothing);
13443             emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
13444             if (dmode != dest_mode)
13445               {
13446                 rtx temp = gen_reg_rtx (dest_mode);
13447                 convert_move (temp, mask, 0);
13448                 return temp;
13449               }
13450             return mask;
13451           }
13452           break;
13453         default:
13454           gcc_unreachable ();
13455         }
13456
13457       if (try_again)
13458         {
13459           vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
13460           /* You only get two chances.  */
13461           gcc_assert (vec_cmp_insn != INSN_NOT_AVAILABLE);
13462         }
13463
13464       if (swap_operands)
13465         {
13466           rtx tmp;
13467           tmp = op0;
13468           op0 = op1;
13469           op1 = tmp;
13470         }
13471     }
13472
13473   emit_insn (gen_rtx_SET (VOIDmode, mask,
13474                           gen_rtx_UNSPEC (dest_mode,
13475                                           gen_rtvec (2, op0, op1),
13476                                           vec_cmp_insn)));
13477   if (dmode != dest_mode)
13478     {
13479       rtx temp = gen_reg_rtx (dest_mode);
13480       convert_move (temp, mask, 0);
13481       return temp;
13482     }
13483   return mask;
13484 }
13485
13486 /* Return vector select instruction for MODE. Return INSN_NOT_AVAILABLE, if
13487    valid insn doesn exist for given mode.  */
13488
13489 static int
13490 get_vsel_insn (enum machine_mode mode)
13491 {
13492   switch (mode)
13493     {
13494     case V4SImode:
13495       return UNSPEC_VSEL4SI;
13496       break;
13497     case V4SFmode:
13498       return UNSPEC_VSEL4SF;
13499       break;
13500     case V8HImode:
13501       return UNSPEC_VSEL8HI;
13502       break;
13503     case V16QImode:
13504       return UNSPEC_VSEL16QI;
13505       break;
13506     default:
13507       return INSN_NOT_AVAILABLE;
13508       break;
13509     }
13510   return INSN_NOT_AVAILABLE;
13511 }
13512
13513 /* Emit vector select insn where DEST is destination using
13514    operands OP1, OP2 and MASK.  */
13515
13516 static void
13517 rs6000_emit_vector_select (rtx dest, rtx op1, rtx op2, rtx mask)
13518 {
13519   rtx t, temp;
13520   enum machine_mode dest_mode = GET_MODE (dest);
13521   int vsel_insn_index  = get_vsel_insn (GET_MODE (dest));
13522
13523   temp = gen_reg_rtx (dest_mode);
13524
13525   /* For each vector element, select op1 when mask is 1 otherwise
13526      select op2.  */
13527   t = gen_rtx_SET (VOIDmode, temp,
13528                    gen_rtx_UNSPEC (dest_mode,
13529                                    gen_rtvec (3, op2, op1, mask),
13530                                    vsel_insn_index));
13531   emit_insn (t);
13532   emit_move_insn (dest, temp);
13533   return;
13534 }
13535
13536 /* Emit vector conditional expression.
13537    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
13538    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
13539
13540 int
13541 rs6000_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
13542                               rtx cond, rtx cc_op0, rtx cc_op1)
13543 {
13544   enum machine_mode dest_mode = GET_MODE (dest);
13545   enum rtx_code rcode = GET_CODE (cond);
13546   rtx mask;
13547
13548   if (!TARGET_ALTIVEC)
13549     return 0;
13550
13551   /* Get the vector mask for the given relational operations.  */
13552   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
13553
13554   rs6000_emit_vector_select (dest, op1, op2, mask);
13555
13556   return 1;
13557 }
13558
13559 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
13560    operands of the last comparison is nonzero/true, FALSE_COND if it
13561    is zero/false.  Return 0 if the hardware has no such operation.  */
13562
13563 int
13564 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
13565 {
13566   enum rtx_code code = GET_CODE (op);
13567   rtx op0 = XEXP (op, 0);
13568   rtx op1 = XEXP (op, 1);
13569   REAL_VALUE_TYPE c1;
13570   enum machine_mode compare_mode = GET_MODE (op0);
13571   enum machine_mode result_mode = GET_MODE (dest);
13572   rtx temp;
13573   bool is_against_zero;
13574
13575   /* These modes should always match.  */
13576   if (GET_MODE (op1) != compare_mode
13577       /* In the isel case however, we can use a compare immediate, so
13578          op1 may be a small constant.  */
13579       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
13580     return 0;
13581   if (GET_MODE (true_cond) != result_mode)
13582     return 0;
13583   if (GET_MODE (false_cond) != result_mode)
13584     return 0;
13585
13586   /* First, work out if the hardware can do this at all, or
13587      if it's too slow....  */
13588   if (!FLOAT_MODE_P (compare_mode))
13589     {
13590       if (TARGET_ISEL)
13591         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
13592       return 0;
13593     }
13594   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
13595            && SCALAR_FLOAT_MODE_P (compare_mode))
13596     return 0;
13597
13598   is_against_zero = op1 == CONST0_RTX (compare_mode);
13599
13600   /* A floating-point subtract might overflow, underflow, or produce
13601      an inexact result, thus changing the floating-point flags, so it
13602      can't be generated if we care about that.  It's safe if one side
13603      of the construct is zero, since then no subtract will be
13604      generated.  */
13605   if (SCALAR_FLOAT_MODE_P (compare_mode)
13606       && flag_trapping_math && ! is_against_zero)
13607     return 0;
13608
13609   /* Eliminate half of the comparisons by switching operands, this
13610      makes the remaining code simpler.  */
13611   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
13612       || code == LTGT || code == LT || code == UNLE)
13613     {
13614       code = reverse_condition_maybe_unordered (code);
13615       temp = true_cond;
13616       true_cond = false_cond;
13617       false_cond = temp;
13618     }
13619
13620   /* UNEQ and LTGT take four instructions for a comparison with zero,
13621      it'll probably be faster to use a branch here too.  */
13622   if (code == UNEQ && HONOR_NANS (compare_mode))
13623     return 0;
13624
13625   if (GET_CODE (op1) == CONST_DOUBLE)
13626     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
13627
13628   /* We're going to try to implement comparisons by performing
13629      a subtract, then comparing against zero.  Unfortunately,
13630      Inf - Inf is NaN which is not zero, and so if we don't
13631      know that the operand is finite and the comparison
13632      would treat EQ different to UNORDERED, we can't do it.  */
13633   if (HONOR_INFINITIES (compare_mode)
13634       && code != GT && code != UNGE
13635       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
13636       /* Constructs of the form (a OP b ? a : b) are safe.  */
13637       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
13638           || (! rtx_equal_p (op0, true_cond)
13639               && ! rtx_equal_p (op1, true_cond))))
13640     return 0;
13641
13642   /* At this point we know we can use fsel.  */
13643
13644   /* Reduce the comparison to a comparison against zero.  */
13645   if (! is_against_zero)
13646     {
13647       temp = gen_reg_rtx (compare_mode);
13648       emit_insn (gen_rtx_SET (VOIDmode, temp,
13649                               gen_rtx_MINUS (compare_mode, op0, op1)));
13650       op0 = temp;
13651       op1 = CONST0_RTX (compare_mode);
13652     }
13653
13654   /* If we don't care about NaNs we can reduce some of the comparisons
13655      down to faster ones.  */
13656   if (! HONOR_NANS (compare_mode))
13657     switch (code)
13658       {
13659       case GT:
13660         code = LE;
13661         temp = true_cond;
13662         true_cond = false_cond;
13663         false_cond = temp;
13664         break;
13665       case UNGE:
13666         code = GE;
13667         break;
13668       case UNEQ:
13669         code = EQ;
13670         break;
13671       default:
13672         break;
13673       }
13674
13675   /* Now, reduce everything down to a GE.  */
13676   switch (code)
13677     {
13678     case GE:
13679       break;
13680
13681     case LE:
13682       temp = gen_reg_rtx (compare_mode);
13683       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
13684       op0 = temp;
13685       break;
13686
13687     case ORDERED:
13688       temp = gen_reg_rtx (compare_mode);
13689       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
13690       op0 = temp;
13691       break;
13692
13693     case EQ:
13694       temp = gen_reg_rtx (compare_mode);
13695       emit_insn (gen_rtx_SET (VOIDmode, temp,
13696                               gen_rtx_NEG (compare_mode,
13697                                            gen_rtx_ABS (compare_mode, op0))));
13698       op0 = temp;
13699       break;
13700
13701     case UNGE:
13702       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
13703       temp = gen_reg_rtx (result_mode);
13704       emit_insn (gen_rtx_SET (VOIDmode, temp,
13705                               gen_rtx_IF_THEN_ELSE (result_mode,
13706                                                     gen_rtx_GE (VOIDmode,
13707                                                                 op0, op1),
13708                                                     true_cond, false_cond)));
13709       false_cond = true_cond;
13710       true_cond = temp;
13711
13712       temp = gen_reg_rtx (compare_mode);
13713       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
13714       op0 = temp;
13715       break;
13716
13717     case GT:
13718       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
13719       temp = gen_reg_rtx (result_mode);
13720       emit_insn (gen_rtx_SET (VOIDmode, temp,
13721                               gen_rtx_IF_THEN_ELSE (result_mode,
13722                                                     gen_rtx_GE (VOIDmode,
13723                                                                 op0, op1),
13724                                                     true_cond, false_cond)));
13725       true_cond = false_cond;
13726       false_cond = temp;
13727
13728       temp = gen_reg_rtx (compare_mode);
13729       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
13730       op0 = temp;
13731       break;
13732
13733     default:
13734       gcc_unreachable ();
13735     }
13736
13737   emit_insn (gen_rtx_SET (VOIDmode, dest,
13738                           gen_rtx_IF_THEN_ELSE (result_mode,
13739                                                 gen_rtx_GE (VOIDmode,
13740                                                             op0, op1),
13741                                                 true_cond, false_cond)));
13742   return 1;
13743 }
13744
13745 /* Same as above, but for ints (isel).  */
13746
13747 static int
13748 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
13749 {
13750   rtx condition_rtx, cr;
13751
13752   /* All isel implementations thus far are 32-bits.  */
13753   if (GET_MODE (XEXP (op, 0)) != SImode)
13754     return 0;
13755
13756   /* We still have to do the compare, because isel doesn't do a
13757      compare, it just looks at the CRx bits set by a previous compare
13758      instruction.  */
13759   condition_rtx = rs6000_generate_compare (op, SImode);
13760   cr = XEXP (condition_rtx, 0);
13761
13762   if (GET_MODE (cr) == CCmode)
13763     emit_insn (gen_isel_signed (dest, condition_rtx,
13764                                 true_cond, false_cond, cr));
13765   else
13766     emit_insn (gen_isel_unsigned (dest, condition_rtx,
13767                                   true_cond, false_cond, cr));
13768
13769   return 1;
13770 }
13771
13772 const char *
13773 output_isel (rtx *operands)
13774 {
13775   enum rtx_code code;
13776
13777   code = GET_CODE (operands[1]);
13778   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
13779     {
13780       PUT_CODE (operands[1], reverse_condition (code));
13781       return "isel %0,%3,%2,%j1";
13782     }
13783   else
13784     return "isel %0,%2,%3,%j1";
13785 }
13786
13787 void
13788 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
13789 {
13790   enum machine_mode mode = GET_MODE (op0);
13791   enum rtx_code c;
13792   rtx target;
13793
13794   if (code == SMAX || code == SMIN)
13795     c = GE;
13796   else
13797     c = GEU;
13798
13799   if (code == SMAX || code == UMAX)
13800     target = emit_conditional_move (dest, c, op0, op1, mode,
13801                                     op0, op1, mode, 0);
13802   else
13803     target = emit_conditional_move (dest, c, op0, op1, mode,
13804                                     op1, op0, mode, 0);
13805   gcc_assert (target);
13806   if (target != dest)
13807     emit_move_insn (dest, target);
13808 }
13809
13810 /* Emit instructions to perform a load-reserved/store-conditional operation.
13811    The operation performed is an atomic
13812    (set M (CODE:MODE M OP))
13813    If not NULL, BEFORE is atomically set to M before the operation, and
13814    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
13815    If SYNC_P then a memory barrier is emitted before the operation.
13816    Either OP or M may be wrapped in a NOT operation.  */
13817
13818 void
13819 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
13820                   rtx m, rtx op, rtx before_param, rtx after_param,
13821                   bool sync_p)
13822 {
13823   enum machine_mode used_mode;
13824   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
13825   rtx used_m;
13826   rtvec vec;
13827   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
13828   rtx shift = NULL_RTX;
13829
13830   if (sync_p)
13831     emit_insn (gen_lwsync ());
13832
13833     used_m = m;
13834
13835   /* If this is smaller than SImode, we'll have to use SImode with
13836      adjustments.  */
13837   if (mode == QImode || mode == HImode)
13838     {
13839       rtx newop, oldop;
13840
13841       if (MEM_ALIGN (used_m) >= 32)
13842         {
13843           int ishift = 0;
13844           if (BYTES_BIG_ENDIAN)
13845             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
13846
13847           shift = GEN_INT (ishift);
13848           used_m = change_address (used_m, SImode, 0);
13849         }
13850       else
13851         {
13852           rtx addrSI, aligned_addr;
13853           int shift_mask = mode == QImode ? 0x18 : 0x10;
13854
13855           addrSI = gen_lowpart_common (SImode,
13856                                        force_reg (Pmode, XEXP (used_m, 0)));
13857           addrSI = force_reg (SImode, addrSI);
13858           shift = gen_reg_rtx (SImode);
13859
13860           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
13861                                  GEN_INT (shift_mask)));
13862           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
13863
13864           aligned_addr = expand_binop (Pmode, and_optab,
13865                                        XEXP (used_m, 0),
13866                                        GEN_INT (-4), NULL_RTX,
13867                                        1, OPTAB_LIB_WIDEN);
13868           used_m = change_address (used_m, SImode, aligned_addr);
13869           set_mem_align (used_m, 32);
13870         }
13871       /* It's safe to keep the old alias set of USED_M, because
13872          the operation is atomic and only affects the original
13873          USED_M.  */
13874       m = used_m;
13875
13876       if (GET_CODE (op) == NOT)
13877         {
13878           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
13879           oldop = gen_rtx_NOT (SImode, oldop);
13880         }
13881       else
13882         oldop = lowpart_subreg (SImode, op, mode);
13883
13884       switch (code)
13885         {
13886         case IOR:
13887         case XOR:
13888           newop = expand_binop (SImode, and_optab,
13889                                 oldop, GEN_INT (imask), NULL_RTX,
13890                                 1, OPTAB_LIB_WIDEN);
13891           emit_insn (gen_ashlsi3 (newop, newop, shift));
13892           break;
13893
13894         case NOT: /* NAND */
13895           newop = expand_binop (SImode, ior_optab,
13896                                 oldop, GEN_INT (~imask), NULL_RTX,
13897                                 1, OPTAB_LIB_WIDEN);
13898           emit_insn (gen_rotlsi3 (newop, newop, shift));
13899           break;
13900
13901         case AND:
13902           newop = expand_binop (SImode, ior_optab,
13903                                 oldop, GEN_INT (~imask), NULL_RTX,
13904                                 1, OPTAB_LIB_WIDEN);
13905           emit_insn (gen_rotlsi3 (newop, newop, shift));
13906           break;
13907
13908         case PLUS:
13909         case MINUS:
13910           {
13911             rtx mask;
13912
13913             newop = expand_binop (SImode, and_optab,
13914                                   oldop, GEN_INT (imask), NULL_RTX,
13915                                   1, OPTAB_LIB_WIDEN);
13916             emit_insn (gen_ashlsi3 (newop, newop, shift));
13917
13918             mask = gen_reg_rtx (SImode);
13919             emit_move_insn (mask, GEN_INT (imask));
13920             emit_insn (gen_ashlsi3 (mask, mask, shift));
13921
13922             if (code == PLUS)
13923               newop = gen_rtx_PLUS (SImode, m, newop);
13924             else
13925               newop = gen_rtx_MINUS (SImode, m, newop);
13926             newop = gen_rtx_AND (SImode, newop, mask);
13927             newop = gen_rtx_IOR (SImode, newop,
13928                                  gen_rtx_AND (SImode,
13929                                               gen_rtx_NOT (SImode, mask),
13930                                               m));
13931             break;
13932           }
13933
13934         default:
13935           gcc_unreachable ();
13936         }
13937
13938       op = newop;
13939       used_mode = SImode;
13940       before = gen_reg_rtx (used_mode);
13941       after = gen_reg_rtx (used_mode);
13942     }
13943   else
13944     {
13945       used_mode = mode;
13946       before = before_param;
13947       after = after_param;
13948
13949       if (before == NULL_RTX)
13950         before = gen_reg_rtx (used_mode);
13951       if (after == NULL_RTX)
13952         after = gen_reg_rtx (used_mode);
13953     }
13954
13955   if ((code == PLUS || code == MINUS)
13956       && used_mode != mode)
13957     the_op = op;  /* Computed above.  */
13958   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
13959     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
13960   else if (code == NOT)
13961     the_op = gen_rtx_fmt_ee (IOR, used_mode,
13962                              gen_rtx_NOT (used_mode, m),
13963                              gen_rtx_NOT (used_mode, op));
13964   else
13965     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
13966
13967   set_after = gen_rtx_SET (VOIDmode, after, the_op);
13968   set_before = gen_rtx_SET (VOIDmode, before, used_m);
13969   set_atomic = gen_rtx_SET (VOIDmode, used_m,
13970                             gen_rtx_UNSPEC (used_mode,
13971                                             gen_rtvec (1, the_op),
13972                                             UNSPEC_SYNC_OP));
13973   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
13974
13975   if ((code == PLUS || code == MINUS) && used_mode != mode)
13976     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
13977                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
13978   else
13979     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
13980   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
13981
13982   /* Shift and mask the return values properly.  */
13983   if (used_mode != mode && before_param)
13984     {
13985       emit_insn (gen_lshrsi3 (before, before, shift));
13986       convert_move (before_param, before, 1);
13987     }
13988
13989   if (used_mode != mode && after_param)
13990     {
13991       emit_insn (gen_lshrsi3 (after, after, shift));
13992       convert_move (after_param, after, 1);
13993     }
13994
13995   /* The previous sequence will end with a branch that's dependent on
13996      the conditional store, so placing an isync will ensure that no
13997      other instructions (especially, no load or store instructions)
13998      can start before the atomic operation completes.  */
13999   if (sync_p)
14000     emit_insn (gen_isync ());
14001 }
14002
14003 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
14004    COND is true.  Mark the jump as unlikely to be taken.  */
14005
14006 static void
14007 emit_unlikely_jump (rtx cond, rtx label)
14008 {
14009   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
14010   rtx x;
14011
14012   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
14013   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
14014   add_reg_note (x, REG_BR_PROB, very_unlikely);
14015 }
14016
14017 /* A subroutine of the atomic operation splitters.  Emit a load-locked
14018    instruction in MODE.  */
14019
14020 static void
14021 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
14022 {
14023   rtx (*fn) (rtx, rtx) = NULL;
14024   if (mode == SImode)
14025     fn = gen_load_locked_si;
14026   else if (mode == DImode)
14027     fn = gen_load_locked_di;
14028   emit_insn (fn (reg, mem));
14029 }
14030
14031 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
14032    instruction in MODE.  */
14033
14034 static void
14035 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
14036 {
14037   rtx (*fn) (rtx, rtx, rtx) = NULL;
14038   if (mode == SImode)
14039     fn = gen_store_conditional_si;
14040   else if (mode == DImode)
14041     fn = gen_store_conditional_di;
14042
14043   /* Emit sync before stwcx. to address PPC405 Erratum.  */
14044   if (PPC405_ERRATUM77)
14045     emit_insn (gen_memory_barrier ());
14046
14047   emit_insn (fn (res, mem, val));
14048 }
14049
14050 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
14051    to perform.  MEM is the memory on which to operate.  VAL is the second
14052    operand of the binary operator.  BEFORE and AFTER are optional locations to
14053    return the value of MEM either before of after the operation.  SCRATCH is
14054    a scratch register.  */
14055
14056 void
14057 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
14058                        rtx before, rtx after, rtx scratch)
14059 {
14060   enum machine_mode mode = GET_MODE (mem);
14061   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
14062
14063   emit_insn (gen_lwsync ());
14064
14065   label = gen_label_rtx ();
14066   emit_label (label);
14067   label = gen_rtx_LABEL_REF (VOIDmode, label);
14068
14069   if (before == NULL_RTX)
14070     before = scratch;
14071   emit_load_locked (mode, before, mem);
14072
14073   if (code == NOT)
14074     x = gen_rtx_IOR (mode,
14075                      gen_rtx_NOT (mode, before),
14076                      gen_rtx_NOT (mode, val));
14077   else if (code == AND)
14078     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
14079   else
14080     x = gen_rtx_fmt_ee (code, mode, before, val);
14081
14082   if (after != NULL_RTX)
14083     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
14084   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
14085
14086   emit_store_conditional (mode, cond, mem, scratch);
14087
14088   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
14089   emit_unlikely_jump (x, label);
14090
14091   emit_insn (gen_isync ());
14092 }
14093
14094 /* Expand an atomic compare and swap operation.  MEM is the memory on which
14095    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
14096    value to be stored.  SCRATCH is a scratch GPR.  */
14097
14098 void
14099 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
14100                                rtx scratch)
14101 {
14102   enum machine_mode mode = GET_MODE (mem);
14103   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
14104
14105   emit_insn (gen_lwsync ());
14106
14107   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
14108   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
14109   emit_label (XEXP (label1, 0));
14110
14111   emit_load_locked (mode, retval, mem);
14112
14113   x = gen_rtx_COMPARE (CCmode, retval, oldval);
14114   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
14115
14116   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
14117   emit_unlikely_jump (x, label2);
14118
14119   emit_move_insn (scratch, newval);
14120   emit_store_conditional (mode, cond, mem, scratch);
14121
14122   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
14123   emit_unlikely_jump (x, label1);
14124
14125   emit_insn (gen_isync ());
14126   emit_label (XEXP (label2, 0));
14127 }
14128
14129 /* Expand an atomic test and set operation.  MEM is the memory on which
14130    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
14131
14132 void
14133 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
14134 {
14135   enum machine_mode mode = GET_MODE (mem);
14136   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
14137
14138   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
14139   emit_label (XEXP (label, 0));
14140
14141   emit_load_locked (mode, retval, mem);
14142   emit_move_insn (scratch, val);
14143   emit_store_conditional (mode, cond, mem, scratch);
14144
14145   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
14146   emit_unlikely_jump (x, label);
14147
14148   emit_insn (gen_isync ());
14149 }
14150
14151 void
14152 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
14153 {
14154   enum machine_mode mode = GET_MODE (mem);
14155   rtx addrSI, align, wdst, shift, mask;
14156   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
14157   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
14158
14159   /* Shift amount for subword relative to aligned word.  */
14160   addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
14161   addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
14162   shift = gen_reg_rtx (SImode);
14163   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
14164                          GEN_INT (shift_mask)));
14165   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
14166
14167   /* Shift and mask old value into position within word.  */
14168   oldval = convert_modes (SImode, mode, oldval, 1);
14169   oldval = expand_binop (SImode, and_optab,
14170                          oldval, GEN_INT (imask), NULL_RTX,
14171                          1, OPTAB_LIB_WIDEN);
14172   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
14173
14174   /* Shift and mask new value into position within word.  */
14175   newval = convert_modes (SImode, mode, newval, 1);
14176   newval = expand_binop (SImode, and_optab,
14177                          newval, GEN_INT (imask), NULL_RTX,
14178                          1, OPTAB_LIB_WIDEN);
14179   emit_insn (gen_ashlsi3 (newval, newval, shift));
14180
14181   /* Mask for insertion.  */
14182   mask = gen_reg_rtx (SImode);
14183   emit_move_insn (mask, GEN_INT (imask));
14184   emit_insn (gen_ashlsi3 (mask, mask, shift));
14185
14186   /* Address of aligned word containing subword.  */
14187   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
14188                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
14189   mem = change_address (mem, SImode, align);
14190   set_mem_align (mem, 32);
14191   MEM_VOLATILE_P (mem) = 1;
14192
14193   wdst = gen_reg_rtx (SImode);
14194   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
14195                                                     oldval, newval, mem));
14196
14197   /* Shift the result back.  */
14198   emit_insn (gen_lshrsi3 (wdst, wdst, shift));
14199
14200   emit_move_insn (dst, gen_lowpart (mode, wdst));
14201 }
14202
14203 void
14204 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
14205                                   rtx oldval, rtx newval, rtx mem,
14206                                   rtx scratch)
14207 {
14208   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
14209
14210   emit_insn (gen_lwsync ());
14211   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
14212   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
14213   emit_label (XEXP (label1, 0));
14214
14215   emit_load_locked (SImode, scratch, mem);
14216
14217   /* Mask subword within loaded value for comparison with oldval.
14218      Use UNSPEC_AND to avoid clobber.*/
14219   emit_insn (gen_rtx_SET (SImode, dest,
14220                           gen_rtx_UNSPEC (SImode,
14221                                           gen_rtvec (2, scratch, mask),
14222                                           UNSPEC_AND)));
14223
14224   x = gen_rtx_COMPARE (CCmode, dest, oldval);
14225   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
14226
14227   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
14228   emit_unlikely_jump (x, label2);
14229
14230   /* Clear subword within loaded value for insertion of new value.  */
14231   emit_insn (gen_rtx_SET (SImode, scratch,
14232                           gen_rtx_AND (SImode,
14233                                        gen_rtx_NOT (SImode, mask), scratch)));
14234   emit_insn (gen_iorsi3 (scratch, scratch, newval));
14235   emit_store_conditional (SImode, cond, mem, scratch);
14236
14237   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
14238   emit_unlikely_jump (x, label1);
14239
14240   emit_insn (gen_isync ());
14241   emit_label (XEXP (label2, 0));
14242 }
14243
14244
14245   /* Emit instructions to move SRC to DST.  Called by splitters for
14246    multi-register moves.  It will emit at most one instruction for
14247    each register that is accessed; that is, it won't emit li/lis pairs
14248    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
14249    register.  */
14250
14251 void
14252 rs6000_split_multireg_move (rtx dst, rtx src)
14253 {
14254   /* The register number of the first register being moved.  */
14255   int reg;
14256   /* The mode that is to be moved.  */
14257   enum machine_mode mode;
14258   /* The mode that the move is being done in, and its size.  */
14259   enum machine_mode reg_mode;
14260   int reg_mode_size;
14261   /* The number of registers that will be moved.  */
14262   int nregs;
14263
14264   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
14265   mode = GET_MODE (dst);
14266   nregs = hard_regno_nregs[reg][mode];
14267   if (FP_REGNO_P (reg))
14268     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : 
14269         ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
14270   else if (ALTIVEC_REGNO_P (reg))
14271     reg_mode = V16QImode;
14272   else if (TARGET_E500_DOUBLE && mode == TFmode)
14273     reg_mode = DFmode;
14274   else
14275     reg_mode = word_mode;
14276   reg_mode_size = GET_MODE_SIZE (reg_mode);
14277
14278   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
14279
14280   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
14281     {
14282       /* Move register range backwards, if we might have destructive
14283          overlap.  */
14284       int i;
14285       for (i = nregs - 1; i >= 0; i--)
14286         emit_insn (gen_rtx_SET (VOIDmode,
14287                                 simplify_gen_subreg (reg_mode, dst, mode,
14288                                                      i * reg_mode_size),
14289                                 simplify_gen_subreg (reg_mode, src, mode,
14290                                                      i * reg_mode_size)));
14291     }
14292   else
14293     {
14294       int i;
14295       int j = -1;
14296       bool used_update = false;
14297
14298       if (MEM_P (src) && INT_REGNO_P (reg))
14299         {
14300           rtx breg;
14301
14302           if (GET_CODE (XEXP (src, 0)) == PRE_INC
14303               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
14304             {
14305               rtx delta_rtx;
14306               breg = XEXP (XEXP (src, 0), 0);
14307               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
14308                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
14309                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
14310               emit_insn (TARGET_32BIT
14311                          ? gen_addsi3 (breg, breg, delta_rtx)
14312                          : gen_adddi3 (breg, breg, delta_rtx));
14313               src = replace_equiv_address (src, breg);
14314             }
14315           else if (! rs6000_offsettable_memref_p (src))
14316             {
14317               rtx basereg;
14318               basereg = gen_rtx_REG (Pmode, reg);
14319               emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
14320               src = replace_equiv_address (src, basereg);
14321             }
14322
14323           breg = XEXP (src, 0);
14324           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
14325             breg = XEXP (breg, 0);
14326
14327           /* If the base register we are using to address memory is
14328              also a destination reg, then change that register last.  */
14329           if (REG_P (breg)
14330               && REGNO (breg) >= REGNO (dst)
14331               && REGNO (breg) < REGNO (dst) + nregs)
14332             j = REGNO (breg) - REGNO (dst);
14333         }
14334
14335       if (GET_CODE (dst) == MEM && INT_REGNO_P (reg))
14336         {
14337           rtx breg;
14338
14339           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
14340               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
14341             {
14342               rtx delta_rtx;
14343               breg = XEXP (XEXP (dst, 0), 0);
14344               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
14345                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
14346                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
14347
14348               /* We have to update the breg before doing the store.
14349                  Use store with update, if available.  */
14350
14351               if (TARGET_UPDATE)
14352                 {
14353                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
14354                   emit_insn (TARGET_32BIT
14355                              ? (TARGET_POWERPC64
14356                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
14357                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
14358                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
14359                   used_update = true;
14360                 }
14361               else
14362                 emit_insn (TARGET_32BIT
14363                            ? gen_addsi3 (breg, breg, delta_rtx)
14364                            : gen_adddi3 (breg, breg, delta_rtx));
14365               dst = replace_equiv_address (dst, breg);
14366             }
14367           else
14368             gcc_assert (rs6000_offsettable_memref_p (dst));
14369         }
14370
14371       for (i = 0; i < nregs; i++)
14372         {
14373           /* Calculate index to next subword.  */
14374           ++j;
14375           if (j == nregs)
14376             j = 0;
14377
14378           /* If compiler already emitted move of first word by
14379              store with update, no need to do anything.  */
14380           if (j == 0 && used_update)
14381             continue;
14382
14383           emit_insn (gen_rtx_SET (VOIDmode,
14384                                   simplify_gen_subreg (reg_mode, dst, mode,
14385                                                        j * reg_mode_size),
14386                                   simplify_gen_subreg (reg_mode, src, mode,
14387                                                        j * reg_mode_size)));
14388         }
14389     }
14390 }
14391
14392 \f
14393 /* This page contains routines that are used to determine what the
14394    function prologue and epilogue code will do and write them out.  */
14395
14396 /* Return the first fixed-point register that is required to be
14397    saved. 32 if none.  */
14398
14399 int
14400 first_reg_to_save (void)
14401 {
14402   int first_reg;
14403
14404   /* Find lowest numbered live register.  */
14405   for (first_reg = 13; first_reg <= 31; first_reg++)
14406     if (df_regs_ever_live_p (first_reg)
14407         && (! call_used_regs[first_reg]
14408             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
14409                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
14410                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
14411                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
14412       break;
14413
14414 #if TARGET_MACHO
14415   if (flag_pic
14416       && crtl->uses_pic_offset_table
14417       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
14418     return RS6000_PIC_OFFSET_TABLE_REGNUM;
14419 #endif
14420
14421   return first_reg;
14422 }
14423
14424 /* Similar, for FP regs.  */
14425
14426 int
14427 first_fp_reg_to_save (void)
14428 {
14429   int first_reg;
14430
14431   /* Find lowest numbered live register.  */
14432   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
14433     if (df_regs_ever_live_p (first_reg))
14434       break;
14435
14436   return first_reg;
14437 }
14438
14439 /* Similar, for AltiVec regs.  */
14440
14441 static int
14442 first_altivec_reg_to_save (void)
14443 {
14444   int i;
14445
14446   /* Stack frame remains as is unless we are in AltiVec ABI.  */
14447   if (! TARGET_ALTIVEC_ABI)
14448     return LAST_ALTIVEC_REGNO + 1;
14449
14450   /* On Darwin, the unwind routines are compiled without
14451      TARGET_ALTIVEC, and use save_world to save/restore the
14452      altivec registers when necessary.  */
14453   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
14454       && ! TARGET_ALTIVEC)
14455     return FIRST_ALTIVEC_REGNO + 20;
14456
14457   /* Find lowest numbered live register.  */
14458   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
14459     if (df_regs_ever_live_p (i))
14460       break;
14461
14462   return i;
14463 }
14464
14465 /* Return a 32-bit mask of the AltiVec registers we need to set in
14466    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
14467    the 32-bit word is 0.  */
14468
14469 static unsigned int
14470 compute_vrsave_mask (void)
14471 {
14472   unsigned int i, mask = 0;
14473
14474   /* On Darwin, the unwind routines are compiled without
14475      TARGET_ALTIVEC, and use save_world to save/restore the
14476      call-saved altivec registers when necessary.  */
14477   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
14478       && ! TARGET_ALTIVEC)
14479     mask |= 0xFFF;
14480
14481   /* First, find out if we use _any_ altivec registers.  */
14482   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
14483     if (df_regs_ever_live_p (i))
14484       mask |= ALTIVEC_REG_BIT (i);
14485
14486   if (mask == 0)
14487     return mask;
14488
14489   /* Next, remove the argument registers from the set.  These must
14490      be in the VRSAVE mask set by the caller, so we don't need to add
14491      them in again.  More importantly, the mask we compute here is
14492      used to generate CLOBBERs in the set_vrsave insn, and we do not
14493      wish the argument registers to die.  */
14494   for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
14495     mask &= ~ALTIVEC_REG_BIT (i);
14496
14497   /* Similarly, remove the return value from the set.  */
14498   {
14499     bool yes = false;
14500     diddle_return_value (is_altivec_return_reg, &yes);
14501     if (yes)
14502       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
14503   }
14504
14505   return mask;
14506 }
14507
14508 /* For a very restricted set of circumstances, we can cut down the
14509    size of prologues/epilogues by calling our own save/restore-the-world
14510    routines.  */
14511
14512 static void
14513 compute_save_world_info (rs6000_stack_t *info_ptr)
14514 {
14515   info_ptr->world_save_p = 1;
14516   info_ptr->world_save_p
14517     = (WORLD_SAVE_P (info_ptr)
14518        && DEFAULT_ABI == ABI_DARWIN
14519        && ! (cfun->calls_setjmp && flag_exceptions)
14520        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
14521        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
14522        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
14523        && info_ptr->cr_save_p);
14524
14525   /* This will not work in conjunction with sibcalls.  Make sure there
14526      are none.  (This check is expensive, but seldom executed.) */
14527   if (WORLD_SAVE_P (info_ptr))
14528     {
14529       rtx insn;
14530       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
14531         if ( GET_CODE (insn) == CALL_INSN
14532              && SIBLING_CALL_P (insn))
14533           {
14534             info_ptr->world_save_p = 0;
14535             break;
14536           }
14537     }
14538
14539   if (WORLD_SAVE_P (info_ptr))
14540     {
14541       /* Even if we're not touching VRsave, make sure there's room on the
14542          stack for it, if it looks like we're calling SAVE_WORLD, which
14543          will attempt to save it. */
14544       info_ptr->vrsave_size  = 4;
14545
14546       /* If we are going to save the world, we need to save the link register too.  */
14547       info_ptr->lr_save_p = 1;
14548
14549       /* "Save" the VRsave register too if we're saving the world.  */
14550       if (info_ptr->vrsave_mask == 0)
14551         info_ptr->vrsave_mask = compute_vrsave_mask ();
14552
14553       /* Because the Darwin register save/restore routines only handle
14554          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
14555          check.  */
14556       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
14557                   && (info_ptr->first_altivec_reg_save
14558                       >= FIRST_SAVED_ALTIVEC_REGNO));
14559     }
14560   return;
14561 }
14562
14563
14564 static void
14565 is_altivec_return_reg (rtx reg, void *xyes)
14566 {
14567   bool *yes = (bool *) xyes;
14568   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
14569     *yes = true;
14570 }
14571
14572 \f
14573 /* Calculate the stack information for the current function.  This is
14574    complicated by having two separate calling sequences, the AIX calling
14575    sequence and the V.4 calling sequence.
14576
14577    AIX (and Darwin/Mac OS X) stack frames look like:
14578                                                           32-bit  64-bit
14579         SP----> +---------------------------------------+
14580                 | back chain to caller                  | 0       0
14581                 +---------------------------------------+
14582                 | saved CR                              | 4       8 (8-11)
14583                 +---------------------------------------+
14584                 | saved LR                              | 8       16
14585                 +---------------------------------------+
14586                 | reserved for compilers                | 12      24
14587                 +---------------------------------------+
14588                 | reserved for binders                  | 16      32
14589                 +---------------------------------------+
14590                 | saved TOC pointer                     | 20      40
14591                 +---------------------------------------+
14592                 | Parameter save area (P)               | 24      48
14593                 +---------------------------------------+
14594                 | Alloca space (A)                      | 24+P    etc.
14595                 +---------------------------------------+
14596                 | Local variable space (L)              | 24+P+A
14597                 +---------------------------------------+
14598                 | Float/int conversion temporary (X)    | 24+P+A+L
14599                 +---------------------------------------+
14600                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
14601                 +---------------------------------------+
14602                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
14603                 +---------------------------------------+
14604                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
14605                 +---------------------------------------+
14606                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
14607                 +---------------------------------------+
14608                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
14609                 +---------------------------------------+
14610         old SP->| back chain to caller's caller         |
14611                 +---------------------------------------+
14612
14613    The required alignment for AIX configurations is two words (i.e., 8
14614    or 16 bytes).
14615
14616
14617    V.4 stack frames look like:
14618
14619         SP----> +---------------------------------------+
14620                 | back chain to caller                  | 0
14621                 +---------------------------------------+
14622                 | caller's saved LR                     | 4
14623                 +---------------------------------------+
14624                 | Parameter save area (P)               | 8
14625                 +---------------------------------------+
14626                 | Alloca space (A)                      | 8+P
14627                 +---------------------------------------+
14628                 | Varargs save area (V)                 | 8+P+A
14629                 +---------------------------------------+
14630                 | Local variable space (L)              | 8+P+A+V
14631                 +---------------------------------------+
14632                 | Float/int conversion temporary (X)    | 8+P+A+V+L
14633                 +---------------------------------------+
14634                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
14635                 +---------------------------------------+
14636                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
14637                 +---------------------------------------+
14638                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
14639                 +---------------------------------------+
14640                 | SPE: area for 64-bit GP registers     |
14641                 +---------------------------------------+
14642                 | SPE alignment padding                 |
14643                 +---------------------------------------+
14644                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
14645                 +---------------------------------------+
14646                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
14647                 +---------------------------------------+
14648                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
14649                 +---------------------------------------+
14650         old SP->| back chain to caller's caller         |
14651                 +---------------------------------------+
14652
14653    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
14654    given.  (But note below and in sysv4.h that we require only 8 and
14655    may round up the size of our stack frame anyways.  The historical
14656    reason is early versions of powerpc-linux which didn't properly
14657    align the stack at program startup.  A happy side-effect is that
14658    -mno-eabi libraries can be used with -meabi programs.)
14659
14660    The EABI configuration defaults to the V.4 layout.  However,
14661    the stack alignment requirements may differ.  If -mno-eabi is not
14662    given, the required stack alignment is 8 bytes; if -mno-eabi is
14663    given, the required alignment is 16 bytes.  (But see V.4 comment
14664    above.)  */
14665
14666 #ifndef ABI_STACK_BOUNDARY
14667 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
14668 #endif
14669
14670 static rs6000_stack_t *
14671 rs6000_stack_info (void)
14672 {
14673   static rs6000_stack_t info;
14674   rs6000_stack_t *info_ptr = &info;
14675   int reg_size = TARGET_32BIT ? 4 : 8;
14676   int ehrd_size;
14677   int save_align;
14678   int first_gp;
14679   HOST_WIDE_INT non_fixed_size;
14680
14681   memset (&info, 0, sizeof (info));
14682
14683   if (TARGET_SPE)
14684     {
14685       /* Cache value so we don't rescan instruction chain over and over.  */
14686       if (cfun->machine->insn_chain_scanned_p == 0)
14687         cfun->machine->insn_chain_scanned_p
14688           = spe_func_has_64bit_regs_p () + 1;
14689       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
14690     }
14691
14692   /* Select which calling sequence.  */
14693   info_ptr->abi = DEFAULT_ABI;
14694
14695   /* Calculate which registers need to be saved & save area size.  */
14696   info_ptr->first_gp_reg_save = first_reg_to_save ();
14697   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
14698      even if it currently looks like we won't.  Reload may need it to
14699      get at a constant; if so, it will have already created a constant
14700      pool entry for it.  */
14701   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
14702        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
14703        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
14704       && crtl->uses_const_pool
14705       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
14706     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
14707   else
14708     first_gp = info_ptr->first_gp_reg_save;
14709
14710   info_ptr->gp_size = reg_size * (32 - first_gp);
14711
14712   /* For the SPE, we have an additional upper 32-bits on each GPR.
14713      Ideally we should save the entire 64-bits only when the upper
14714      half is used in SIMD instructions.  Since we only record
14715      registers live (not the size they are used in), this proves
14716      difficult because we'd have to traverse the instruction chain at
14717      the right time, taking reload into account.  This is a real pain,
14718      so we opt to save the GPRs in 64-bits always if but one register
14719      gets used in 64-bits.  Otherwise, all the registers in the frame
14720      get saved in 32-bits.
14721
14722      So... since when we save all GPRs (except the SP) in 64-bits, the
14723      traditional GP save area will be empty.  */
14724   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
14725     info_ptr->gp_size = 0;
14726
14727   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
14728   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
14729
14730   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
14731   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
14732                                  - info_ptr->first_altivec_reg_save);
14733
14734   /* Does this function call anything?  */
14735   info_ptr->calls_p = (! current_function_is_leaf
14736                        || cfun->machine->ra_needs_full_frame);
14737
14738   /* Determine if we need to save the link register.  */
14739   if ((DEFAULT_ABI == ABI_AIX
14740        && crtl->profile
14741        && !TARGET_PROFILE_KERNEL)
14742 #ifdef TARGET_RELOCATABLE
14743       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
14744 #endif
14745       || (info_ptr->first_fp_reg_save != 64
14746           && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
14747       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
14748       || info_ptr->calls_p
14749       || rs6000_ra_ever_killed ())
14750     {
14751       info_ptr->lr_save_p = 1;
14752       df_set_regs_ever_live (LR_REGNO, true);
14753     }
14754
14755   /* Determine if we need to save the condition code registers.  */
14756   if (df_regs_ever_live_p (CR2_REGNO)
14757       || df_regs_ever_live_p (CR3_REGNO)
14758       || df_regs_ever_live_p (CR4_REGNO))
14759     {
14760       info_ptr->cr_save_p = 1;
14761       if (DEFAULT_ABI == ABI_V4)
14762         info_ptr->cr_size = reg_size;
14763     }
14764
14765   /* If the current function calls __builtin_eh_return, then we need
14766      to allocate stack space for registers that will hold data for
14767      the exception handler.  */
14768   if (crtl->calls_eh_return)
14769     {
14770       unsigned int i;
14771       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
14772         continue;
14773
14774       /* SPE saves EH registers in 64-bits.  */
14775       ehrd_size = i * (TARGET_SPE_ABI
14776                        && info_ptr->spe_64bit_regs_used != 0
14777                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
14778     }
14779   else
14780     ehrd_size = 0;
14781
14782   /* Determine various sizes.  */
14783   info_ptr->reg_size     = reg_size;
14784   info_ptr->fixed_size   = RS6000_SAVE_AREA;
14785   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
14786   info_ptr->parm_size    = RS6000_ALIGN (crtl->outgoing_args_size,
14787                                          TARGET_ALTIVEC ? 16 : 8);
14788   if (FRAME_GROWS_DOWNWARD)
14789     info_ptr->vars_size
14790       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
14791                        + info_ptr->parm_size,
14792                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
14793          - (info_ptr->fixed_size + info_ptr->vars_size
14794             + info_ptr->parm_size);
14795
14796   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
14797     info_ptr->spe_gp_size = 8 * (32 - first_gp);
14798   else
14799     info_ptr->spe_gp_size = 0;
14800
14801   if (TARGET_ALTIVEC_ABI)
14802     info_ptr->vrsave_mask = compute_vrsave_mask ();
14803   else
14804     info_ptr->vrsave_mask = 0;
14805
14806   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
14807     info_ptr->vrsave_size  = 4;
14808   else
14809     info_ptr->vrsave_size  = 0;
14810
14811   compute_save_world_info (info_ptr);
14812
14813   /* Calculate the offsets.  */
14814   switch (DEFAULT_ABI)
14815     {
14816     case ABI_NONE:
14817     default:
14818       gcc_unreachable ();
14819
14820     case ABI_AIX:
14821     case ABI_DARWIN:
14822       info_ptr->fp_save_offset   = - info_ptr->fp_size;
14823       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
14824
14825       if (TARGET_ALTIVEC_ABI)
14826         {
14827           info_ptr->vrsave_save_offset
14828             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
14829
14830           /* Align stack so vector save area is on a quadword boundary.
14831              The padding goes above the vectors.  */
14832           if (info_ptr->altivec_size != 0)
14833             info_ptr->altivec_padding_size
14834               = info_ptr->vrsave_save_offset & 0xF;
14835           else
14836             info_ptr->altivec_padding_size = 0;
14837
14838           info_ptr->altivec_save_offset
14839             = info_ptr->vrsave_save_offset
14840             - info_ptr->altivec_padding_size
14841             - info_ptr->altivec_size;
14842           gcc_assert (info_ptr->altivec_size == 0
14843                       || info_ptr->altivec_save_offset % 16 == 0);
14844
14845           /* Adjust for AltiVec case.  */
14846           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
14847         }
14848       else
14849         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
14850       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
14851       info_ptr->lr_save_offset   = 2*reg_size;
14852       break;
14853
14854     case ABI_V4:
14855       info_ptr->fp_save_offset   = - info_ptr->fp_size;
14856       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
14857       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
14858
14859       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
14860         {
14861           /* Align stack so SPE GPR save area is aligned on a
14862              double-word boundary.  */
14863           if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
14864             info_ptr->spe_padding_size
14865               = 8 - (-info_ptr->cr_save_offset % 8);
14866           else
14867             info_ptr->spe_padding_size = 0;
14868
14869           info_ptr->spe_gp_save_offset
14870             = info_ptr->cr_save_offset
14871             - info_ptr->spe_padding_size
14872             - info_ptr->spe_gp_size;
14873
14874           /* Adjust for SPE case.  */
14875           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
14876         }
14877       else if (TARGET_ALTIVEC_ABI)
14878         {
14879           info_ptr->vrsave_save_offset
14880             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
14881
14882           /* Align stack so vector save area is on a quadword boundary.  */
14883           if (info_ptr->altivec_size != 0)
14884             info_ptr->altivec_padding_size
14885               = 16 - (-info_ptr->vrsave_save_offset % 16);
14886           else
14887             info_ptr->altivec_padding_size = 0;
14888
14889           info_ptr->altivec_save_offset
14890             = info_ptr->vrsave_save_offset
14891             - info_ptr->altivec_padding_size
14892             - info_ptr->altivec_size;
14893
14894           /* Adjust for AltiVec case.  */
14895           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
14896         }
14897       else
14898         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
14899       info_ptr->ehrd_offset      -= ehrd_size;
14900       info_ptr->lr_save_offset   = reg_size;
14901       break;
14902     }
14903
14904   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
14905   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
14906                                          + info_ptr->gp_size
14907                                          + info_ptr->altivec_size
14908                                          + info_ptr->altivec_padding_size
14909                                          + info_ptr->spe_gp_size
14910                                          + info_ptr->spe_padding_size
14911                                          + ehrd_size
14912                                          + info_ptr->cr_size
14913                                          + info_ptr->vrsave_size,
14914                                          save_align);
14915
14916   non_fixed_size         = (info_ptr->vars_size
14917                             + info_ptr->parm_size
14918                             + info_ptr->save_size);
14919
14920   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
14921                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
14922
14923   /* Determine if we need to allocate any stack frame:
14924
14925      For AIX we need to push the stack if a frame pointer is needed
14926      (because the stack might be dynamically adjusted), if we are
14927      debugging, if we make calls, or if the sum of fp_save, gp_save,
14928      and local variables are more than the space needed to save all
14929      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
14930      + 18*8 = 288 (GPR13 reserved).
14931
14932      For V.4 we don't have the stack cushion that AIX uses, but assume
14933      that the debugger can handle stackless frames.  */
14934
14935   if (info_ptr->calls_p)
14936     info_ptr->push_p = 1;
14937
14938   else if (DEFAULT_ABI == ABI_V4)
14939     info_ptr->push_p = non_fixed_size != 0;
14940
14941   else if (frame_pointer_needed)
14942     info_ptr->push_p = 1;
14943
14944   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
14945     info_ptr->push_p = 1;
14946
14947   else
14948     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
14949
14950   /* Zero offsets if we're not saving those registers.  */
14951   if (info_ptr->fp_size == 0)
14952     info_ptr->fp_save_offset = 0;
14953
14954   if (info_ptr->gp_size == 0)
14955     info_ptr->gp_save_offset = 0;
14956
14957   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
14958     info_ptr->altivec_save_offset = 0;
14959
14960   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
14961     info_ptr->vrsave_save_offset = 0;
14962
14963   if (! TARGET_SPE_ABI
14964       || info_ptr->spe_64bit_regs_used == 0
14965       || info_ptr->spe_gp_size == 0)
14966     info_ptr->spe_gp_save_offset = 0;
14967
14968   if (! info_ptr->lr_save_p)
14969     info_ptr->lr_save_offset = 0;
14970
14971   if (! info_ptr->cr_save_p)
14972     info_ptr->cr_save_offset = 0;
14973
14974   return info_ptr;
14975 }
14976
14977 /* Return true if the current function uses any GPRs in 64-bit SIMD
14978    mode.  */
14979
14980 static bool
14981 spe_func_has_64bit_regs_p (void)
14982 {
14983   rtx insns, insn;
14984
14985   /* Functions that save and restore all the call-saved registers will
14986      need to save/restore the registers in 64-bits.  */
14987   if (crtl->calls_eh_return
14988       || cfun->calls_setjmp
14989       || crtl->has_nonlocal_goto)
14990     return true;
14991
14992   insns = get_insns ();
14993
14994   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
14995     {
14996       if (INSN_P (insn))
14997         {
14998           rtx i;
14999
15000           /* FIXME: This should be implemented with attributes...
15001
15002                  (set_attr "spe64" "true")....then,
15003                  if (get_spe64(insn)) return true;
15004
15005              It's the only reliable way to do the stuff below.  */
15006
15007           i = PATTERN (insn);
15008           if (GET_CODE (i) == SET)
15009             {
15010               enum machine_mode mode = GET_MODE (SET_SRC (i));
15011
15012               if (SPE_VECTOR_MODE (mode))
15013                 return true;
15014               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
15015                 return true;
15016             }
15017         }
15018     }
15019
15020   return false;
15021 }
15022
15023 static void
15024 debug_stack_info (rs6000_stack_t *info)
15025 {
15026   const char *abi_string;
15027
15028   if (! info)
15029     info = rs6000_stack_info ();
15030
15031   fprintf (stderr, "\nStack information for function %s:\n",
15032            ((current_function_decl && DECL_NAME (current_function_decl))
15033             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
15034             : "<unknown>"));
15035
15036   switch (info->abi)
15037     {
15038     default:             abi_string = "Unknown";        break;
15039     case ABI_NONE:       abi_string = "NONE";           break;
15040     case ABI_AIX:        abi_string = "AIX";            break;
15041     case ABI_DARWIN:     abi_string = "Darwin";         break;
15042     case ABI_V4:         abi_string = "V.4";            break;
15043     }
15044
15045   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
15046
15047   if (TARGET_ALTIVEC_ABI)
15048     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
15049
15050   if (TARGET_SPE_ABI)
15051     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
15052
15053   if (info->first_gp_reg_save != 32)
15054     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
15055
15056   if (info->first_fp_reg_save != 64)
15057     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
15058
15059   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
15060     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
15061              info->first_altivec_reg_save);
15062
15063   if (info->lr_save_p)
15064     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
15065
15066   if (info->cr_save_p)
15067     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
15068
15069   if (info->vrsave_mask)
15070     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
15071
15072   if (info->push_p)
15073     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
15074
15075   if (info->calls_p)
15076     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
15077
15078   if (info->gp_save_offset)
15079     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
15080
15081   if (info->fp_save_offset)
15082     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
15083
15084   if (info->altivec_save_offset)
15085     fprintf (stderr, "\taltivec_save_offset = %5d\n",
15086              info->altivec_save_offset);
15087
15088   if (info->spe_gp_save_offset)
15089     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
15090              info->spe_gp_save_offset);
15091
15092   if (info->vrsave_save_offset)
15093     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
15094              info->vrsave_save_offset);
15095
15096   if (info->lr_save_offset)
15097     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
15098
15099   if (info->cr_save_offset)
15100     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
15101
15102   if (info->varargs_save_offset)
15103     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
15104
15105   if (info->total_size)
15106     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
15107              info->total_size);
15108
15109   if (info->vars_size)
15110     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
15111              info->vars_size);
15112
15113   if (info->parm_size)
15114     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
15115
15116   if (info->fixed_size)
15117     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
15118
15119   if (info->gp_size)
15120     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
15121
15122   if (info->spe_gp_size)
15123     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
15124
15125   if (info->fp_size)
15126     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
15127
15128   if (info->altivec_size)
15129     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
15130
15131   if (info->vrsave_size)
15132     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
15133
15134   if (info->altivec_padding_size)
15135     fprintf (stderr, "\taltivec_padding_size= %5d\n",
15136              info->altivec_padding_size);
15137
15138   if (info->spe_padding_size)
15139     fprintf (stderr, "\tspe_padding_size    = %5d\n",
15140              info->spe_padding_size);
15141
15142   if (info->cr_size)
15143     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
15144
15145   if (info->save_size)
15146     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
15147
15148   if (info->reg_size != 4)
15149     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
15150
15151   fprintf (stderr, "\n");
15152 }
15153
15154 rtx
15155 rs6000_return_addr (int count, rtx frame)
15156 {
15157   /* Currently we don't optimize very well between prolog and body
15158      code and for PIC code the code can be actually quite bad, so
15159      don't try to be too clever here.  */
15160   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
15161     {
15162       cfun->machine->ra_needs_full_frame = 1;
15163
15164       return
15165         gen_rtx_MEM
15166           (Pmode,
15167            memory_address
15168            (Pmode,
15169             plus_constant (copy_to_reg
15170                            (gen_rtx_MEM (Pmode,
15171                                          memory_address (Pmode, frame))),
15172                            RETURN_ADDRESS_OFFSET)));
15173     }
15174
15175   cfun->machine->ra_need_lr = 1;
15176   return get_hard_reg_initial_val (Pmode, LR_REGNO);
15177 }
15178
15179 /* Say whether a function is a candidate for sibcall handling or not.
15180    We do not allow indirect calls to be optimized into sibling calls.
15181    Also, we can't do it if there are any vector parameters; there's
15182    nowhere to put the VRsave code so it works; note that functions with
15183    vector parameters are required to have a prototype, so the argument
15184    type info must be available here.  (The tail recursion case can work
15185    with vector parameters, but there's no way to distinguish here.) */
15186 static bool
15187 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
15188 {
15189   tree type;
15190   if (decl)
15191     {
15192       if (TARGET_ALTIVEC_VRSAVE)
15193         {
15194           for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
15195                type; type = TREE_CHAIN (type))
15196             {
15197               if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
15198                 return false;
15199             }
15200         }
15201       if (DEFAULT_ABI == ABI_DARWIN
15202           || ((*targetm.binds_local_p) (decl)
15203               && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
15204         {
15205           tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
15206
15207           if (!lookup_attribute ("longcall", attr_list)
15208               || lookup_attribute ("shortcall", attr_list))
15209             return true;
15210         }
15211     }
15212   return false;
15213 }
15214
15215 /* NULL if INSN insn is valid within a low-overhead loop.
15216    Otherwise return why doloop cannot be applied.
15217    PowerPC uses the COUNT register for branch on table instructions.  */
15218
15219 static const char *
15220 rs6000_invalid_within_doloop (const_rtx insn)
15221 {
15222   if (CALL_P (insn))
15223     return "Function call in the loop.";
15224
15225   if (JUMP_P (insn)
15226       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
15227           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
15228     return "Computed branch in the loop.";
15229
15230   return NULL;
15231 }
15232
15233 static int
15234 rs6000_ra_ever_killed (void)
15235 {
15236   rtx top;
15237   rtx reg;
15238   rtx insn;
15239
15240   if (cfun->is_thunk)
15241     return 0;
15242
15243   /* regs_ever_live has LR marked as used if any sibcalls are present,
15244      but this should not force saving and restoring in the
15245      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
15246      clobbers LR, so that is inappropriate.  */
15247
15248   /* Also, the prologue can generate a store into LR that
15249      doesn't really count, like this:
15250
15251         move LR->R0
15252         bcl to set PIC register
15253         move LR->R31
15254         move R0->LR
15255
15256      When we're called from the epilogue, we need to avoid counting
15257      this as a store.  */
15258
15259   push_topmost_sequence ();
15260   top = get_insns ();
15261   pop_topmost_sequence ();
15262   reg = gen_rtx_REG (Pmode, LR_REGNO);
15263
15264   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
15265     {
15266       if (INSN_P (insn))
15267         {
15268           if (CALL_P (insn))
15269             {
15270               if (!SIBLING_CALL_P (insn))
15271                 return 1;
15272             }
15273           else if (find_regno_note (insn, REG_INC, LR_REGNO))
15274             return 1;
15275           else if (set_of (reg, insn) != NULL_RTX
15276                    && !prologue_epilogue_contains (insn))
15277             return 1;
15278         }
15279     }
15280   return 0;
15281 }
15282 \f
15283 /* Emit instructions needed to load the TOC register.
15284    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
15285    a constant pool; or for SVR4 -fpic.  */
15286
15287 void
15288 rs6000_emit_load_toc_table (int fromprolog)
15289 {
15290   rtx dest;
15291   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
15292
15293   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
15294     {
15295       char buf[30];
15296       rtx lab, tmp1, tmp2, got;
15297
15298       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
15299       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15300       if (flag_pic == 2)
15301         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
15302       else
15303         got = rs6000_got_sym ();
15304       tmp1 = tmp2 = dest;
15305       if (!fromprolog)
15306         {
15307           tmp1 = gen_reg_rtx (Pmode);
15308           tmp2 = gen_reg_rtx (Pmode);
15309         }
15310       emit_insn (gen_load_toc_v4_PIC_1 (lab));
15311       emit_move_insn (tmp1,
15312                              gen_rtx_REG (Pmode, LR_REGNO));
15313       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
15314       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
15315     }
15316   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
15317     {
15318       emit_insn (gen_load_toc_v4_pic_si ());
15319       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
15320     }
15321   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
15322     {
15323       char buf[30];
15324       rtx temp0 = (fromprolog
15325                    ? gen_rtx_REG (Pmode, 0)
15326                    : gen_reg_rtx (Pmode));
15327
15328       if (fromprolog)
15329         {
15330           rtx symF, symL;
15331
15332           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
15333           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15334
15335           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
15336           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15337
15338           emit_insn (gen_load_toc_v4_PIC_1 (symF));
15339           emit_move_insn (dest,
15340                           gen_rtx_REG (Pmode, LR_REGNO));
15341           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
15342         }
15343       else
15344         {
15345           rtx tocsym;
15346
15347           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
15348           emit_insn (gen_load_toc_v4_PIC_1b (tocsym));
15349           emit_move_insn (dest,
15350                           gen_rtx_REG (Pmode, LR_REGNO));
15351           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
15352         }
15353       emit_insn (gen_addsi3 (dest, temp0, dest));
15354     }
15355   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
15356     {
15357       /* This is for AIX code running in non-PIC ELF32.  */
15358       char buf[30];
15359       rtx realsym;
15360       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
15361       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
15362
15363       emit_insn (gen_elf_high (dest, realsym));
15364       emit_insn (gen_elf_low (dest, dest, realsym));
15365     }
15366   else
15367     {
15368       gcc_assert (DEFAULT_ABI == ABI_AIX);
15369
15370       if (TARGET_32BIT)
15371         emit_insn (gen_load_toc_aix_si (dest));
15372       else
15373         emit_insn (gen_load_toc_aix_di (dest));
15374     }
15375 }
15376
15377 /* Emit instructions to restore the link register after determining where
15378    its value has been stored.  */
15379
15380 void
15381 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
15382 {
15383   rs6000_stack_t *info = rs6000_stack_info ();
15384   rtx operands[2];
15385
15386   operands[0] = source;
15387   operands[1] = scratch;
15388
15389   if (info->lr_save_p)
15390     {
15391       rtx frame_rtx = stack_pointer_rtx;
15392       HOST_WIDE_INT sp_offset = 0;
15393       rtx tmp;
15394
15395       if (frame_pointer_needed
15396           || cfun->calls_alloca
15397           || info->total_size > 32767)
15398         {
15399           tmp = gen_frame_mem (Pmode, frame_rtx);
15400           emit_move_insn (operands[1], tmp);
15401           frame_rtx = operands[1];
15402         }
15403       else if (info->push_p)
15404         sp_offset = info->total_size;
15405
15406       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
15407       tmp = gen_frame_mem (Pmode, tmp);
15408       emit_move_insn (tmp, operands[0]);
15409     }
15410   else
15411     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
15412 }
15413
15414 static GTY(()) alias_set_type set = -1;
15415
15416 alias_set_type
15417 get_TOC_alias_set (void)
15418 {
15419   if (set == -1)
15420     set = new_alias_set ();
15421   return set;
15422 }
15423
15424 /* This returns nonzero if the current function uses the TOC.  This is
15425    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
15426    is generated by the ABI_V4 load_toc_* patterns.  */
15427 #if TARGET_ELF
15428 static int
15429 uses_TOC (void)
15430 {
15431   rtx insn;
15432
15433   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
15434     if (INSN_P (insn))
15435       {
15436         rtx pat = PATTERN (insn);
15437         int i;
15438
15439         if (GET_CODE (pat) == PARALLEL)
15440           for (i = 0; i < XVECLEN (pat, 0); i++)
15441             {
15442               rtx sub = XVECEXP (pat, 0, i);
15443               if (GET_CODE (sub) == USE)
15444                 {
15445                   sub = XEXP (sub, 0);
15446                   if (GET_CODE (sub) == UNSPEC
15447                       && XINT (sub, 1) == UNSPEC_TOC)
15448                     return 1;
15449                 }
15450             }
15451       }
15452   return 0;
15453 }
15454 #endif
15455
15456 rtx
15457 create_TOC_reference (rtx symbol)
15458 {
15459   if (!can_create_pseudo_p ())
15460     df_set_regs_ever_live (TOC_REGISTER, true);
15461   return gen_rtx_PLUS (Pmode,
15462            gen_rtx_REG (Pmode, TOC_REGISTER),
15463              gen_rtx_CONST (Pmode,
15464                gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_TOCREL)));
15465 }
15466
15467 /* If _Unwind_* has been called from within the same module,
15468    toc register is not guaranteed to be saved to 40(1) on function
15469    entry.  Save it there in that case.  */
15470
15471 void
15472 rs6000_aix_emit_builtin_unwind_init (void)
15473 {
15474   rtx mem;
15475   rtx stack_top = gen_reg_rtx (Pmode);
15476   rtx opcode_addr = gen_reg_rtx (Pmode);
15477   rtx opcode = gen_reg_rtx (SImode);
15478   rtx tocompare = gen_reg_rtx (SImode);
15479   rtx no_toc_save_needed = gen_label_rtx ();
15480
15481   mem = gen_frame_mem (Pmode, hard_frame_pointer_rtx);
15482   emit_move_insn (stack_top, mem);
15483
15484   mem = gen_frame_mem (Pmode,
15485                        gen_rtx_PLUS (Pmode, stack_top,
15486                                      GEN_INT (2 * GET_MODE_SIZE (Pmode))));
15487   emit_move_insn (opcode_addr, mem);
15488   emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
15489   emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
15490                                            : 0xE8410028, SImode));
15491
15492   do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
15493                            SImode, NULL_RTX, NULL_RTX,
15494                            no_toc_save_needed);
15495
15496   mem = gen_frame_mem (Pmode,
15497                        gen_rtx_PLUS (Pmode, stack_top,
15498                                      GEN_INT (5 * GET_MODE_SIZE (Pmode))));
15499   emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
15500   emit_label (no_toc_save_needed);
15501 }
15502 \f
15503 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
15504    and the change to the stack pointer.  */
15505
15506 static void
15507 rs6000_emit_stack_tie (void)
15508 {
15509   rtx mem = gen_frame_mem (BLKmode,
15510                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
15511
15512   emit_insn (gen_stack_tie (mem));
15513 }
15514
15515 /* Emit the correct code for allocating stack space, as insns.
15516    If COPY_R12, make sure a copy of the old frame is left in r12.
15517    If COPY_R11, make sure a copy of the old frame is left in r11,
15518    in preference to r12 if COPY_R12.
15519    The generated code may use hard register 0 as a temporary.  */
15520
15521 static void
15522 rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12, int copy_r11)
15523 {
15524   rtx insn;
15525   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
15526   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
15527   rtx todec = gen_int_mode (-size, Pmode);
15528   rtx par, set, mem;
15529
15530   if (INTVAL (todec) != -size)
15531     {
15532       warning (0, "stack frame too large");
15533       emit_insn (gen_trap ());
15534       return;
15535     }
15536
15537   if (crtl->limit_stack)
15538     {
15539       if (REG_P (stack_limit_rtx)
15540           && REGNO (stack_limit_rtx) > 1
15541           && REGNO (stack_limit_rtx) <= 31)
15542         {
15543           emit_insn (TARGET_32BIT
15544                      ? gen_addsi3 (tmp_reg,
15545                                    stack_limit_rtx,
15546                                    GEN_INT (size))
15547                      : gen_adddi3 (tmp_reg,
15548                                    stack_limit_rtx,
15549                                    GEN_INT (size)));
15550
15551           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
15552                                     const0_rtx));
15553         }
15554       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
15555                && TARGET_32BIT
15556                && DEFAULT_ABI == ABI_V4)
15557         {
15558           rtx toload = gen_rtx_CONST (VOIDmode,
15559                                       gen_rtx_PLUS (Pmode,
15560                                                     stack_limit_rtx,
15561                                                     GEN_INT (size)));
15562
15563           emit_insn (gen_elf_high (tmp_reg, toload));
15564           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
15565           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
15566                                     const0_rtx));
15567         }
15568       else
15569         warning (0, "stack limit expression is not supported");
15570     }
15571
15572   if (copy_r12 || copy_r11)
15573     emit_move_insn (copy_r11
15574                     ? gen_rtx_REG (Pmode, 11)
15575                     : gen_rtx_REG (Pmode, 12),
15576                     stack_reg);
15577
15578   if (size > 32767)
15579     {
15580       /* Need a note here so that try_split doesn't get confused.  */
15581       if (get_last_insn () == NULL_RTX)
15582         emit_note (NOTE_INSN_DELETED);
15583       insn = emit_move_insn (tmp_reg, todec);
15584       try_split (PATTERN (insn), insn, 0);
15585       todec = tmp_reg;
15586     }
15587   
15588   insn = emit_insn (TARGET_32BIT
15589                     ? gen_movsi_update_stack (stack_reg, stack_reg,
15590                                         todec, stack_reg)
15591                     : gen_movdi_di_update_stack (stack_reg, stack_reg,
15592                                            todec, stack_reg));
15593   /* Since we didn't use gen_frame_mem to generate the MEM, grab
15594      it now and set the alias set/attributes. The above gen_*_update
15595      calls will generate a PARALLEL with the MEM set being the first
15596      operation. */
15597   par = PATTERN (insn);
15598   gcc_assert (GET_CODE (par) == PARALLEL);
15599   set = XVECEXP (par, 0, 0);
15600   gcc_assert (GET_CODE (set) == SET);
15601   mem = SET_DEST (set);
15602   gcc_assert (MEM_P (mem));
15603   MEM_NOTRAP_P (mem) = 1;
15604   set_mem_alias_set (mem, get_frame_alias_set ());
15605
15606   RTX_FRAME_RELATED_P (insn) = 1;
15607   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
15608                 gen_rtx_SET (VOIDmode, stack_reg,
15609                              gen_rtx_PLUS (Pmode, stack_reg,
15610                                            GEN_INT (-size))));
15611 }
15612
15613 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
15614    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
15615    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
15616    deduce these equivalences by itself so it wasn't necessary to hold
15617    its hand so much.  */
15618
15619 static void
15620 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
15621                       rtx reg2, rtx rreg)
15622 {
15623   rtx real, temp;
15624
15625   /* copy_rtx will not make unique copies of registers, so we need to
15626      ensure we don't have unwanted sharing here.  */
15627   if (reg == reg2)
15628     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
15629
15630   if (reg == rreg)
15631     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
15632
15633   real = copy_rtx (PATTERN (insn));
15634
15635   if (reg2 != NULL_RTX)
15636     real = replace_rtx (real, reg2, rreg);
15637
15638   real = replace_rtx (real, reg,
15639                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
15640                                                         STACK_POINTER_REGNUM),
15641                                     GEN_INT (val)));
15642
15643   /* We expect that 'real' is either a SET or a PARALLEL containing
15644      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
15645      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
15646
15647   if (GET_CODE (real) == SET)
15648     {
15649       rtx set = real;
15650
15651       temp = simplify_rtx (SET_SRC (set));
15652       if (temp)
15653         SET_SRC (set) = temp;
15654       temp = simplify_rtx (SET_DEST (set));
15655       if (temp)
15656         SET_DEST (set) = temp;
15657       if (GET_CODE (SET_DEST (set)) == MEM)
15658         {
15659           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
15660           if (temp)
15661             XEXP (SET_DEST (set), 0) = temp;
15662         }
15663     }
15664   else
15665     {
15666       int i;
15667
15668       gcc_assert (GET_CODE (real) == PARALLEL);
15669       for (i = 0; i < XVECLEN (real, 0); i++)
15670         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
15671           {
15672             rtx set = XVECEXP (real, 0, i);
15673
15674             temp = simplify_rtx (SET_SRC (set));
15675             if (temp)
15676               SET_SRC (set) = temp;
15677             temp = simplify_rtx (SET_DEST (set));
15678             if (temp)
15679               SET_DEST (set) = temp;
15680             if (GET_CODE (SET_DEST (set)) == MEM)
15681               {
15682                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
15683                 if (temp)
15684                   XEXP (SET_DEST (set), 0) = temp;
15685               }
15686             RTX_FRAME_RELATED_P (set) = 1;
15687           }
15688     }
15689
15690   RTX_FRAME_RELATED_P (insn) = 1;
15691   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
15692 }
15693
15694 /* Returns an insn that has a vrsave set operation with the
15695    appropriate CLOBBERs.  */
15696
15697 static rtx
15698 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
15699 {
15700   int nclobs, i;
15701   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
15702   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
15703
15704   clobs[0]
15705     = gen_rtx_SET (VOIDmode,
15706                    vrsave,
15707                    gen_rtx_UNSPEC_VOLATILE (SImode,
15708                                             gen_rtvec (2, reg, vrsave),
15709                                             UNSPECV_SET_VRSAVE));
15710
15711   nclobs = 1;
15712
15713   /* We need to clobber the registers in the mask so the scheduler
15714      does not move sets to VRSAVE before sets of AltiVec registers.
15715
15716      However, if the function receives nonlocal gotos, reload will set
15717      all call saved registers live.  We will end up with:
15718
15719         (set (reg 999) (mem))
15720         (parallel [ (set (reg vrsave) (unspec blah))
15721                     (clobber (reg 999))])
15722
15723      The clobber will cause the store into reg 999 to be dead, and
15724      flow will attempt to delete an epilogue insn.  In this case, we
15725      need an unspec use/set of the register.  */
15726
15727   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
15728     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
15729       {
15730         if (!epiloguep || call_used_regs [i])
15731           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
15732                                              gen_rtx_REG (V4SImode, i));
15733         else
15734           {
15735             rtx reg = gen_rtx_REG (V4SImode, i);
15736
15737             clobs[nclobs++]
15738               = gen_rtx_SET (VOIDmode,
15739                              reg,
15740                              gen_rtx_UNSPEC (V4SImode,
15741                                              gen_rtvec (1, reg), 27));
15742           }
15743       }
15744
15745   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
15746
15747   for (i = 0; i < nclobs; ++i)
15748     XVECEXP (insn, 0, i) = clobs[i];
15749
15750   return insn;
15751 }
15752
15753 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
15754    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
15755
15756 static void
15757 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
15758                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
15759 {
15760   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
15761   rtx replacea, replaceb;
15762
15763   int_rtx = GEN_INT (offset);
15764
15765   /* Some cases that need register indexed addressing.  */
15766   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
15767       || (TARGET_E500_DOUBLE && mode == DFmode)
15768       || (TARGET_SPE_ABI
15769           && SPE_VECTOR_MODE (mode)
15770           && !SPE_CONST_OFFSET_OK (offset)))
15771     {
15772       /* Whomever calls us must make sure r11 is available in the
15773          flow path of instructions in the prologue.  */
15774       offset_rtx = gen_rtx_REG (Pmode, 11);
15775       emit_move_insn (offset_rtx, int_rtx);
15776
15777       replacea = offset_rtx;
15778       replaceb = int_rtx;
15779     }
15780   else
15781     {
15782       offset_rtx = int_rtx;
15783       replacea = NULL_RTX;
15784       replaceb = NULL_RTX;
15785     }
15786
15787   reg = gen_rtx_REG (mode, regno);
15788   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
15789   mem = gen_frame_mem (mode, addr);
15790
15791   insn = emit_move_insn (mem, reg);
15792
15793   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
15794 }
15795
15796 /* Emit an offset memory reference suitable for a frame store, while
15797    converting to a valid addressing mode.  */
15798
15799 static rtx
15800 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
15801 {
15802   rtx int_rtx, offset_rtx;
15803
15804   int_rtx = GEN_INT (offset);
15805
15806   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
15807       || (TARGET_E500_DOUBLE && mode == DFmode))
15808     {
15809       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
15810       emit_move_insn (offset_rtx, int_rtx);
15811     }
15812   else
15813     offset_rtx = int_rtx;
15814
15815   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
15816 }
15817
15818 /* Look for user-defined global regs.  We should not save and restore these,
15819    and cannot use stmw/lmw if there are any in its range.  */
15820
15821 static bool
15822 no_global_regs_above (int first, bool gpr)
15823 {
15824   int i;
15825   for (i = first; i < gpr ? 32 : 64 ; i++)
15826     if (global_regs[i])
15827       return false;
15828   return true;
15829 }
15830
15831 #ifndef TARGET_FIX_AND_CONTINUE
15832 #define TARGET_FIX_AND_CONTINUE 0
15833 #endif
15834
15835 /* It's really GPR 13 and FPR 14, but we need the smaller of the two.  */
15836 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
15837 #define LAST_SAVRES_REGISTER 31
15838 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
15839
15840 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
15841
15842 /* Return the symbol for an out-of-line register save/restore routine.
15843    We are saving/restoring GPRs if GPR is true.  */
15844
15845 static rtx
15846 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep, bool gpr, bool exitp)
15847 {
15848   int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
15849   rtx sym;
15850   int select = ((savep ? 1 : 0) << 2
15851                 | (gpr
15852                    /* On the SPE, we never have any FPRs, but we do have
15853                       32/64-bit versions of the routines.  */
15854                    ? (TARGET_SPE_ABI && info->spe_64bit_regs_used ? 1 : 0)
15855                    : 0) << 1
15856                 | (exitp ? 1: 0));
15857
15858   /* Don't generate bogus routine names.  */
15859   gcc_assert (FIRST_SAVRES_REGISTER <= regno && regno <= LAST_SAVRES_REGISTER);
15860
15861   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
15862
15863   if (sym == NULL)
15864     {
15865       char name[30];
15866       const char *action;
15867       const char *regkind;
15868       const char *exit_suffix;
15869
15870       action = savep ? "save" : "rest";
15871
15872       /* SPE has slightly different names for its routines depending on
15873          whether we are saving 32-bit or 64-bit registers.  */
15874       if (TARGET_SPE_ABI)
15875         {
15876           /* No floating point saves on the SPE.  */
15877           gcc_assert (gpr);
15878
15879           regkind = info->spe_64bit_regs_used ? "64gpr" : "32gpr";
15880         }
15881       else
15882         regkind = gpr ? "gpr" : "fpr";
15883
15884       exit_suffix = exitp ? "_x" : "";
15885
15886       sprintf (name, "_%s%s_%d%s", action, regkind, regno, exit_suffix);
15887
15888       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
15889         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
15890     }
15891
15892   return sym;
15893 }
15894
15895 /* Emit a sequence of insns, including a stack tie if needed, for
15896    resetting the stack pointer.  If SAVRES is true, then don't reset the
15897    stack pointer, but move the base of the frame into r11 for use by
15898    out-of-line register restore routines.  */
15899
15900 static void
15901 rs6000_emit_stack_reset (rs6000_stack_t *info,
15902                          rtx sp_reg_rtx, rtx frame_reg_rtx,
15903                          int sp_offset, bool savres)
15904 {
15905   /* This blockage is needed so that sched doesn't decide to move
15906      the sp change before the register restores.  */
15907   if (frame_reg_rtx != sp_reg_rtx
15908       || (TARGET_SPE_ABI
15909           && info->spe_64bit_regs_used != 0
15910           && info->first_gp_reg_save != 32))
15911     rs6000_emit_stack_tie ();
15912   
15913   if (frame_reg_rtx != sp_reg_rtx)
15914     {
15915       if (sp_offset != 0)
15916         emit_insn (gen_addsi3 (sp_reg_rtx, frame_reg_rtx,
15917                                GEN_INT (sp_offset)));
15918       else if (!savres)
15919         emit_move_insn (sp_reg_rtx, frame_reg_rtx);
15920     }
15921   else if (sp_offset != 0)
15922     {
15923       /* If we are restoring registers out-of-line, we will be using the
15924          "exit" variants of the restore routines, which will reset the
15925          stack for us.  But we do need to point r11 into the right place
15926          for those routines.  */
15927       rtx dest_reg = (savres
15928                       ? gen_rtx_REG (Pmode, 11)
15929                       : sp_reg_rtx);
15930
15931       emit_insn (TARGET_32BIT
15932                  ? gen_addsi3 (dest_reg, sp_reg_rtx,
15933                                GEN_INT (sp_offset))
15934                  : gen_adddi3 (dest_reg, sp_reg_rtx,
15935                                GEN_INT (sp_offset)));
15936     }
15937 }
15938
15939 /* Construct a parallel rtx describing the effect of a call to an
15940    out-of-line register save/restore routine.  */
15941
15942 static rtx
15943 rs6000_make_savres_rtx (rs6000_stack_t *info,
15944                         rtx frame_reg_rtx, int save_area_offset,
15945                         enum machine_mode reg_mode,
15946                         bool savep, bool gpr, bool exitp)
15947 {
15948   int i;
15949   int offset, start_reg, end_reg, n_regs;
15950   int reg_size = GET_MODE_SIZE (reg_mode);
15951   rtx sym;
15952   rtvec p;
15953
15954   offset = 0;
15955   start_reg = (gpr
15956                ? info->first_gp_reg_save
15957                : info->first_fp_reg_save);
15958   end_reg = gpr ? 32 : 64;
15959   n_regs = end_reg - start_reg;
15960   p = rtvec_alloc ((exitp ? 4 : 3) + n_regs);
15961
15962   /* If we're saving registers, then we should never say we're exiting.  */
15963   gcc_assert ((savep && !exitp) || !savep);
15964
15965   if (exitp)
15966     RTVEC_ELT (p, offset++) = gen_rtx_RETURN (VOIDmode);
15967
15968   RTVEC_ELT (p, offset++)
15969     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
15970
15971   sym = rs6000_savres_routine_sym (info, savep, gpr, exitp);
15972   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
15973   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 11));
15974
15975   for (i = 0; i < end_reg - start_reg; i++)
15976     {
15977       rtx addr, reg, mem;
15978       reg = gen_rtx_REG (reg_mode, start_reg + i);
15979       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
15980                            GEN_INT (save_area_offset + reg_size*i));
15981       mem = gen_frame_mem (reg_mode, addr);
15982
15983       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
15984                                                savep ? mem : reg,
15985                                                savep ? reg : mem);
15986     }
15987
15988   return gen_rtx_PARALLEL (VOIDmode, p);
15989 }
15990
15991 /* Determine whether the gp REG is really used.  */
15992
15993 static bool
15994 rs6000_reg_live_or_pic_offset_p (int reg)
15995 {
15996   return ((df_regs_ever_live_p (reg)
15997            && (!call_used_regs[reg]
15998                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
15999                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
16000           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
16001               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
16002                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
16003 }
16004
16005 enum {
16006   SAVRES_MULTIPLE = 0x1,
16007   SAVRES_INLINE_FPRS = 0x2,
16008   SAVRES_INLINE_GPRS = 0x4
16009 };
16010
16011 /* Determine the strategy for savings/restoring registers.  */
16012
16013 static int
16014 rs6000_savres_strategy (rs6000_stack_t *info, bool savep,
16015                         int using_static_chain_p, int sibcall)
16016 {
16017   bool using_multiple_p;
16018   bool common;
16019   bool savres_fprs_inline;
16020   bool savres_gprs_inline;
16021   bool noclobber_global_gprs
16022     = no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true);
16023
16024   using_multiple_p = (TARGET_MULTIPLE && ! TARGET_POWERPC64
16025                       && (!TARGET_SPE_ABI
16026                           || info->spe_64bit_regs_used == 0)
16027                       && info->first_gp_reg_save < 31
16028                       && noclobber_global_gprs);
16029   /* Don't bother to try to save things out-of-line if r11 is occupied
16030      by the static chain.  It would require too much fiddling and the
16031      static chain is rarely used anyway.  */
16032   common = (using_static_chain_p
16033             || sibcall
16034             || crtl->calls_eh_return
16035             || !info->lr_save_p
16036             || cfun->machine->ra_need_lr
16037             || info->total_size > 32767);
16038   savres_fprs_inline = (common
16039                         || info->first_fp_reg_save == 64
16040                         || !no_global_regs_above (info->first_fp_reg_save,
16041                                                   /*gpr=*/false)
16042                         || FP_SAVE_INLINE (info->first_fp_reg_save));
16043   savres_gprs_inline = (common
16044                         /* Saving CR interferes with the exit routines
16045                            used on the SPE, so just punt here.  */
16046                         || (!savep
16047                             && TARGET_SPE_ABI
16048                             && info->spe_64bit_regs_used != 0
16049                             && info->cr_save_p != 0)
16050                         || info->first_gp_reg_save == 32
16051                         || !noclobber_global_gprs
16052                         || GP_SAVE_INLINE (info->first_gp_reg_save));
16053
16054   if (savep)
16055     /* If we are going to use store multiple, then don't even bother
16056      with the out-of-line routines, since the store-multiple instruction
16057      will always be smaller.  */
16058     savres_gprs_inline = savres_gprs_inline || using_multiple_p;
16059   else
16060     {
16061       /* The situation is more complicated with load multiple.  We'd
16062          prefer to use the out-of-line routines for restores, since the
16063          "exit" out-of-line routines can handle the restore of LR and
16064          the frame teardown.  But we can only use the out-of-line
16065          routines if we know that we've used store multiple or
16066          out-of-line routines in the prologue, i.e. if we've saved all
16067          the registers from first_gp_reg_save.  Otherwise, we risk
16068          loading garbage from the stack.  Furthermore, we can only use
16069          the "exit" out-of-line gpr restore if we haven't saved any
16070          fprs.  */
16071       bool saved_all = !savres_gprs_inline || using_multiple_p;
16072
16073       if (saved_all && info->first_fp_reg_save != 64)
16074         /* We can't use the exit routine; use load multiple if it's
16075            available.  */
16076         savres_gprs_inline = savres_gprs_inline || using_multiple_p;
16077     }
16078
16079   return (using_multiple_p
16080           | (savres_fprs_inline << 1)
16081           | (savres_gprs_inline << 2));
16082 }
16083
16084 /* Emit function prologue as insns.  */
16085
16086 void
16087 rs6000_emit_prologue (void)
16088 {
16089   rs6000_stack_t *info = rs6000_stack_info ();
16090   enum machine_mode reg_mode = Pmode;
16091   int reg_size = TARGET_32BIT ? 4 : 8;
16092   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
16093   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
16094   rtx frame_reg_rtx = sp_reg_rtx;
16095   rtx cr_save_rtx = NULL_RTX;
16096   rtx insn;
16097   int strategy;
16098   int saving_FPRs_inline;
16099   int saving_GPRs_inline;
16100   int using_store_multiple;
16101   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
16102                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
16103                               && !call_used_regs[STATIC_CHAIN_REGNUM]);
16104   HOST_WIDE_INT sp_offset = 0;
16105
16106   if (TARGET_FIX_AND_CONTINUE)
16107     {
16108       /* gdb on darwin arranges to forward a function from the old
16109          address by modifying the first 5 instructions of the function
16110          to branch to the overriding function.  This is necessary to
16111          permit function pointers that point to the old function to
16112          actually forward to the new function.  */
16113       emit_insn (gen_nop ());
16114       emit_insn (gen_nop ());
16115       emit_insn (gen_nop ());
16116       emit_insn (gen_nop ());
16117       emit_insn (gen_nop ());
16118     }
16119
16120   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
16121     {
16122       reg_mode = V2SImode;
16123       reg_size = 8;
16124     }
16125
16126   strategy = rs6000_savres_strategy (info, /*savep=*/true,
16127                                      /*static_chain_p=*/using_static_chain_p,
16128                                      /*sibcall=*/0);
16129   using_store_multiple = strategy & SAVRES_MULTIPLE;
16130   saving_FPRs_inline = strategy & SAVRES_INLINE_FPRS;
16131   saving_GPRs_inline = strategy & SAVRES_INLINE_GPRS;
16132
16133   /* For V.4, update stack before we do any saving and set back pointer.  */
16134   if (! WORLD_SAVE_P (info)
16135       && info->push_p
16136       && (DEFAULT_ABI == ABI_V4
16137           || crtl->calls_eh_return))
16138     {
16139       bool need_r11 = (TARGET_SPE
16140                        ? (!saving_GPRs_inline
16141                           && info->spe_64bit_regs_used == 0)
16142                        : (!saving_FPRs_inline || !saving_GPRs_inline));
16143       if (info->total_size < 32767)
16144         sp_offset = info->total_size;
16145       else
16146         frame_reg_rtx = (need_r11
16147                          ? gen_rtx_REG (Pmode, 11)
16148                          : frame_ptr_rtx);
16149       rs6000_emit_allocate_stack (info->total_size,
16150                                   (frame_reg_rtx != sp_reg_rtx
16151                                    && (info->cr_save_p
16152                                        || info->lr_save_p
16153                                        || info->first_fp_reg_save < 64
16154                                        || info->first_gp_reg_save < 32
16155                                        )),
16156                                   need_r11);
16157       if (frame_reg_rtx != sp_reg_rtx)
16158         rs6000_emit_stack_tie ();
16159     }
16160
16161   /* Handle world saves specially here.  */
16162   if (WORLD_SAVE_P (info))
16163     {
16164       int i, j, sz;
16165       rtx treg;
16166       rtvec p;
16167       rtx reg0;
16168
16169       /* save_world expects lr in r0. */
16170       reg0 = gen_rtx_REG (Pmode, 0);
16171       if (info->lr_save_p)
16172         {
16173           insn = emit_move_insn (reg0,
16174                                  gen_rtx_REG (Pmode, LR_REGNO));
16175           RTX_FRAME_RELATED_P (insn) = 1;
16176         }
16177
16178       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
16179          assumptions about the offsets of various bits of the stack
16180          frame.  */
16181       gcc_assert (info->gp_save_offset == -220
16182                   && info->fp_save_offset == -144
16183                   && info->lr_save_offset == 8
16184                   && info->cr_save_offset == 4
16185                   && info->push_p
16186                   && info->lr_save_p
16187                   && (!crtl->calls_eh_return
16188                        || info->ehrd_offset == -432)
16189                   && info->vrsave_save_offset == -224
16190                   && info->altivec_save_offset == -416);
16191
16192       treg = gen_rtx_REG (SImode, 11);
16193       emit_move_insn (treg, GEN_INT (-info->total_size));
16194
16195       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
16196          in R11.  It also clobbers R12, so beware!  */
16197
16198       /* Preserve CR2 for save_world prologues */
16199       sz = 5;
16200       sz += 32 - info->first_gp_reg_save;
16201       sz += 64 - info->first_fp_reg_save;
16202       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
16203       p = rtvec_alloc (sz);
16204       j = 0;
16205       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
16206                                             gen_rtx_REG (SImode,
16207                                                          LR_REGNO));
16208       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
16209                                         gen_rtx_SYMBOL_REF (Pmode,
16210                                                             "*save_world"));
16211       /* We do floats first so that the instruction pattern matches
16212          properly.  */
16213       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
16214         {
16215           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
16216                                    ? DFmode : SFmode), 
16217                                  info->first_fp_reg_save + i);
16218           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16219                                    GEN_INT (info->fp_save_offset
16220                                             + sp_offset + 8 * i));
16221           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
16222                                      ? DFmode : SFmode), addr);
16223
16224           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
16225         }
16226       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
16227         {
16228           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
16229           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16230                                    GEN_INT (info->altivec_save_offset
16231                                             + sp_offset + 16 * i));
16232           rtx mem = gen_frame_mem (V4SImode, addr);
16233
16234           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
16235         }
16236       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16237         {
16238           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
16239           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16240                                    GEN_INT (info->gp_save_offset
16241                                             + sp_offset + reg_size * i));
16242           rtx mem = gen_frame_mem (reg_mode, addr);
16243
16244           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
16245         }
16246
16247       {
16248         /* CR register traditionally saved as CR2.  */
16249         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
16250         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16251                                  GEN_INT (info->cr_save_offset
16252                                           + sp_offset));
16253         rtx mem = gen_frame_mem (reg_mode, addr);
16254
16255         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
16256       }
16257       /* Explain about use of R0.  */
16258       if (info->lr_save_p)
16259         {
16260           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16261                                    GEN_INT (info->lr_save_offset
16262                                             + sp_offset));
16263           rtx mem = gen_frame_mem (reg_mode, addr);
16264
16265           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
16266         }
16267       /* Explain what happens to the stack pointer.  */
16268       {
16269         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
16270         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
16271       }
16272
16273       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
16274       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16275                             treg, GEN_INT (-info->total_size));
16276       sp_offset = info->total_size;
16277     }
16278
16279   /* If we use the link register, get it into r0.  */
16280   if (!WORLD_SAVE_P (info) && info->lr_save_p)
16281     {
16282       rtx addr, reg, mem;
16283
16284       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
16285                              gen_rtx_REG (Pmode, LR_REGNO));
16286       RTX_FRAME_RELATED_P (insn) = 1;
16287
16288       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16289                                GEN_INT (info->lr_save_offset + sp_offset));
16290       reg = gen_rtx_REG (Pmode, 0);
16291       mem = gen_rtx_MEM (Pmode, addr);
16292       /* This should not be of rs6000_sr_alias_set, because of
16293          __builtin_return_address.  */
16294
16295       insn = emit_move_insn (mem, reg);
16296       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16297                             NULL_RTX, NULL_RTX);
16298     }
16299
16300   /* If we need to save CR, put it into r12.  */
16301   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
16302     {
16303       rtx set;
16304
16305       cr_save_rtx = gen_rtx_REG (SImode, 12);
16306       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
16307       RTX_FRAME_RELATED_P (insn) = 1;
16308       /* Now, there's no way that dwarf2out_frame_debug_expr is going
16309          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
16310          But that's OK.  All we have to do is specify that _one_ condition
16311          code register is saved in this stack slot.  The thrower's epilogue
16312          will then restore all the call-saved registers.
16313          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
16314       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
16315                          gen_rtx_REG (SImode, CR2_REGNO));
16316       add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
16317     }
16318
16319   /* Do any required saving of fpr's.  If only one or two to save, do
16320      it ourselves.  Otherwise, call function.  */
16321   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
16322     {
16323       int i;
16324       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
16325         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
16326              && ! call_used_regs[info->first_fp_reg_save+i]))
16327           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, 
16328                            (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
16329                             ? DFmode : SFmode,
16330                            info->first_fp_reg_save + i,
16331                            info->fp_save_offset + sp_offset + 8 * i,
16332                            info->total_size);
16333     }
16334   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
16335     {
16336       rtx par;
16337
16338       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
16339                                     info->fp_save_offset + sp_offset,
16340                                     DFmode,
16341                                     /*savep=*/true, /*gpr=*/false,
16342                                     /*exitp=*/false);
16343       insn = emit_insn (par);
16344       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16345                             NULL_RTX, NULL_RTX);
16346     }
16347
16348   /* Save GPRs.  This is done as a PARALLEL if we are using
16349      the store-multiple instructions.  */
16350   if (!WORLD_SAVE_P (info)
16351       && TARGET_SPE_ABI
16352       && info->spe_64bit_regs_used != 0
16353       && info->first_gp_reg_save != 32)
16354     {
16355       int i;
16356       rtx spe_save_area_ptr;
16357  
16358       /* Determine whether we can address all of the registers that need
16359          to be saved with an offset from the stack pointer that fits in
16360          the small const field for SPE memory instructions.  */
16361       int spe_regs_addressable_via_sp
16362         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
16363                                + (32 - info->first_gp_reg_save - 1) * reg_size)
16364            && saving_GPRs_inline);
16365       int spe_offset;
16366  
16367       if (spe_regs_addressable_via_sp)
16368         {
16369           spe_save_area_ptr = frame_reg_rtx;
16370           spe_offset = info->spe_gp_save_offset + sp_offset;
16371         }
16372       else
16373         {
16374           /* Make r11 point to the start of the SPE save area.  We need
16375              to be careful here if r11 is holding the static chain.  If
16376              it is, then temporarily save it in r0.  We would use r0 as
16377              our base register here, but using r0 as a base register in
16378              loads and stores means something different from what we
16379              would like.  */
16380           int ool_adjust = (saving_GPRs_inline
16381                             ? 0
16382                             : (info->first_gp_reg_save
16383                                - (FIRST_SAVRES_REGISTER+1))*8);
16384           HOST_WIDE_INT offset = (info->spe_gp_save_offset
16385                                   + sp_offset - ool_adjust);
16386
16387           if (using_static_chain_p)
16388             {
16389               rtx r0 = gen_rtx_REG (Pmode, 0);
16390               gcc_assert (info->first_gp_reg_save > 11);
16391  
16392               emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
16393             }
16394  
16395           spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
16396           insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
16397                                         frame_reg_rtx,
16398                                         GEN_INT (offset)));
16399           /* We need to make sure the move to r11 gets noted for
16400              properly outputting unwind information.  */
16401           if (!saving_GPRs_inline)
16402             rs6000_frame_related (insn, frame_reg_rtx, offset,
16403                                   NULL_RTX, NULL_RTX);
16404           spe_offset = 0;
16405         }
16406  
16407       if (saving_GPRs_inline)
16408         {
16409           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16410             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
16411               {
16412                 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
16413                 rtx offset, addr, mem;
16414
16415                 /* We're doing all this to ensure that the offset fits into
16416                    the immediate offset of 'evstdd'.  */
16417                 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
16418  
16419                 offset = GEN_INT (reg_size * i + spe_offset);
16420                 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
16421                 mem = gen_rtx_MEM (V2SImode, addr);
16422   
16423                 insn = emit_move_insn (mem, reg);
16424            
16425                 rs6000_frame_related (insn, spe_save_area_ptr,
16426                                       info->spe_gp_save_offset
16427                                       + sp_offset + reg_size * i,
16428                                       offset, const0_rtx);
16429               }
16430         }
16431       else
16432         {
16433           rtx par;
16434
16435           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
16436                                         0, reg_mode,
16437                                         /*savep=*/true, /*gpr=*/true,
16438                                         /*exitp=*/false);
16439           insn = emit_insn (par);
16440           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16441                                 NULL_RTX, NULL_RTX);
16442         }
16443                                         
16444  
16445       /* Move the static chain pointer back.  */
16446       if (using_static_chain_p && !spe_regs_addressable_via_sp)
16447         emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
16448     }
16449   else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
16450     {
16451       rtx par;
16452
16453       /* Need to adjust r11 if we saved any FPRs.  */
16454       if (info->first_fp_reg_save != 64)
16455         {
16456           rtx r11 = gen_rtx_REG (reg_mode, 11);
16457           rtx offset = GEN_INT (info->total_size
16458                                 + (-8 * (64-info->first_fp_reg_save)));
16459           rtx ptr_reg = (sp_reg_rtx == frame_reg_rtx
16460                          ? sp_reg_rtx : r11);
16461
16462           emit_insn (TARGET_32BIT
16463                      ? gen_addsi3 (r11, ptr_reg, offset)
16464                      : gen_adddi3 (r11, ptr_reg, offset));
16465         }
16466
16467       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
16468                                     info->gp_save_offset + sp_offset,
16469                                     reg_mode,
16470                                     /*savep=*/true, /*gpr=*/true,
16471                                     /*exitp=*/false);
16472       insn = emit_insn (par);
16473       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16474                             NULL_RTX, NULL_RTX);
16475     }
16476   else if (!WORLD_SAVE_P (info) && using_store_multiple)
16477     {
16478       rtvec p;
16479       int i;
16480       p = rtvec_alloc (32 - info->first_gp_reg_save);
16481       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16482         {
16483           rtx addr, reg, mem;
16484           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
16485           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16486                                GEN_INT (info->gp_save_offset
16487                                         + sp_offset
16488                                         + reg_size * i));
16489           mem = gen_frame_mem (reg_mode, addr);
16490
16491           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
16492         }
16493       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
16494       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16495                             NULL_RTX, NULL_RTX);
16496     }
16497   else if (!WORLD_SAVE_P (info))
16498     {
16499       int i;
16500       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16501         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
16502           {
16503             rtx addr, reg, mem;
16504             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
16505
16506             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16507                                  GEN_INT (info->gp_save_offset
16508                                           + sp_offset
16509                                           + reg_size * i));
16510             mem = gen_frame_mem (reg_mode, addr);
16511
16512             insn = emit_move_insn (mem, reg);
16513             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16514                                   NULL_RTX, NULL_RTX);
16515           }
16516     }
16517
16518   /* ??? There's no need to emit actual instructions here, but it's the
16519      easiest way to get the frame unwind information emitted.  */
16520   if (crtl->calls_eh_return)
16521     {
16522       unsigned int i, regno;
16523
16524       /* In AIX ABI we need to pretend we save r2 here.  */
16525       if (TARGET_AIX)
16526         {
16527           rtx addr, reg, mem;
16528
16529           reg = gen_rtx_REG (reg_mode, 2);
16530           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16531                                GEN_INT (sp_offset + 5 * reg_size));
16532           mem = gen_frame_mem (reg_mode, addr);
16533
16534           insn = emit_move_insn (mem, reg);
16535           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16536                                 NULL_RTX, NULL_RTX);
16537           PATTERN (insn) = gen_blockage ();
16538         }
16539
16540       for (i = 0; ; ++i)
16541         {
16542           regno = EH_RETURN_DATA_REGNO (i);
16543           if (regno == INVALID_REGNUM)
16544             break;
16545
16546           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
16547                            info->ehrd_offset + sp_offset
16548                            + reg_size * (int) i,
16549                            info->total_size);
16550         }
16551     }
16552
16553   /* Save CR if we use any that must be preserved.  */
16554   if (!WORLD_SAVE_P (info) && info->cr_save_p)
16555     {
16556       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16557                                GEN_INT (info->cr_save_offset + sp_offset));
16558       rtx mem = gen_frame_mem (SImode, addr);
16559       /* See the large comment above about why CR2_REGNO is used.  */
16560       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
16561
16562       /* If r12 was used to hold the original sp, copy cr into r0 now
16563          that it's free.  */
16564       if (REGNO (frame_reg_rtx) == 12)
16565         {
16566           rtx set;
16567
16568           cr_save_rtx = gen_rtx_REG (SImode, 0);
16569           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
16570           RTX_FRAME_RELATED_P (insn) = 1;
16571           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
16572           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
16573         }
16574       insn = emit_move_insn (mem, cr_save_rtx);
16575
16576       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16577                             NULL_RTX, NULL_RTX);
16578     }
16579
16580   /* Update stack and set back pointer unless this is V.4,
16581      for which it was done previously.  */
16582   if (!WORLD_SAVE_P (info) && info->push_p
16583       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
16584     {
16585       if (info->total_size < 32767)
16586       sp_offset = info->total_size;
16587       else
16588         frame_reg_rtx = frame_ptr_rtx;
16589       rs6000_emit_allocate_stack (info->total_size,
16590                                   (frame_reg_rtx != sp_reg_rtx
16591                                    && ((info->altivec_size != 0)
16592                                        || (info->vrsave_mask != 0)
16593                                        )),
16594                                   FALSE);
16595       if (frame_reg_rtx != sp_reg_rtx)
16596         rs6000_emit_stack_tie ();
16597     }
16598
16599   /* Set frame pointer, if needed.  */
16600   if (frame_pointer_needed)
16601     {
16602       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
16603                              sp_reg_rtx);
16604       RTX_FRAME_RELATED_P (insn) = 1;
16605     }
16606
16607   /* Save AltiVec registers if needed.  Save here because the red zone does
16608      not include AltiVec registers.  */
16609   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
16610     {
16611       int i;
16612
16613       /* There should be a non inline version of this, for when we
16614          are saving lots of vector registers.  */
16615       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
16616         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
16617           {
16618             rtx areg, savereg, mem;
16619             int offset;
16620
16621             offset = info->altivec_save_offset + sp_offset
16622               + 16 * (i - info->first_altivec_reg_save);
16623
16624             savereg = gen_rtx_REG (V4SImode, i);
16625
16626             areg = gen_rtx_REG (Pmode, 0);
16627             emit_move_insn (areg, GEN_INT (offset));
16628
16629             /* AltiVec addressing mode is [reg+reg].  */
16630             mem = gen_frame_mem (V4SImode,
16631                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
16632
16633             insn = emit_move_insn (mem, savereg);
16634
16635             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
16636                                   areg, GEN_INT (offset));
16637           }
16638     }
16639
16640   /* VRSAVE is a bit vector representing which AltiVec registers
16641      are used.  The OS uses this to determine which vector
16642      registers to save on a context switch.  We need to save
16643      VRSAVE on the stack frame, add whatever AltiVec registers we
16644      used in this function, and do the corresponding magic in the
16645      epilogue.  */
16646
16647   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
16648       && info->vrsave_mask != 0)
16649     {
16650       rtx reg, mem, vrsave;
16651       int offset;
16652
16653       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
16654          as frame_reg_rtx and r11 as the static chain pointer for
16655          nested functions.  */
16656       reg = gen_rtx_REG (SImode, 0);
16657       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
16658       if (TARGET_MACHO)
16659         emit_insn (gen_get_vrsave_internal (reg));
16660       else
16661         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
16662
16663       if (!WORLD_SAVE_P (info))
16664         {
16665           /* Save VRSAVE.  */
16666           offset = info->vrsave_save_offset + sp_offset;
16667           mem = gen_frame_mem (SImode,
16668                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
16669                                              GEN_INT (offset)));
16670           insn = emit_move_insn (mem, reg);
16671         }
16672
16673       /* Include the registers in the mask.  */
16674       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
16675
16676       insn = emit_insn (generate_set_vrsave (reg, info, 0));
16677     }
16678
16679   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
16680   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
16681       || (DEFAULT_ABI == ABI_V4
16682           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
16683           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
16684     {
16685       /* If emit_load_toc_table will use the link register, we need to save
16686          it.  We use R12 for this purpose because emit_load_toc_table
16687          can use register 0.  This allows us to use a plain 'blr' to return
16688          from the procedure more often.  */
16689       int save_LR_around_toc_setup = (TARGET_ELF
16690                                       && DEFAULT_ABI != ABI_AIX
16691                                       && flag_pic
16692                                       && ! info->lr_save_p
16693                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
16694       if (save_LR_around_toc_setup)
16695         {
16696           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
16697
16698           insn = emit_move_insn (frame_ptr_rtx, lr);
16699           RTX_FRAME_RELATED_P (insn) = 1;
16700
16701           rs6000_emit_load_toc_table (TRUE);
16702
16703           insn = emit_move_insn (lr, frame_ptr_rtx);
16704           RTX_FRAME_RELATED_P (insn) = 1;
16705         }
16706       else
16707         rs6000_emit_load_toc_table (TRUE);
16708     }
16709
16710 #if TARGET_MACHO
16711   if (DEFAULT_ABI == ABI_DARWIN
16712       && flag_pic && crtl->uses_pic_offset_table)
16713     {
16714       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
16715       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
16716
16717       /* Save and restore LR locally around this call (in R0).  */
16718       if (!info->lr_save_p)
16719         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
16720
16721       emit_insn (gen_load_macho_picbase (src));
16722
16723       emit_move_insn (gen_rtx_REG (Pmode,
16724                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
16725                       lr);
16726
16727       if (!info->lr_save_p)
16728         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
16729     }
16730 #endif
16731 }
16732
16733 /* Write function prologue.  */
16734
16735 static void
16736 rs6000_output_function_prologue (FILE *file,
16737                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
16738 {
16739   rs6000_stack_t *info = rs6000_stack_info ();
16740
16741   if (TARGET_DEBUG_STACK)
16742     debug_stack_info (info);
16743
16744   /* Write .extern for any function we will call to save and restore
16745      fp values.  */
16746   if (info->first_fp_reg_save < 64
16747       && !FP_SAVE_INLINE (info->first_fp_reg_save))
16748     fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
16749              SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
16750              RESTORE_FP_PREFIX, info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
16751
16752   /* Write .extern for AIX common mode routines, if needed.  */
16753   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
16754     {
16755       fputs ("\t.extern __mulh\n", file);
16756       fputs ("\t.extern __mull\n", file);
16757       fputs ("\t.extern __divss\n", file);
16758       fputs ("\t.extern __divus\n", file);
16759       fputs ("\t.extern __quoss\n", file);
16760       fputs ("\t.extern __quous\n", file);
16761       common_mode_defined = 1;
16762     }
16763
16764   if (! HAVE_prologue)
16765     {
16766       start_sequence ();
16767
16768       /* A NOTE_INSN_DELETED is supposed to be at the start and end of
16769          the "toplevel" insn chain.  */
16770       emit_note (NOTE_INSN_DELETED);
16771       rs6000_emit_prologue ();
16772       emit_note (NOTE_INSN_DELETED);
16773
16774       /* Expand INSN_ADDRESSES so final() doesn't crash.  */
16775       {
16776         rtx insn;
16777         unsigned addr = 0;
16778         for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16779           {
16780             INSN_ADDRESSES_NEW (insn, addr);
16781             addr += 4;
16782           }
16783       }
16784
16785       if (TARGET_DEBUG_STACK)
16786         debug_rtx_list (get_insns (), 100);
16787       final (get_insns (), file, FALSE);
16788       end_sequence ();
16789     }
16790
16791   rs6000_pic_labelno++;
16792 }
16793
16794 /* Non-zero if vmx regs are restored before the frame pop, zero if
16795    we restore after the pop when possible.  */
16796 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
16797
16798 /* Reload CR from REG.  */
16799
16800 static void
16801 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
16802 {
16803   int count = 0;
16804   int i;
16805
16806   if (using_mfcr_multiple)
16807     {
16808       for (i = 0; i < 8; i++)
16809         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
16810           count++;
16811       gcc_assert (count);
16812     }
16813
16814   if (using_mfcr_multiple && count > 1)
16815     {
16816       rtvec p;
16817       int ndx;
16818
16819       p = rtvec_alloc (count);
16820
16821       ndx = 0;
16822       for (i = 0; i < 8; i++)
16823         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
16824           {
16825             rtvec r = rtvec_alloc (2);
16826             RTVEC_ELT (r, 0) = reg;
16827             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
16828             RTVEC_ELT (p, ndx) =
16829               gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
16830                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
16831             ndx++;
16832           }
16833       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
16834       gcc_assert (ndx == count);
16835     }
16836   else
16837     for (i = 0; i < 8; i++)
16838       if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
16839         {
16840           emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
16841                                                        CR0_REGNO+i),
16842                                           reg));
16843         }
16844 }
16845
16846 /* Emit function epilogue as insns.
16847
16848    At present, dwarf2out_frame_debug_expr doesn't understand
16849    register restores, so we don't bother setting RTX_FRAME_RELATED_P
16850    anywhere in the epilogue.  Most of the insns below would in any case
16851    need special notes to explain where r11 is in relation to the stack.  */
16852
16853 void
16854 rs6000_emit_epilogue (int sibcall)
16855 {
16856   rs6000_stack_t *info;
16857   int restoring_GPRs_inline;
16858   int restoring_FPRs_inline;
16859   int using_load_multiple;
16860   int using_mtcr_multiple;
16861   int use_backchain_to_restore_sp;
16862   int restore_lr;
16863   int strategy;
16864   int sp_offset = 0;
16865   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
16866   rtx frame_reg_rtx = sp_reg_rtx;
16867   enum machine_mode reg_mode = Pmode;
16868   int reg_size = TARGET_32BIT ? 4 : 8;
16869   int i;
16870
16871   info = rs6000_stack_info ();
16872
16873   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
16874     {
16875       reg_mode = V2SImode;
16876       reg_size = 8;
16877     }
16878
16879   strategy = rs6000_savres_strategy (info, /*savep=*/false,
16880                                      /*static_chain_p=*/0, sibcall);
16881   using_load_multiple = strategy & SAVRES_MULTIPLE;
16882   restoring_FPRs_inline = strategy & SAVRES_INLINE_FPRS;
16883   restoring_GPRs_inline = strategy & SAVRES_INLINE_GPRS;
16884   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
16885                          || rs6000_cpu == PROCESSOR_PPC603
16886                          || rs6000_cpu == PROCESSOR_PPC750
16887                          || optimize_size);
16888   /* Restore via the backchain when we have a large frame, since this
16889      is more efficient than an addis, addi pair.  The second condition
16890      here will not trigger at the moment;  We don't actually need a
16891      frame pointer for alloca, but the generic parts of the compiler
16892      give us one anyway.  */
16893   use_backchain_to_restore_sp = (info->total_size > 32767
16894                                  || info->total_size
16895                                      + (info->lr_save_p ? info->lr_save_offset : 0)
16896                                        > 32767
16897                                  || (cfun->calls_alloca
16898                                      && !frame_pointer_needed));
16899   restore_lr = (info->lr_save_p
16900                 && restoring_GPRs_inline
16901                 && restoring_FPRs_inline);
16902
16903   if (WORLD_SAVE_P (info))
16904     {
16905       int i, j;
16906       char rname[30];
16907       const char *alloc_rname;
16908       rtvec p;
16909
16910       /* eh_rest_world_r10 will return to the location saved in the LR
16911          stack slot (which is not likely to be our caller.)
16912          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
16913          rest_world is similar, except any R10 parameter is ignored.
16914          The exception-handling stuff that was here in 2.95 is no
16915          longer necessary.  */
16916
16917       p = rtvec_alloc (9
16918                        + 1
16919                        + 32 - info->first_gp_reg_save
16920                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
16921                        + 63 + 1 - info->first_fp_reg_save);
16922
16923       strcpy (rname, ((crtl->calls_eh_return) ?
16924                       "*eh_rest_world_r10" : "*rest_world"));
16925       alloc_rname = ggc_strdup (rname);
16926
16927       j = 0;
16928       RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
16929       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
16930                                         gen_rtx_REG (Pmode,
16931                                                      LR_REGNO));
16932       RTVEC_ELT (p, j++)
16933         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
16934       /* The instruction pattern requires a clobber here;
16935          it is shared with the restVEC helper. */
16936       RTVEC_ELT (p, j++)
16937         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
16938
16939       {
16940         /* CR register traditionally saved as CR2.  */
16941         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
16942         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16943                                  GEN_INT (info->cr_save_offset));
16944         rtx mem = gen_frame_mem (reg_mode, addr);
16945
16946         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16947       }
16948
16949       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
16950         {
16951           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
16952           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16953                                    GEN_INT (info->gp_save_offset
16954                                             + reg_size * i));
16955           rtx mem = gen_frame_mem (reg_mode, addr);
16956
16957           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16958         }
16959       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
16960         {
16961           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
16962           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16963                                    GEN_INT (info->altivec_save_offset
16964                                             + 16 * i));
16965           rtx mem = gen_frame_mem (V4SImode, addr);
16966
16967           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16968         }
16969       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
16970         {
16971           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
16972                                    ? DFmode : SFmode), 
16973                                  info->first_fp_reg_save + i);
16974           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
16975                                    GEN_INT (info->fp_save_offset
16976                                             + 8 * i));
16977           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
16978                                      ? DFmode : SFmode), addr);
16979
16980           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
16981         }
16982       RTVEC_ELT (p, j++)
16983         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
16984       RTVEC_ELT (p, j++)
16985         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
16986       RTVEC_ELT (p, j++)
16987         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
16988       RTVEC_ELT (p, j++)
16989         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
16990       RTVEC_ELT (p, j++)
16991         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
16992       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
16993
16994       return;
16995     }
16996
16997   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
16998   if (info->push_p)
16999     sp_offset = info->total_size;
17000
17001   /* Restore AltiVec registers if we must do so before adjusting the
17002      stack.  */
17003   if (TARGET_ALTIVEC_ABI
17004       && info->altivec_size != 0
17005       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
17006           || (DEFAULT_ABI != ABI_V4
17007               && info->altivec_save_offset < (TARGET_32BIT ? -220 : -288))))
17008     {
17009       int i;
17010
17011       if (use_backchain_to_restore_sp)
17012         {
17013           frame_reg_rtx = gen_rtx_REG (Pmode, 11);
17014           emit_move_insn (frame_reg_rtx,
17015                           gen_rtx_MEM (Pmode, sp_reg_rtx));
17016           sp_offset = 0;
17017         }
17018       else if (frame_pointer_needed)
17019         frame_reg_rtx = hard_frame_pointer_rtx;
17020
17021       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
17022         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
17023           {
17024             rtx addr, areg, mem;
17025
17026             areg = gen_rtx_REG (Pmode, 0);
17027             emit_move_insn
17028               (areg, GEN_INT (info->altivec_save_offset
17029                               + sp_offset
17030                               + 16 * (i - info->first_altivec_reg_save)));
17031
17032             /* AltiVec addressing mode is [reg+reg].  */
17033             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
17034             mem = gen_frame_mem (V4SImode, addr);
17035
17036             emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
17037           }
17038     }
17039
17040   /* Restore VRSAVE if we must do so before adjusting the stack.  */
17041   if (TARGET_ALTIVEC
17042       && TARGET_ALTIVEC_VRSAVE
17043       && info->vrsave_mask != 0
17044       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
17045           || (DEFAULT_ABI != ABI_V4
17046               && info->vrsave_save_offset < (TARGET_32BIT ? -220 : -288))))
17047     {
17048       rtx addr, mem, reg;
17049
17050       if (frame_reg_rtx == sp_reg_rtx)
17051         {
17052           if (use_backchain_to_restore_sp)
17053             {
17054               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
17055               emit_move_insn (frame_reg_rtx,
17056                               gen_rtx_MEM (Pmode, sp_reg_rtx));
17057               sp_offset = 0;
17058             }
17059           else if (frame_pointer_needed)
17060             frame_reg_rtx = hard_frame_pointer_rtx;
17061         }
17062
17063       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17064                            GEN_INT (info->vrsave_save_offset + sp_offset));
17065       mem = gen_frame_mem (SImode, addr);
17066       reg = gen_rtx_REG (SImode, 12);
17067       emit_move_insn (reg, mem);
17068
17069       emit_insn (generate_set_vrsave (reg, info, 1));
17070     }
17071
17072   /* If we have a large stack frame, restore the old stack pointer
17073      using the backchain.  */
17074   if (use_backchain_to_restore_sp)
17075     {
17076       if (frame_reg_rtx == sp_reg_rtx)
17077         {
17078           /* Under V.4, don't reset the stack pointer until after we're done
17079              loading the saved registers.  */
17080           if (DEFAULT_ABI == ABI_V4)
17081             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
17082
17083           emit_move_insn (frame_reg_rtx,
17084                           gen_rtx_MEM (Pmode, sp_reg_rtx));
17085           sp_offset = 0;
17086         }
17087       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
17088                && DEFAULT_ABI == ABI_V4)
17089         /* frame_reg_rtx has been set up by the altivec restore.  */
17090         ;
17091       else
17092         {
17093           emit_move_insn (sp_reg_rtx, frame_reg_rtx);
17094           frame_reg_rtx = sp_reg_rtx;
17095         }
17096     }
17097   /* If we have a frame pointer, we can restore the old stack pointer
17098      from it.  */
17099   else if (frame_pointer_needed)
17100     {
17101       frame_reg_rtx = sp_reg_rtx;
17102       if (DEFAULT_ABI == ABI_V4)
17103         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
17104
17105       emit_insn (TARGET_32BIT
17106                  ? gen_addsi3 (frame_reg_rtx, hard_frame_pointer_rtx,
17107                                GEN_INT (info->total_size))
17108                  : gen_adddi3 (frame_reg_rtx, hard_frame_pointer_rtx,
17109                                GEN_INT (info->total_size)));
17110       sp_offset = 0;
17111     }
17112   else if (info->push_p
17113            && DEFAULT_ABI != ABI_V4
17114            && !crtl->calls_eh_return)
17115     {
17116       emit_insn (TARGET_32BIT
17117                  ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
17118                                GEN_INT (info->total_size))
17119                  : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
17120                                GEN_INT (info->total_size)));
17121       sp_offset = 0;
17122     }
17123
17124   /* Restore AltiVec registers if we have not done so already.  */
17125   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
17126       && TARGET_ALTIVEC_ABI
17127       && info->altivec_size != 0
17128       && (DEFAULT_ABI == ABI_V4
17129           || info->altivec_save_offset >= (TARGET_32BIT ? -220 : -288)))
17130     {
17131       int i;
17132
17133       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
17134         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
17135           {
17136             rtx addr, areg, mem;
17137
17138             areg = gen_rtx_REG (Pmode, 0);
17139             emit_move_insn
17140               (areg, GEN_INT (info->altivec_save_offset
17141                               + sp_offset
17142                               + 16 * (i - info->first_altivec_reg_save)));
17143
17144             /* AltiVec addressing mode is [reg+reg].  */
17145             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
17146             mem = gen_frame_mem (V4SImode, addr);
17147
17148             emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
17149           }
17150     }
17151
17152   /* Restore VRSAVE if we have not done so already.  */
17153   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
17154       && TARGET_ALTIVEC
17155       && TARGET_ALTIVEC_VRSAVE
17156       && info->vrsave_mask != 0
17157       && (DEFAULT_ABI == ABI_V4
17158           || info->vrsave_save_offset >= (TARGET_32BIT ? -220 : -288)))
17159     {
17160       rtx addr, mem, reg;
17161
17162       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17163                            GEN_INT (info->vrsave_save_offset + sp_offset));
17164       mem = gen_frame_mem (SImode, addr);
17165       reg = gen_rtx_REG (SImode, 12);
17166       emit_move_insn (reg, mem);
17167
17168       emit_insn (generate_set_vrsave (reg, info, 1));
17169     }
17170
17171   /* Get the old lr if we saved it.  If we are restoring registers
17172      out-of-line, then the out-of-line routines can do this for us.  */
17173   if (restore_lr)
17174     {
17175       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
17176                                       info->lr_save_offset + sp_offset);
17177
17178       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
17179     }
17180
17181   /* Get the old cr if we saved it.  */
17182   if (info->cr_save_p)
17183     {
17184       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17185                                GEN_INT (info->cr_save_offset + sp_offset));
17186       rtx mem = gen_frame_mem (SImode, addr);
17187
17188       emit_move_insn (gen_rtx_REG (SImode, 12), mem);
17189     }
17190
17191   /* Set LR here to try to overlap restores below.  */
17192   if (restore_lr)
17193     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
17194                     gen_rtx_REG (Pmode, 0));
17195
17196   /* Load exception handler data registers, if needed.  */
17197   if (crtl->calls_eh_return)
17198     {
17199       unsigned int i, regno;
17200
17201       if (TARGET_AIX)
17202         {
17203           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17204                                    GEN_INT (sp_offset + 5 * reg_size));
17205           rtx mem = gen_frame_mem (reg_mode, addr);
17206
17207           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
17208         }
17209
17210       for (i = 0; ; ++i)
17211         {
17212           rtx mem;
17213
17214           regno = EH_RETURN_DATA_REGNO (i);
17215           if (regno == INVALID_REGNUM)
17216             break;
17217
17218           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
17219                                       info->ehrd_offset + sp_offset
17220                                       + reg_size * (int) i);
17221
17222           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
17223         }
17224     }
17225
17226   /* Restore GPRs.  This is done as a PARALLEL if we are using
17227      the load-multiple instructions.  */
17228   if (TARGET_SPE_ABI
17229       && info->spe_64bit_regs_used != 0
17230       && info->first_gp_reg_save != 32)
17231     {
17232       /* Determine whether we can address all of the registers that need
17233          to be saved with an offset from the stack pointer that fits in
17234          the small const field for SPE memory instructions.  */
17235       int spe_regs_addressable_via_sp
17236         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
17237                                + (32 - info->first_gp_reg_save - 1) * reg_size)
17238            && restoring_GPRs_inline);
17239       int spe_offset;
17240
17241       if (spe_regs_addressable_via_sp)
17242         spe_offset = info->spe_gp_save_offset + sp_offset;
17243       else
17244         {
17245           rtx old_frame_reg_rtx = frame_reg_rtx;
17246           /* Make r11 point to the start of the SPE save area.  We worried about
17247              not clobbering it when we were saving registers in the prologue.
17248              There's no need to worry here because the static chain is passed
17249              anew to every function.  */
17250           int ool_adjust = (restoring_GPRs_inline
17251                             ? 0
17252                             : (info->first_gp_reg_save
17253                                - (FIRST_SAVRES_REGISTER+1))*8);
17254
17255           if (frame_reg_rtx == sp_reg_rtx)
17256             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
17257           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
17258                                  GEN_INT (info->spe_gp_save_offset
17259                                           + sp_offset
17260                                           - ool_adjust)));
17261           /* Keep the invariant that frame_reg_rtx + sp_offset points
17262              at the top of the stack frame.  */
17263           sp_offset = -info->spe_gp_save_offset;
17264
17265           spe_offset = 0;
17266         }
17267
17268       if (restoring_GPRs_inline)
17269         {
17270           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
17271             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
17272               {
17273                 rtx offset, addr, mem;
17274
17275                 /* We're doing all this to ensure that the immediate offset
17276                    fits into the immediate field of 'evldd'.  */
17277                 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
17278
17279                 offset = GEN_INT (spe_offset + reg_size * i);
17280                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
17281                 mem = gen_rtx_MEM (V2SImode, addr);
17282
17283                 emit_move_insn (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
17284                                 mem);
17285               }
17286         }
17287       else
17288         {
17289           rtx par;
17290
17291           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
17292                                         0, reg_mode,
17293                                         /*savep=*/false, /*gpr=*/true,
17294                                         /*exitp=*/true);
17295           emit_jump_insn (par);
17296
17297           /* We don't want anybody else emitting things after we jumped
17298              back.  */
17299           return;
17300         }
17301     }
17302   else if (!restoring_GPRs_inline)
17303     {
17304       /* We are jumping to an out-of-line function.  */
17305       bool can_use_exit = info->first_fp_reg_save == 64;
17306       rtx par;
17307
17308       /* Emit stack reset code if we need it.  */
17309       if (can_use_exit)
17310         rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
17311                                  sp_offset, can_use_exit);
17312       else
17313         emit_insn (gen_addsi3 (gen_rtx_REG (Pmode, 11),
17314                                sp_reg_rtx,
17315                                GEN_INT (sp_offset - info->fp_size)));
17316
17317       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
17318                                     info->gp_save_offset, reg_mode,
17319                                     /*savep=*/false, /*gpr=*/true,
17320                                     /*exitp=*/can_use_exit);
17321
17322       if (can_use_exit)
17323         {
17324           if (info->cr_save_p)
17325             rs6000_restore_saved_cr (gen_rtx_REG (SImode, 12),
17326                                      using_mtcr_multiple);
17327
17328           emit_jump_insn (par);
17329
17330           /* We don't want anybody else emitting things after we jumped
17331              back.  */
17332           return;
17333         }
17334       else
17335         emit_insn (par);
17336     }
17337   else if (using_load_multiple)
17338     {
17339       rtvec p;
17340       p = rtvec_alloc (32 - info->first_gp_reg_save);
17341       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
17342         {
17343           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17344                                    GEN_INT (info->gp_save_offset
17345                                             + sp_offset
17346                                             + reg_size * i));
17347           rtx mem = gen_frame_mem (reg_mode, addr);
17348
17349           RTVEC_ELT (p, i) =
17350             gen_rtx_SET (VOIDmode,
17351                          gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
17352                          mem);
17353         }
17354       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
17355     }
17356   else
17357     {
17358       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
17359         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
17360           {
17361             rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17362                                      GEN_INT (info->gp_save_offset
17363                                               + sp_offset
17364                                               + reg_size * i));
17365             rtx mem = gen_frame_mem (reg_mode, addr);
17366
17367             emit_move_insn (gen_rtx_REG (reg_mode,
17368                                          info->first_gp_reg_save + i), mem);
17369           }
17370     }
17371
17372   /* Restore fpr's if we need to do it without calling a function.  */
17373   if (restoring_FPRs_inline)
17374     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
17375       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
17376            && ! call_used_regs[info->first_fp_reg_save+i]))
17377         {
17378           rtx addr, mem;
17379           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
17380                                GEN_INT (info->fp_save_offset
17381                                         + sp_offset
17382                                         + 8 * i));
17383           mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
17384                                  ? DFmode : SFmode), addr);
17385
17386           emit_move_insn (gen_rtx_REG (((TARGET_HARD_FLOAT 
17387                                          && TARGET_DOUBLE_FLOAT)
17388                                         ? DFmode : SFmode),
17389                                        info->first_fp_reg_save + i),
17390                           mem);
17391         }
17392
17393   /* If we saved cr, restore it here.  Just those that were used.  */
17394   if (info->cr_save_p)
17395     rs6000_restore_saved_cr (gen_rtx_REG (SImode, 12), using_mtcr_multiple);
17396
17397   /* If this is V.4, unwind the stack pointer after all of the loads
17398      have been done.  */
17399   rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
17400                            sp_offset, !restoring_FPRs_inline);
17401
17402   if (crtl->calls_eh_return)
17403     {
17404       rtx sa = EH_RETURN_STACKADJ_RTX;
17405       emit_insn (TARGET_32BIT
17406                  ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
17407                  : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
17408     }
17409
17410   if (!sibcall)
17411     {
17412       rtvec p;
17413       if (! restoring_FPRs_inline)
17414         p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
17415       else
17416         p = rtvec_alloc (2);
17417
17418       RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
17419       RTVEC_ELT (p, 1) = (restoring_FPRs_inline
17420                           ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
17421                           : gen_rtx_CLOBBER (VOIDmode,
17422                                              gen_rtx_REG (Pmode, 65)));
17423
17424       /* If we have to restore more than two FP registers, branch to the
17425          restore function.  It will return to our caller.  */
17426       if (! restoring_FPRs_inline)
17427         {
17428           int i;
17429           rtx sym;
17430
17431           sym = rs6000_savres_routine_sym (info,
17432                                            /*savep=*/false,
17433                                            /*gpr=*/false,
17434                                            /*exitp=*/true);
17435           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
17436           RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
17437                                           gen_rtx_REG (Pmode, 11));
17438           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
17439             {
17440               rtx addr, mem;
17441               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
17442                                    GEN_INT (info->fp_save_offset + 8*i));
17443               mem = gen_frame_mem (DFmode, addr);
17444
17445               RTVEC_ELT (p, i+4) =
17446                 gen_rtx_SET (VOIDmode,
17447                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
17448                              mem);
17449             }
17450         }
17451
17452       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
17453     }
17454 }
17455
17456 /* Write function epilogue.  */
17457
17458 static void
17459 rs6000_output_function_epilogue (FILE *file,
17460                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
17461 {
17462   if (! HAVE_epilogue)
17463     {
17464       rtx insn = get_last_insn ();
17465       /* If the last insn was a BARRIER, we don't have to write anything except
17466          the trace table.  */
17467       if (GET_CODE (insn) == NOTE)
17468         insn = prev_nonnote_insn (insn);
17469       if (insn == 0 ||  GET_CODE (insn) != BARRIER)
17470         {
17471           /* This is slightly ugly, but at least we don't have two
17472              copies of the epilogue-emitting code.  */
17473           start_sequence ();
17474
17475           /* A NOTE_INSN_DELETED is supposed to be at the start
17476              and end of the "toplevel" insn chain.  */
17477           emit_note (NOTE_INSN_DELETED);
17478           rs6000_emit_epilogue (FALSE);
17479           emit_note (NOTE_INSN_DELETED);
17480
17481           /* Expand INSN_ADDRESSES so final() doesn't crash.  */
17482           {
17483             rtx insn;
17484             unsigned addr = 0;
17485             for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
17486               {
17487                 INSN_ADDRESSES_NEW (insn, addr);
17488                 addr += 4;
17489               }
17490           }
17491
17492           if (TARGET_DEBUG_STACK)
17493             debug_rtx_list (get_insns (), 100);
17494           final (get_insns (), file, FALSE);
17495           end_sequence ();
17496         }
17497     }
17498
17499 #if TARGET_MACHO
17500   macho_branch_islands ();
17501   /* Mach-O doesn't support labels at the end of objects, so if
17502      it looks like we might want one, insert a NOP.  */
17503   {
17504     rtx insn = get_last_insn ();
17505     while (insn
17506            && NOTE_P (insn)
17507            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
17508       insn = PREV_INSN (insn);
17509     if (insn
17510         && (LABEL_P (insn)
17511             || (NOTE_P (insn)
17512                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
17513       fputs ("\tnop\n", file);
17514   }
17515 #endif
17516
17517   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
17518      on its format.
17519
17520      We don't output a traceback table if -finhibit-size-directive was
17521      used.  The documentation for -finhibit-size-directive reads
17522      ``don't output a @code{.size} assembler directive, or anything
17523      else that would cause trouble if the function is split in the
17524      middle, and the two halves are placed at locations far apart in
17525      memory.''  The traceback table has this property, since it
17526      includes the offset from the start of the function to the
17527      traceback table itself.
17528
17529      System V.4 Powerpc's (and the embedded ABI derived from it) use a
17530      different traceback table.  */
17531   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
17532       && rs6000_traceback != traceback_none && !cfun->is_thunk)
17533     {
17534       const char *fname = NULL;
17535       const char *language_string = lang_hooks.name;
17536       int fixed_parms = 0, float_parms = 0, parm_info = 0;
17537       int i;
17538       int optional_tbtab;
17539       rs6000_stack_t *info = rs6000_stack_info ();
17540
17541       if (rs6000_traceback == traceback_full)
17542         optional_tbtab = 1;
17543       else if (rs6000_traceback == traceback_part)
17544         optional_tbtab = 0;
17545       else
17546         optional_tbtab = !optimize_size && !TARGET_ELF;
17547
17548       if (optional_tbtab)
17549         {
17550           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
17551           while (*fname == '.') /* V.4 encodes . in the name */
17552             fname++;
17553
17554           /* Need label immediately before tbtab, so we can compute
17555              its offset from the function start.  */
17556           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
17557           ASM_OUTPUT_LABEL (file, fname);
17558         }
17559
17560       /* The .tbtab pseudo-op can only be used for the first eight
17561          expressions, since it can't handle the possibly variable
17562          length fields that follow.  However, if you omit the optional
17563          fields, the assembler outputs zeros for all optional fields
17564          anyways, giving each variable length field is minimum length
17565          (as defined in sys/debug.h).  Thus we can not use the .tbtab
17566          pseudo-op at all.  */
17567
17568       /* An all-zero word flags the start of the tbtab, for debuggers
17569          that have to find it by searching forward from the entry
17570          point or from the current pc.  */
17571       fputs ("\t.long 0\n", file);
17572
17573       /* Tbtab format type.  Use format type 0.  */
17574       fputs ("\t.byte 0,", file);
17575
17576       /* Language type.  Unfortunately, there does not seem to be any
17577          official way to discover the language being compiled, so we
17578          use language_string.
17579          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
17580          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
17581          a number, so for now use 9.  */
17582       if (! strcmp (language_string, "GNU C"))
17583         i = 0;
17584       else if (! strcmp (language_string, "GNU F77")
17585                || ! strcmp (language_string, "GNU Fortran"))
17586         i = 1;
17587       else if (! strcmp (language_string, "GNU Pascal"))
17588         i = 2;
17589       else if (! strcmp (language_string, "GNU Ada"))
17590         i = 3;
17591       else if (! strcmp (language_string, "GNU C++")
17592                || ! strcmp (language_string, "GNU Objective-C++"))
17593         i = 9;
17594       else if (! strcmp (language_string, "GNU Java"))
17595         i = 13;
17596       else if (! strcmp (language_string, "GNU Objective-C"))
17597         i = 14;
17598       else
17599         gcc_unreachable ();
17600       fprintf (file, "%d,", i);
17601
17602       /* 8 single bit fields: global linkage (not set for C extern linkage,
17603          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
17604          from start of procedure stored in tbtab, internal function, function
17605          has controlled storage, function has no toc, function uses fp,
17606          function logs/aborts fp operations.  */
17607       /* Assume that fp operations are used if any fp reg must be saved.  */
17608       fprintf (file, "%d,",
17609                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
17610
17611       /* 6 bitfields: function is interrupt handler, name present in
17612          proc table, function calls alloca, on condition directives
17613          (controls stack walks, 3 bits), saves condition reg, saves
17614          link reg.  */
17615       /* The `function calls alloca' bit seems to be set whenever reg 31 is
17616          set up as a frame pointer, even when there is no alloca call.  */
17617       fprintf (file, "%d,",
17618                ((optional_tbtab << 6)
17619                 | ((optional_tbtab & frame_pointer_needed) << 5)
17620                 | (info->cr_save_p << 1)
17621                 | (info->lr_save_p)));
17622
17623       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
17624          (6 bits).  */
17625       fprintf (file, "%d,",
17626                (info->push_p << 7) | (64 - info->first_fp_reg_save));
17627
17628       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
17629       fprintf (file, "%d,", (32 - first_reg_to_save ()));
17630
17631       if (optional_tbtab)
17632         {
17633           /* Compute the parameter info from the function decl argument
17634              list.  */
17635           tree decl;
17636           int next_parm_info_bit = 31;
17637
17638           for (decl = DECL_ARGUMENTS (current_function_decl);
17639                decl; decl = TREE_CHAIN (decl))
17640             {
17641               rtx parameter = DECL_INCOMING_RTL (decl);
17642               enum machine_mode mode = GET_MODE (parameter);
17643
17644               if (GET_CODE (parameter) == REG)
17645                 {
17646                   if (SCALAR_FLOAT_MODE_P (mode))
17647                     {
17648                       int bits;
17649
17650                       float_parms++;
17651
17652                       switch (mode)
17653                         {
17654                         case SFmode:
17655                         case SDmode:
17656                           bits = 0x2;
17657                           break;
17658
17659                         case DFmode:
17660                         case DDmode:
17661                         case TFmode:
17662                         case TDmode:
17663                           bits = 0x3;
17664                           break;
17665
17666                         default:
17667                           gcc_unreachable ();
17668                         }
17669
17670                       /* If only one bit will fit, don't or in this entry.  */
17671                       if (next_parm_info_bit > 0)
17672                         parm_info |= (bits << (next_parm_info_bit - 1));
17673                       next_parm_info_bit -= 2;
17674                     }
17675                   else
17676                     {
17677                       fixed_parms += ((GET_MODE_SIZE (mode)
17678                                        + (UNITS_PER_WORD - 1))
17679                                       / UNITS_PER_WORD);
17680                       next_parm_info_bit -= 1;
17681                     }
17682                 }
17683             }
17684         }
17685
17686       /* Number of fixed point parameters.  */
17687       /* This is actually the number of words of fixed point parameters; thus
17688          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
17689       fprintf (file, "%d,", fixed_parms);
17690
17691       /* 2 bitfields: number of floating point parameters (7 bits), parameters
17692          all on stack.  */
17693       /* This is actually the number of fp registers that hold parameters;
17694          and thus the maximum value is 13.  */
17695       /* Set parameters on stack bit if parameters are not in their original
17696          registers, regardless of whether they are on the stack?  Xlc
17697          seems to set the bit when not optimizing.  */
17698       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
17699
17700       if (! optional_tbtab)
17701         return;
17702
17703       /* Optional fields follow.  Some are variable length.  */
17704
17705       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
17706          11 double float.  */
17707       /* There is an entry for each parameter in a register, in the order that
17708          they occur in the parameter list.  Any intervening arguments on the
17709          stack are ignored.  If the list overflows a long (max possible length
17710          34 bits) then completely leave off all elements that don't fit.  */
17711       /* Only emit this long if there was at least one parameter.  */
17712       if (fixed_parms || float_parms)
17713         fprintf (file, "\t.long %d\n", parm_info);
17714
17715       /* Offset from start of code to tb table.  */
17716       fputs ("\t.long ", file);
17717       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
17718       if (TARGET_AIX)
17719         RS6000_OUTPUT_BASENAME (file, fname);
17720       else
17721         assemble_name (file, fname);
17722       putc ('-', file);
17723       rs6000_output_function_entry (file, fname);
17724       putc ('\n', file);
17725
17726       /* Interrupt handler mask.  */
17727       /* Omit this long, since we never set the interrupt handler bit
17728          above.  */
17729
17730       /* Number of CTL (controlled storage) anchors.  */
17731       /* Omit this long, since the has_ctl bit is never set above.  */
17732
17733       /* Displacement into stack of each CTL anchor.  */
17734       /* Omit this list of longs, because there are no CTL anchors.  */
17735
17736       /* Length of function name.  */
17737       if (*fname == '*')
17738         ++fname;
17739       fprintf (file, "\t.short %d\n", (int) strlen (fname));
17740
17741       /* Function name.  */
17742       assemble_string (fname, strlen (fname));
17743
17744       /* Register for alloca automatic storage; this is always reg 31.
17745          Only emit this if the alloca bit was set above.  */
17746       if (frame_pointer_needed)
17747         fputs ("\t.byte 31\n", file);
17748
17749       fputs ("\t.align 2\n", file);
17750     }
17751 }
17752 \f
17753 /* A C compound statement that outputs the assembler code for a thunk
17754    function, used to implement C++ virtual function calls with
17755    multiple inheritance.  The thunk acts as a wrapper around a virtual
17756    function, adjusting the implicit object parameter before handing
17757    control off to the real function.
17758
17759    First, emit code to add the integer DELTA to the location that
17760    contains the incoming first argument.  Assume that this argument
17761    contains a pointer, and is the one used to pass the `this' pointer
17762    in C++.  This is the incoming argument *before* the function
17763    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
17764    values of all other incoming arguments.
17765
17766    After the addition, emit code to jump to FUNCTION, which is a
17767    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
17768    not touch the return address.  Hence returning from FUNCTION will
17769    return to whoever called the current `thunk'.
17770
17771    The effect must be as if FUNCTION had been called directly with the
17772    adjusted first argument.  This macro is responsible for emitting
17773    all of the code for a thunk function; output_function_prologue()
17774    and output_function_epilogue() are not invoked.
17775
17776    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
17777    been extracted from it.)  It might possibly be useful on some
17778    targets, but probably not.
17779
17780    If you do not define this macro, the target-independent code in the
17781    C++ frontend will generate a less efficient heavyweight thunk that
17782    calls FUNCTION instead of jumping to it.  The generic approach does
17783    not support varargs.  */
17784
17785 static void
17786 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
17787                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
17788                         tree function)
17789 {
17790   rtx this_rtx, insn, funexp;
17791
17792   reload_completed = 1;
17793   epilogue_completed = 1;
17794
17795   /* Mark the end of the (empty) prologue.  */
17796   emit_note (NOTE_INSN_PROLOGUE_END);
17797
17798   /* Find the "this" pointer.  If the function returns a structure,
17799      the structure return pointer is in r3.  */
17800   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
17801     this_rtx = gen_rtx_REG (Pmode, 4);
17802   else
17803     this_rtx = gen_rtx_REG (Pmode, 3);
17804
17805   /* Apply the constant offset, if required.  */
17806   if (delta)
17807     {
17808       rtx delta_rtx = GEN_INT (delta);
17809       emit_insn (TARGET_32BIT
17810                  ? gen_addsi3 (this_rtx, this_rtx, delta_rtx)
17811                  : gen_adddi3 (this_rtx, this_rtx, delta_rtx));
17812     }
17813
17814   /* Apply the offset from the vtable, if required.  */
17815   if (vcall_offset)
17816     {
17817       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
17818       rtx tmp = gen_rtx_REG (Pmode, 12);
17819
17820       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
17821       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
17822         {
17823           emit_insn (TARGET_32BIT
17824                      ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
17825                      : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
17826           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
17827         }
17828       else
17829         {
17830           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
17831
17832           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
17833         }
17834       emit_insn (TARGET_32BIT
17835                  ? gen_addsi3 (this_rtx, this_rtx, tmp)
17836                  : gen_adddi3 (this_rtx, this_rtx, tmp));
17837     }
17838
17839   /* Generate a tail call to the target function.  */
17840   if (!TREE_USED (function))
17841     {
17842       assemble_external (function);
17843       TREE_USED (function) = 1;
17844     }
17845   funexp = XEXP (DECL_RTL (function), 0);
17846   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
17847
17848 #if TARGET_MACHO
17849   if (MACHOPIC_INDIRECT)
17850     funexp = machopic_indirect_call_target (funexp);
17851 #endif
17852
17853   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
17854      generate sibcall RTL explicitly.  */
17855   insn = emit_call_insn (
17856            gen_rtx_PARALLEL (VOIDmode,
17857              gen_rtvec (4,
17858                         gen_rtx_CALL (VOIDmode,
17859                                       funexp, const0_rtx),
17860                         gen_rtx_USE (VOIDmode, const0_rtx),
17861                         gen_rtx_USE (VOIDmode,
17862                                      gen_rtx_REG (SImode,
17863                                                   LR_REGNO)),
17864                         gen_rtx_RETURN (VOIDmode))));
17865   SIBLING_CALL_P (insn) = 1;
17866   emit_barrier ();
17867
17868   /* Run just enough of rest_of_compilation to get the insns emitted.
17869      There's not really enough bulk here to make other passes such as
17870      instruction scheduling worth while.  Note that use_thunk calls
17871      assemble_start_function and assemble_end_function.  */
17872   insn = get_insns ();
17873   insn_locators_alloc ();
17874   shorten_branches (insn);
17875   final_start_function (insn, file, 1);
17876   final (insn, file, 1);
17877   final_end_function ();
17878   free_after_compilation (cfun);
17879
17880   reload_completed = 0;
17881   epilogue_completed = 0;
17882 }
17883 \f
17884 /* A quick summary of the various types of 'constant-pool tables'
17885    under PowerPC:
17886
17887    Target       Flags           Name            One table per
17888    AIX          (none)          AIX TOC         object file
17889    AIX          -mfull-toc      AIX TOC         object file
17890    AIX          -mminimal-toc   AIX minimal TOC translation unit
17891    SVR4/EABI    (none)          SVR4 SDATA      object file
17892    SVR4/EABI    -fpic           SVR4 pic        object file
17893    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
17894    SVR4/EABI    -mrelocatable   EABI TOC        function
17895    SVR4/EABI    -maix           AIX TOC         object file
17896    SVR4/EABI    -maix -mminimal-toc
17897                                 AIX minimal TOC translation unit
17898
17899    Name                 Reg.    Set by  entries       contains:
17900                                         made by  addrs? fp?     sum?
17901
17902    AIX TOC              2       crt0    as       Y      option  option
17903    AIX minimal TOC      30      prolog  gcc      Y      Y       option
17904    SVR4 SDATA           13      crt0    gcc      N      Y       N
17905    SVR4 pic             30      prolog  ld       Y      not yet N
17906    SVR4 PIC             30      prolog  gcc      Y      option  option
17907    EABI TOC             30      prolog  gcc      Y      option  option
17908
17909 */
17910
17911 /* Hash functions for the hash table.  */
17912
17913 static unsigned
17914 rs6000_hash_constant (rtx k)
17915 {
17916   enum rtx_code code = GET_CODE (k);
17917   enum machine_mode mode = GET_MODE (k);
17918   unsigned result = (code << 3) ^ mode;
17919   const char *format;
17920   int flen, fidx;
17921
17922   format = GET_RTX_FORMAT (code);
17923   flen = strlen (format);
17924   fidx = 0;
17925
17926   switch (code)
17927     {
17928     case LABEL_REF:
17929       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
17930
17931     case CONST_DOUBLE:
17932       if (mode != VOIDmode)
17933         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
17934       flen = 2;
17935       break;
17936
17937     case CODE_LABEL:
17938       fidx = 3;
17939       break;
17940
17941     default:
17942       break;
17943     }
17944
17945   for (; fidx < flen; fidx++)
17946     switch (format[fidx])
17947       {
17948       case 's':
17949         {
17950           unsigned i, len;
17951           const char *str = XSTR (k, fidx);
17952           len = strlen (str);
17953           result = result * 613 + len;
17954           for (i = 0; i < len; i++)
17955             result = result * 613 + (unsigned) str[i];
17956           break;
17957         }
17958       case 'u':
17959       case 'e':
17960         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
17961         break;
17962       case 'i':
17963       case 'n':
17964         result = result * 613 + (unsigned) XINT (k, fidx);
17965         break;
17966       case 'w':
17967         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
17968           result = result * 613 + (unsigned) XWINT (k, fidx);
17969         else
17970           {
17971             size_t i;
17972             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
17973               result = result * 613 + (unsigned) (XWINT (k, fidx)
17974                                                   >> CHAR_BIT * i);
17975           }
17976         break;
17977       case '0':
17978         break;
17979       default:
17980         gcc_unreachable ();
17981       }
17982
17983   return result;
17984 }
17985
17986 static unsigned
17987 toc_hash_function (const void *hash_entry)
17988 {
17989   const struct toc_hash_struct *thc =
17990     (const struct toc_hash_struct *) hash_entry;
17991   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
17992 }
17993
17994 /* Compare H1 and H2 for equivalence.  */
17995
17996 static int
17997 toc_hash_eq (const void *h1, const void *h2)
17998 {
17999   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
18000   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
18001
18002   if (((const struct toc_hash_struct *) h1)->key_mode
18003       != ((const struct toc_hash_struct *) h2)->key_mode)
18004     return 0;
18005
18006   return rtx_equal_p (r1, r2);
18007 }
18008
18009 /* These are the names given by the C++ front-end to vtables, and
18010    vtable-like objects.  Ideally, this logic should not be here;
18011    instead, there should be some programmatic way of inquiring as
18012    to whether or not an object is a vtable.  */
18013
18014 #define VTABLE_NAME_P(NAME)                             \
18015   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
18016   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
18017   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
18018   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
18019   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
18020
18021 #ifdef NO_DOLLAR_IN_LABEL
18022 /* Return a GGC-allocated character string translating dollar signs in
18023    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
18024
18025 const char *
18026 rs6000_xcoff_strip_dollar (const char *name)
18027 {
18028   char *strip, *p;
18029   int len;
18030
18031   p = strchr (name, '$');
18032
18033   if (p == 0 || p == name)
18034     return name;
18035
18036   len = strlen (name);
18037   strip = (char *) alloca (len + 1);
18038   strcpy (strip, name);
18039   p = strchr (strip, '$');
18040   while (p)
18041     {
18042       *p = '_';
18043       p = strchr (p + 1, '$');
18044     }
18045
18046   return ggc_alloc_string (strip, len);
18047 }
18048 #endif
18049
18050 void
18051 rs6000_output_symbol_ref (FILE *file, rtx x)
18052 {
18053   /* Currently C++ toc references to vtables can be emitted before it
18054      is decided whether the vtable is public or private.  If this is
18055      the case, then the linker will eventually complain that there is
18056      a reference to an unknown section.  Thus, for vtables only,
18057      we emit the TOC reference to reference the symbol and not the
18058      section.  */
18059   const char *name = XSTR (x, 0);
18060
18061   if (VTABLE_NAME_P (name))
18062     {
18063       RS6000_OUTPUT_BASENAME (file, name);
18064     }
18065   else
18066     assemble_name (file, name);
18067 }
18068
18069 /* Output a TOC entry.  We derive the entry name from what is being
18070    written.  */
18071
18072 void
18073 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
18074 {
18075   char buf[256];
18076   const char *name = buf;
18077   rtx base = x;
18078   HOST_WIDE_INT offset = 0;
18079
18080   gcc_assert (!TARGET_NO_TOC);
18081
18082   /* When the linker won't eliminate them, don't output duplicate
18083      TOC entries (this happens on AIX if there is any kind of TOC,
18084      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
18085      CODE_LABELs.  */
18086   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
18087     {
18088       struct toc_hash_struct *h;
18089       void * * found;
18090
18091       /* Create toc_hash_table.  This can't be done at OVERRIDE_OPTIONS
18092          time because GGC is not initialized at that point.  */
18093       if (toc_hash_table == NULL)
18094         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
18095                                           toc_hash_eq, NULL);
18096
18097       h = GGC_NEW (struct toc_hash_struct);
18098       h->key = x;
18099       h->key_mode = mode;
18100       h->labelno = labelno;
18101
18102       found = htab_find_slot (toc_hash_table, h, INSERT);
18103       if (*found == NULL)
18104         *found = h;
18105       else  /* This is indeed a duplicate.
18106                Set this label equal to that label.  */
18107         {
18108           fputs ("\t.set ", file);
18109           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
18110           fprintf (file, "%d,", labelno);
18111           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
18112           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
18113                                               found)->labelno));
18114           return;
18115         }
18116     }
18117
18118   /* If we're going to put a double constant in the TOC, make sure it's
18119      aligned properly when strict alignment is on.  */
18120   if (GET_CODE (x) == CONST_DOUBLE
18121       && STRICT_ALIGNMENT
18122       && GET_MODE_BITSIZE (mode) >= 64
18123       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
18124     ASM_OUTPUT_ALIGN (file, 3);
18125   }
18126
18127   (*targetm.asm_out.internal_label) (file, "LC", labelno);
18128
18129   /* Handle FP constants specially.  Note that if we have a minimal
18130      TOC, things we put here aren't actually in the TOC, so we can allow
18131      FP constants.  */
18132   if (GET_CODE (x) == CONST_DOUBLE &&
18133       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
18134     {
18135       REAL_VALUE_TYPE rv;
18136       long k[4];
18137
18138       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
18139       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
18140         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
18141       else
18142         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
18143
18144       if (TARGET_64BIT)
18145         {
18146           if (TARGET_MINIMAL_TOC)
18147             fputs (DOUBLE_INT_ASM_OP, file);
18148           else
18149             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
18150                      k[0] & 0xffffffff, k[1] & 0xffffffff,
18151                      k[2] & 0xffffffff, k[3] & 0xffffffff);
18152           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
18153                    k[0] & 0xffffffff, k[1] & 0xffffffff,
18154                    k[2] & 0xffffffff, k[3] & 0xffffffff);
18155           return;
18156         }
18157       else
18158         {
18159           if (TARGET_MINIMAL_TOC)
18160             fputs ("\t.long ", file);
18161           else
18162             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
18163                      k[0] & 0xffffffff, k[1] & 0xffffffff,
18164                      k[2] & 0xffffffff, k[3] & 0xffffffff);
18165           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
18166                    k[0] & 0xffffffff, k[1] & 0xffffffff,
18167                    k[2] & 0xffffffff, k[3] & 0xffffffff);
18168           return;
18169         }
18170     }
18171   else if (GET_CODE (x) == CONST_DOUBLE &&
18172            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
18173     {
18174       REAL_VALUE_TYPE rv;
18175       long k[2];
18176
18177       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
18178
18179       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
18180         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
18181       else
18182         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
18183
18184       if (TARGET_64BIT)
18185         {
18186           if (TARGET_MINIMAL_TOC)
18187             fputs (DOUBLE_INT_ASM_OP, file);
18188           else
18189             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
18190                      k[0] & 0xffffffff, k[1] & 0xffffffff);
18191           fprintf (file, "0x%lx%08lx\n",
18192                    k[0] & 0xffffffff, k[1] & 0xffffffff);
18193           return;
18194         }
18195       else
18196         {
18197           if (TARGET_MINIMAL_TOC)
18198             fputs ("\t.long ", file);
18199           else
18200             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
18201                      k[0] & 0xffffffff, k[1] & 0xffffffff);
18202           fprintf (file, "0x%lx,0x%lx\n",
18203                    k[0] & 0xffffffff, k[1] & 0xffffffff);
18204           return;
18205         }
18206     }
18207   else if (GET_CODE (x) == CONST_DOUBLE &&
18208            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
18209     {
18210       REAL_VALUE_TYPE rv;
18211       long l;
18212
18213       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
18214       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
18215         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
18216       else
18217         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
18218
18219       if (TARGET_64BIT)
18220         {
18221           if (TARGET_MINIMAL_TOC)
18222             fputs (DOUBLE_INT_ASM_OP, file);
18223           else
18224             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
18225           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
18226           return;
18227         }
18228       else
18229         {
18230           if (TARGET_MINIMAL_TOC)
18231             fputs ("\t.long ", file);
18232           else
18233             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
18234           fprintf (file, "0x%lx\n", l & 0xffffffff);
18235           return;
18236         }
18237     }
18238   else if (GET_MODE (x) == VOIDmode
18239            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
18240     {
18241       unsigned HOST_WIDE_INT low;
18242       HOST_WIDE_INT high;
18243
18244       if (GET_CODE (x) == CONST_DOUBLE)
18245         {
18246           low = CONST_DOUBLE_LOW (x);
18247           high = CONST_DOUBLE_HIGH (x);
18248         }
18249       else
18250 #if HOST_BITS_PER_WIDE_INT == 32
18251         {
18252           low = INTVAL (x);
18253           high = (low & 0x80000000) ? ~0 : 0;
18254         }
18255 #else
18256         {
18257           low = INTVAL (x) & 0xffffffff;
18258           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
18259         }
18260 #endif
18261
18262       /* TOC entries are always Pmode-sized, but since this
18263          is a bigendian machine then if we're putting smaller
18264          integer constants in the TOC we have to pad them.
18265          (This is still a win over putting the constants in
18266          a separate constant pool, because then we'd have
18267          to have both a TOC entry _and_ the actual constant.)
18268
18269          For a 32-bit target, CONST_INT values are loaded and shifted
18270          entirely within `low' and can be stored in one TOC entry.  */
18271
18272       /* It would be easy to make this work, but it doesn't now.  */
18273       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
18274
18275       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
18276         {
18277 #if HOST_BITS_PER_WIDE_INT == 32
18278           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
18279                          POINTER_SIZE, &low, &high, 0);
18280 #else
18281           low |= high << 32;
18282           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
18283           high = (HOST_WIDE_INT) low >> 32;
18284           low &= 0xffffffff;
18285 #endif
18286         }
18287
18288       if (TARGET_64BIT)
18289         {
18290           if (TARGET_MINIMAL_TOC)
18291             fputs (DOUBLE_INT_ASM_OP, file);
18292           else
18293             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
18294                      (long) high & 0xffffffff, (long) low & 0xffffffff);
18295           fprintf (file, "0x%lx%08lx\n",
18296                    (long) high & 0xffffffff, (long) low & 0xffffffff);
18297           return;
18298         }
18299       else
18300         {
18301           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
18302             {
18303               if (TARGET_MINIMAL_TOC)
18304                 fputs ("\t.long ", file);
18305               else
18306                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
18307                          (long) high & 0xffffffff, (long) low & 0xffffffff);
18308               fprintf (file, "0x%lx,0x%lx\n",
18309                        (long) high & 0xffffffff, (long) low & 0xffffffff);
18310             }
18311           else
18312             {
18313               if (TARGET_MINIMAL_TOC)
18314                 fputs ("\t.long ", file);
18315               else
18316                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
18317               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
18318             }
18319           return;
18320         }
18321     }
18322
18323   if (GET_CODE (x) == CONST)
18324     {
18325       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS);
18326
18327       base = XEXP (XEXP (x, 0), 0);
18328       offset = INTVAL (XEXP (XEXP (x, 0), 1));
18329     }
18330
18331   switch (GET_CODE (base))
18332     {
18333     case SYMBOL_REF:
18334       name = XSTR (base, 0);
18335       break;
18336
18337     case LABEL_REF:
18338       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
18339                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
18340       break;
18341
18342     case CODE_LABEL:
18343       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
18344       break;
18345
18346     default:
18347       gcc_unreachable ();
18348     }
18349
18350   if (TARGET_MINIMAL_TOC)
18351     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
18352   else
18353     {
18354       fputs ("\t.tc ", file);
18355       RS6000_OUTPUT_BASENAME (file, name);
18356
18357       if (offset < 0)
18358         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
18359       else if (offset)
18360         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
18361
18362       fputs ("[TC],", file);
18363     }
18364
18365   /* Currently C++ toc references to vtables can be emitted before it
18366      is decided whether the vtable is public or private.  If this is
18367      the case, then the linker will eventually complain that there is
18368      a TOC reference to an unknown section.  Thus, for vtables only,
18369      we emit the TOC reference to reference the symbol and not the
18370      section.  */
18371   if (VTABLE_NAME_P (name))
18372     {
18373       RS6000_OUTPUT_BASENAME (file, name);
18374       if (offset < 0)
18375         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
18376       else if (offset > 0)
18377         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
18378     }
18379   else
18380     output_addr_const (file, x);
18381   putc ('\n', file);
18382 }
18383 \f
18384 /* Output an assembler pseudo-op to write an ASCII string of N characters
18385    starting at P to FILE.
18386
18387    On the RS/6000, we have to do this using the .byte operation and
18388    write out special characters outside the quoted string.
18389    Also, the assembler is broken; very long strings are truncated,
18390    so we must artificially break them up early.  */
18391
18392 void
18393 output_ascii (FILE *file, const char *p, int n)
18394 {
18395   char c;
18396   int i, count_string;
18397   const char *for_string = "\t.byte \"";
18398   const char *for_decimal = "\t.byte ";
18399   const char *to_close = NULL;
18400
18401   count_string = 0;
18402   for (i = 0; i < n; i++)
18403     {
18404       c = *p++;
18405       if (c >= ' ' && c < 0177)
18406         {
18407           if (for_string)
18408             fputs (for_string, file);
18409           putc (c, file);
18410
18411           /* Write two quotes to get one.  */
18412           if (c == '"')
18413             {
18414               putc (c, file);
18415               ++count_string;
18416             }
18417
18418           for_string = NULL;
18419           for_decimal = "\"\n\t.byte ";
18420           to_close = "\"\n";
18421           ++count_string;
18422
18423           if (count_string >= 512)
18424             {
18425               fputs (to_close, file);
18426
18427               for_string = "\t.byte \"";
18428               for_decimal = "\t.byte ";
18429               to_close = NULL;
18430               count_string = 0;
18431             }
18432         }
18433       else
18434         {
18435           if (for_decimal)
18436             fputs (for_decimal, file);
18437           fprintf (file, "%d", c);
18438
18439           for_string = "\n\t.byte \"";
18440           for_decimal = ", ";
18441           to_close = "\n";
18442           count_string = 0;
18443         }
18444     }
18445
18446   /* Now close the string if we have written one.  Then end the line.  */
18447   if (to_close)
18448     fputs (to_close, file);
18449 }
18450 \f
18451 /* Generate a unique section name for FILENAME for a section type
18452    represented by SECTION_DESC.  Output goes into BUF.
18453
18454    SECTION_DESC can be any string, as long as it is different for each
18455    possible section type.
18456
18457    We name the section in the same manner as xlc.  The name begins with an
18458    underscore followed by the filename (after stripping any leading directory
18459    names) with the last period replaced by the string SECTION_DESC.  If
18460    FILENAME does not contain a period, SECTION_DESC is appended to the end of
18461    the name.  */
18462
18463 void
18464 rs6000_gen_section_name (char **buf, const char *filename,
18465                          const char *section_desc)
18466 {
18467   const char *q, *after_last_slash, *last_period = 0;
18468   char *p;
18469   int len;
18470
18471   after_last_slash = filename;
18472   for (q = filename; *q; q++)
18473     {
18474       if (*q == '/')
18475         after_last_slash = q + 1;
18476       else if (*q == '.')
18477         last_period = q;
18478     }
18479
18480   len = strlen (after_last_slash) + strlen (section_desc) + 2;
18481   *buf = (char *) xmalloc (len);
18482
18483   p = *buf;
18484   *p++ = '_';
18485
18486   for (q = after_last_slash; *q; q++)
18487     {
18488       if (q == last_period)
18489         {
18490           strcpy (p, section_desc);
18491           p += strlen (section_desc);
18492           break;
18493         }
18494
18495       else if (ISALNUM (*q))
18496         *p++ = *q;
18497     }
18498
18499   if (last_period == 0)
18500     strcpy (p, section_desc);
18501   else
18502     *p = '\0';
18503 }
18504 \f
18505 /* Emit profile function.  */
18506
18507 void
18508 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
18509 {
18510   /* Non-standard profiling for kernels, which just saves LR then calls
18511      _mcount without worrying about arg saves.  The idea is to change
18512      the function prologue as little as possible as it isn't easy to
18513      account for arg save/restore code added just for _mcount.  */
18514   if (TARGET_PROFILE_KERNEL)
18515     return;
18516
18517   if (DEFAULT_ABI == ABI_AIX)
18518     {
18519 #ifndef NO_PROFILE_COUNTERS
18520 # define NO_PROFILE_COUNTERS 0
18521 #endif
18522       if (NO_PROFILE_COUNTERS)
18523         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
18524                            LCT_NORMAL, VOIDmode, 0);
18525       else
18526         {
18527           char buf[30];
18528           const char *label_name;
18529           rtx fun;
18530
18531           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
18532           label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
18533           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
18534
18535           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
18536                              LCT_NORMAL, VOIDmode, 1, fun, Pmode);
18537         }
18538     }
18539   else if (DEFAULT_ABI == ABI_DARWIN)
18540     {
18541       const char *mcount_name = RS6000_MCOUNT;
18542       int caller_addr_regno = LR_REGNO;
18543
18544       /* Be conservative and always set this, at least for now.  */
18545       crtl->uses_pic_offset_table = 1;
18546
18547 #if TARGET_MACHO
18548       /* For PIC code, set up a stub and collect the caller's address
18549          from r0, which is where the prologue puts it.  */
18550       if (MACHOPIC_INDIRECT
18551           && crtl->uses_pic_offset_table)
18552         caller_addr_regno = 0;
18553 #endif
18554       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
18555                          LCT_NORMAL, VOIDmode, 1,
18556                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
18557     }
18558 }
18559
18560 /* Write function profiler code.  */
18561
18562 void
18563 output_function_profiler (FILE *file, int labelno)
18564 {
18565   char buf[100];
18566
18567   switch (DEFAULT_ABI)
18568     {
18569     default:
18570       gcc_unreachable ();
18571
18572     case ABI_V4:
18573       if (!TARGET_32BIT)
18574         {
18575           warning (0, "no profiling of 64-bit code for this ABI");
18576           return;
18577         }
18578       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
18579       fprintf (file, "\tmflr %s\n", reg_names[0]);
18580       if (NO_PROFILE_COUNTERS)
18581         {
18582           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
18583                        reg_names[0], reg_names[1]);
18584         }
18585       else if (TARGET_SECURE_PLT && flag_pic)
18586         {
18587           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
18588                        reg_names[0], reg_names[1]);
18589           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
18590           asm_fprintf (file, "\t{cau|addis} %s,%s,",
18591                        reg_names[12], reg_names[12]);
18592           assemble_name (file, buf);
18593           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
18594           assemble_name (file, buf);
18595           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
18596         }
18597       else if (flag_pic == 1)
18598         {
18599           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
18600           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
18601                        reg_names[0], reg_names[1]);
18602           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
18603           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
18604           assemble_name (file, buf);
18605           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
18606         }
18607       else if (flag_pic > 1)
18608         {
18609           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
18610                        reg_names[0], reg_names[1]);
18611           /* Now, we need to get the address of the label.  */
18612           fputs ("\tbcl 20,31,1f\n\t.long ", file);
18613           assemble_name (file, buf);
18614           fputs ("-.\n1:", file);
18615           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
18616           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
18617                        reg_names[0], reg_names[11]);
18618           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
18619                        reg_names[0], reg_names[0], reg_names[11]);
18620         }
18621       else
18622         {
18623           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
18624           assemble_name (file, buf);
18625           fputs ("@ha\n", file);
18626           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
18627                        reg_names[0], reg_names[1]);
18628           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
18629           assemble_name (file, buf);
18630           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
18631         }
18632
18633       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
18634       fprintf (file, "\tbl %s%s\n",
18635                RS6000_MCOUNT, flag_pic ? "@plt" : "");
18636       break;
18637
18638     case ABI_AIX:
18639     case ABI_DARWIN:
18640       if (!TARGET_PROFILE_KERNEL)
18641         {
18642           /* Don't do anything, done in output_profile_hook ().  */
18643         }
18644       else
18645         {
18646           gcc_assert (!TARGET_32BIT);
18647
18648           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
18649           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
18650
18651           if (cfun->static_chain_decl != NULL)
18652             {
18653               asm_fprintf (file, "\tstd %s,24(%s)\n",
18654                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
18655               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
18656               asm_fprintf (file, "\tld %s,24(%s)\n",
18657                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
18658             }
18659           else
18660             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
18661         }
18662       break;
18663     }
18664 }
18665
18666 \f
18667
18668 /* The following variable value is the last issued insn.  */
18669
18670 static rtx last_scheduled_insn;
18671
18672 /* The following variable helps to balance issuing of load and
18673    store instructions */
18674
18675 static int load_store_pendulum;
18676
18677 /* Power4 load update and store update instructions are cracked into a
18678    load or store and an integer insn which are executed in the same cycle.
18679    Branches have their own dispatch slot which does not count against the
18680    GCC issue rate, but it changes the program flow so there are no other
18681    instructions to issue in this cycle.  */
18682
18683 static int
18684 rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
18685                        int verbose ATTRIBUTE_UNUSED,
18686                        rtx insn, int more)
18687 {
18688   last_scheduled_insn = insn;
18689   if (GET_CODE (PATTERN (insn)) == USE
18690       || GET_CODE (PATTERN (insn)) == CLOBBER)
18691     {
18692       cached_can_issue_more = more;
18693       return cached_can_issue_more;
18694     }
18695
18696   if (insn_terminates_group_p (insn, current_group))
18697     {
18698       cached_can_issue_more = 0;
18699       return cached_can_issue_more;
18700     }
18701
18702   /* If no reservation, but reach here */
18703   if (recog_memoized (insn) < 0)
18704     return more;
18705
18706   if (rs6000_sched_groups)
18707     {
18708       if (is_microcoded_insn (insn))
18709         cached_can_issue_more = 0;
18710       else if (is_cracked_insn (insn))
18711         cached_can_issue_more = more > 2 ? more - 2 : 0;
18712       else
18713         cached_can_issue_more = more - 1;
18714
18715       return cached_can_issue_more;
18716     }
18717
18718   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
18719     return 0;
18720
18721   cached_can_issue_more = more - 1;
18722   return cached_can_issue_more;
18723 }
18724
18725 /* Adjust the cost of a scheduling dependency.  Return the new cost of
18726    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
18727
18728 static int
18729 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
18730 {
18731   enum attr_type attr_type;
18732
18733   if (! recog_memoized (insn))
18734     return 0;
18735
18736   switch (REG_NOTE_KIND (link))
18737     {
18738     case REG_DEP_TRUE:
18739       {
18740         /* Data dependency; DEP_INSN writes a register that INSN reads
18741            some cycles later.  */
18742
18743         /* Separate a load from a narrower, dependent store.  */
18744         if (rs6000_sched_groups
18745             && GET_CODE (PATTERN (insn)) == SET
18746             && GET_CODE (PATTERN (dep_insn)) == SET
18747             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
18748             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
18749             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
18750                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
18751           return cost + 14;
18752
18753         attr_type = get_attr_type (insn);
18754
18755         switch (attr_type)
18756           {
18757           case TYPE_JMPREG:
18758             /* Tell the first scheduling pass about the latency between
18759                a mtctr and bctr (and mtlr and br/blr).  The first
18760                scheduling pass will not know about this latency since
18761                the mtctr instruction, which has the latency associated
18762                to it, will be generated by reload.  */
18763             return TARGET_POWER ? 5 : 4;
18764           case TYPE_BRANCH:
18765             /* Leave some extra cycles between a compare and its
18766                dependent branch, to inhibit expensive mispredicts.  */
18767             if ((rs6000_cpu_attr == CPU_PPC603
18768                  || rs6000_cpu_attr == CPU_PPC604
18769                  || rs6000_cpu_attr == CPU_PPC604E
18770                  || rs6000_cpu_attr == CPU_PPC620
18771                  || rs6000_cpu_attr == CPU_PPC630
18772                  || rs6000_cpu_attr == CPU_PPC750
18773                  || rs6000_cpu_attr == CPU_PPC7400
18774                  || rs6000_cpu_attr == CPU_PPC7450
18775                  || rs6000_cpu_attr == CPU_POWER4
18776                  || rs6000_cpu_attr == CPU_POWER5
18777                  || rs6000_cpu_attr == CPU_CELL)
18778                 && recog_memoized (dep_insn)
18779                 && (INSN_CODE (dep_insn) >= 0))
18780
18781               switch (get_attr_type (dep_insn))
18782                 {
18783                 case TYPE_CMP:
18784                 case TYPE_COMPARE:
18785                 case TYPE_DELAYED_COMPARE:
18786                 case TYPE_IMUL_COMPARE:
18787                 case TYPE_LMUL_COMPARE:
18788                 case TYPE_FPCOMPARE:
18789                 case TYPE_CR_LOGICAL:
18790                 case TYPE_DELAYED_CR:
18791                     return cost + 2;
18792                 default:
18793                   break;
18794                 }
18795             break;
18796
18797           case TYPE_STORE:
18798           case TYPE_STORE_U:
18799           case TYPE_STORE_UX:
18800           case TYPE_FPSTORE:
18801           case TYPE_FPSTORE_U:
18802           case TYPE_FPSTORE_UX:
18803             if ((rs6000_cpu == PROCESSOR_POWER6)
18804                 && recog_memoized (dep_insn)
18805                 && (INSN_CODE (dep_insn) >= 0))
18806               {
18807
18808                 if (GET_CODE (PATTERN (insn)) != SET)
18809                   /* If this happens, we have to extend this to schedule
18810                      optimally.  Return default for now.  */
18811                   return cost;
18812
18813                 /* Adjust the cost for the case where the value written
18814                    by a fixed point operation is used as the address
18815                    gen value on a store. */
18816                 switch (get_attr_type (dep_insn))
18817                   {
18818                   case TYPE_LOAD:
18819                   case TYPE_LOAD_U:
18820                   case TYPE_LOAD_UX:
18821                   case TYPE_CNTLZ:
18822                     {
18823                       if (! store_data_bypass_p (dep_insn, insn))
18824                         return 4;
18825                       break;
18826                     }
18827                   case TYPE_LOAD_EXT:
18828                   case TYPE_LOAD_EXT_U:
18829                   case TYPE_LOAD_EXT_UX:
18830                   case TYPE_VAR_SHIFT_ROTATE:
18831                   case TYPE_VAR_DELAYED_COMPARE:
18832                     {
18833                       if (! store_data_bypass_p (dep_insn, insn))
18834                         return 6;
18835                       break;
18836                       }
18837                   case TYPE_INTEGER:
18838                   case TYPE_COMPARE:
18839                   case TYPE_FAST_COMPARE:
18840                   case TYPE_EXTS:
18841                   case TYPE_SHIFT:
18842                   case TYPE_INSERT_WORD:
18843                   case TYPE_INSERT_DWORD:
18844                   case TYPE_FPLOAD_U:
18845                   case TYPE_FPLOAD_UX:
18846                   case TYPE_STORE_U:
18847                   case TYPE_STORE_UX:
18848                   case TYPE_FPSTORE_U:
18849                   case TYPE_FPSTORE_UX:
18850                     {
18851                       if (! store_data_bypass_p (dep_insn, insn))
18852                         return 3;
18853                       break;
18854                     }
18855                   case TYPE_IMUL:
18856                   case TYPE_IMUL2:
18857                   case TYPE_IMUL3:
18858                   case TYPE_LMUL:
18859                   case TYPE_IMUL_COMPARE:
18860                   case TYPE_LMUL_COMPARE:
18861                     {
18862                       if (! store_data_bypass_p (dep_insn, insn))
18863                         return 17;
18864                       break;
18865                     }
18866                   case TYPE_IDIV:
18867                     {
18868                       if (! store_data_bypass_p (dep_insn, insn))
18869                         return 45;
18870                       break;
18871                     }
18872                   case TYPE_LDIV:
18873                     {
18874                       if (! store_data_bypass_p (dep_insn, insn))
18875                         return 57;
18876                       break;
18877                     }
18878                   default:
18879                     break;
18880                   }
18881               }
18882               break;
18883
18884           case TYPE_LOAD:
18885           case TYPE_LOAD_U:
18886           case TYPE_LOAD_UX:
18887           case TYPE_LOAD_EXT:
18888           case TYPE_LOAD_EXT_U:
18889           case TYPE_LOAD_EXT_UX:
18890             if ((rs6000_cpu == PROCESSOR_POWER6)
18891                 && recog_memoized (dep_insn)
18892                 && (INSN_CODE (dep_insn) >= 0))
18893               {
18894
18895                 /* Adjust the cost for the case where the value written
18896                    by a fixed point instruction is used within the address
18897                    gen portion of a subsequent load(u)(x) */
18898                 switch (get_attr_type (dep_insn))
18899                   {
18900                   case TYPE_LOAD:
18901                   case TYPE_LOAD_U:
18902                   case TYPE_LOAD_UX:
18903                   case TYPE_CNTLZ:
18904                     {
18905                       if (set_to_load_agen (dep_insn, insn))
18906                         return 4;
18907                       break;
18908                     }
18909                   case TYPE_LOAD_EXT:
18910                   case TYPE_LOAD_EXT_U:
18911                   case TYPE_LOAD_EXT_UX:
18912                   case TYPE_VAR_SHIFT_ROTATE:
18913                   case TYPE_VAR_DELAYED_COMPARE:
18914                     {
18915                       if (set_to_load_agen (dep_insn, insn))
18916                         return 6;
18917                       break;
18918                     }
18919                   case TYPE_INTEGER:
18920                   case TYPE_COMPARE:
18921                   case TYPE_FAST_COMPARE:
18922                   case TYPE_EXTS:
18923                   case TYPE_SHIFT:
18924                   case TYPE_INSERT_WORD:
18925                   case TYPE_INSERT_DWORD:
18926                   case TYPE_FPLOAD_U:
18927                   case TYPE_FPLOAD_UX:
18928                   case TYPE_STORE_U:
18929                   case TYPE_STORE_UX:
18930                   case TYPE_FPSTORE_U:
18931                   case TYPE_FPSTORE_UX:
18932                     {
18933                       if (set_to_load_agen (dep_insn, insn))
18934                         return 3;
18935                       break;
18936                     }
18937                   case TYPE_IMUL:
18938                   case TYPE_IMUL2:
18939                   case TYPE_IMUL3:
18940                   case TYPE_LMUL:
18941                   case TYPE_IMUL_COMPARE:
18942                   case TYPE_LMUL_COMPARE:
18943                     {
18944                       if (set_to_load_agen (dep_insn, insn))
18945                         return 17;
18946                       break;
18947                     }
18948                   case TYPE_IDIV:
18949                     {
18950                       if (set_to_load_agen (dep_insn, insn))
18951                         return 45;
18952                       break;
18953                     }
18954                   case TYPE_LDIV:
18955                     {
18956                       if (set_to_load_agen (dep_insn, insn))
18957                         return 57;
18958                       break;
18959                     }
18960                   default:
18961                     break;
18962                   }
18963               }
18964             break;
18965
18966           case TYPE_FPLOAD:
18967             if ((rs6000_cpu == PROCESSOR_POWER6)
18968                 && recog_memoized (dep_insn)
18969                 && (INSN_CODE (dep_insn) >= 0)
18970                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
18971               return 2;
18972
18973           default:
18974             break;
18975           }
18976
18977       /* Fall out to return default cost.  */
18978       }
18979       break;
18980
18981     case REG_DEP_OUTPUT:
18982       /* Output dependency; DEP_INSN writes a register that INSN writes some
18983          cycles later.  */
18984       if ((rs6000_cpu == PROCESSOR_POWER6)
18985           && recog_memoized (dep_insn)
18986           && (INSN_CODE (dep_insn) >= 0))
18987         {
18988           attr_type = get_attr_type (insn);
18989
18990           switch (attr_type)
18991             {
18992             case TYPE_FP:
18993               if (get_attr_type (dep_insn) == TYPE_FP)
18994                 return 1;
18995               break;
18996             case TYPE_FPLOAD:
18997               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
18998                 return 2;
18999               break;
19000             default:
19001               break;
19002             }
19003         }
19004     case REG_DEP_ANTI:
19005       /* Anti dependency; DEP_INSN reads a register that INSN writes some
19006          cycles later.  */
19007       return 0;
19008
19009     default:
19010       gcc_unreachable ();
19011     }
19012
19013   return cost;
19014 }
19015
19016 /* The function returns a true if INSN is microcoded.
19017    Return false otherwise.  */
19018
19019 static bool
19020 is_microcoded_insn (rtx insn)
19021 {
19022   if (!insn || !INSN_P (insn)
19023       || GET_CODE (PATTERN (insn)) == USE
19024       || GET_CODE (PATTERN (insn)) == CLOBBER)
19025     return false;
19026
19027   if (rs6000_cpu_attr == CPU_CELL)
19028     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
19029
19030   if (rs6000_sched_groups)
19031     {
19032       enum attr_type type = get_attr_type (insn);
19033       if (type == TYPE_LOAD_EXT_U
19034           || type == TYPE_LOAD_EXT_UX
19035           || type == TYPE_LOAD_UX
19036           || type == TYPE_STORE_UX
19037           || type == TYPE_MFCR)
19038         return true;
19039     }
19040
19041   return false;
19042 }
19043
19044 /* The function returns true if INSN is cracked into 2 instructions
19045    by the processor (and therefore occupies 2 issue slots).  */
19046
19047 static bool
19048 is_cracked_insn (rtx insn)
19049 {
19050   if (!insn || !INSN_P (insn)
19051       || GET_CODE (PATTERN (insn)) == USE
19052       || GET_CODE (PATTERN (insn)) == CLOBBER)
19053     return false;
19054
19055   if (rs6000_sched_groups)
19056     {
19057       enum attr_type type = get_attr_type (insn);
19058       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
19059           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
19060           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
19061           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
19062           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
19063           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
19064           || type == TYPE_IDIV || type == TYPE_LDIV
19065           || type == TYPE_INSERT_WORD)
19066         return true;
19067     }
19068
19069   return false;
19070 }
19071
19072 /* The function returns true if INSN can be issued only from
19073    the branch slot.  */
19074
19075 static bool
19076 is_branch_slot_insn (rtx insn)
19077 {
19078   if (!insn || !INSN_P (insn)
19079       || GET_CODE (PATTERN (insn)) == USE
19080       || GET_CODE (PATTERN (insn)) == CLOBBER)
19081     return false;
19082
19083   if (rs6000_sched_groups)
19084     {
19085       enum attr_type type = get_attr_type (insn);
19086       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
19087         return true;
19088       return false;
19089     }
19090
19091   return false;
19092 }
19093
19094 /* The function returns true if out_inst sets a value that is
19095    used in the address generation computation of in_insn */
19096 static bool
19097 set_to_load_agen (rtx out_insn, rtx in_insn)
19098 {
19099   rtx out_set, in_set;
19100
19101   /* For performance reasons, only handle the simple case where
19102      both loads are a single_set. */
19103   out_set = single_set (out_insn);
19104   if (out_set)
19105     {
19106       in_set = single_set (in_insn);
19107       if (in_set)
19108         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
19109     }
19110
19111   return false;
19112 }
19113
19114 /* The function returns true if the target storage location of
19115    out_insn is adjacent to the target storage location of in_insn */
19116 /* Return 1 if memory locations are adjacent.  */
19117
19118 static bool
19119 adjacent_mem_locations (rtx insn1, rtx insn2)
19120 {
19121
19122   rtx a = get_store_dest (PATTERN (insn1));
19123   rtx b = get_store_dest (PATTERN (insn2));
19124
19125   if ((GET_CODE (XEXP (a, 0)) == REG
19126        || (GET_CODE (XEXP (a, 0)) == PLUS
19127            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
19128       && (GET_CODE (XEXP (b, 0)) == REG
19129           || (GET_CODE (XEXP (b, 0)) == PLUS
19130               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
19131     {
19132       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
19133       rtx reg0, reg1;
19134
19135       if (GET_CODE (XEXP (a, 0)) == PLUS)
19136         {
19137           reg0 = XEXP (XEXP (a, 0), 0);
19138           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
19139         }
19140       else
19141         reg0 = XEXP (a, 0);
19142
19143       if (GET_CODE (XEXP (b, 0)) == PLUS)
19144         {
19145           reg1 = XEXP (XEXP (b, 0), 0);
19146           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
19147         }
19148       else
19149         reg1 = XEXP (b, 0);
19150
19151       val_diff = val1 - val0;
19152
19153       return ((REGNO (reg0) == REGNO (reg1))
19154               && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
19155                   || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
19156     }
19157
19158   return false;
19159 }
19160
19161 /* A C statement (sans semicolon) to update the integer scheduling
19162    priority INSN_PRIORITY (INSN). Increase the priority to execute the
19163    INSN earlier, reduce the priority to execute INSN later.  Do not
19164    define this macro if you do not need to adjust the scheduling
19165    priorities of insns.  */
19166
19167 static int
19168 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
19169 {
19170   /* On machines (like the 750) which have asymmetric integer units,
19171      where one integer unit can do multiply and divides and the other
19172      can't, reduce the priority of multiply/divide so it is scheduled
19173      before other integer operations.  */
19174
19175 #if 0
19176   if (! INSN_P (insn))
19177     return priority;
19178
19179   if (GET_CODE (PATTERN (insn)) == USE)
19180     return priority;
19181
19182   switch (rs6000_cpu_attr) {
19183   case CPU_PPC750:
19184     switch (get_attr_type (insn))
19185       {
19186       default:
19187         break;
19188
19189       case TYPE_IMUL:
19190       case TYPE_IDIV:
19191         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
19192                  priority, priority);
19193         if (priority >= 0 && priority < 0x01000000)
19194           priority >>= 3;
19195         break;
19196       }
19197   }
19198 #endif
19199
19200   if (insn_must_be_first_in_group (insn)
19201       && reload_completed
19202       && current_sched_info->sched_max_insns_priority
19203       && rs6000_sched_restricted_insns_priority)
19204     {
19205
19206       /* Prioritize insns that can be dispatched only in the first
19207          dispatch slot.  */
19208       if (rs6000_sched_restricted_insns_priority == 1)
19209         /* Attach highest priority to insn. This means that in
19210            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
19211            precede 'priority' (critical path) considerations.  */
19212         return current_sched_info->sched_max_insns_priority;
19213       else if (rs6000_sched_restricted_insns_priority == 2)
19214         /* Increase priority of insn by a minimal amount. This means that in
19215            haifa-sched.c:ready_sort(), only 'priority' (critical path)
19216            considerations precede dispatch-slot restriction considerations.  */
19217         return (priority + 1);
19218     }
19219
19220   if (rs6000_cpu == PROCESSOR_POWER6
19221       && ((load_store_pendulum == -2 && is_load_insn (insn))
19222           || (load_store_pendulum == 2 && is_store_insn (insn))))
19223     /* Attach highest priority to insn if the scheduler has just issued two
19224        stores and this instruction is a load, or two loads and this instruction
19225        is a store. Power6 wants loads and stores scheduled alternately
19226        when possible */
19227     return current_sched_info->sched_max_insns_priority;
19228
19229   return priority;
19230 }
19231
19232 /* Return true if the instruction is nonpipelined on the Cell. */
19233 static bool
19234 is_nonpipeline_insn (rtx insn)
19235 {
19236   enum attr_type type;
19237   if (!insn || !INSN_P (insn)
19238       || GET_CODE (PATTERN (insn)) == USE
19239       || GET_CODE (PATTERN (insn)) == CLOBBER)
19240     return false;
19241
19242   type = get_attr_type (insn);
19243   if (type == TYPE_IMUL
19244       || type == TYPE_IMUL2
19245       || type == TYPE_IMUL3
19246       || type == TYPE_LMUL
19247       || type == TYPE_IDIV
19248       || type == TYPE_LDIV
19249       || type == TYPE_SDIV
19250       || type == TYPE_DDIV
19251       || type == TYPE_SSQRT
19252       || type == TYPE_DSQRT
19253       || type == TYPE_MFCR
19254       || type == TYPE_MFCRF
19255       || type == TYPE_MFJMPR)
19256     {
19257       return true;
19258     }
19259   return false;
19260 }
19261
19262
19263 /* Return how many instructions the machine can issue per cycle.  */
19264
19265 static int
19266 rs6000_issue_rate (void)
19267 {
19268   /* Use issue rate of 1 for first scheduling pass to decrease degradation.  */
19269   if (!reload_completed)
19270     return 1;
19271
19272   switch (rs6000_cpu_attr) {
19273   case CPU_RIOS1:  /* ? */
19274   case CPU_RS64A:
19275   case CPU_PPC601: /* ? */
19276   case CPU_PPC7450:
19277     return 3;
19278   case CPU_PPC440:
19279   case CPU_PPC603:
19280   case CPU_PPC750:
19281   case CPU_PPC7400:
19282   case CPU_PPC8540:
19283   case CPU_CELL:
19284   case CPU_PPCE300C2:
19285   case CPU_PPCE300C3:
19286   case CPU_PPCE500MC:
19287     return 2;
19288   case CPU_RIOS2:
19289   case CPU_PPC604:
19290   case CPU_PPC604E:
19291   case CPU_PPC620:
19292   case CPU_PPC630:
19293     return 4;
19294   case CPU_POWER4:
19295   case CPU_POWER5:
19296   case CPU_POWER6:
19297     return 5;
19298   default:
19299     return 1;
19300   }
19301 }
19302
19303 /* Return how many instructions to look ahead for better insn
19304    scheduling.  */
19305
19306 static int
19307 rs6000_use_sched_lookahead (void)
19308 {
19309   if (rs6000_cpu_attr == CPU_PPC8540)
19310     return 4;
19311   if (rs6000_cpu_attr == CPU_CELL)
19312     return (reload_completed ? 8 : 0);
19313   return 0;
19314 }
19315
19316 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
19317 static int
19318 rs6000_use_sched_lookahead_guard (rtx insn)
19319 {
19320   if (rs6000_cpu_attr != CPU_CELL)
19321     return 1;
19322
19323    if (insn == NULL_RTX || !INSN_P (insn))
19324      abort ();
19325
19326   if (!reload_completed
19327       || is_nonpipeline_insn (insn)
19328       || is_microcoded_insn (insn))
19329     return 0;
19330
19331   return 1;
19332 }
19333
19334 /* Determine is PAT refers to memory.  */
19335
19336 static bool
19337 is_mem_ref (rtx pat)
19338 {
19339   const char * fmt;
19340   int i, j;
19341   bool ret = false;
19342
19343   /* stack_tie does not produce any real memory traffic.  */
19344   if (GET_CODE (pat) == UNSPEC
19345       && XINT (pat, 1) == UNSPEC_TIE)
19346     return false;
19347
19348   if (GET_CODE (pat) == MEM)
19349     return true;
19350
19351   /* Recursively process the pattern.  */
19352   fmt = GET_RTX_FORMAT (GET_CODE (pat));
19353
19354   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
19355     {
19356       if (fmt[i] == 'e')
19357         ret |= is_mem_ref (XEXP (pat, i));
19358       else if (fmt[i] == 'E')
19359         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
19360           ret |= is_mem_ref (XVECEXP (pat, i, j));
19361     }
19362
19363   return ret;
19364 }
19365
19366 /* Determine if PAT is a PATTERN of a load insn.  */
19367
19368 static bool
19369 is_load_insn1 (rtx pat)
19370 {
19371   if (!pat || pat == NULL_RTX)
19372     return false;
19373
19374   if (GET_CODE (pat) == SET)
19375     return is_mem_ref (SET_SRC (pat));
19376
19377   if (GET_CODE (pat) == PARALLEL)
19378     {
19379       int i;
19380
19381       for (i = 0; i < XVECLEN (pat, 0); i++)
19382         if (is_load_insn1 (XVECEXP (pat, 0, i)))
19383           return true;
19384     }
19385
19386   return false;
19387 }
19388
19389 /* Determine if INSN loads from memory.  */
19390
19391 static bool
19392 is_load_insn (rtx insn)
19393 {
19394   if (!insn || !INSN_P (insn))
19395     return false;
19396
19397   if (GET_CODE (insn) == CALL_INSN)
19398     return false;
19399
19400   return is_load_insn1 (PATTERN (insn));
19401 }
19402
19403 /* Determine if PAT is a PATTERN of a store insn.  */
19404
19405 static bool
19406 is_store_insn1 (rtx pat)
19407 {
19408   if (!pat || pat == NULL_RTX)
19409     return false;
19410
19411   if (GET_CODE (pat) == SET)
19412     return is_mem_ref (SET_DEST (pat));
19413
19414   if (GET_CODE (pat) == PARALLEL)
19415     {
19416       int i;
19417
19418       for (i = 0; i < XVECLEN (pat, 0); i++)
19419         if (is_store_insn1 (XVECEXP (pat, 0, i)))
19420           return true;
19421     }
19422
19423   return false;
19424 }
19425
19426 /* Determine if INSN stores to memory.  */
19427
19428 static bool
19429 is_store_insn (rtx insn)
19430 {
19431   if (!insn || !INSN_P (insn))
19432     return false;
19433
19434   return is_store_insn1 (PATTERN (insn));
19435 }
19436
19437 /* Return the dest of a store insn.  */
19438
19439 static rtx
19440 get_store_dest (rtx pat)
19441 {
19442   gcc_assert (is_store_insn1 (pat));
19443
19444   if (GET_CODE (pat) == SET)
19445     return SET_DEST (pat);
19446   else if (GET_CODE (pat) == PARALLEL)
19447     {
19448       int i;
19449
19450       for (i = 0; i < XVECLEN (pat, 0); i++)
19451         {
19452           rtx inner_pat = XVECEXP (pat, 0, i);
19453           if (GET_CODE (inner_pat) == SET
19454               && is_mem_ref (SET_DEST (inner_pat)))
19455             return inner_pat;
19456         }
19457     }
19458   /* We shouldn't get here, because we should have either a simple
19459      store insn or a store with update which are covered above.  */
19460   gcc_unreachable();
19461 }
19462
19463 /* Returns whether the dependence between INSN and NEXT is considered
19464    costly by the given target.  */
19465
19466 static bool
19467 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
19468 {
19469   rtx insn;
19470   rtx next;
19471
19472   /* If the flag is not enabled - no dependence is considered costly;
19473      allow all dependent insns in the same group.
19474      This is the most aggressive option.  */
19475   if (rs6000_sched_costly_dep == no_dep_costly)
19476     return false;
19477
19478   /* If the flag is set to 1 - a dependence is always considered costly;
19479      do not allow dependent instructions in the same group.
19480      This is the most conservative option.  */
19481   if (rs6000_sched_costly_dep == all_deps_costly)
19482     return true;
19483
19484   insn = DEP_PRO (dep);
19485   next = DEP_CON (dep);
19486
19487   if (rs6000_sched_costly_dep == store_to_load_dep_costly
19488       && is_load_insn (next)
19489       && is_store_insn (insn))
19490     /* Prevent load after store in the same group.  */
19491     return true;
19492
19493   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
19494       && is_load_insn (next)
19495       && is_store_insn (insn)
19496       && DEP_TYPE (dep) == REG_DEP_TRUE)
19497      /* Prevent load after store in the same group if it is a true
19498         dependence.  */
19499      return true;
19500
19501   /* The flag is set to X; dependences with latency >= X are considered costly,
19502      and will not be scheduled in the same group.  */
19503   if (rs6000_sched_costly_dep <= max_dep_latency
19504       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
19505     return true;
19506
19507   return false;
19508 }
19509
19510 /* Return the next insn after INSN that is found before TAIL is reached,
19511    skipping any "non-active" insns - insns that will not actually occupy
19512    an issue slot.  Return NULL_RTX if such an insn is not found.  */
19513
19514 static rtx
19515 get_next_active_insn (rtx insn, rtx tail)
19516 {
19517   if (insn == NULL_RTX || insn == tail)
19518     return NULL_RTX;
19519
19520   while (1)
19521     {
19522       insn = NEXT_INSN (insn);
19523       if (insn == NULL_RTX || insn == tail)
19524         return NULL_RTX;
19525
19526       if (CALL_P (insn)
19527           || JUMP_P (insn)
19528           || (NONJUMP_INSN_P (insn)
19529               && GET_CODE (PATTERN (insn)) != USE
19530               && GET_CODE (PATTERN (insn)) != CLOBBER
19531               && INSN_CODE (insn) != CODE_FOR_stack_tie))
19532         break;
19533     }
19534   return insn;
19535 }
19536
19537 /* We are about to begin issuing insns for this clock cycle. */
19538
19539 static int
19540 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
19541                         rtx *ready ATTRIBUTE_UNUSED,
19542                         int *pn_ready ATTRIBUTE_UNUSED,
19543                         int clock_var ATTRIBUTE_UNUSED)
19544 {
19545   int n_ready = *pn_ready;
19546
19547   if (sched_verbose)
19548     fprintf (dump, "// rs6000_sched_reorder :\n");
19549
19550   /* Reorder the ready list, if the second to last ready insn
19551      is a nonepipeline insn.  */
19552   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
19553   {
19554     if (is_nonpipeline_insn (ready[n_ready - 1])
19555         && (recog_memoized (ready[n_ready - 2]) > 0))
19556       /* Simply swap first two insns.  */
19557       {
19558         rtx tmp = ready[n_ready - 1];
19559         ready[n_ready - 1] = ready[n_ready - 2];
19560         ready[n_ready - 2] = tmp;
19561       }
19562   }
19563
19564   if (rs6000_cpu == PROCESSOR_POWER6)
19565     load_store_pendulum = 0;
19566
19567   return rs6000_issue_rate ();
19568 }
19569
19570 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
19571
19572 static int
19573 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
19574                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
19575 {
19576   if (sched_verbose)
19577     fprintf (dump, "// rs6000_sched_reorder2 :\n");
19578
19579   /* For Power6, we need to handle some special cases to try and keep the
19580      store queue from overflowing and triggering expensive flushes.
19581
19582      This code monitors how load and store instructions are being issued
19583      and skews the ready list one way or the other to increase the likelihood
19584      that a desired instruction is issued at the proper time.
19585
19586      A couple of things are done.  First, we maintain a "load_store_pendulum"
19587      to track the current state of load/store issue.
19588
19589        - If the pendulum is at zero, then no loads or stores have been
19590          issued in the current cycle so we do nothing.
19591
19592        - If the pendulum is 1, then a single load has been issued in this
19593          cycle and we attempt to locate another load in the ready list to
19594          issue with it.
19595
19596        - If the pendulum is -2, then two stores have already been
19597          issued in this cycle, so we increase the priority of the first load
19598          in the ready list to increase it's likelihood of being chosen first
19599          in the next cycle.
19600
19601        - If the pendulum is -1, then a single store has been issued in this
19602          cycle and we attempt to locate another store in the ready list to
19603          issue with it, preferring a store to an adjacent memory location to
19604          facilitate store pairing in the store queue.
19605
19606        - If the pendulum is 2, then two loads have already been
19607          issued in this cycle, so we increase the priority of the first store
19608          in the ready list to increase it's likelihood of being chosen first
19609          in the next cycle.
19610
19611        - If the pendulum < -2 or > 2, then do nothing.
19612
19613        Note: This code covers the most common scenarios.  There exist non
19614              load/store instructions which make use of the LSU and which
19615              would need to be accounted for to strictly model the behavior
19616              of the machine.  Those instructions are currently unaccounted
19617              for to help minimize compile time overhead of this code.
19618    */
19619   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
19620     {
19621       int pos;
19622       int i;
19623       rtx tmp;
19624
19625       if (is_store_insn (last_scheduled_insn))
19626         /* Issuing a store, swing the load_store_pendulum to the left */
19627         load_store_pendulum--;
19628       else if (is_load_insn (last_scheduled_insn))
19629         /* Issuing a load, swing the load_store_pendulum to the right */
19630         load_store_pendulum++;
19631       else
19632         return cached_can_issue_more;
19633
19634       /* If the pendulum is balanced, or there is only one instruction on
19635          the ready list, then all is well, so return. */
19636       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
19637         return cached_can_issue_more;
19638
19639       if (load_store_pendulum == 1)
19640         {
19641           /* A load has been issued in this cycle.  Scan the ready list
19642              for another load to issue with it */
19643           pos = *pn_ready-1;
19644
19645           while (pos >= 0)
19646             {
19647               if (is_load_insn (ready[pos]))
19648                 {
19649                   /* Found a load.  Move it to the head of the ready list,
19650                      and adjust it's priority so that it is more likely to
19651                      stay there */
19652                   tmp = ready[pos];
19653                   for (i=pos; i<*pn_ready-1; i++)
19654                     ready[i] = ready[i + 1];
19655                   ready[*pn_ready-1] = tmp;
19656
19657                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
19658                     INSN_PRIORITY (tmp)++;
19659                   break;
19660                 }
19661               pos--;
19662             }
19663         }
19664       else if (load_store_pendulum == -2)
19665         {
19666           /* Two stores have been issued in this cycle.  Increase the
19667              priority of the first load in the ready list to favor it for
19668              issuing in the next cycle. */
19669           pos = *pn_ready-1;
19670
19671           while (pos >= 0)
19672             {
19673               if (is_load_insn (ready[pos])
19674                   && !sel_sched_p ()
19675                   && INSN_PRIORITY_KNOWN (ready[pos]))
19676                 {
19677                   INSN_PRIORITY (ready[pos])++;
19678
19679                   /* Adjust the pendulum to account for the fact that a load
19680                      was found and increased in priority.  This is to prevent
19681                      increasing the priority of multiple loads */
19682                   load_store_pendulum--;
19683
19684                   break;
19685                 }
19686               pos--;
19687             }
19688         }
19689       else if (load_store_pendulum == -1)
19690         {
19691           /* A store has been issued in this cycle.  Scan the ready list for
19692              another store to issue with it, preferring a store to an adjacent
19693              memory location */
19694           int first_store_pos = -1;
19695
19696           pos = *pn_ready-1;
19697
19698           while (pos >= 0)
19699             {
19700               if (is_store_insn (ready[pos]))
19701                 {
19702                   /* Maintain the index of the first store found on the
19703                      list */
19704                   if (first_store_pos == -1)
19705                     first_store_pos = pos;
19706
19707                   if (is_store_insn (last_scheduled_insn)
19708                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
19709                     {
19710                       /* Found an adjacent store.  Move it to the head of the
19711                          ready list, and adjust it's priority so that it is
19712                          more likely to stay there */
19713                       tmp = ready[pos];
19714                       for (i=pos; i<*pn_ready-1; i++)
19715                         ready[i] = ready[i + 1];
19716                       ready[*pn_ready-1] = tmp;
19717
19718                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
19719                         INSN_PRIORITY (tmp)++;
19720
19721                       first_store_pos = -1;
19722
19723                       break;
19724                     };
19725                 }
19726               pos--;
19727             }
19728
19729           if (first_store_pos >= 0)
19730             {
19731               /* An adjacent store wasn't found, but a non-adjacent store was,
19732                  so move the non-adjacent store to the front of the ready
19733                  list, and adjust its priority so that it is more likely to
19734                  stay there. */
19735               tmp = ready[first_store_pos];
19736               for (i=first_store_pos; i<*pn_ready-1; i++)
19737                 ready[i] = ready[i + 1];
19738               ready[*pn_ready-1] = tmp;
19739               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
19740                 INSN_PRIORITY (tmp)++;
19741             }
19742         }
19743       else if (load_store_pendulum == 2)
19744        {
19745            /* Two loads have been issued in this cycle.  Increase the priority
19746               of the first store in the ready list to favor it for issuing in
19747               the next cycle. */
19748           pos = *pn_ready-1;
19749
19750           while (pos >= 0)
19751             {
19752               if (is_store_insn (ready[pos])
19753                   && !sel_sched_p ()
19754                   && INSN_PRIORITY_KNOWN (ready[pos]))
19755                 {
19756                   INSN_PRIORITY (ready[pos])++;
19757
19758                   /* Adjust the pendulum to account for the fact that a store
19759                      was found and increased in priority.  This is to prevent
19760                      increasing the priority of multiple stores */
19761                   load_store_pendulum++;
19762
19763                   break;
19764                 }
19765               pos--;
19766             }
19767         }
19768     }
19769
19770   return cached_can_issue_more;
19771 }
19772
19773 /* Return whether the presence of INSN causes a dispatch group termination
19774    of group WHICH_GROUP.
19775
19776    If WHICH_GROUP == current_group, this function will return true if INSN
19777    causes the termination of the current group (i.e, the dispatch group to
19778    which INSN belongs). This means that INSN will be the last insn in the
19779    group it belongs to.
19780
19781    If WHICH_GROUP == previous_group, this function will return true if INSN
19782    causes the termination of the previous group (i.e, the dispatch group that
19783    precedes the group to which INSN belongs).  This means that INSN will be
19784    the first insn in the group it belongs to).  */
19785
19786 static bool
19787 insn_terminates_group_p (rtx insn, enum group_termination which_group)
19788 {
19789   bool first, last;
19790
19791   if (! insn)
19792     return false;
19793
19794   first = insn_must_be_first_in_group (insn);
19795   last = insn_must_be_last_in_group (insn);
19796
19797   if (first && last)
19798     return true;
19799
19800   if (which_group == current_group)
19801     return last;
19802   else if (which_group == previous_group)
19803     return first;
19804
19805   return false;
19806 }
19807
19808
19809 static bool
19810 insn_must_be_first_in_group (rtx insn)
19811 {
19812   enum attr_type type;
19813
19814   if (!insn
19815       || insn == NULL_RTX
19816       || GET_CODE (insn) == NOTE
19817       || GET_CODE (PATTERN (insn)) == USE
19818       || GET_CODE (PATTERN (insn)) == CLOBBER)
19819     return false;
19820
19821   switch (rs6000_cpu)
19822     {
19823     case PROCESSOR_POWER5:
19824       if (is_cracked_insn (insn))
19825         return true;
19826     case PROCESSOR_POWER4:
19827       if (is_microcoded_insn (insn))
19828         return true;
19829
19830       if (!rs6000_sched_groups)
19831         return false;
19832
19833       type = get_attr_type (insn);
19834
19835       switch (type)
19836         {
19837         case TYPE_MFCR:
19838         case TYPE_MFCRF:
19839         case TYPE_MTCR:
19840         case TYPE_DELAYED_CR:
19841         case TYPE_CR_LOGICAL:
19842         case TYPE_MTJMPR:
19843         case TYPE_MFJMPR:
19844         case TYPE_IDIV:
19845         case TYPE_LDIV:
19846         case TYPE_LOAD_L:
19847         case TYPE_STORE_C:
19848         case TYPE_ISYNC:
19849         case TYPE_SYNC:
19850           return true;
19851         default:
19852           break;
19853         }
19854       break;
19855     case PROCESSOR_POWER6:
19856       type = get_attr_type (insn);
19857
19858       switch (type)
19859         {
19860         case TYPE_INSERT_DWORD:
19861         case TYPE_EXTS:
19862         case TYPE_CNTLZ:
19863         case TYPE_SHIFT:
19864         case TYPE_VAR_SHIFT_ROTATE:
19865         case TYPE_TRAP:
19866         case TYPE_IMUL:
19867         case TYPE_IMUL2:
19868         case TYPE_IMUL3:
19869         case TYPE_LMUL:
19870         case TYPE_IDIV:
19871         case TYPE_INSERT_WORD:
19872         case TYPE_DELAYED_COMPARE:
19873         case TYPE_IMUL_COMPARE:
19874         case TYPE_LMUL_COMPARE:
19875         case TYPE_FPCOMPARE:
19876         case TYPE_MFCR:
19877         case TYPE_MTCR:
19878         case TYPE_MFJMPR:
19879         case TYPE_MTJMPR:
19880         case TYPE_ISYNC:
19881         case TYPE_SYNC:
19882         case TYPE_LOAD_L:
19883         case TYPE_STORE_C:
19884         case TYPE_LOAD_U:
19885         case TYPE_LOAD_UX:
19886         case TYPE_LOAD_EXT_UX:
19887         case TYPE_STORE_U:
19888         case TYPE_STORE_UX:
19889         case TYPE_FPLOAD_U:
19890         case TYPE_FPLOAD_UX:
19891         case TYPE_FPSTORE_U:
19892         case TYPE_FPSTORE_UX:
19893           return true;
19894         default:
19895           break;
19896         }
19897       break;
19898     default:
19899       break;
19900     }
19901
19902   return false;
19903 }
19904
19905 static bool
19906 insn_must_be_last_in_group (rtx insn)
19907 {
19908   enum attr_type type;
19909
19910   if (!insn
19911       || insn == NULL_RTX
19912       || GET_CODE (insn) == NOTE
19913       || GET_CODE (PATTERN (insn)) == USE
19914       || GET_CODE (PATTERN (insn)) == CLOBBER)
19915     return false;
19916
19917   switch (rs6000_cpu) {
19918   case PROCESSOR_POWER4:
19919   case PROCESSOR_POWER5:
19920     if (is_microcoded_insn (insn))
19921       return true;
19922
19923     if (is_branch_slot_insn (insn))
19924       return true;
19925
19926     break;
19927   case PROCESSOR_POWER6:
19928     type = get_attr_type (insn);
19929
19930     switch (type)
19931       {
19932       case TYPE_EXTS:
19933       case TYPE_CNTLZ:
19934       case TYPE_SHIFT:
19935       case TYPE_VAR_SHIFT_ROTATE:
19936       case TYPE_TRAP:
19937       case TYPE_IMUL:
19938       case TYPE_IMUL2:
19939       case TYPE_IMUL3:
19940       case TYPE_LMUL:
19941       case TYPE_IDIV:
19942       case TYPE_DELAYED_COMPARE:
19943       case TYPE_IMUL_COMPARE:
19944       case TYPE_LMUL_COMPARE:
19945       case TYPE_FPCOMPARE:
19946       case TYPE_MFCR:
19947       case TYPE_MTCR:
19948       case TYPE_MFJMPR:
19949       case TYPE_MTJMPR:
19950       case TYPE_ISYNC:
19951       case TYPE_SYNC:
19952       case TYPE_LOAD_L:
19953       case TYPE_STORE_C:
19954         return true;
19955       default:
19956         break;
19957     }
19958     break;
19959   default:
19960     break;
19961   }
19962
19963   return false;
19964 }
19965
19966 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
19967    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
19968
19969 static bool
19970 is_costly_group (rtx *group_insns, rtx next_insn)
19971 {
19972   int i;
19973   int issue_rate = rs6000_issue_rate ();
19974
19975   for (i = 0; i < issue_rate; i++)
19976     {
19977       sd_iterator_def sd_it;
19978       dep_t dep;
19979       rtx insn = group_insns[i];
19980
19981       if (!insn)
19982         continue;
19983
19984       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
19985         {
19986           rtx next = DEP_CON (dep);
19987
19988           if (next == next_insn
19989               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
19990             return true;
19991         }
19992     }
19993
19994   return false;
19995 }
19996
19997 /* Utility of the function redefine_groups.
19998    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
19999    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
20000    to keep it "far" (in a separate group) from GROUP_INSNS, following
20001    one of the following schemes, depending on the value of the flag
20002    -minsert_sched_nops = X:
20003    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
20004        in order to force NEXT_INSN into a separate group.
20005    (2) X < sched_finish_regroup_exact: insert exactly X nops.
20006    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
20007    insertion (has a group just ended, how many vacant issue slots remain in the
20008    last group, and how many dispatch groups were encountered so far).  */
20009
20010 static int
20011 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
20012                  rtx next_insn, bool *group_end, int can_issue_more,
20013                  int *group_count)
20014 {
20015   rtx nop;
20016   bool force;
20017   int issue_rate = rs6000_issue_rate ();
20018   bool end = *group_end;
20019   int i;
20020
20021   if (next_insn == NULL_RTX)
20022     return can_issue_more;
20023
20024   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
20025     return can_issue_more;
20026
20027   force = is_costly_group (group_insns, next_insn);
20028   if (!force)
20029     return can_issue_more;
20030
20031   if (sched_verbose > 6)
20032     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
20033              *group_count ,can_issue_more);
20034
20035   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
20036     {
20037       if (*group_end)
20038         can_issue_more = 0;
20039
20040       /* Since only a branch can be issued in the last issue_slot, it is
20041          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
20042          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
20043          in this case the last nop will start a new group and the branch
20044          will be forced to the new group.  */
20045       if (can_issue_more && !is_branch_slot_insn (next_insn))
20046         can_issue_more--;
20047
20048       while (can_issue_more > 0)
20049         {
20050           nop = gen_nop ();
20051           emit_insn_before (nop, next_insn);
20052           can_issue_more--;
20053         }
20054
20055       *group_end = true;
20056       return 0;
20057     }
20058
20059   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
20060     {
20061       int n_nops = rs6000_sched_insert_nops;
20062
20063       /* Nops can't be issued from the branch slot, so the effective
20064          issue_rate for nops is 'issue_rate - 1'.  */
20065       if (can_issue_more == 0)
20066         can_issue_more = issue_rate;
20067       can_issue_more--;
20068       if (can_issue_more == 0)
20069         {
20070           can_issue_more = issue_rate - 1;
20071           (*group_count)++;
20072           end = true;
20073           for (i = 0; i < issue_rate; i++)
20074             {
20075               group_insns[i] = 0;
20076             }
20077         }
20078
20079       while (n_nops > 0)
20080         {
20081           nop = gen_nop ();
20082           emit_insn_before (nop, next_insn);
20083           if (can_issue_more == issue_rate - 1) /* new group begins */
20084             end = false;
20085           can_issue_more--;
20086           if (can_issue_more == 0)
20087             {
20088               can_issue_more = issue_rate - 1;
20089               (*group_count)++;
20090               end = true;
20091               for (i = 0; i < issue_rate; i++)
20092                 {
20093                   group_insns[i] = 0;
20094                 }
20095             }
20096           n_nops--;
20097         }
20098
20099       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
20100       can_issue_more++;
20101
20102       /* Is next_insn going to start a new group?  */
20103       *group_end
20104         = (end
20105            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
20106            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
20107            || (can_issue_more < issue_rate &&
20108                insn_terminates_group_p (next_insn, previous_group)));
20109       if (*group_end && end)
20110         (*group_count)--;
20111
20112       if (sched_verbose > 6)
20113         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
20114                  *group_count, can_issue_more);
20115       return can_issue_more;
20116     }
20117
20118   return can_issue_more;
20119 }
20120
20121 /* This function tries to synch the dispatch groups that the compiler "sees"
20122    with the dispatch groups that the processor dispatcher is expected to
20123    form in practice.  It tries to achieve this synchronization by forcing the
20124    estimated processor grouping on the compiler (as opposed to the function
20125    'pad_goups' which tries to force the scheduler's grouping on the processor).
20126
20127    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
20128    examines the (estimated) dispatch groups that will be formed by the processor
20129    dispatcher.  It marks these group boundaries to reflect the estimated
20130    processor grouping, overriding the grouping that the scheduler had marked.
20131    Depending on the value of the flag '-minsert-sched-nops' this function can
20132    force certain insns into separate groups or force a certain distance between
20133    them by inserting nops, for example, if there exists a "costly dependence"
20134    between the insns.
20135
20136    The function estimates the group boundaries that the processor will form as
20137    follows:  It keeps track of how many vacant issue slots are available after
20138    each insn.  A subsequent insn will start a new group if one of the following
20139    4 cases applies:
20140    - no more vacant issue slots remain in the current dispatch group.
20141    - only the last issue slot, which is the branch slot, is vacant, but the next
20142      insn is not a branch.
20143    - only the last 2 or less issue slots, including the branch slot, are vacant,
20144      which means that a cracked insn (which occupies two issue slots) can't be
20145      issued in this group.
20146    - less than 'issue_rate' slots are vacant, and the next insn always needs to
20147      start a new group.  */
20148
20149 static int
20150 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
20151 {
20152   rtx insn, next_insn;
20153   int issue_rate;
20154   int can_issue_more;
20155   int slot, i;
20156   bool group_end;
20157   int group_count = 0;
20158   rtx *group_insns;
20159
20160   /* Initialize.  */
20161   issue_rate = rs6000_issue_rate ();
20162   group_insns = XALLOCAVEC (rtx, issue_rate);
20163   for (i = 0; i < issue_rate; i++)
20164     {
20165       group_insns[i] = 0;
20166     }
20167   can_issue_more = issue_rate;
20168   slot = 0;
20169   insn = get_next_active_insn (prev_head_insn, tail);
20170   group_end = false;
20171
20172   while (insn != NULL_RTX)
20173     {
20174       slot = (issue_rate - can_issue_more);
20175       group_insns[slot] = insn;
20176       can_issue_more =
20177         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
20178       if (insn_terminates_group_p (insn, current_group))
20179         can_issue_more = 0;
20180
20181       next_insn = get_next_active_insn (insn, tail);
20182       if (next_insn == NULL_RTX)
20183         return group_count + 1;
20184
20185       /* Is next_insn going to start a new group?  */
20186       group_end
20187         = (can_issue_more == 0
20188            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
20189            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
20190            || (can_issue_more < issue_rate &&
20191                insn_terminates_group_p (next_insn, previous_group)));
20192
20193       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
20194                                         next_insn, &group_end, can_issue_more,
20195                                         &group_count);
20196
20197       if (group_end)
20198         {
20199           group_count++;
20200           can_issue_more = 0;
20201           for (i = 0; i < issue_rate; i++)
20202             {
20203               group_insns[i] = 0;
20204             }
20205         }
20206
20207       if (GET_MODE (next_insn) == TImode && can_issue_more)
20208         PUT_MODE (next_insn, VOIDmode);
20209       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
20210         PUT_MODE (next_insn, TImode);
20211
20212       insn = next_insn;
20213       if (can_issue_more == 0)
20214         can_issue_more = issue_rate;
20215     } /* while */
20216
20217   return group_count;
20218 }
20219
20220 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
20221    dispatch group boundaries that the scheduler had marked.  Pad with nops
20222    any dispatch groups which have vacant issue slots, in order to force the
20223    scheduler's grouping on the processor dispatcher.  The function
20224    returns the number of dispatch groups found.  */
20225
20226 static int
20227 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
20228 {
20229   rtx insn, next_insn;
20230   rtx nop;
20231   int issue_rate;
20232   int can_issue_more;
20233   int group_end;
20234   int group_count = 0;
20235
20236   /* Initialize issue_rate.  */
20237   issue_rate = rs6000_issue_rate ();
20238   can_issue_more = issue_rate;
20239
20240   insn = get_next_active_insn (prev_head_insn, tail);
20241   next_insn = get_next_active_insn (insn, tail);
20242
20243   while (insn != NULL_RTX)
20244     {
20245       can_issue_more =
20246         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
20247
20248       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
20249
20250       if (next_insn == NULL_RTX)
20251         break;
20252
20253       if (group_end)
20254         {
20255           /* If the scheduler had marked group termination at this location
20256              (between insn and next_insn), and neither insn nor next_insn will
20257              force group termination, pad the group with nops to force group
20258              termination.  */
20259           if (can_issue_more
20260               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
20261               && !insn_terminates_group_p (insn, current_group)
20262               && !insn_terminates_group_p (next_insn, previous_group))
20263             {
20264               if (!is_branch_slot_insn (next_insn))
20265                 can_issue_more--;
20266
20267               while (can_issue_more)
20268                 {
20269                   nop = gen_nop ();
20270                   emit_insn_before (nop, next_insn);
20271                   can_issue_more--;
20272                 }
20273             }
20274
20275           can_issue_more = issue_rate;
20276           group_count++;
20277         }
20278
20279       insn = next_insn;
20280       next_insn = get_next_active_insn (insn, tail);
20281     }
20282
20283   return group_count;
20284 }
20285
20286 /* We're beginning a new block.  Initialize data structures as necessary.  */
20287
20288 static void
20289 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
20290                      int sched_verbose ATTRIBUTE_UNUSED,
20291                      int max_ready ATTRIBUTE_UNUSED)
20292 {
20293   last_scheduled_insn = NULL_RTX;
20294   load_store_pendulum = 0;
20295 }
20296
20297 /* The following function is called at the end of scheduling BB.
20298    After reload, it inserts nops at insn group bundling.  */
20299
20300 static void
20301 rs6000_sched_finish (FILE *dump, int sched_verbose)
20302 {
20303   int n_groups;
20304
20305   if (sched_verbose)
20306     fprintf (dump, "=== Finishing schedule.\n");
20307
20308   if (reload_completed && rs6000_sched_groups)
20309     {
20310       /* Do not run sched_finish hook when selective scheduling enabled.  */
20311       if (sel_sched_p ())
20312         return;
20313
20314       if (rs6000_sched_insert_nops == sched_finish_none)
20315         return;
20316
20317       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
20318         n_groups = pad_groups (dump, sched_verbose,
20319                                current_sched_info->prev_head,
20320                                current_sched_info->next_tail);
20321       else
20322         n_groups = redefine_groups (dump, sched_verbose,
20323                                     current_sched_info->prev_head,
20324                                     current_sched_info->next_tail);
20325
20326       if (sched_verbose >= 6)
20327         {
20328           fprintf (dump, "ngroups = %d\n", n_groups);
20329           print_rtl (dump, current_sched_info->prev_head);
20330           fprintf (dump, "Done finish_sched\n");
20331         }
20332     }
20333 }
20334
20335 struct _rs6000_sched_context
20336 {
20337   short cached_can_issue_more;
20338   rtx last_scheduled_insn;
20339   int load_store_pendulum;
20340 };
20341
20342 typedef struct _rs6000_sched_context rs6000_sched_context_def;
20343 typedef rs6000_sched_context_def *rs6000_sched_context_t;
20344
20345 /* Allocate store for new scheduling context.  */
20346 static void *
20347 rs6000_alloc_sched_context (void)
20348 {
20349   return xmalloc (sizeof (rs6000_sched_context_def));
20350 }
20351
20352 /* If CLEAN_P is true then initializes _SC with clean data,
20353    and from the global context otherwise.  */
20354 static void
20355 rs6000_init_sched_context (void *_sc, bool clean_p)
20356 {
20357   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
20358
20359   if (clean_p)
20360     {
20361       sc->cached_can_issue_more = 0;
20362       sc->last_scheduled_insn = NULL_RTX;
20363       sc->load_store_pendulum = 0;
20364     }
20365   else
20366     {
20367       sc->cached_can_issue_more = cached_can_issue_more;
20368       sc->last_scheduled_insn = last_scheduled_insn;
20369       sc->load_store_pendulum = load_store_pendulum;
20370     }
20371 }
20372
20373 /* Sets the global scheduling context to the one pointed to by _SC.  */
20374 static void
20375 rs6000_set_sched_context (void *_sc)
20376 {
20377   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
20378
20379   gcc_assert (sc != NULL);
20380
20381   cached_can_issue_more = sc->cached_can_issue_more;
20382   last_scheduled_insn = sc->last_scheduled_insn;
20383   load_store_pendulum = sc->load_store_pendulum;
20384 }
20385
20386 /* Free _SC.  */
20387 static void
20388 rs6000_free_sched_context (void *_sc)
20389 {
20390   gcc_assert (_sc != NULL);
20391
20392   free (_sc);
20393 }
20394
20395 \f
20396 /* Length in units of the trampoline for entering a nested function.  */
20397
20398 int
20399 rs6000_trampoline_size (void)
20400 {
20401   int ret = 0;
20402
20403   switch (DEFAULT_ABI)
20404     {
20405     default:
20406       gcc_unreachable ();
20407
20408     case ABI_AIX:
20409       ret = (TARGET_32BIT) ? 12 : 24;
20410       break;
20411
20412     case ABI_DARWIN:
20413     case ABI_V4:
20414       ret = (TARGET_32BIT) ? 40 : 48;
20415       break;
20416     }
20417
20418   return ret;
20419 }
20420
20421 /* Emit RTL insns to initialize the variable parts of a trampoline.
20422    FNADDR is an RTX for the address of the function's pure code.
20423    CXT is an RTX for the static chain value for the function.  */
20424
20425 void
20426 rs6000_initialize_trampoline (rtx addr, rtx fnaddr, rtx cxt)
20427 {
20428   int regsize = (TARGET_32BIT) ? 4 : 8;
20429   rtx ctx_reg = force_reg (Pmode, cxt);
20430
20431   switch (DEFAULT_ABI)
20432     {
20433     default:
20434       gcc_unreachable ();
20435
20436 /* Macros to shorten the code expansions below.  */
20437 #define MEM_DEREF(addr) gen_rtx_MEM (Pmode, memory_address (Pmode, addr))
20438 #define MEM_PLUS(addr,offset) \
20439   gen_rtx_MEM (Pmode, memory_address (Pmode, plus_constant (addr, offset)))
20440
20441     /* Under AIX, just build the 3 word function descriptor */
20442     case ABI_AIX:
20443       {
20444         rtx fn_reg = gen_reg_rtx (Pmode);
20445         rtx toc_reg = gen_reg_rtx (Pmode);
20446         emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
20447         emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
20448         emit_move_insn (MEM_DEREF (addr), fn_reg);
20449         emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
20450         emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
20451       }
20452       break;
20453
20454     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
20455     case ABI_DARWIN:
20456     case ABI_V4:
20457       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
20458                          LCT_NORMAL, VOIDmode, 4,
20459                          addr, Pmode,
20460                          GEN_INT (rs6000_trampoline_size ()), SImode,
20461                          fnaddr, Pmode,
20462                          ctx_reg, Pmode);
20463       break;
20464     }
20465
20466   return;
20467 }
20468
20469 \f
20470 /* Table of valid machine attributes.  */
20471
20472 const struct attribute_spec rs6000_attribute_table[] =
20473 {
20474   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
20475   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute },
20476   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
20477   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
20478   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
20479   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute },
20480 #ifdef SUBTARGET_ATTRIBUTE_TABLE
20481   SUBTARGET_ATTRIBUTE_TABLE,
20482 #endif
20483   { NULL,        0, 0, false, false, false, NULL }
20484 };
20485
20486 /* Handle the "altivec" attribute.  The attribute may have
20487    arguments as follows:
20488
20489         __attribute__((altivec(vector__)))
20490         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
20491         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
20492
20493   and may appear more than once (e.g., 'vector bool char') in a
20494   given declaration.  */
20495
20496 static tree
20497 rs6000_handle_altivec_attribute (tree *node,
20498                                  tree name ATTRIBUTE_UNUSED,
20499                                  tree args,
20500                                  int flags ATTRIBUTE_UNUSED,
20501                                  bool *no_add_attrs)
20502 {
20503   tree type = *node, result = NULL_TREE;
20504   enum machine_mode mode;
20505   int unsigned_p;
20506   char altivec_type
20507     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
20508         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
20509        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
20510        : '?');
20511
20512   while (POINTER_TYPE_P (type)
20513          || TREE_CODE (type) == FUNCTION_TYPE
20514          || TREE_CODE (type) == METHOD_TYPE
20515          || TREE_CODE (type) == ARRAY_TYPE)
20516     type = TREE_TYPE (type);
20517
20518   mode = TYPE_MODE (type);
20519
20520   /* Check for invalid AltiVec type qualifiers.  */
20521   if (type == long_unsigned_type_node || type == long_integer_type_node)
20522     {
20523     if (TARGET_64BIT)
20524       error ("use of %<long%> in AltiVec types is invalid for 64-bit code");
20525     else if (rs6000_warn_altivec_long)
20526       warning (0, "use of %<long%> in AltiVec types is deprecated; use %<int%>");
20527     }
20528   else if (type == long_long_unsigned_type_node
20529            || type == long_long_integer_type_node)
20530     error ("use of %<long long%> in AltiVec types is invalid");
20531   else if (type == double_type_node)
20532     error ("use of %<double%> in AltiVec types is invalid");
20533   else if (type == long_double_type_node)
20534     error ("use of %<long double%> in AltiVec types is invalid");
20535   else if (type == boolean_type_node)
20536     error ("use of boolean types in AltiVec types is invalid");
20537   else if (TREE_CODE (type) == COMPLEX_TYPE)
20538     error ("use of %<complex%> in AltiVec types is invalid");
20539   else if (DECIMAL_FLOAT_MODE_P (mode))
20540     error ("use of decimal floating point types in AltiVec types is invalid");
20541
20542   switch (altivec_type)
20543     {
20544     case 'v':
20545       unsigned_p = TYPE_UNSIGNED (type);
20546       switch (mode)
20547         {
20548         case SImode:
20549           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
20550           break;
20551         case HImode:
20552           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
20553           break;
20554         case QImode:
20555           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
20556           break;
20557         case SFmode: result = V4SF_type_node; break;
20558           /* If the user says 'vector int bool', we may be handed the 'bool'
20559              attribute _before_ the 'vector' attribute, and so select the
20560              proper type in the 'b' case below.  */
20561         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
20562           result = type;
20563         default: break;
20564         }
20565       break;
20566     case 'b':
20567       switch (mode)
20568         {
20569         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
20570         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
20571         case QImode: case V16QImode: result = bool_V16QI_type_node;
20572         default: break;
20573         }
20574       break;
20575     case 'p':
20576       switch (mode)
20577         {
20578         case V8HImode: result = pixel_V8HI_type_node;
20579         default: break;
20580         }
20581     default: break;
20582     }
20583
20584   /* Propagate qualifiers attached to the element type
20585      onto the vector type.  */
20586   if (result && result != type && TYPE_QUALS (type))
20587     result = build_qualified_type (result, TYPE_QUALS (type));
20588
20589   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
20590
20591   if (result)
20592     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
20593
20594   return NULL_TREE;
20595 }
20596
20597 /* AltiVec defines four built-in scalar types that serve as vector
20598    elements; we must teach the compiler how to mangle them.  */
20599
20600 static const char *
20601 rs6000_mangle_type (const_tree type)
20602 {
20603   type = TYPE_MAIN_VARIANT (type);
20604
20605   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
20606       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
20607     return NULL;
20608
20609   if (type == bool_char_type_node) return "U6__boolc";
20610   if (type == bool_short_type_node) return "U6__bools";
20611   if (type == pixel_type_node) return "u7__pixel";
20612   if (type == bool_int_type_node) return "U6__booli";
20613
20614   /* Mangle IBM extended float long double as `g' (__float128) on
20615      powerpc*-linux where long-double-64 previously was the default.  */
20616   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
20617       && TARGET_ELF
20618       && TARGET_LONG_DOUBLE_128
20619       && !TARGET_IEEEQUAD)
20620     return "g";
20621
20622   /* For all other types, use normal C++ mangling.  */
20623   return NULL;
20624 }
20625
20626 /* Handle a "longcall" or "shortcall" attribute; arguments as in
20627    struct attribute_spec.handler.  */
20628
20629 static tree
20630 rs6000_handle_longcall_attribute (tree *node, tree name,
20631                                   tree args ATTRIBUTE_UNUSED,
20632                                   int flags ATTRIBUTE_UNUSED,
20633                                   bool *no_add_attrs)
20634 {
20635   if (TREE_CODE (*node) != FUNCTION_TYPE
20636       && TREE_CODE (*node) != FIELD_DECL
20637       && TREE_CODE (*node) != TYPE_DECL)
20638     {
20639       warning (OPT_Wattributes, "%qE attribute only applies to functions",
20640                name);
20641       *no_add_attrs = true;
20642     }
20643
20644   return NULL_TREE;
20645 }
20646
20647 /* Set longcall attributes on all functions declared when
20648    rs6000_default_long_calls is true.  */
20649 static void
20650 rs6000_set_default_type_attributes (tree type)
20651 {
20652   if (rs6000_default_long_calls
20653       && (TREE_CODE (type) == FUNCTION_TYPE
20654           || TREE_CODE (type) == METHOD_TYPE))
20655     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
20656                                         NULL_TREE,
20657                                         TYPE_ATTRIBUTES (type));
20658
20659 #if TARGET_MACHO
20660   darwin_set_default_type_attributes (type);
20661 #endif
20662 }
20663
20664 /* Return a reference suitable for calling a function with the
20665    longcall attribute.  */
20666
20667 rtx
20668 rs6000_longcall_ref (rtx call_ref)
20669 {
20670   const char *call_name;
20671   tree node;
20672
20673   if (GET_CODE (call_ref) != SYMBOL_REF)
20674     return call_ref;
20675
20676   /* System V adds '.' to the internal name, so skip them.  */
20677   call_name = XSTR (call_ref, 0);
20678   if (*call_name == '.')
20679     {
20680       while (*call_name == '.')
20681         call_name++;
20682
20683       node = get_identifier (call_name);
20684       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
20685     }
20686
20687   return force_reg (Pmode, call_ref);
20688 }
20689 \f
20690 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
20691 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
20692 #endif
20693
20694 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
20695    struct attribute_spec.handler.  */
20696 static tree
20697 rs6000_handle_struct_attribute (tree *node, tree name,
20698                                 tree args ATTRIBUTE_UNUSED,
20699                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
20700 {
20701   tree *type = NULL;
20702   if (DECL_P (*node))
20703     {
20704       if (TREE_CODE (*node) == TYPE_DECL)
20705         type = &TREE_TYPE (*node);
20706     }
20707   else
20708     type = node;
20709
20710   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
20711                  || TREE_CODE (*type) == UNION_TYPE)))
20712     {
20713       warning (OPT_Wattributes, "%qE attribute ignored", name);
20714       *no_add_attrs = true;
20715     }
20716
20717   else if ((is_attribute_p ("ms_struct", name)
20718             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
20719            || ((is_attribute_p ("gcc_struct", name)
20720                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
20721     {
20722       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
20723                name);
20724       *no_add_attrs = true;
20725     }
20726
20727   return NULL_TREE;
20728 }
20729
20730 static bool
20731 rs6000_ms_bitfield_layout_p (const_tree record_type)
20732 {
20733   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
20734           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
20735     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
20736 }
20737 \f
20738 #ifdef USING_ELFOS_H
20739
20740 /* A get_unnamed_section callback, used for switching to toc_section.  */
20741
20742 static void
20743 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
20744 {
20745   if (DEFAULT_ABI == ABI_AIX
20746       && TARGET_MINIMAL_TOC
20747       && !TARGET_RELOCATABLE)
20748     {
20749       if (!toc_initialized)
20750         {
20751           toc_initialized = 1;
20752           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
20753           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
20754           fprintf (asm_out_file, "\t.tc ");
20755           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
20756           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
20757           fprintf (asm_out_file, "\n");
20758
20759           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
20760           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
20761           fprintf (asm_out_file, " = .+32768\n");
20762         }
20763       else
20764         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
20765     }
20766   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
20767     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
20768   else
20769     {
20770       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
20771       if (!toc_initialized)
20772         {
20773           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
20774           fprintf (asm_out_file, " = .+32768\n");
20775           toc_initialized = 1;
20776         }
20777     }
20778 }
20779
20780 /* Implement TARGET_ASM_INIT_SECTIONS.  */
20781
20782 static void
20783 rs6000_elf_asm_init_sections (void)
20784 {
20785   toc_section
20786     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
20787
20788   sdata2_section
20789     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
20790                            SDATA2_SECTION_ASM_OP);
20791 }
20792
20793 /* Implement TARGET_SELECT_RTX_SECTION.  */
20794
20795 static section *
20796 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
20797                                unsigned HOST_WIDE_INT align)
20798 {
20799   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
20800     return toc_section;
20801   else
20802     return default_elf_select_rtx_section (mode, x, align);
20803 }
20804 \f
20805 /* For a SYMBOL_REF, set generic flags and then perform some
20806    target-specific processing.
20807
20808    When the AIX ABI is requested on a non-AIX system, replace the
20809    function name with the real name (with a leading .) rather than the
20810    function descriptor name.  This saves a lot of overriding code to
20811    read the prefixes.  */
20812
20813 static void
20814 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
20815 {
20816   default_encode_section_info (decl, rtl, first);
20817
20818   if (first
20819       && TREE_CODE (decl) == FUNCTION_DECL
20820       && !TARGET_AIX
20821       && DEFAULT_ABI == ABI_AIX)
20822     {
20823       rtx sym_ref = XEXP (rtl, 0);
20824       size_t len = strlen (XSTR (sym_ref, 0));
20825       char *str = XALLOCAVEC (char, len + 2);
20826       str[0] = '.';
20827       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
20828       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
20829     }
20830 }
20831
20832 static inline bool
20833 compare_section_name (const char *section, const char *templ)
20834 {
20835   int len;
20836
20837   len = strlen (templ);
20838   return (strncmp (section, templ, len) == 0
20839           && (section[len] == 0 || section[len] == '.'));
20840 }
20841
20842 bool
20843 rs6000_elf_in_small_data_p (const_tree decl)
20844 {
20845   if (rs6000_sdata == SDATA_NONE)
20846     return false;
20847
20848   /* We want to merge strings, so we never consider them small data.  */
20849   if (TREE_CODE (decl) == STRING_CST)
20850     return false;
20851
20852   /* Functions are never in the small data area.  */
20853   if (TREE_CODE (decl) == FUNCTION_DECL)
20854     return false;
20855
20856   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
20857     {
20858       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
20859       if (compare_section_name (section, ".sdata")
20860           || compare_section_name (section, ".sdata2")
20861           || compare_section_name (section, ".gnu.linkonce.s")
20862           || compare_section_name (section, ".sbss")
20863           || compare_section_name (section, ".sbss2")
20864           || compare_section_name (section, ".gnu.linkonce.sb")
20865           || strcmp (section, ".PPC.EMB.sdata0") == 0
20866           || strcmp (section, ".PPC.EMB.sbss0") == 0)
20867         return true;
20868     }
20869   else
20870     {
20871       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
20872
20873       if (size > 0
20874           && (unsigned HOST_WIDE_INT) size <= g_switch_value
20875           /* If it's not public, and we're not going to reference it there,
20876              there's no need to put it in the small data section.  */
20877           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
20878         return true;
20879     }
20880
20881   return false;
20882 }
20883
20884 #endif /* USING_ELFOS_H */
20885 \f
20886 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
20887
20888 static bool
20889 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
20890 {
20891   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
20892 }
20893 \f
20894 /* Return a REG that occurs in ADDR with coefficient 1.
20895    ADDR can be effectively incremented by incrementing REG.
20896
20897    r0 is special and we must not select it as an address
20898    register by this routine since our caller will try to
20899    increment the returned register via an "la" instruction.  */
20900
20901 rtx
20902 find_addr_reg (rtx addr)
20903 {
20904   while (GET_CODE (addr) == PLUS)
20905     {
20906       if (GET_CODE (XEXP (addr, 0)) == REG
20907           && REGNO (XEXP (addr, 0)) != 0)
20908         addr = XEXP (addr, 0);
20909       else if (GET_CODE (XEXP (addr, 1)) == REG
20910                && REGNO (XEXP (addr, 1)) != 0)
20911         addr = XEXP (addr, 1);
20912       else if (CONSTANT_P (XEXP (addr, 0)))
20913         addr = XEXP (addr, 1);
20914       else if (CONSTANT_P (XEXP (addr, 1)))
20915         addr = XEXP (addr, 0);
20916       else
20917         gcc_unreachable ();
20918     }
20919   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
20920   return addr;
20921 }
20922
20923 void
20924 rs6000_fatal_bad_address (rtx op)
20925 {
20926   fatal_insn ("bad address", op);
20927 }
20928
20929 #if TARGET_MACHO
20930
20931 static tree branch_island_list = 0;
20932
20933 /* Remember to generate a branch island for far calls to the given
20934    function.  */
20935
20936 static void
20937 add_compiler_branch_island (tree label_name, tree function_name,
20938                             int line_number)
20939 {
20940   tree branch_island = build_tree_list (function_name, label_name);
20941   TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
20942   TREE_CHAIN (branch_island) = branch_island_list;
20943   branch_island_list = branch_island;
20944 }
20945
20946 #define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND)     TREE_VALUE (BRANCH_ISLAND)
20947 #define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND)  TREE_PURPOSE (BRANCH_ISLAND)
20948 #define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND)    \
20949                 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
20950
20951 /* Generate far-jump branch islands for everything on the
20952    branch_island_list.  Invoked immediately after the last instruction
20953    of the epilogue has been emitted; the branch-islands must be
20954    appended to, and contiguous with, the function body.  Mach-O stubs
20955    are generated in machopic_output_stub().  */
20956
20957 static void
20958 macho_branch_islands (void)
20959 {
20960   char tmp_buf[512];
20961   tree branch_island;
20962
20963   for (branch_island = branch_island_list;
20964        branch_island;
20965        branch_island = TREE_CHAIN (branch_island))
20966     {
20967       const char *label =
20968         IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
20969       const char *name  =
20970         IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
20971       char name_buf[512];
20972       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
20973       if (name[0] == '*' || name[0] == '&')
20974         strcpy (name_buf, name+1);
20975       else
20976         {
20977           name_buf[0] = '_';
20978           strcpy (name_buf+1, name);
20979         }
20980       strcpy (tmp_buf, "\n");
20981       strcat (tmp_buf, label);
20982 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
20983       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
20984         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
20985 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
20986       if (flag_pic)
20987         {
20988           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
20989           strcat (tmp_buf, label);
20990           strcat (tmp_buf, "_pic\n");
20991           strcat (tmp_buf, label);
20992           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
20993
20994           strcat (tmp_buf, "\taddis r11,r11,ha16(");
20995           strcat (tmp_buf, name_buf);
20996           strcat (tmp_buf, " - ");
20997           strcat (tmp_buf, label);
20998           strcat (tmp_buf, "_pic)\n");
20999
21000           strcat (tmp_buf, "\tmtlr r0\n");
21001
21002           strcat (tmp_buf, "\taddi r12,r11,lo16(");
21003           strcat (tmp_buf, name_buf);
21004           strcat (tmp_buf, " - ");
21005           strcat (tmp_buf, label);
21006           strcat (tmp_buf, "_pic)\n");
21007
21008           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
21009         }
21010       else
21011         {
21012           strcat (tmp_buf, ":\nlis r12,hi16(");
21013           strcat (tmp_buf, name_buf);
21014           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
21015           strcat (tmp_buf, name_buf);
21016           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
21017         }
21018       output_asm_insn (tmp_buf, 0);
21019 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
21020       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
21021         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
21022 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
21023     }
21024
21025   branch_island_list = 0;
21026 }
21027
21028 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
21029    already there or not.  */
21030
21031 static int
21032 no_previous_def (tree function_name)
21033 {
21034   tree branch_island;
21035   for (branch_island = branch_island_list;
21036        branch_island;
21037        branch_island = TREE_CHAIN (branch_island))
21038     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
21039       return 0;
21040   return 1;
21041 }
21042
21043 /* GET_PREV_LABEL gets the label name from the previous definition of
21044    the function.  */
21045
21046 static tree
21047 get_prev_label (tree function_name)
21048 {
21049   tree branch_island;
21050   for (branch_island = branch_island_list;
21051        branch_island;
21052        branch_island = TREE_CHAIN (branch_island))
21053     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
21054       return BRANCH_ISLAND_LABEL_NAME (branch_island);
21055   return 0;
21056 }
21057
21058 #ifndef DARWIN_LINKER_GENERATES_ISLANDS
21059 #define DARWIN_LINKER_GENERATES_ISLANDS 0
21060 #endif
21061
21062 /* KEXTs still need branch islands.  */
21063 #define DARWIN_GENERATE_ISLANDS (!DARWIN_LINKER_GENERATES_ISLANDS \
21064                                  || flag_mkernel || flag_apple_kext)
21065
21066 /* INSN is either a function call or a millicode call.  It may have an
21067    unconditional jump in its delay slot.
21068
21069    CALL_DEST is the routine we are calling.  */
21070
21071 char *
21072 output_call (rtx insn, rtx *operands, int dest_operand_number,
21073              int cookie_operand_number)
21074 {
21075   static char buf[256];
21076   if (DARWIN_GENERATE_ISLANDS
21077       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
21078       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
21079     {
21080       tree labelname;
21081       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
21082
21083       if (no_previous_def (funname))
21084         {
21085           rtx label_rtx = gen_label_rtx ();
21086           char *label_buf, temp_buf[256];
21087           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
21088                                        CODE_LABEL_NUMBER (label_rtx));
21089           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
21090           labelname = get_identifier (label_buf);
21091           add_compiler_branch_island (labelname, funname, insn_line (insn));
21092         }
21093       else
21094         labelname = get_prev_label (funname);
21095
21096       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
21097          instruction will reach 'foo', otherwise link as 'bl L42'".
21098          "L42" should be a 'branch island', that will do a far jump to
21099          'foo'.  Branch islands are generated in
21100          macho_branch_islands().  */
21101       sprintf (buf, "jbsr %%z%d,%.246s",
21102                dest_operand_number, IDENTIFIER_POINTER (labelname));
21103     }
21104   else
21105     sprintf (buf, "bl %%z%d", dest_operand_number);
21106   return buf;
21107 }
21108
21109 /* Generate PIC and indirect symbol stubs.  */
21110
21111 void
21112 machopic_output_stub (FILE *file, const char *symb, const char *stub)
21113 {
21114   unsigned int length;
21115   char *symbol_name, *lazy_ptr_name;
21116   char *local_label_0;
21117   static int label = 0;
21118
21119   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
21120   symb = (*targetm.strip_name_encoding) (symb);
21121
21122
21123   length = strlen (symb);
21124   symbol_name = XALLOCAVEC (char, length + 32);
21125   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
21126
21127   lazy_ptr_name = XALLOCAVEC (char, length + 32);
21128   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
21129
21130   if (flag_pic == 2)
21131     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
21132   else
21133     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
21134
21135   if (flag_pic == 2)
21136     {
21137       fprintf (file, "\t.align 5\n");
21138
21139       fprintf (file, "%s:\n", stub);
21140       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
21141
21142       label++;
21143       local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
21144       sprintf (local_label_0, "\"L%011d$spb\"", label);
21145
21146       fprintf (file, "\tmflr r0\n");
21147       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
21148       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
21149       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
21150                lazy_ptr_name, local_label_0);
21151       fprintf (file, "\tmtlr r0\n");
21152       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
21153                (TARGET_64BIT ? "ldu" : "lwzu"),
21154                lazy_ptr_name, local_label_0);
21155       fprintf (file, "\tmtctr r12\n");
21156       fprintf (file, "\tbctr\n");
21157     }
21158   else
21159     {
21160       fprintf (file, "\t.align 4\n");
21161
21162       fprintf (file, "%s:\n", stub);
21163       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
21164
21165       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
21166       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
21167                (TARGET_64BIT ? "ldu" : "lwzu"),
21168                lazy_ptr_name);
21169       fprintf (file, "\tmtctr r12\n");
21170       fprintf (file, "\tbctr\n");
21171     }
21172
21173   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
21174   fprintf (file, "%s:\n", lazy_ptr_name);
21175   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
21176   fprintf (file, "%sdyld_stub_binding_helper\n",
21177            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
21178 }
21179
21180 /* Legitimize PIC addresses.  If the address is already
21181    position-independent, we return ORIG.  Newly generated
21182    position-independent addresses go into a reg.  This is REG if non
21183    zero, otherwise we allocate register(s) as necessary.  */
21184
21185 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
21186
21187 rtx
21188 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
21189                                         rtx reg)
21190 {
21191   rtx base, offset;
21192
21193   if (reg == NULL && ! reload_in_progress && ! reload_completed)
21194     reg = gen_reg_rtx (Pmode);
21195
21196   if (GET_CODE (orig) == CONST)
21197     {
21198       rtx reg_temp;
21199
21200       if (GET_CODE (XEXP (orig, 0)) == PLUS
21201           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
21202         return orig;
21203
21204       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
21205
21206       /* Use a different reg for the intermediate value, as
21207          it will be marked UNCHANGING.  */
21208       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
21209       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
21210                                                      Pmode, reg_temp);
21211       offset =
21212         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
21213                                                 Pmode, reg);
21214
21215       if (GET_CODE (offset) == CONST_INT)
21216         {
21217           if (SMALL_INT (offset))
21218             return plus_constant (base, INTVAL (offset));
21219           else if (! reload_in_progress && ! reload_completed)
21220             offset = force_reg (Pmode, offset);
21221           else
21222             {
21223               rtx mem = force_const_mem (Pmode, orig);
21224               return machopic_legitimize_pic_address (mem, Pmode, reg);
21225             }
21226         }
21227       return gen_rtx_PLUS (Pmode, base, offset);
21228     }
21229
21230   /* Fall back on generic machopic code.  */
21231   return machopic_legitimize_pic_address (orig, mode, reg);
21232 }
21233
21234 /* Output a .machine directive for the Darwin assembler, and call
21235    the generic start_file routine.  */
21236
21237 static void
21238 rs6000_darwin_file_start (void)
21239 {
21240   static const struct
21241   {
21242     const char *arg;
21243     const char *name;
21244     int if_set;
21245   } mapping[] = {
21246     { "ppc64", "ppc64", MASK_64BIT },
21247     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
21248     { "power4", "ppc970", 0 },
21249     { "G5", "ppc970", 0 },
21250     { "7450", "ppc7450", 0 },
21251     { "7400", "ppc7400", MASK_ALTIVEC },
21252     { "G4", "ppc7400", 0 },
21253     { "750", "ppc750", 0 },
21254     { "740", "ppc750", 0 },
21255     { "G3", "ppc750", 0 },
21256     { "604e", "ppc604e", 0 },
21257     { "604", "ppc604", 0 },
21258     { "603e", "ppc603", 0 },
21259     { "603", "ppc603", 0 },
21260     { "601", "ppc601", 0 },
21261     { NULL, "ppc", 0 } };
21262   const char *cpu_id = "";
21263   size_t i;
21264
21265   rs6000_file_start ();
21266   darwin_file_start ();
21267
21268   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
21269   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
21270     if (rs6000_select[i].set_arch_p && rs6000_select[i].string
21271         && rs6000_select[i].string[0] != '\0')
21272       cpu_id = rs6000_select[i].string;
21273
21274   /* Look through the mapping array.  Pick the first name that either
21275      matches the argument, has a bit set in IF_SET that is also set
21276      in the target flags, or has a NULL name.  */
21277
21278   i = 0;
21279   while (mapping[i].arg != NULL
21280          && strcmp (mapping[i].arg, cpu_id) != 0
21281          && (mapping[i].if_set & target_flags) == 0)
21282     i++;
21283
21284   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
21285 }
21286
21287 #endif /* TARGET_MACHO */
21288
21289 #if TARGET_ELF
21290 static int
21291 rs6000_elf_reloc_rw_mask (void)
21292 {
21293   if (flag_pic)
21294     return 3;
21295   else if (DEFAULT_ABI == ABI_AIX)
21296     return 2;
21297   else
21298     return 0;
21299 }
21300
21301 /* Record an element in the table of global constructors.  SYMBOL is
21302    a SYMBOL_REF of the function to be called; PRIORITY is a number
21303    between 0 and MAX_INIT_PRIORITY.
21304
21305    This differs from default_named_section_asm_out_constructor in
21306    that we have special handling for -mrelocatable.  */
21307
21308 static void
21309 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
21310 {
21311   const char *section = ".ctors";
21312   char buf[16];
21313
21314   if (priority != DEFAULT_INIT_PRIORITY)
21315     {
21316       sprintf (buf, ".ctors.%.5u",
21317                /* Invert the numbering so the linker puts us in the proper
21318                   order; constructors are run from right to left, and the
21319                   linker sorts in increasing order.  */
21320                MAX_INIT_PRIORITY - priority);
21321       section = buf;
21322     }
21323
21324   switch_to_section (get_section (section, SECTION_WRITE, NULL));
21325   assemble_align (POINTER_SIZE);
21326
21327   if (TARGET_RELOCATABLE)
21328     {
21329       fputs ("\t.long (", asm_out_file);
21330       output_addr_const (asm_out_file, symbol);
21331       fputs (")@fixup\n", asm_out_file);
21332     }
21333   else
21334     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
21335 }
21336
21337 static void
21338 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
21339 {
21340   const char *section = ".dtors";
21341   char buf[16];
21342
21343   if (priority != DEFAULT_INIT_PRIORITY)
21344     {
21345       sprintf (buf, ".dtors.%.5u",
21346                /* Invert the numbering so the linker puts us in the proper
21347                   order; constructors are run from right to left, and the
21348                   linker sorts in increasing order.  */
21349                MAX_INIT_PRIORITY - priority);
21350       section = buf;
21351     }
21352
21353   switch_to_section (get_section (section, SECTION_WRITE, NULL));
21354   assemble_align (POINTER_SIZE);
21355
21356   if (TARGET_RELOCATABLE)
21357     {
21358       fputs ("\t.long (", asm_out_file);
21359       output_addr_const (asm_out_file, symbol);
21360       fputs (")@fixup\n", asm_out_file);
21361     }
21362   else
21363     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
21364 }
21365
21366 void
21367 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
21368 {
21369   if (TARGET_64BIT)
21370     {
21371       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
21372       ASM_OUTPUT_LABEL (file, name);
21373       fputs (DOUBLE_INT_ASM_OP, file);
21374       rs6000_output_function_entry (file, name);
21375       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
21376       if (DOT_SYMBOLS)
21377         {
21378           fputs ("\t.size\t", file);
21379           assemble_name (file, name);
21380           fputs (",24\n\t.type\t.", file);
21381           assemble_name (file, name);
21382           fputs (",@function\n", file);
21383           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
21384             {
21385               fputs ("\t.globl\t.", file);
21386               assemble_name (file, name);
21387               putc ('\n', file);
21388             }
21389         }
21390       else
21391         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
21392       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
21393       rs6000_output_function_entry (file, name);
21394       fputs (":\n", file);
21395       return;
21396     }
21397
21398   if (TARGET_RELOCATABLE
21399       && !TARGET_SECURE_PLT
21400       && (get_pool_size () != 0 || crtl->profile)
21401       && uses_TOC ())
21402     {
21403       char buf[256];
21404
21405       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
21406
21407       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
21408       fprintf (file, "\t.long ");
21409       assemble_name (file, buf);
21410       putc ('-', file);
21411       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
21412       assemble_name (file, buf);
21413       putc ('\n', file);
21414     }
21415
21416   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
21417   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
21418
21419   if (DEFAULT_ABI == ABI_AIX)
21420     {
21421       const char *desc_name, *orig_name;
21422
21423       orig_name = (*targetm.strip_name_encoding) (name);
21424       desc_name = orig_name;
21425       while (*desc_name == '.')
21426         desc_name++;
21427
21428       if (TREE_PUBLIC (decl))
21429         fprintf (file, "\t.globl %s\n", desc_name);
21430
21431       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
21432       fprintf (file, "%s:\n", desc_name);
21433       fprintf (file, "\t.long %s\n", orig_name);
21434       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
21435       if (DEFAULT_ABI == ABI_AIX)
21436         fputs ("\t.long 0\n", file);
21437       fprintf (file, "\t.previous\n");
21438     }
21439   ASM_OUTPUT_LABEL (file, name);
21440 }
21441
21442 static void
21443 rs6000_elf_end_indicate_exec_stack (void)
21444 {
21445   if (TARGET_32BIT)
21446     file_end_indicate_exec_stack ();
21447 }
21448 #endif
21449
21450 #if TARGET_XCOFF
21451 static void
21452 rs6000_xcoff_asm_output_anchor (rtx symbol)
21453 {
21454   char buffer[100];
21455
21456   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
21457            SYMBOL_REF_BLOCK_OFFSET (symbol));
21458   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
21459 }
21460
21461 static void
21462 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
21463 {
21464   fputs (GLOBAL_ASM_OP, stream);
21465   RS6000_OUTPUT_BASENAME (stream, name);
21466   putc ('\n', stream);
21467 }
21468
21469 /* A get_unnamed_decl callback, used for read-only sections.  PTR
21470    points to the section string variable.  */
21471
21472 static void
21473 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
21474 {
21475   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
21476            *(const char *const *) directive,
21477            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
21478 }
21479
21480 /* Likewise for read-write sections.  */
21481
21482 static void
21483 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
21484 {
21485   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
21486            *(const char *const *) directive,
21487            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
21488 }
21489
21490 /* A get_unnamed_section callback, used for switching to toc_section.  */
21491
21492 static void
21493 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
21494 {
21495   if (TARGET_MINIMAL_TOC)
21496     {
21497       /* toc_section is always selected at least once from
21498          rs6000_xcoff_file_start, so this is guaranteed to
21499          always be defined once and only once in each file.  */
21500       if (!toc_initialized)
21501         {
21502           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
21503           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
21504           toc_initialized = 1;
21505         }
21506       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
21507                (TARGET_32BIT ? "" : ",3"));
21508     }
21509   else
21510     fputs ("\t.toc\n", asm_out_file);
21511 }
21512
21513 /* Implement TARGET_ASM_INIT_SECTIONS.  */
21514
21515 static void
21516 rs6000_xcoff_asm_init_sections (void)
21517 {
21518   read_only_data_section
21519     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
21520                            &xcoff_read_only_section_name);
21521
21522   private_data_section
21523     = get_unnamed_section (SECTION_WRITE,
21524                            rs6000_xcoff_output_readwrite_section_asm_op,
21525                            &xcoff_private_data_section_name);
21526
21527   read_only_private_data_section
21528     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
21529                            &xcoff_private_data_section_name);
21530
21531   toc_section
21532     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
21533
21534   readonly_data_section = read_only_data_section;
21535   exception_section = data_section;
21536 }
21537
21538 static int
21539 rs6000_xcoff_reloc_rw_mask (void)
21540 {
21541   return 3;
21542 }
21543
21544 static void
21545 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
21546                                 tree decl ATTRIBUTE_UNUSED)
21547 {
21548   int smclass;
21549   static const char * const suffix[3] = { "PR", "RO", "RW" };
21550
21551   if (flags & SECTION_CODE)
21552     smclass = 0;
21553   else if (flags & SECTION_WRITE)
21554     smclass = 2;
21555   else
21556     smclass = 1;
21557
21558   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
21559            (flags & SECTION_CODE) ? "." : "",
21560            name, suffix[smclass], flags & SECTION_ENTSIZE);
21561 }
21562
21563 static section *
21564 rs6000_xcoff_select_section (tree decl, int reloc,
21565                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
21566 {
21567   if (decl_readonly_section (decl, reloc))
21568     {
21569       if (TREE_PUBLIC (decl))
21570         return read_only_data_section;
21571       else
21572         return read_only_private_data_section;
21573     }
21574   else
21575     {
21576       if (TREE_PUBLIC (decl))
21577         return data_section;
21578       else
21579         return private_data_section;
21580     }
21581 }
21582
21583 static void
21584 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
21585 {
21586   const char *name;
21587
21588   /* Use select_section for private and uninitialized data.  */
21589   if (!TREE_PUBLIC (decl)
21590       || DECL_COMMON (decl)
21591       || DECL_INITIAL (decl) == NULL_TREE
21592       || DECL_INITIAL (decl) == error_mark_node
21593       || (flag_zero_initialized_in_bss
21594           && initializer_zerop (DECL_INITIAL (decl))))
21595     return;
21596
21597   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
21598   name = (*targetm.strip_name_encoding) (name);
21599   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
21600 }
21601
21602 /* Select section for constant in constant pool.
21603
21604    On RS/6000, all constants are in the private read-only data area.
21605    However, if this is being placed in the TOC it must be output as a
21606    toc entry.  */
21607
21608 static section *
21609 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
21610                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
21611 {
21612   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
21613     return toc_section;
21614   else
21615     return read_only_private_data_section;
21616 }
21617
21618 /* Remove any trailing [DS] or the like from the symbol name.  */
21619
21620 static const char *
21621 rs6000_xcoff_strip_name_encoding (const char *name)
21622 {
21623   size_t len;
21624   if (*name == '*')
21625     name++;
21626   len = strlen (name);
21627   if (name[len - 1] == ']')
21628     return ggc_alloc_string (name, len - 4);
21629   else
21630     return name;
21631 }
21632
21633 /* Section attributes.  AIX is always PIC.  */
21634
21635 static unsigned int
21636 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
21637 {
21638   unsigned int align;
21639   unsigned int flags = default_section_type_flags (decl, name, reloc);
21640
21641   /* Align to at least UNIT size.  */
21642   if (flags & SECTION_CODE)
21643     align = MIN_UNITS_PER_WORD;
21644   else
21645     /* Increase alignment of large objects if not already stricter.  */
21646     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
21647                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
21648                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
21649
21650   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
21651 }
21652
21653 /* Output at beginning of assembler file.
21654
21655    Initialize the section names for the RS/6000 at this point.
21656
21657    Specify filename, including full path, to assembler.
21658
21659    We want to go into the TOC section so at least one .toc will be emitted.
21660    Also, in order to output proper .bs/.es pairs, we need at least one static
21661    [RW] section emitted.
21662
21663    Finally, declare mcount when profiling to make the assembler happy.  */
21664
21665 static void
21666 rs6000_xcoff_file_start (void)
21667 {
21668   rs6000_gen_section_name (&xcoff_bss_section_name,
21669                            main_input_filename, ".bss_");
21670   rs6000_gen_section_name (&xcoff_private_data_section_name,
21671                            main_input_filename, ".rw_");
21672   rs6000_gen_section_name (&xcoff_read_only_section_name,
21673                            main_input_filename, ".ro_");
21674
21675   fputs ("\t.file\t", asm_out_file);
21676   output_quoted_string (asm_out_file, main_input_filename);
21677   fputc ('\n', asm_out_file);
21678   if (write_symbols != NO_DEBUG)
21679     switch_to_section (private_data_section);
21680   switch_to_section (text_section);
21681   if (profile_flag)
21682     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
21683   rs6000_file_start ();
21684 }
21685
21686 /* Output at end of assembler file.
21687    On the RS/6000, referencing data should automatically pull in text.  */
21688
21689 static void
21690 rs6000_xcoff_file_end (void)
21691 {
21692   switch_to_section (text_section);
21693   fputs ("_section_.text:\n", asm_out_file);
21694   switch_to_section (data_section);
21695   fputs (TARGET_32BIT
21696          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
21697          asm_out_file);
21698 }
21699 #endif /* TARGET_XCOFF */
21700
21701 /* Compute a (partial) cost for rtx X.  Return true if the complete
21702    cost has been computed, and false if subexpressions should be
21703    scanned.  In either case, *TOTAL contains the cost result.  */
21704
21705 static bool
21706 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
21707                   bool speed)
21708 {
21709   enum machine_mode mode = GET_MODE (x);
21710
21711   switch (code)
21712     {
21713       /* On the RS/6000, if it is valid in the insn, it is free.  */
21714     case CONST_INT:
21715       if (((outer_code == SET
21716             || outer_code == PLUS
21717             || outer_code == MINUS)
21718            && (satisfies_constraint_I (x)
21719                || satisfies_constraint_L (x)))
21720           || (outer_code == AND
21721               && (satisfies_constraint_K (x)
21722                   || (mode == SImode
21723                       ? satisfies_constraint_L (x)
21724                       : satisfies_constraint_J (x))
21725                   || mask_operand (x, mode)
21726                   || (mode == DImode
21727                       && mask64_operand (x, DImode))))
21728           || ((outer_code == IOR || outer_code == XOR)
21729               && (satisfies_constraint_K (x)
21730                   || (mode == SImode
21731                       ? satisfies_constraint_L (x)
21732                       : satisfies_constraint_J (x))))
21733           || outer_code == ASHIFT
21734           || outer_code == ASHIFTRT
21735           || outer_code == LSHIFTRT
21736           || outer_code == ROTATE
21737           || outer_code == ROTATERT
21738           || outer_code == ZERO_EXTRACT
21739           || (outer_code == MULT
21740               && satisfies_constraint_I (x))
21741           || ((outer_code == DIV || outer_code == UDIV
21742                || outer_code == MOD || outer_code == UMOD)
21743               && exact_log2 (INTVAL (x)) >= 0)
21744           || (outer_code == COMPARE
21745               && (satisfies_constraint_I (x)
21746                   || satisfies_constraint_K (x)))
21747           || (outer_code == EQ
21748               && (satisfies_constraint_I (x)
21749                   || satisfies_constraint_K (x)
21750                   || (mode == SImode
21751                       ? satisfies_constraint_L (x)
21752                       : satisfies_constraint_J (x))))
21753           || (outer_code == GTU
21754               && satisfies_constraint_I (x))
21755           || (outer_code == LTU
21756               && satisfies_constraint_P (x)))
21757         {
21758           *total = 0;
21759           return true;
21760         }
21761       else if ((outer_code == PLUS
21762                 && reg_or_add_cint_operand (x, VOIDmode))
21763                || (outer_code == MINUS
21764                    && reg_or_sub_cint_operand (x, VOIDmode))
21765                || ((outer_code == SET
21766                     || outer_code == IOR
21767                     || outer_code == XOR)
21768                    && (INTVAL (x)
21769                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
21770         {
21771           *total = COSTS_N_INSNS (1);
21772           return true;
21773         }
21774       /* FALLTHRU */
21775
21776     case CONST_DOUBLE:
21777       if (mode == DImode && code == CONST_DOUBLE)
21778         {
21779           if ((outer_code == IOR || outer_code == XOR)
21780               && CONST_DOUBLE_HIGH (x) == 0
21781               && (CONST_DOUBLE_LOW (x)
21782                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
21783             {
21784               *total = 0;
21785               return true;
21786             }
21787           else if ((outer_code == AND && and64_2_operand (x, DImode))
21788                    || ((outer_code == SET
21789                         || outer_code == IOR
21790                         || outer_code == XOR)
21791                        && CONST_DOUBLE_HIGH (x) == 0))
21792             {
21793               *total = COSTS_N_INSNS (1);
21794               return true;
21795             }
21796         }
21797       /* FALLTHRU */
21798
21799     case CONST:
21800     case HIGH:
21801     case SYMBOL_REF:
21802     case MEM:
21803       /* When optimizing for size, MEM should be slightly more expensive
21804          than generating address, e.g., (plus (reg) (const)).
21805          L1 cache latency is about two instructions.  */
21806       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
21807       return true;
21808
21809     case LABEL_REF:
21810       *total = 0;
21811       return true;
21812
21813     case PLUS:
21814       if (mode == DFmode)
21815         {
21816           if (GET_CODE (XEXP (x, 0)) == MULT)
21817             {
21818               /* FNMA accounted in outer NEG.  */
21819               if (outer_code == NEG)
21820                 *total = rs6000_cost->dmul - rs6000_cost->fp;
21821               else
21822                 *total = rs6000_cost->dmul;
21823             }
21824           else
21825             *total = rs6000_cost->fp;
21826         }
21827       else if (mode == SFmode)
21828         {
21829           /* FNMA accounted in outer NEG.  */
21830           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
21831             *total = 0;
21832           else
21833             *total = rs6000_cost->fp;
21834         }
21835       else
21836         *total = COSTS_N_INSNS (1);
21837       return false;
21838
21839     case MINUS:
21840       if (mode == DFmode)
21841         {
21842           if (GET_CODE (XEXP (x, 0)) == MULT
21843               || GET_CODE (XEXP (x, 1)) == MULT)
21844             {
21845               /* FNMA accounted in outer NEG.  */
21846               if (outer_code == NEG)
21847                 *total = rs6000_cost->dmul - rs6000_cost->fp;
21848               else
21849                 *total = rs6000_cost->dmul;
21850             }
21851           else
21852             *total = rs6000_cost->fp;
21853         }
21854       else if (mode == SFmode)
21855         {
21856           /* FNMA accounted in outer NEG.  */
21857           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
21858             *total = 0;
21859           else
21860             *total = rs6000_cost->fp;
21861         }
21862       else
21863         *total = COSTS_N_INSNS (1);
21864       return false;
21865
21866     case MULT:
21867       if (GET_CODE (XEXP (x, 1)) == CONST_INT
21868           && satisfies_constraint_I (XEXP (x, 1)))
21869         {
21870           if (INTVAL (XEXP (x, 1)) >= -256
21871               && INTVAL (XEXP (x, 1)) <= 255)
21872             *total = rs6000_cost->mulsi_const9;
21873           else
21874             *total = rs6000_cost->mulsi_const;
21875         }
21876       /* FMA accounted in outer PLUS/MINUS.  */
21877       else if ((mode == DFmode || mode == SFmode)
21878                && (outer_code == PLUS || outer_code == MINUS))
21879         *total = 0;
21880       else if (mode == DFmode)
21881         *total = rs6000_cost->dmul;
21882       else if (mode == SFmode)
21883         *total = rs6000_cost->fp;
21884       else if (mode == DImode)
21885         *total = rs6000_cost->muldi;
21886       else
21887         *total = rs6000_cost->mulsi;
21888       return false;
21889
21890     case DIV:
21891     case MOD:
21892       if (FLOAT_MODE_P (mode))
21893         {
21894           *total = mode == DFmode ? rs6000_cost->ddiv
21895                                   : rs6000_cost->sdiv;
21896           return false;
21897         }
21898       /* FALLTHRU */
21899
21900     case UDIV:
21901     case UMOD:
21902       if (GET_CODE (XEXP (x, 1)) == CONST_INT
21903           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
21904         {
21905           if (code == DIV || code == MOD)
21906             /* Shift, addze */
21907             *total = COSTS_N_INSNS (2);
21908           else
21909             /* Shift */
21910             *total = COSTS_N_INSNS (1);
21911         }
21912       else
21913         {
21914           if (GET_MODE (XEXP (x, 1)) == DImode)
21915             *total = rs6000_cost->divdi;
21916           else
21917             *total = rs6000_cost->divsi;
21918         }
21919       /* Add in shift and subtract for MOD. */
21920       if (code == MOD || code == UMOD)
21921         *total += COSTS_N_INSNS (2);
21922       return false;
21923
21924     case CTZ:
21925     case FFS:
21926       *total = COSTS_N_INSNS (4);
21927       return false;
21928
21929     case POPCOUNT:
21930       *total = COSTS_N_INSNS (6);
21931       return false;
21932
21933     case NOT:
21934       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
21935         {
21936           *total = 0;
21937           return false;
21938         }
21939       /* FALLTHRU */
21940
21941     case AND:
21942     case CLZ:
21943     case IOR:
21944     case XOR:
21945     case ZERO_EXTRACT:
21946       *total = COSTS_N_INSNS (1);
21947       return false;
21948
21949     case ASHIFT:
21950     case ASHIFTRT:
21951     case LSHIFTRT:
21952     case ROTATE:
21953     case ROTATERT:
21954       /* Handle mul_highpart.  */
21955       if (outer_code == TRUNCATE
21956           && GET_CODE (XEXP (x, 0)) == MULT)
21957         {
21958           if (mode == DImode)
21959             *total = rs6000_cost->muldi;
21960           else
21961             *total = rs6000_cost->mulsi;
21962           return true;
21963         }
21964       else if (outer_code == AND)
21965         *total = 0;
21966       else
21967         *total = COSTS_N_INSNS (1);
21968       return false;
21969
21970     case SIGN_EXTEND:
21971     case ZERO_EXTEND:
21972       if (GET_CODE (XEXP (x, 0)) == MEM)
21973         *total = 0;
21974       else
21975         *total = COSTS_N_INSNS (1);
21976       return false;
21977
21978     case COMPARE:
21979     case NEG:
21980     case ABS:
21981       if (!FLOAT_MODE_P (mode))
21982         {
21983           *total = COSTS_N_INSNS (1);
21984           return false;
21985         }
21986       /* FALLTHRU */
21987
21988     case FLOAT:
21989     case UNSIGNED_FLOAT:
21990     case FIX:
21991     case UNSIGNED_FIX:
21992     case FLOAT_TRUNCATE:
21993       *total = rs6000_cost->fp;
21994       return false;
21995
21996     case FLOAT_EXTEND:
21997       if (mode == DFmode)
21998         *total = 0;
21999       else
22000         *total = rs6000_cost->fp;
22001       return false;
22002
22003     case UNSPEC:
22004       switch (XINT (x, 1))
22005         {
22006         case UNSPEC_FRSP:
22007           *total = rs6000_cost->fp;
22008           return true;
22009
22010         default:
22011           break;
22012         }
22013       break;
22014
22015     case CALL:
22016     case IF_THEN_ELSE:
22017       if (!speed)
22018         {
22019           *total = COSTS_N_INSNS (1);
22020           return true;
22021         }
22022       else if (FLOAT_MODE_P (mode)
22023                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
22024         {
22025           *total = rs6000_cost->fp;
22026           return false;
22027         }
22028       break;
22029
22030     case EQ:
22031     case GTU:
22032     case LTU:
22033       /* Carry bit requires mode == Pmode.
22034          NEG or PLUS already counted so only add one.  */
22035       if (mode == Pmode
22036           && (outer_code == NEG || outer_code == PLUS))
22037         {
22038           *total = COSTS_N_INSNS (1);
22039           return true;
22040         }
22041       if (outer_code == SET)
22042         {
22043           if (XEXP (x, 1) == const0_rtx)
22044             {
22045               *total = COSTS_N_INSNS (2);
22046               return true;
22047             }
22048           else if (mode == Pmode)
22049             {
22050               *total = COSTS_N_INSNS (3);
22051               return false;
22052             }
22053         }
22054       /* FALLTHRU */
22055
22056     case GT:
22057     case LT:
22058     case UNORDERED:
22059       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
22060         {
22061           *total = COSTS_N_INSNS (2);
22062           return true;
22063         }
22064       /* CC COMPARE.  */
22065       if (outer_code == COMPARE)
22066         {
22067           *total = 0;
22068           return true;
22069         }
22070       break;
22071
22072     default:
22073       break;
22074     }
22075
22076   return false;
22077 }
22078
22079 /* A C expression returning the cost of moving data from a register of class
22080    CLASS1 to one of CLASS2.  */
22081
22082 int
22083 rs6000_register_move_cost (enum machine_mode mode,
22084                            enum reg_class from, enum reg_class to)
22085 {
22086   /*  Moves from/to GENERAL_REGS.  */
22087   if (reg_classes_intersect_p (to, GENERAL_REGS)
22088       || reg_classes_intersect_p (from, GENERAL_REGS))
22089     {
22090       if (! reg_classes_intersect_p (to, GENERAL_REGS))
22091         from = to;
22092
22093       if (from == FLOAT_REGS || from == ALTIVEC_REGS)
22094         return (rs6000_memory_move_cost (mode, from, 0)
22095                 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
22096
22097       /* It's more expensive to move CR_REGS than CR0_REGS because of the
22098          shift.  */
22099       else if (from == CR_REGS)
22100         return 4;
22101
22102       /* Power6 has slower LR/CTR moves so make them more expensive than
22103          memory in order to bias spills to memory .*/
22104       else if (rs6000_cpu == PROCESSOR_POWER6
22105                && reg_classes_intersect_p (from, LINK_OR_CTR_REGS))
22106         return 6 * hard_regno_nregs[0][mode];
22107
22108       else
22109         /* A move will cost one instruction per GPR moved.  */
22110         return 2 * hard_regno_nregs[0][mode];
22111     }
22112
22113   /* Moving between two similar registers is just one instruction.  */
22114   else if (reg_classes_intersect_p (to, from))
22115     return (mode == TFmode || mode == TDmode) ? 4 : 2;
22116
22117   /* Everything else has to go through GENERAL_REGS.  */
22118   else
22119     return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
22120             + rs6000_register_move_cost (mode, from, GENERAL_REGS));
22121 }
22122
22123 /* A C expressions returning the cost of moving data of MODE from a register to
22124    or from memory.  */
22125
22126 int
22127 rs6000_memory_move_cost (enum machine_mode mode, enum reg_class rclass,
22128                          int in ATTRIBUTE_UNUSED)
22129 {
22130   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
22131     return 4 * hard_regno_nregs[0][mode];
22132   else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
22133     return 4 * hard_regno_nregs[32][mode];
22134   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
22135     return 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
22136   else
22137     return 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
22138 }
22139
22140 /* Returns a code for a target-specific builtin that implements
22141    reciprocal of the function, or NULL_TREE if not available.  */
22142
22143 static tree
22144 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
22145                            bool sqrt ATTRIBUTE_UNUSED)
22146 {
22147   if (! (TARGET_RECIP && TARGET_PPC_GFXOPT && !optimize_size
22148          && flag_finite_math_only && !flag_trapping_math
22149          && flag_unsafe_math_optimizations))
22150     return NULL_TREE;
22151
22152   if (md_fn)
22153     return NULL_TREE;
22154   else
22155     switch (fn)
22156       {
22157       case BUILT_IN_SQRTF:
22158         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
22159
22160       default:
22161         return NULL_TREE;
22162       }
22163 }
22164
22165 /* Newton-Raphson approximation of single-precision floating point divide n/d.
22166    Assumes no trapping math and finite arguments.  */
22167
22168 void
22169 rs6000_emit_swdivsf (rtx dst, rtx n, rtx d)
22170 {
22171   rtx x0, e0, e1, y1, u0, v0, one;
22172
22173   x0 = gen_reg_rtx (SFmode);
22174   e0 = gen_reg_rtx (SFmode);
22175   e1 = gen_reg_rtx (SFmode);
22176   y1 = gen_reg_rtx (SFmode);
22177   u0 = gen_reg_rtx (SFmode);
22178   v0 = gen_reg_rtx (SFmode);
22179   one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
22180
22181   /* x0 = 1./d estimate */
22182   emit_insn (gen_rtx_SET (VOIDmode, x0,
22183                           gen_rtx_UNSPEC (SFmode, gen_rtvec (1, d),
22184                                           UNSPEC_FRES)));
22185   /* e0 = 1. - d * x0 */
22186   emit_insn (gen_rtx_SET (VOIDmode, e0,
22187                           gen_rtx_MINUS (SFmode, one,
22188                                          gen_rtx_MULT (SFmode, d, x0))));
22189   /* e1 = e0 + e0 * e0 */
22190   emit_insn (gen_rtx_SET (VOIDmode, e1,
22191                           gen_rtx_PLUS (SFmode,
22192                                         gen_rtx_MULT (SFmode, e0, e0), e0)));
22193   /* y1 = x0 + e1 * x0 */
22194   emit_insn (gen_rtx_SET (VOIDmode, y1,
22195                           gen_rtx_PLUS (SFmode,
22196                                         gen_rtx_MULT (SFmode, e1, x0), x0)));
22197   /* u0 = n * y1 */
22198   emit_insn (gen_rtx_SET (VOIDmode, u0,
22199                           gen_rtx_MULT (SFmode, n, y1)));
22200   /* v0 = n - d * u0 */
22201   emit_insn (gen_rtx_SET (VOIDmode, v0,
22202                           gen_rtx_MINUS (SFmode, n,
22203                                          gen_rtx_MULT (SFmode, d, u0))));
22204   /* dst = u0 + v0 * y1 */
22205   emit_insn (gen_rtx_SET (VOIDmode, dst,
22206                           gen_rtx_PLUS (SFmode,
22207                                         gen_rtx_MULT (SFmode, v0, y1), u0)));
22208 }
22209
22210 /* Newton-Raphson approximation of double-precision floating point divide n/d.
22211    Assumes no trapping math and finite arguments.  */
22212
22213 void
22214 rs6000_emit_swdivdf (rtx dst, rtx n, rtx d)
22215 {
22216   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
22217
22218   x0 = gen_reg_rtx (DFmode);
22219   e0 = gen_reg_rtx (DFmode);
22220   e1 = gen_reg_rtx (DFmode);
22221   e2 = gen_reg_rtx (DFmode);
22222   y1 = gen_reg_rtx (DFmode);
22223   y2 = gen_reg_rtx (DFmode);
22224   y3 = gen_reg_rtx (DFmode);
22225   u0 = gen_reg_rtx (DFmode);
22226   v0 = gen_reg_rtx (DFmode);
22227   one = force_reg (DFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, DFmode));
22228
22229   /* x0 = 1./d estimate */
22230   emit_insn (gen_rtx_SET (VOIDmode, x0,
22231                           gen_rtx_UNSPEC (DFmode, gen_rtvec (1, d),
22232                                           UNSPEC_FRES)));
22233   /* e0 = 1. - d * x0 */
22234   emit_insn (gen_rtx_SET (VOIDmode, e0,
22235                           gen_rtx_MINUS (DFmode, one,
22236                                          gen_rtx_MULT (SFmode, d, x0))));
22237   /* y1 = x0 + e0 * x0 */
22238   emit_insn (gen_rtx_SET (VOIDmode, y1,
22239                           gen_rtx_PLUS (DFmode,
22240                                         gen_rtx_MULT (DFmode, e0, x0), x0)));
22241   /* e1 = e0 * e0 */
22242   emit_insn (gen_rtx_SET (VOIDmode, e1,
22243                           gen_rtx_MULT (DFmode, e0, e0)));
22244   /* y2 = y1 + e1 * y1 */
22245   emit_insn (gen_rtx_SET (VOIDmode, y2,
22246                           gen_rtx_PLUS (DFmode,
22247                                         gen_rtx_MULT (DFmode, e1, y1), y1)));
22248   /* e2 = e1 * e1 */
22249   emit_insn (gen_rtx_SET (VOIDmode, e2,
22250                           gen_rtx_MULT (DFmode, e1, e1)));
22251   /* y3 = y2 + e2 * y2 */
22252   emit_insn (gen_rtx_SET (VOIDmode, y3,
22253                           gen_rtx_PLUS (DFmode,
22254                                         gen_rtx_MULT (DFmode, e2, y2), y2)));
22255   /* u0 = n * y3 */
22256   emit_insn (gen_rtx_SET (VOIDmode, u0,
22257                           gen_rtx_MULT (DFmode, n, y3)));
22258   /* v0 = n - d * u0 */
22259   emit_insn (gen_rtx_SET (VOIDmode, v0,
22260                           gen_rtx_MINUS (DFmode, n,
22261                                          gen_rtx_MULT (DFmode, d, u0))));
22262   /* dst = u0 + v0 * y3 */
22263   emit_insn (gen_rtx_SET (VOIDmode, dst,
22264                           gen_rtx_PLUS (DFmode,
22265                                         gen_rtx_MULT (DFmode, v0, y3), u0)));
22266 }
22267
22268
22269 /* Newton-Raphson approximation of single-precision floating point rsqrt.
22270    Assumes no trapping math and finite arguments.  */
22271
22272 void
22273 rs6000_emit_swrsqrtsf (rtx dst, rtx src)
22274 {
22275   rtx x0, x1, x2, y1, u0, u1, u2, v0, v1, v2, t0,
22276     half, one, halfthree, c1, cond, label;
22277
22278   x0 = gen_reg_rtx (SFmode);
22279   x1 = gen_reg_rtx (SFmode);
22280   x2 = gen_reg_rtx (SFmode);
22281   y1 = gen_reg_rtx (SFmode);
22282   u0 = gen_reg_rtx (SFmode);
22283   u1 = gen_reg_rtx (SFmode);
22284   u2 = gen_reg_rtx (SFmode);
22285   v0 = gen_reg_rtx (SFmode);
22286   v1 = gen_reg_rtx (SFmode);
22287   v2 = gen_reg_rtx (SFmode);
22288   t0 = gen_reg_rtx (SFmode);
22289   halfthree = gen_reg_rtx (SFmode);
22290   cond = gen_rtx_REG (CCFPmode, CR1_REGNO);
22291   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
22292
22293   /* check 0.0, 1.0, NaN, Inf by testing src * src = src */
22294   emit_insn (gen_rtx_SET (VOIDmode, t0,
22295                           gen_rtx_MULT (SFmode, src, src)));
22296
22297   emit_insn (gen_rtx_SET (VOIDmode, cond,
22298                           gen_rtx_COMPARE (CCFPmode, t0, src)));
22299   c1 = gen_rtx_EQ (VOIDmode, cond, const0_rtx);
22300   emit_unlikely_jump (c1, label);
22301
22302   half = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconsthalf, SFmode));
22303   one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
22304
22305   /* halfthree = 1.5 = 1.0 + 0.5 */
22306   emit_insn (gen_rtx_SET (VOIDmode, halfthree,
22307                           gen_rtx_PLUS (SFmode, one, half)));
22308
22309   /* x0 = rsqrt estimate */
22310   emit_insn (gen_rtx_SET (VOIDmode, x0,
22311                           gen_rtx_UNSPEC (SFmode, gen_rtvec (1, src),
22312                                           UNSPEC_RSQRT)));
22313
22314   /* y1 = 0.5 * src = 1.5 * src - src -> fewer constants */
22315   emit_insn (gen_rtx_SET (VOIDmode, y1,
22316                           gen_rtx_MINUS (SFmode,
22317                                          gen_rtx_MULT (SFmode, src, halfthree),
22318                                          src)));
22319
22320   /* x1 = x0 * (1.5 - y1 * (x0 * x0)) */
22321   emit_insn (gen_rtx_SET (VOIDmode, u0,
22322                           gen_rtx_MULT (SFmode, x0, x0)));
22323   emit_insn (gen_rtx_SET (VOIDmode, v0,
22324                           gen_rtx_MINUS (SFmode,
22325                                          halfthree,
22326                                          gen_rtx_MULT (SFmode, y1, u0))));
22327   emit_insn (gen_rtx_SET (VOIDmode, x1,
22328                           gen_rtx_MULT (SFmode, x0, v0)));
22329
22330   /* x2 = x1 * (1.5 - y1 * (x1 * x1)) */
22331   emit_insn (gen_rtx_SET (VOIDmode, u1,
22332                           gen_rtx_MULT (SFmode, x1, x1)));
22333   emit_insn (gen_rtx_SET (VOIDmode, v1,
22334                           gen_rtx_MINUS (SFmode,
22335                                          halfthree,
22336                                          gen_rtx_MULT (SFmode, y1, u1))));
22337   emit_insn (gen_rtx_SET (VOIDmode, x2,
22338                           gen_rtx_MULT (SFmode, x1, v1)));
22339
22340   /* dst = x2 * (1.5 - y1 * (x2 * x2)) */
22341   emit_insn (gen_rtx_SET (VOIDmode, u2,
22342                           gen_rtx_MULT (SFmode, x2, x2)));
22343   emit_insn (gen_rtx_SET (VOIDmode, v2,
22344                           gen_rtx_MINUS (SFmode,
22345                                          halfthree,
22346                                          gen_rtx_MULT (SFmode, y1, u2))));
22347   emit_insn (gen_rtx_SET (VOIDmode, dst,
22348                           gen_rtx_MULT (SFmode, x2, v2)));
22349
22350   emit_label (XEXP (label, 0));
22351 }
22352
22353 /* Emit popcount intrinsic on TARGET_POPCNTB targets.  DST is the
22354    target, and SRC is the argument operand.  */
22355
22356 void
22357 rs6000_emit_popcount (rtx dst, rtx src)
22358 {
22359   enum machine_mode mode = GET_MODE (dst);
22360   rtx tmp1, tmp2;
22361
22362   tmp1 = gen_reg_rtx (mode);
22363
22364   if (mode == SImode)
22365     {
22366       emit_insn (gen_popcntbsi2 (tmp1, src));
22367       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
22368                            NULL_RTX, 0);
22369       tmp2 = force_reg (SImode, tmp2);
22370       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
22371     }
22372   else
22373     {
22374       emit_insn (gen_popcntbdi2 (tmp1, src));
22375       tmp2 = expand_mult (DImode, tmp1,
22376                           GEN_INT ((HOST_WIDE_INT)
22377                                    0x01010101 << 32 | 0x01010101),
22378                           NULL_RTX, 0);
22379       tmp2 = force_reg (DImode, tmp2);
22380       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
22381     }
22382 }
22383
22384
22385 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
22386    target, and SRC is the argument operand.  */
22387
22388 void
22389 rs6000_emit_parity (rtx dst, rtx src)
22390 {
22391   enum machine_mode mode = GET_MODE (dst);
22392   rtx tmp;
22393
22394   tmp = gen_reg_rtx (mode);
22395   if (mode == SImode)
22396     {
22397       /* Is mult+shift >= shift+xor+shift+xor?  */
22398       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
22399         {
22400           rtx tmp1, tmp2, tmp3, tmp4;
22401
22402           tmp1 = gen_reg_rtx (SImode);
22403           emit_insn (gen_popcntbsi2 (tmp1, src));
22404
22405           tmp2 = gen_reg_rtx (SImode);
22406           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
22407           tmp3 = gen_reg_rtx (SImode);
22408           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
22409
22410           tmp4 = gen_reg_rtx (SImode);
22411           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
22412           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
22413         }
22414       else
22415         rs6000_emit_popcount (tmp, src);
22416       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
22417     }
22418   else
22419     {
22420       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
22421       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
22422         {
22423           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
22424
22425           tmp1 = gen_reg_rtx (DImode);
22426           emit_insn (gen_popcntbdi2 (tmp1, src));
22427
22428           tmp2 = gen_reg_rtx (DImode);
22429           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
22430           tmp3 = gen_reg_rtx (DImode);
22431           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
22432
22433           tmp4 = gen_reg_rtx (DImode);
22434           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
22435           tmp5 = gen_reg_rtx (DImode);
22436           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
22437
22438           tmp6 = gen_reg_rtx (DImode);
22439           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
22440           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
22441         }
22442       else
22443         rs6000_emit_popcount (tmp, src);
22444       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
22445     }
22446 }
22447
22448 /* Return an RTX representing where to find the function value of a
22449    function returning MODE.  */
22450 static rtx
22451 rs6000_complex_function_value (enum machine_mode mode)
22452 {
22453   unsigned int regno;
22454   rtx r1, r2;
22455   enum machine_mode inner = GET_MODE_INNER (mode);
22456   unsigned int inner_bytes = GET_MODE_SIZE (inner);
22457
22458   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
22459     regno = FP_ARG_RETURN;
22460   else
22461     {
22462       regno = GP_ARG_RETURN;
22463
22464       /* 32-bit is OK since it'll go in r3/r4.  */
22465       if (TARGET_32BIT && inner_bytes >= 4)
22466         return gen_rtx_REG (mode, regno);
22467     }
22468
22469   if (inner_bytes >= 8)
22470     return gen_rtx_REG (mode, regno);
22471
22472   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
22473                           const0_rtx);
22474   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
22475                           GEN_INT (inner_bytes));
22476   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
22477 }
22478
22479 /* Define how to find the value returned by a function.
22480    VALTYPE is the data type of the value (as a tree).
22481    If the precise function being called is known, FUNC is its FUNCTION_DECL;
22482    otherwise, FUNC is 0.
22483
22484    On the SPE, both FPs and vectors are returned in r3.
22485
22486    On RS/6000 an integer value is in r3 and a floating-point value is in
22487    fp1, unless -msoft-float.  */
22488
22489 rtx
22490 rs6000_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
22491 {
22492   enum machine_mode mode;
22493   unsigned int regno;
22494
22495   /* Special handling for structs in darwin64.  */
22496   if (rs6000_darwin64_abi
22497       && TYPE_MODE (valtype) == BLKmode
22498       && TREE_CODE (valtype) == RECORD_TYPE
22499       && int_size_in_bytes (valtype) > 0)
22500     {
22501       CUMULATIVE_ARGS valcum;
22502       rtx valret;
22503
22504       valcum.words = 0;
22505       valcum.fregno = FP_ARG_MIN_REG;
22506       valcum.vregno = ALTIVEC_ARG_MIN_REG;
22507       /* Do a trial code generation as if this were going to be passed as
22508          an argument; if any part goes in memory, we return NULL.  */
22509       valret = rs6000_darwin64_record_arg (&valcum, valtype, 1, true);
22510       if (valret)
22511         return valret;
22512       /* Otherwise fall through to standard ABI rules.  */
22513     }
22514
22515   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
22516     {
22517       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
22518       return gen_rtx_PARALLEL (DImode,
22519         gen_rtvec (2,
22520                    gen_rtx_EXPR_LIST (VOIDmode,
22521                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
22522                                       const0_rtx),
22523                    gen_rtx_EXPR_LIST (VOIDmode,
22524                                       gen_rtx_REG (SImode,
22525                                                    GP_ARG_RETURN + 1),
22526                                       GEN_INT (4))));
22527     }
22528   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
22529     {
22530       return gen_rtx_PARALLEL (DCmode,
22531         gen_rtvec (4,
22532                    gen_rtx_EXPR_LIST (VOIDmode,
22533                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
22534                                       const0_rtx),
22535                    gen_rtx_EXPR_LIST (VOIDmode,
22536                                       gen_rtx_REG (SImode,
22537                                                    GP_ARG_RETURN + 1),
22538                                       GEN_INT (4)),
22539                    gen_rtx_EXPR_LIST (VOIDmode,
22540                                       gen_rtx_REG (SImode,
22541                                                    GP_ARG_RETURN + 2),
22542                                       GEN_INT (8)),
22543                    gen_rtx_EXPR_LIST (VOIDmode,
22544                                       gen_rtx_REG (SImode,
22545                                                    GP_ARG_RETURN + 3),
22546                                       GEN_INT (12))));
22547     }
22548
22549   mode = TYPE_MODE (valtype);
22550   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
22551       || POINTER_TYPE_P (valtype))
22552     mode = TARGET_32BIT ? SImode : DImode;
22553
22554   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
22555     /* _Decimal128 must use an even/odd register pair.  */
22556     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
22557   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
22558            && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
22559     regno = FP_ARG_RETURN;
22560   else if (TREE_CODE (valtype) == COMPLEX_TYPE
22561            && targetm.calls.split_complex_arg)
22562     return rs6000_complex_function_value (mode);
22563   else if (TREE_CODE (valtype) == VECTOR_TYPE
22564            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
22565            && ALTIVEC_VECTOR_MODE (mode))
22566     regno = ALTIVEC_ARG_RETURN;
22567   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
22568            && (mode == DFmode || mode == DCmode
22569                || mode == TFmode || mode == TCmode))
22570     return spe_build_register_parallel (mode, GP_ARG_RETURN);
22571   else
22572     regno = GP_ARG_RETURN;
22573
22574   return gen_rtx_REG (mode, regno);
22575 }
22576
22577 /* Define how to find the value returned by a library function
22578    assuming the value has mode MODE.  */
22579 rtx
22580 rs6000_libcall_value (enum machine_mode mode)
22581 {
22582   unsigned int regno;
22583
22584   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
22585     {
22586       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
22587       return gen_rtx_PARALLEL (DImode,
22588         gen_rtvec (2,
22589                    gen_rtx_EXPR_LIST (VOIDmode,
22590                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
22591                                       const0_rtx),
22592                    gen_rtx_EXPR_LIST (VOIDmode,
22593                                       gen_rtx_REG (SImode,
22594                                                    GP_ARG_RETURN + 1),
22595                                       GEN_INT (4))));
22596     }
22597
22598   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
22599     /* _Decimal128 must use an even/odd register pair.  */
22600     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
22601   else if (SCALAR_FLOAT_MODE_P (mode)
22602            && TARGET_HARD_FLOAT && TARGET_FPRS
22603            && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
22604     regno = FP_ARG_RETURN;
22605   else if (ALTIVEC_VECTOR_MODE (mode)
22606            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
22607     regno = ALTIVEC_ARG_RETURN;
22608   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
22609     return rs6000_complex_function_value (mode);
22610   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
22611            && (mode == DFmode || mode == DCmode
22612                || mode == TFmode || mode == TCmode))
22613     return spe_build_register_parallel (mode, GP_ARG_RETURN);
22614   else
22615     regno = GP_ARG_RETURN;
22616
22617   return gen_rtx_REG (mode, regno);
22618 }
22619
22620 /* Define the offset between two registers, FROM to be eliminated and its
22621    replacement TO, at the start of a routine.  */
22622 HOST_WIDE_INT
22623 rs6000_initial_elimination_offset (int from, int to)
22624 {
22625   rs6000_stack_t *info = rs6000_stack_info ();
22626   HOST_WIDE_INT offset;
22627
22628   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
22629     offset = info->push_p ? 0 : -info->total_size;
22630   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
22631     {
22632       offset = info->push_p ? 0 : -info->total_size;
22633       if (FRAME_GROWS_DOWNWARD)
22634         offset += info->fixed_size + info->vars_size + info->parm_size;
22635     }
22636   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
22637     offset = FRAME_GROWS_DOWNWARD
22638              ? info->fixed_size + info->vars_size + info->parm_size
22639              : 0;
22640   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
22641     offset = info->total_size;
22642   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
22643     offset = info->push_p ? info->total_size : 0;
22644   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
22645     offset = 0;
22646   else
22647     gcc_unreachable ();
22648
22649   return offset;
22650 }
22651
22652 static rtx
22653 rs6000_dwarf_register_span (rtx reg)
22654 {
22655   rtx parts[8];
22656   int i, words;
22657   unsigned regno = REGNO (reg);
22658   enum machine_mode mode = GET_MODE (reg);
22659
22660   if (TARGET_SPE
22661       && regno < 32
22662       && (SPE_VECTOR_MODE (GET_MODE (reg))
22663           || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
22664               && mode != SFmode && mode != SDmode && mode != SCmode)))
22665     ;
22666   else
22667     return NULL_RTX;
22668
22669   regno = REGNO (reg);
22670
22671   /* The duality of the SPE register size wreaks all kinds of havoc.
22672      This is a way of distinguishing r0 in 32-bits from r0 in
22673      64-bits.  */
22674   words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
22675   gcc_assert (words <= 4);
22676   for (i = 0; i < words; i++, regno++)
22677     {
22678       if (BYTES_BIG_ENDIAN)
22679         {
22680           parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
22681           parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
22682         }
22683       else
22684         {
22685           parts[2 * i] = gen_rtx_REG (SImode, regno);
22686           parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
22687         }
22688     }
22689
22690   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
22691 }
22692
22693 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
22694
22695 static void
22696 rs6000_init_dwarf_reg_sizes_extra (tree address)
22697 {
22698   if (TARGET_SPE)
22699     {
22700       int i;
22701       enum machine_mode mode = TYPE_MODE (char_type_node);
22702       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
22703       rtx mem = gen_rtx_MEM (BLKmode, addr);
22704       rtx value = gen_int_mode (4, mode);
22705
22706       for (i = 1201; i < 1232; i++)
22707         {
22708           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
22709           HOST_WIDE_INT offset
22710             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
22711
22712           emit_move_insn (adjust_address (mem, mode, offset), value);
22713         }
22714     }
22715 }
22716
22717 /* Map internal gcc register numbers to DWARF2 register numbers.  */
22718
22719 unsigned int
22720 rs6000_dbx_register_number (unsigned int regno)
22721 {
22722   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
22723     return regno;
22724   if (regno == MQ_REGNO)
22725     return 100;
22726   if (regno == LR_REGNO)
22727     return 108;
22728   if (regno == CTR_REGNO)
22729     return 109;
22730   if (CR_REGNO_P (regno))
22731     return regno - CR0_REGNO + 86;
22732   if (regno == XER_REGNO)
22733     return 101;
22734   if (ALTIVEC_REGNO_P (regno))
22735     return regno - FIRST_ALTIVEC_REGNO + 1124;
22736   if (regno == VRSAVE_REGNO)
22737     return 356;
22738   if (regno == VSCR_REGNO)
22739     return 67;
22740   if (regno == SPE_ACC_REGNO)
22741     return 99;
22742   if (regno == SPEFSCR_REGNO)
22743     return 612;
22744   /* SPE high reg number.  We get these values of regno from
22745      rs6000_dwarf_register_span.  */
22746   gcc_assert (regno >= 1200 && regno < 1232);
22747   return regno;
22748 }
22749
22750 /* target hook eh_return_filter_mode */
22751 static enum machine_mode
22752 rs6000_eh_return_filter_mode (void)
22753 {
22754   return TARGET_32BIT ? SImode : word_mode;
22755 }
22756
22757 /* Target hook for scalar_mode_supported_p.  */
22758 static bool
22759 rs6000_scalar_mode_supported_p (enum machine_mode mode)
22760 {
22761   if (DECIMAL_FLOAT_MODE_P (mode))
22762     return true;
22763   else
22764     return default_scalar_mode_supported_p (mode);
22765 }
22766
22767 /* Target hook for vector_mode_supported_p.  */
22768 static bool
22769 rs6000_vector_mode_supported_p (enum machine_mode mode)
22770 {
22771
22772   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
22773     return true;
22774
22775   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
22776     return true;
22777
22778   else if (TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
22779     return true;
22780
22781   else
22782     return false;
22783 }
22784
22785 /* Target hook for invalid_arg_for_unprototyped_fn. */
22786 static const char *
22787 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
22788 {
22789   return (!rs6000_darwin64_abi
22790           && typelist == 0
22791           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
22792           && (funcdecl == NULL_TREE
22793               || (TREE_CODE (funcdecl) == FUNCTION_DECL
22794                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
22795           ? N_("AltiVec argument passed to unprototyped function")
22796           : NULL;
22797 }
22798
22799 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
22800    setup by using __stack_chk_fail_local hidden function instead of
22801    calling __stack_chk_fail directly.  Otherwise it is better to call
22802    __stack_chk_fail directly.  */
22803
22804 static tree
22805 rs6000_stack_protect_fail (void)
22806 {
22807   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
22808          ? default_hidden_stack_protect_fail ()
22809          : default_external_stack_protect_fail ();
22810 }
22811
22812 void
22813 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
22814                            int num_operands ATTRIBUTE_UNUSED)
22815 {
22816   if (rs6000_warn_cell_microcode)
22817     {
22818       const char *temp;
22819       int insn_code_number = recog_memoized (insn);
22820       location_t location = locator_location (INSN_LOCATOR (insn));
22821
22822       /* Punt on insns we cannot recognize.  */
22823       if (insn_code_number < 0)
22824         return;
22825
22826       temp = get_insn_template (insn_code_number, insn);
22827
22828       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
22829         warning_at (location, OPT_mwarn_cell_microcode,
22830                     "emitting microcode insn %s\t[%s] #%d",
22831                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn)); 
22832       else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
22833         warning_at (location, OPT_mwarn_cell_microcode,
22834                     "emitting conditional microcode insn %s\t[%s] #%d",
22835                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
22836     }
22837 }
22838
22839 #include "gt-rs6000.h"